All the way back in 2002, Martin Fowler talked about what he called Design Decay. He says:
If you have a notion of planned design, that the design is something that’s right at the beginning, then it’s kind of inevitable that the design will decay.
I like this concept of design decay. While I don’t think a design ever perfectly captures the essence of its subject, I think the design does lose its relevancy and accuracy over time. Fowler is talking about design decay in the context of refactoring. When we refactor our software, we make something new out of something old because the old thing was falling behind or getting too complex. Like decaying leaves that add nutrients to the ground and give opportunity to new life, decaying designs allow a new design to grow that’s fresh and new.
I’ve talked about entropy here and its relation to complexity. As complexity grows, so does entropy. A high-entropy design leaves more room for problems, bugs, and security issues. I think the concept of design decay is complementary to entropy.
In What is Life?, Erwin Schrödinger—the physicist who gave us the Schrödinger’s Cat thought experiment—theorized that life reduces or maintains its entropy by feeding on what he called negative entropy. Wikipedia says:
Schrödinger asked the question: “How does the living organism avoid decay?” The obvious answer is: “By eating, drinking, breathing and (in the case of plants) assimilating.”
Life slows its decay and seeks to retain order by taking in the nutrients and byproducts of other life. It’s always replenishing itself for survival, always trying to avoid disorder, chaos, and death. In other words, life is constantly refactoring itself to survive.
Design isn’t fixed in time. It is fluid and constantly changing because the thing it’s trying to capture is fluid and constantly changing. Therefore, design decay is inevitable. But decay is what creates the opportunity for reducing design entropy. It’s what makes refactoring possible—we’re able to refactor because the design always needs it. And in refactoring, we’re able to reduce or control the entropy of the design.