Skip to content
SDB
03Engineering

Six architecture decisions that aged well

Looking back across thirty years of systems, the choices I am still glad about have almost nothing in common technically — but they share a single quality: they kept the next decision cheap.

Subhendu Datta Bhowmik3 min read

Architecture is one of the few disciplines where you get graded a decade late. The design review says you were right; the maintenance backlog five years on tells you whether you actually were.

I went back through the systems I have worked on that are still running and asked a narrow question: which decisions am I still glad about? Not which were clever — which ones were still paying rent long after I had left the building.

1. Putting the domain model before the delivery mechanism

Every system that survived had a core that did not know how it was being invoked. HTTP, message queue, batch file, scheduled job — all of them were adapters around something that would have compiled without them.

This sounds like architectural piety until you watch the alternative. Business logic embedded in a servlet in 2003 had to be rewritten for SOAP in 2006, REST in 2011, and events in 2018. Logic that sat behind an interface got four new adapters instead of four rewrites.

2. One source of truth for identity, always

Every single integration nightmare I have been called into had multiple answers to "who is this person?" Duplicate customer records, three definitions of an active account, an employee who left but still owns approvals in one system.

Identity is the one place where I have never regretted centralising, and never once regretted the extra six weeks it cost up front.

3. Making the boring path the fast path

If the safe way to deploy is slower than the unsafe way, engineers will use the unsafe way, and they will be right to. Every environment where quality held had one property: the governed route was also the convenient route.

4. Writing the trade-off down at the moment of decision

Not a document. A paragraph, in the repository, next to the code:

ADR-014: Synchronous pricing call at checkout
Status:   Accepted (2019-03)
Context:  Pricing changes hourly; stale prices cause revenue leakage
          and customer disputes. Cache invalidation across 40 regions
          was estimated at 6 weeks.
Decision: Call pricing synchronously. Accept +80ms p95 at checkout.
Revisit:  If checkout p95 exceeds 400ms, or if regional cache
          invalidation becomes available as a platform service.

The value is entirely in that last line. Four years later, someone found this file, saw that the revisit condition had been met, and changed the design in a week — without archaeology, without a war room, and without anyone claiming "we've always done it this way".

5. Choosing the database for the shape of the questions

Not for the shape of the data — anything can store anything now. For the questions. If the interesting questions are about relationships more than two hops deep, a relational schema will fight you forever, and no amount of ORM cleverness changes that. If the questions are aggregate and columnar, row storage will punish you.

I have been wrong about this in both directions, and both were expensive.

6. Refusing to build the thing that had no owner

The single highest-return decision of my career was declining to build a system that no business unit would agree to own after launch. It was a good idea. It was well funded. There was no name on the line for its future.

Every unowned system I did build is either dead or a hazard.

Architecture is not the art of choosing the best option. It is the art of choosing the option whose consequences you are willing to live with for ten years.

The common thread

None of these are technology choices. Re-reading the list, what strikes me is that not one of them would show up on an architecture diagram. They are all decisions about reversibility — keeping the cost of the eleventh change close to the cost of the first.

That is the whole job, really. Everything else is implementation detail.

Filed under

  • Architecture
  • Trade-offs
  • Legacy
  • Design

Keep reading

Engineering3 min read

Migrating a monolith without stopping the business

The strangler pattern is well documented and still routinely misapplied. The hard part was never splitting the code — it was splitting the data while both halves stayed correct.

Read essay →
Mathematics10 min read

Forward and inverse kinematics, without the fog

Two questions every articulated mechanism asks: given the joint angles, where is the tip? Given a tip pose, which angles get you there? The math is the same whether the arm is on a desk, a factory floor, or a simulation.

Read essay →
Technology3 min read

The honest case for AI in the enterprise

Most enterprise AI programmes fail for the same reason enterprise search failed in 2008: nobody owned the data. Here is what actually has to be true before a model earns a place in production.

Read essay →