Or the Dangers of Incremental Complexity
Products are not built in big bangs: they are painfully crafted layer upon layer, decision after decision, day by day. It’s also a team sport where each member makes countless decisions that hopefully help flow towards something customers love.
In fact, these decisions are so numerous and small that they seem to cost nothing. Our judgment and creativity to builds the product crumb by drop. Each and every morning we shows up for work ready to bake wholesome chocolaty goodness into the product. It’s seeming irrelevance of each atomic bit that lulls us into false thinking that every addition is just a harmless Pythonesque “wafer thin” bite.
That’s right, not all these changes are good. It’s just as likely (perhaps more likely) that the team is tinkering with the recipe. Someone asks them to add a pinch of cardamom today, pecans tomorrow, and raisins next week. Individually, these little changes seem to be trivial. Taken together, they can delay your schedule at best or ruin your product at worst.
Let me give you a concrete example:
In a past job, we had to build an object model for taxis. At our current stage, this was pretty simple: a truck has a name, a home base, and an assigned driver. One of our team independently looked ahead and decided individually that he should also add make, model, MPG, and other performance fields. He also decided that assignments needed a whole new model since they could date range (start, end) and handle multiple drivers. Many of you are probably thinking all this was just what engineers are supposed to do – anticipate needs. Read on…
By the time he’d built the truck model, it had taken 5x as a long and resulted in 100s of lines of code. It got worse the very next week when we built the meter interface code and learned more about the system. For reporting requirements, MPG and performance fields had to be handled outside the taxi model. We also found that driver assignments were much more naturally handled by looking at fare information. Not only had we wasted a lot of time, we had to spend even more time reversing the changes we’d put in.
One of my past CEOs called this a “death by ant bites” and “death of a million cuts.”
It’s one of the most pernicious forms of feature creep because every single one of the changes can be justified. I’m not suggesting that all little adds are bad, but they all cost something. Generally, if someone says they are anticipating a future need, then you’re being bitten by an ant.
You need to make sure that your team is watching each other’s back and keeping everyone honest. It’s even better to take turns playing devil’s advocate on each feature. It’s worth an extra 10 minutes in a meeting to justify if that extra feature is required.
PS: Test Driven Design (TDD) repels ants because it exposes the true cost for those anticipatory or seemingly minor changes. That “10 minute” feature is really a half day of work to design, test, integrate, and document. If it’s not worth doing right, then it’s not worth adding to the product.