AW Dev Rethought

🕵️ Debugging is like being the detective in a crime movie where you are also the murderer - Filipe Fortes

Architecture Realities: Why Simplifying Architecture Is Harder Than Expanding It


Introduction:

Adding to a system is easy. Engineers add new services, new databases, new queues, and new layers of abstraction with relatively little friction. Each addition solves an immediate problem, seems justified at the time, and gets deployed without significant resistance.

Removing from a system is a different problem entirely. Every component that gets added eventually becomes something that other components depend on, something that teams build assumptions around, and something that carries implicit knowledge about why it exists that is rarely written down. By the time simplification becomes necessary, the system has accumulated enough complexity that removing any part of it feels riskier than leaving it in place.

This asymmetry — where expansion is frictionless and simplification is painful — is one of the most persistent and underappreciated challenges in software architecture. Understanding why it happens is the first step toward building systems that remain maintainable as they evolve.


Complexity Accumulates in Small Increments:

No engineering team sets out to build a complicated system. Complexity accumulates gradually, one reasonable decision at a time. A caching layer gets added to handle a traffic spike. A message queue gets introduced to decouple two services. A new microservice gets created to isolate a specific domain. Each of these decisions is defensible in isolation.

The problem is that each addition increases the surface area of the system — more moving parts, more failure modes, more operational overhead, more cognitive load for engineers who need to understand how everything fits together. Over time, the cumulative weight of individually reasonable decisions produces a system that is genuinely difficult to reason about.

By the time the complexity becomes painful enough to address, it has been present long enough that engineers have built deep assumptions around it. Removing it requires not just technical work but organisational negotiation with every team whose systems depend on what you are trying to simplify.


Dependencies Make Removal Risky:

The primary technical barrier to simplification is dependency. Every component in a production system has consumers — services that call it, pipelines that read from it, monitoring systems that observe it, runbooks that reference it. Removing a component means identifying every dependency, migrating every consumer, and verifying that nothing breaks in the process.

In well-documented systems with clear ownership, this is difficult. In systems that have evolved organically over years, with undocumented dependencies and tribal knowledge distributed across teams that have experienced significant turnover, it is genuinely dangerous. Engineers who attempt simplification in these environments frequently discover dependencies that nobody knew existed, only after something breaks in production.

The safest response to undiscovered dependencies is to leave things in place. This is rational behaviour that makes simplification progressively harder over time as the number of undiscovered dependencies grows.


The Original Problem Is Often Forgotten:

Every piece of complexity in a system was added to solve a specific problem. A service was introduced because a monolith was too slow to deploy. A caching layer was added because database queries were timing out. A circuit breaker was implemented because a downstream dependency was unreliable.

Over time, the original problems get solved in other ways, or become irrelevant, or simply fade from institutional memory. The solutions remain — because removing them requires effort and carries risk — but the problems they solved are no longer present.

This produces systems with components that serve no current purpose but cannot be safely removed because nobody is certain they serve no purpose. Proving that something is unnecessary requires the same level of investigation as proving that something is necessary — and that investigation rarely gets prioritised against new feature work.


Simplification Requires Organisational Alignment, Not Just Technical Work:

In a single-team system, simplification is a technical decision. In a multi-team system, it is an organisational negotiation. Every team whose system touches what you want to simplify has to agree to participate in the migration, prioritise the work, and accept the risk of changing something that currently works.

Teams that are not experiencing the pain of the complexity you want to remove have little incentive to help you remove it. Their systems work. Participating in a simplification effort means taking on migration risk for a benefit they may not directly experience.

This is why simplification efforts in large organisations so frequently stall. The team driving the simplification cannot complete it unilaterally, but the teams whose cooperation they need have higher-priority work and lower motivation to help.


Incremental Simplification Works Better Than Big Bang Rewrites:

The temptation when facing significant architectural complexity is to propose a clean slate — a rewrite that replaces the complicated system with something simpler and better designed. This is almost always the wrong approach.

Rewrites take longer than estimated, accumulate their own complexity during development, and require maintaining two systems simultaneously during the transition period. The new system, designed without the hard-won operational knowledge embedded in the old one, frequently rediscovers the same problems that caused the original complexity to accumulate.

Incremental simplification — identifying the smallest removable unit of complexity, migrating its consumers, removing it, and repeating — is slower and less satisfying but significantly more likely to succeed. Each successful removal builds confidence, reduces the surface area for the next removal, and demonstrates to stakeholders that simplification is achievable.


The Best Time to Simplify Was Earlier, the Second Best Time Is Now:

Simplification gets harder the longer it is deferred. Dependencies multiply, institutional knowledge decays, and the cognitive overhead of understanding the system well enough to simplify it increases. Teams that treat simplification as something to do after the next feature launch consistently find that the next feature launch introduces new complexity before the previous simplification work begins.

The most effective engineering cultures treat simplification as ongoing maintenance rather than a periodic project. They allocate explicit capacity for it, measure complexity alongside reliability and performance, and create incentives for removing things rather than only for adding them.


Conclusion:

Simplifying architecture is harder than expanding it because expansion is a local decision with immediate benefits, while simplification is a distributed effort with delayed and often invisible returns. Dependencies, forgotten context, organisational friction, and the risk aversion that comes with touching production systems all conspire to make removing complexity harder than adding it.

The teams that manage complexity most effectively are the ones that treat simplification as a first-class engineering discipline — not something that happens when the system becomes unbearable, but something that happens continuously as a deliberate counterweight to the complexity that accumulates naturally as systems evolve.


If this article helped you, you can support my work on AW Dev Rethought.


Rethought Relay:
Link copied!

Enjoyed this post?

Stay in the loop

New posts + weekly digest, straight to your inbox.

or

Create a free account

  • Save posts to your vault
  • Like posts & build history
  • New-post alerts

Comments

Add Your Comment

Comment Added!