I live in a pretty good neighborhood and get to know it by running around in it most mornings. It’s nice — for the most part. But there are these places. Houses slightly in need of a paint-job with two-car garages and two cars parked in the driveway. On some days, when those garage doors stand open, you can see what they hold. And it isn’t cars.
Wood-working projects, refrigerators, piles of boxes from moving that haven’t been unpacked after several years, toys, toys, more toys, motorcycles, disassembled vintage cars on blocks, old Christmas trees, bikes, snowmobiles, hockey nets, stacks of soda from Sam’s Club. Garages so full of non-car stuff that they can’t fit a car in them.
So too with software. We have our own garbage garages.
In the tidy neighborhood of our design we have pockets of garbage — structures that are not used for their intended purposes, designs that fill up with so much unessential stuff that we can’t see the design for the garbage. Sure, we might hide it behind a tidy API garage door, but it’s still there.
And it happens at all levels of granularity: functions with while loops that have no coherent termination criteria; inheritance hierarchies with no (or a deeply compromised) basis for inheriting; subsystems with dark pits of dysfunction that lower the value of their entire neighborhood. These are the code smells, the anti-patterns, the legacies of past generations of developers.
And garbage breeds rats, and rats breed plague, and now my metaphor has fallen apart…
But I’m as guilty as anyone, so I’m no one to sermonize. I guess we just have to make an effort to actually clean up our garbage rather than just close the garage door to hide it. It doesn’t fool anyone anyway — there are still two cars sitting in the driveway.