Archive for May, 2009

Waterproofing is waste

May 20, 2009

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 .

That’s not a wall, it’s a ceiling

May 13, 2009

Why is software development work so difficult to make reliable estimates about?

If you asked someone to plaster a wall in your house, they would look at it; feel the surface; test it for moisture and loose material; think about the weather; then measure the wall and see how many square metres it was. Then they would tell you how long it would take and if it was wrong by more than 10% then you would probably be unhappy.

If you did some software development work and you missed your deadline by 10% no one would be surprised. Software projects don’t hit their deadlines; in fact deadlines might not even be important. In fact, if it worked at all they will probably be quite pleased.

The question is: why not? One conversation I had about this led to the insightful comment: when you do software development and you think “I’m going to plaster this wall” you make some estimate but as soon as you start working you find out that it isn’t a wall at all! You quickly find out that the wall has become a ceiling made of rubber. Or it’s a door that leads into a lift shaft. The concepts in software are — well — soft! My wife took an alternative, less fanciful, view: that it was like trying to get someone to estimate the job when they only hear a description on the phone. The person that is describing the work doesn’t realise what all the important things are; doesn’t know how to find them and even if they are told what to look for, they don’t know how to see the important things.

So, what do we do? Give up making estimates or try and make the software process mechanical? I think that the kind of problems that we see with estimating software development are more akin to things experienced in creative design work. Software isn’t changing that fast; even though the technologies evolve rapidly the core ideas are the same as they have been for 30 years. The question is why isn’t that producing repeatability? The answer is, I think, that there isn’t a clear body of knowledge like there is for civil engineering and there isn’t a professional development program that is embedding it.

Thanks to Jaspreet for his insight into plastering and software development!