Back to Newsletter

Weekly Reflection #19 - Design for Evolution

Each week, I share one insight. One piece of wisdom. One question to reflect on. (and a little Lagniappe)


Insight

Things change. Requirements change. Teams change. And yet, the systems we build have to live through all of it. One of my favorite software engineering books is Building Evolutionary Architectures. This book introduced me to one of my favorite software architecture concepts: fitness functions. These are executable checks that encode what "healthy" means for your system. If you've ever written a unit test, you've written a narrowly scoped fitness function. The book frames evolvable systems along two axes:

  • mechanics: the engineering practices that make change safe (CI, deployment, testing).
  • structure: designing the system so change is cheap in the first place.

Fitness functions tie the two together. They are the guardrails that let you change a system confidently without breaking it in new and surprising ways.

I used to try to design systems that anticipated every future requirement up front. Eventually, this strategy loses. Even the "perfect" design will suffer from bit rot if uncared for.

The best systems don't try to plan for all possible futures. They define what "healthy" looks like and evolve from there.


Wisdom

There are no separate systems. The world is a continuum. Where to draw a boundary around a system depends on the purpose of the discussion.—Donella H. Meadows


Reflection

"Perfect is the enemy of good." Where have you delayed shipping something good because you were still chasing the "perfect" design?


Lagniappe

Enjoyed this issue?

Subscribe to get future issues delivered to your inbox.

Get the newsletter
in your inbox

No spam. Just useful ideas.

Prefer RSS? Subscribe via feed