Following on from previous rants on developers doing work for the users and not spending time working on things that are just for their own satisfaction (see Productivity Over Perfection and Quality is a Feature). I’m now turning my attention to people who are coding their applications as if they were writing the core of the .NET runtime. All the endless perfection of the object model and obsession over performance; all those little things add up. And what do they add up to? They add up to features not delivered. They add up to people not getting the software they need to do some real work. You know real work; it’s the stuff that people do when they don’t work on software. You know like getting people’s pensions paid properly; or getting those reports out in an hour so the accounts team can go home on time; or adding that extra link to the mapping widget so people can track their orders.
We all know that developers love developing; what they particularly love is developing little things that no one needs. This goldplating is not really working, it’s playing and you don’t do crossword puzzles in work, do you? However, small things are waste as well; waterproofing something that will never see water is a waste. So is endlessly checking input parameters for being null or endlessly perfecting the layout and naming of classes. You know what: write a test, make it pass. If you have some spare time when there is literally no other work then you can come back and play. Or more likely, go home on time yourself, for once.
In the end though, when the project is over, will people remember that it was delivered late or will they remember that it was perfect when it finally showed up? It may depend on how often you do it. If you are always late then people might start getting the message and asking someone else who can deliver something good enough, but deliver it on time.
The polishers will tell you that their stuff is so much better that it justifies the extra time. This is pure sleight of hand. You just can’t tell how a piece of software will turn out, especially if you are developing business software and running to catch up with a changing set of requirements. If you don’t deliver approximately on time, then no one will care about how perfect it was; they will only care that the requirement has now gone away as the business has moved on. And frankly, to anyone who isn’t a nitpicking nerd, perfection is simply irrelevant, uninteresting and unobtainable since it all changes next year when the new law/manager/technology comes in; having working software is much more important.
Remember this isn’t hacking; this is being good enough, but no more. If you are writing cryptography software then good enough has to be very good indeed. If you are writing a shell script to copy some files then copy ‘n’ paste is probably your friend. Of course, the real trick is to know how good is good enough? If you are working on a stable problem then you can take your time and keep it clean, but there are always little corner cases that won’t lie down so perfection will keep retreating anyway.
If you are spending excessive time waterproofing your code then you are wasting time and money, and if you are a paid employee, neither are yours to waste .