I’ve developed a theory of commercial software development, that has made me more accepting of imperfection, less-stressed and happier with my job. I say:
If you try to do your software development exactly right, the project will fail. If you don’t try to do anything right, the project will fail. If you pick just few areas and do them well, the project has a chance.
Trying to do everything exactly right will eventually fail because doing everything exactly right —total planning, precise requirements, detailed designs, thorough reviews, three types of testing—is a huge effort. For all but the most complex of projects, a lot of that effort is wasted. Wasted effort means whoever is paying for the software is paying too much money for what they get. <yoda-voice>Wasted-money leads to tension. Tension leads to disrespect. Disrespect leads to distrust. Distrust leads to failure. Failure leads to suffering.</yoda-voice>1
At the other extreme, not doing anything right is a shortcut to failure. People don’t study software engineering for years and years because it is simple. If a team goes at a software project without planning, requirements, design or testing, they will probably produce a lot of code, but not code that does what the person who is paying for the software wants it to do.
The successful projects I have worked on have taken a middle road. They take limited resources and a non-trivial problem and work out how best to apply one to the other. My theory is that, if you do just a few things really well, it alleviates the pressure in a whole range of areas.
Here are some practices I’ve used, and their effect on the project.2
Each practice affects many areas of the project; picking a good range of mostly non-overlapping practices markedly improves a project’s chance of success.
While there is no magic recipe, exactly which practices the team chooses to do doesn’t matter as much as that they do choose some and then do them.
I don’t stress when the project isn’t doing everything right, or even when it isn’t doing all the things that I think it should be doing, so long as some things are being done right and nobody is trying to do everything right. I have a much better tolerance for software development process “imperfections” than I did a few years ago. In fact, I always welcome a few.
1It’s rare for a team of more than two people to agree on what ‘exactly right’ means anyway. Disagreement leads to tension. Tension leads to…
2I’m not recommending any or all of these for your project. You decide what’s right for your project, and why.
Comments
Is that some wisdom I detect coming out in sympathy with your greying hair? ;)
By the way, I reckon that, regardless of the success of the project, humour is a vital ingredient to being a happy programmer.
Satisfaction in software development for me comes from two things:
Maybe this can be rephrased as:
"Choose a quality setting low enough to ensure project completion but no lower"
I have to agree. This past year has been based for me on two principles:
Don't cut corners on small projects (even if the customer wants you to).
Don't make a big project into a huge project (even if the customer wants you to).
Some people might balk at my non-customer centric approach, but really, there are times when customers want you to cut so many corners you have a circle, then six months later wonder why things didn't work out as they had planned.
A good philosophy to apply to most projects... gardening ... cooking ... bring up children...
Wen I pr0g I f1nd that dr4w1ng it helpz meh.