chapter nine

9 Durable by design

 

This chapter covers

  • Designing systems that adapt to change
  • Tight cohesion and loose coupling
  • Keeping systems resilient
  • Using tests to preserve behavior
  • Protecting trust with stable public interfaces

By using the dimensions we’ve explored so far, we’re already writing higher-quality code that’s easier to maintain and extend. We’ve also looked at the role of team culture, including documentation, technical debt management, and other habits that sustain the long-term health of a codebase. All these dimensions serve one shared purpose: to write software that stands the test of time. That’s why, at the base of our rosette, supporting and encompassing all the other dimensions, lies durability.

A digital product is constantly evolving, often in unpredictable ways. Clients will request new features, and technologies will continue to shift. Change is not the exception; it’s the rule. Software must also support changing conditions while it’s running. It must be robust enough to handle traffic spikes, misuse, or attacks without breaking, and resilient enough to recover from transient failures. In short, it must be durable.

9.1 Designing for change

9.1.1 The balance between cohesion and coupling

9.1.2 SOLID

9.1.3 Design patterns

9.2 Resilience

9.3 Testing and the discipline of doubt

9.4 Designing for trust

9.4.1 Designing stable contracts

9.4.2 Evolving without breaking trust

9.5 Summary