Every month, my company spends about $50K on software development. We’ve been doing this for 10 years. We think that we’re building something valuable well into the future.
Yet if the company went bankrupt, our work will instantly become worthless. Our business system serves our unique needs and would be useless in any other context. Likewise, if enough senior developers left at the same time, the business might be OK, but without in-depth knowledge, we would have to start over with the code.
Our code only has value when it makes money for the business. Like a living being, it only has value when it contributes to a common purpose (profit) and begins to disintegrate the moment that purpose is gone.
One difference between living and constructed things is that all of the parts of a living being are usually necessary for its function. If you remove any part of it, you will kill it, or at least imperil its ability to survive.
A complex codebase on the other hand usually serves multiple goals, and these goals change over time. Inevitably, some parts of the system become irrelevant to the system’s well-being.
98.5% percent of human DNA does not code for any proteins. It’s “junk” DNA. While not entirely useless, it’s a relic of evolutionary history. Given enough time, the same happens with any codebase.
This month, I tried to remove a feature from the codebase. It’s a small and simple feature, but one of the oldest. I found that I couldn’t get rid of it. Various parts of our system made certain assumptions that broke when the feature was removed. Subtle interactions caused things to break in unpredictable ways. This feature had wormed itself into the deepest layers of the logic engines and removing it broke dozens of unit tests.
I gave up and put the feature back in the backlog. I considered paving over the complexity by hiding it from the user, while letting it run in the background, like a vestigial organ. In fact, the feature had never been useful, but it took years for the business to admit that the tens of thousands spent on it were wasted. If we had recognized this earlier, stripping it out would have been much easier.
Adding complexity to a system does not make it more valuable — it makes it more costly to maintain. Humans have high-calorie needs because our brains require a lot of energy to run. Nature didn’t give us the largest brains it could, but the smallest brains that we could survive with. Human brains are mostly full of heuristics that provide shortcuts to perceiving and simulating reality just well enough to keep us alive long enough to reproduce. Likewise, software systems should have the minimum complexity needed to satisfy business requirements.