AW Dev Rethought

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

Resilience Engineering: Why Reliability Engineering Is More About Design Than Tools


Introduction:

Reliability engineering has a tooling problem — not because the tools are bad but because tools have become the primary lens through which reliability is understood and pursued. Teams that want to improve reliability evaluate monitoring platforms, adopt chaos engineering frameworks, implement distributed tracing, and deploy service meshes. The implicit assumption is that the right combination of tools will produce reliable systems.

Tools are necessary but insufficient. A comprehensive observability stack tells you when something is wrong. It does not prevent the architectural decisions that make systems fragile in the first place. A chaos engineering framework surfaces failure modes that already exist in a system. It does not eliminate the design choices that created those failure modes. Reliable systems are not instrumented into existence — they are designed into existence, and the tools that support reliability are only as effective as the design they are applied to.

Understanding reliability as a design discipline rather than a tooling discipline changes where engineering effort is invested and when — earlier, at the point where the cost of getting it right is lowest.


Reliability Is Designed In, Not Added On:

The most expensive way to make a system reliable is to build it first and then add reliability mechanisms afterward. Retry logic, circuit breakers, fallback mechanisms, and graceful degradation paths are significantly more complex to add to an existing system than to design into a system from the beginning.

An existing service that makes synchronous calls to downstream dependencies without timeout protection needs to be refactored to add it — and refactoring requires understanding all of the call sites, testing all of the failure scenarios, and coordinating the deployment of changes that affect production behaviour. A service designed from the beginning with explicit timeout budgets for every downstream call has that protection as a built-in characteristic that requires no subsequent retrofit.

The same principle applies to every reliability mechanism. Graceful degradation requires knowing which features are critical and which are optional — a distinction that is easiest to make during design and hardest to establish in a system that was built without it. Failure isolation requires service boundaries that were drawn with isolation in mind. Recovery procedures require state management approaches that support clean recovery — which are significantly easier to design correctly than to retrofit.


Failure Modes Are Architectural, Not Operational:

The failure modes of a system are largely determined by its architecture. A system that shares a database across multiple services has a failure mode where database contention affects all services simultaneously — and no amount of operational tooling eliminates that failure mode without changing the architecture. A system that makes synchronous calls across service boundaries has a failure mode where slow downstream services cause latency to cascade upward — and circuit breakers mitigate but do not eliminate this failure mode as long as the synchronous coupling exists.

Operational tools manage failure modes that already exist in a system. Architectural decisions determine which failure modes exist. Teams that focus primarily on operational tooling without addressing the architectural sources of unreliability are managing symptoms rather than causes. They get better at detecting and responding to failures without reducing the frequency or severity of those failures.

Architectural reliability decisions include how services communicate — synchronous versus asynchronous, which introduces different failure characteristics. How data is stored and replicated — which determines recovery characteristics after storage failures. How load is distributed — which determines failure behaviour under traffic spikes. These decisions, made during system design, determine the reliability ceiling that operational tooling can reach.


Simplicity Is the Most Underrated Reliability Strategy:

Complex systems fail in complex ways. Every component added to a system is a component that can fail. Every integration between components is a failure mode waiting to be triggered. Every layer of abstraction is an additional surface area for bugs and misconfigurations.

Simplicity — building systems with fewer components, fewer integrations, and fewer layers than the problem might seem to demand — is one of the most reliable reliability strategies available. A system that achieves its goals with five services is more reliable than a system that achieves the same goals with fifteen, not because five is a magic number but because fewer components means fewer failure modes, less coordination overhead, and less operational complexity.

The pressure against simplicity in engineering organisations is real. More sophisticated architectures demonstrate technical capability. Micro-services and distributed systems are associated with engineering maturity. The organisational incentives that reward architectural complexity over architectural simplicity make it genuinely difficult to choose the simpler solution even when the simpler solution is more reliable.


Dependency Management Is Reliability Management:

Every external dependency a system takes on is a reliability risk that the system inherits. A service that depends on ten downstream services has ten potential sources of failure that are outside its control. A library that depends on a third-party package that has not been maintained for two years is a vulnerability waiting to be discovered. A managed service that provides a critical capability introduces a failure mode that is determined by the provider's operational practices rather than your own.

Reliability engineering that does not account for dependency risk is incomplete. Evaluating dependencies before adopting them — for reliability track record, support quality, and failure mode characteristics — is a design activity that affects system reliability as directly as any architectural decision about the system itself.

Reducing unnecessary dependencies, replacing unreliable dependencies with more reliable alternatives, and designing for graceful degradation when dependencies are unavailable are all reliability strategies that operate at the design level rather than the tooling level. They reduce failure probability rather than improving failure detection.


Observability Reveals Design Problems, Not Just Operational Ones:

The most valuable use of observability tooling is not detecting failures when they occur — it is revealing design problems that cause failures to occur more often than they should. A distributed trace that consistently shows a specific service adding disproportionate latency to requests is revealing a design decision — the choice to put that service on the critical path — that may need to be revisited.

Observability data that is used to inform architectural decisions produces reliability improvements that compound. Each design change that reduces a failure mode reduces the frequency of the incidents that observability would otherwise need to detect and alert on. Teams that use observability purely reactively — to understand failures after they occur — capture only a fraction of the value that observability infrastructure provides.

The discipline of reviewing observability data not just during incidents but as part of regular architectural reviews, and treating patterns in that data as signals about design problems rather than just operational ones, connects tooling investment to the design improvements that produce lasting reliability gains.


Conclusion:

Reliability engineering is more about design than tools because the fundamental characteristics of a system — how it fails, how it recovers, how it degrades under stress — are determined by architectural decisions made during design, not by the tooling applied during operation. Tools that support reliability are essential and worth investing in. They are most effective when they are applied to systems whose designs have made reliability possible.

The engineering teams that build the most reliable systems are not the ones with the most sophisticated observability stacks or the most comprehensive chaos engineering programs. They are the ones that treat reliability as a design constraint from the beginning — making architectural choices that reduce failure modes, simplify recovery, and limit the blast radius of inevitable failures before the first line of code is written.


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!