Imagine you’re in a deli ordering a sandwich. You’ve decided what kind of cheese (swiss) and what kind of bread (focaccia) you want and now you’re looking at the possible meats you can put on it. Your eyes scan over all the big humps of smoked turkey, pastrami, roast beef … until you notice one weird one and wonder what the hell it’s doing there.
It’s a jalapeno peanut butter glazed ham.
You think to yourself: this thing takes up space in the fridge, has to be ordered and moved from a truck into shop, sorted and manually organized into a spot on the display, and then occasionally spoils and has to be replaced. All of this effort … for a couple of eccentric customers who occasionally order it? Even if it’s not a money-losing ham it’s definitely sucking up a lot of effort.
That weird ham is the equivalent of rarely used features in your product. It’s that obscure checkbox on the third tab of a config panel.
When presented with a feature request, you should fight the kneejerk response of: “Sure, why not. Just add it as an option. Another checkbox.”
Careless moves like that are the slow road to disaster.
That new option has all these characteristics:
It adds another code path and another corner case. Because that code path is exercised by 1% of users, it’ll break one day but you’ll only find out many weeks later.
It is less testable (or requires a special new test to be written) When something changes, the special test may break and need to be rewritten.
It clutters your UI with an element that is visually distracting to everyone who doesn’t care for it. Depending on what it is, it may even give your users more opportunity to screw up. Furthermore, your designers will have to struggle with this wart forever.
It represents exponential complexity. This is actually the most important negative effect that will cripple you over time, and the one you must be most vigilant against, because it kills you by thousands of small bites.
The complexity of your system is NOT expressed as O(lines of code). It’s actually roughly O(2^number of checkboxes). Don’t dismiss it as “just another checkbox” and “just” a quick ten-line fix. That seemingly innocuous feature has effectively doubled the complexity. The deeper it is, the worse the compounding effect.