Skip to content

· 2 min read

Good systems are opinionated about the few things that matter

Flexibility everywhere is a way of never deciding. The best systems hold firm opinions in a few places and stay out of the way everywhere else.

  • Philosophy
  • Architecture
  • Product

There is a style of software that tries to accommodate everything. Every behaviour is configurable. Every workflow can be customised. Every field is optional. It looks generous. In practice it is a way of avoiding decisions, and the cost lands on the people who use it.

The systems I admire are the opposite. They are opinionated — firmly, deliberately — about a small number of things that matter, and flexible about everything else.

Why flexibility everywhere fails

It pushes design onto the user. Every setting is a decision the product team declined to make, handed to someone with less context.

It multiplies states. Each option doubles the combinations the system can be in. Most combinations are never tested. Some of them are broken, and users find them.

It dilutes the constraint. Every product has one thing that must never go wrong. Flexibility around that thing is how it eventually does.

It makes the product harder to explain. A tool that can do anything is hard to describe, hard to sell and hard to learn.

Where to hold opinions

The places worth being opinionated are the ones that protect the product's core promise.

  • Data integrity. An inspection record is append-only. A price is stored with its currency. A published post has a date. These are not preferences.
  • Safety defaults. New content starts as a draft. New accounts start with the least access. Uploads are validated before they are accepted.
  • The shape of the main workflow. One clear path through the core task, rather than five equivalent ones.
  • What the system refuses to do. Written down, with the reason.

Where to stay flexible

Flexibility is valuable at the edges, where users genuinely differ and a wrong default costs little: content, presentation, naming, preferences that affect only the person who sets them.

The skill is telling the two apart. A useful question: if a user chose the "wrong" option here, would anyone else be harmed, or would anything important break? If yes, hold an opinion. If no, let them choose.

Opinions need reasons

An opinionated system is only good if its opinions are right, and they can only be right if they are reasoned. So each firm choice should come with its reason, written where the next person will find it. Then, when circumstances change, the reason shows whether the opinion still holds.

An opinion without a reason is just stubbornness. An opinion with one is a design.

The takeaway

Decide the few things your system will be strict about, and be strict about them. Make everything else easy to change. Most of the difficulty in software is not building features; it is deciding, and good systems are the record of good decisions.