Design patterns

Minimal Viable Architecture and the case for up-front design

13 November 2023

Evolutionary design and iterative development only get you so far - you still need some level of up-front thinking and forward planning.

Monoliths and the microservices backlash

22 May 2023

We need a more nuanced understanding of how to get the best out of monoliths, microservices, and serverless architectures.

When to use serverless architecture... and when not to

9 February 2023

The potential benefits of an architecture based on serverless functions are nuanced, making it a good fit only for some very specific use cases.

Data Vault 2.0: the good, the bad and the downright confusing

12 December 2020

Data Vault 2.0 modelling can support a more agile approach to data warehouse design and data ingestion. Inevitably, this flexibility does come with a heavy burden of complexity.

Architecture without documentation is incomplete

17 October 2020

Designing good architecture is only half the battle. You also need to be able to communicate your architecture to anybody who is likely to use it.

Naming things is easy. Abstraction is much harder.

13 June 2020

One of the more pervasive myths in software development is that naming things is hard.

When is an event not an event?

8 February 2020

Message design in an event-driven architecture can be quite nuanced, especially if you want to achieve any of the benefits of loose coupling that they can be associated with.

When should you write your own message endpoint library?

14 December 2019

Enterprise messaging patterns are complex beasts that often warrant a common implementation across your endpoints. Should you ever be tempted to roll your own?

Splitting up shared databases

6 October 2019

The problem of shared databases is not confined to monolithic systems. A big store of shared state is the guilty secret lurking in many a microservice architecture.

Finding service boundaries: more than just the bounded context

6 January 2019

When you are identifying service boundaries, it’s not enough to consider the domain model alone. There are other, more pragmatic concerns to bear in mind.

Writing ArchUnit style tests for .Net and C# to enforce architecture rules

27 November 2018

ArchUnit is a java library that provides a fluent API for creating self-testing architectures via unit tests. A similar library can be written for .Net Standard that acts on compiled assemblies rather than raw code.

Messaging anti-patterns in event-driven architecture

12 October 2018

Event-driven integration can improve the scalability, resilience and scalability of distributed applications… but this does depend on the design of your event messages…

Building Twelve Factor Apps with .Net Core

12 August 2018

Twelve factor apps provide a methodology for building apps that are optimised for modern cloud environments. It’s only been achievable in the Microsoft world since the advent of .Net Core.

Autonomous bubbles and event streams: Pragmatic approaches to working with legacy systems

29 July 2018

It’s easy to get caught up in unrealistic notions that you can re-write a legacy system or gradually decompose it. There are other, more pragmatic approaches that can help to modernise architectures and enable new development.

Using architectural “fitness functions” as a guide to system design

18 June 2018

Fitness functions can be a useful metaphor for guiding an emerging architecture, but you do have to invest in making sure they describe the right outcome.