I decided to write down some software design principles that are really hard to put into words, but nevertheless I must make my own attempt.


Standardization enables scalability.

This is a multi-faceted principle, as standardization can take different shapes at various levels.

Real-world analogies first:

  • Lego (obviously): a limited number of shapes with a few ways to connect brought us a great number of creations, joy, and human connections.
  • Guitar pedals and modular synthesizers: one type of cord, a very limited number of inputs, usually just one output - endless variations.
  • Gridfinity: a simple standard for a 3D-printed storage system - so many variations and customizations, for any case a person can and cannot imagine.

Projecting this back to software: both flexibility and scalability improve when there are restrictions imposed on interfaces. I mean flexibility and scalability in a broad sense - managing hardware, adding features on top of features, adding or moving people between teams and projects. I guess I could call it a system design principle.

Here is a pretty standard program workflow: the boxes can represente separate services or modules within a single program:

This is how we typically imagine a developer's job. But the real world often demands one of these designs:

So the principle is: if you have the luxury to design a system from scratch, or, more typically, need to add a new element to the system, ask yourself (and others) a few questions:

  • What if we need to remove an element quickly - how easy is it to do?
  • What if we need to have multiple elements of this kind, working sequentially or in parallel?
  • What if the system needs to optionally skip this element?
  • How easy is this element to extend?
  • Can any other element of the system to talk to this element? Can it be the other way around?

In my toolkit, the best tool for this is Hexagonal Architecture. It imposes one standard on the system - it must allow adding adapters and ports to any module. Therefore, any module can talk to any other module if you encode translators.

However, Hexagonal Architecture is just what I reach for. The principle isn't in the tool - it's in the constant effort to keep the system open to evolution by maintaining the right restrictions.