Design patterns

June 3rd, 2018

Layers, onions, hexagons and the folly of application-wide abstractions

Not only are layered applications difficult to maintain, but the common abstractions they are built on tend to give rise to inflexible implementations that have serious scalability challenges.

July 22nd, 2017

The poor man’s Cassandra: scaling Azure Table Storage to maximise throughput.

Azure Table Storage can be tuned for high throughput workloads, but you’ll probably be faced with some difficult trade-offs.

February 12th, 2017

A simple guide to using Redux with React.js (yeah, right…)

Learning React.js always starts so well, but adding Redux into the mix can make things unnecessarily complex. The lack of accessible examples doesn’t help – this is an attempt at writing a stripped down, bare bones introduction that focuses on the main ideas behind Redux.

January 7th, 2017

Event stores and event sourcing: some practical disadvantages and problems

Event stores and event sourcing are a powerful idea, but they can be vulnerable to a number of technical and operational challenges when faced with real world complexity.

October 27th, 2016

The problem with using maturity models to describe technology solutions

Maturity models are a management tool. When applied to technology solutions they often provide a weak analysis that describes a false progression.

October 3rd, 2016

What’s so bad about monoliths anyway…?!

Don’t get me wrong – I am an advocate of decomposing functionality into autonomous services. My reservation is that you need to have a lot of prerequisites in place before you can start leveraging microservices.

July 29th, 2016

Designing an event store for scalable event sourcing

Event sourcing can scale very nicely, though this does depend on a number of key design decisions for the underlying event store.

June 2nd, 2016

Is “Serverless” architecture just a finely-grained rebranding of PaaS?

Serverless computing makes bold promises of development without having to worry about environments, scaling or deployment. Haven’t we been here before?

April 14th, 2016

What do we actually mean when we say “business logic”?

In most cases “business logic” just refers to the poorly-defined “gloop” that sits between user interfaces and databases in layered architectures.

March 23rd, 2016

API gateways and the dangers of creeping middleware scope

An API gateway can solve many generic problems in an API infrastructure, but you do need to define a clear remit and protect against creeping scope.

July 25th, 2015

Can cross-cutting concerns really exist between services?

You might be able to identify cross-cutting concerns in a monolith, but in a service-orientated world they should melt away into specific implementations.

May 5th, 2015

Refactoring large monoliths to microservices: strategies, risks and pragmatic reality

Large scale rewrites of systems are loaded with risk. You can address this by preparing the ground in advance and adopting an incremental approach, but a willingness to be pragmatic is essential.

March 9th, 2015

How big is a microservice?

We know that micro services are small and focused by design – just how small is this in practice?

February 8th, 2015

Protocol buffers for .Net: protobuf-net vs protobuf-csharp-port

Google’s open source serialization format is an efficient way of passing platform-independent and version-tolerant data between end-points. Two very different implementations have emerged for .Net.

November 3rd, 2014

Why you shouldn’t create asynchronous wrappers with Task.Run()

Many developers confuse asynchronous operations with parallel execution. The essential difference is that an asynchronous operation is concerned with which resources you consume while parallel execution is more concerned with how many.