BEstimation – The Best Practices of Software Estimation
We've all been bitten by poor estimation, whether by our own hand or someone else’s.
I estimate 87.3% of estimations are made up on the spot.
I'm not going to cover yet another estimation method or propose top down or bottom up approaches. Suffice to say there are few ways to estimate a complex or large software project that are little better than 'guestimation' or 'gut feel', however much process and technology is thrown at it. As withnessed by the attempt to apply engineering rigour to a field more unlike engineering than just about any other, the result has always been the same 'Software Crisis'.
Please read this great post (How I Learned to Stop Worrying and Love the Gantt Chart Bomb) for a specific take on the misuse of the evil Gantt Chart.
But what I do want to do is highlight some of the pitfalls that businesses, and IT fall into with regard to estimation. Caveat Emptor – as Baz Luhrmann says, my advice has no basis more reliable than my own meandering experience… I will dispense this advice now. Oh yes, and wear sunscreen.

So here we go, these are the things to adopt as best practice (maybe even estimation 'Governance'), and the reasons why:
1. Treat software estimation as a discrete skill.
It doesn't matter so much if it sits in IT, the Project Office or some other department, but it should be a discreet, recognised and rewarded skill that needs training, mentoring and practice.
Programmers get a degree and years of practice, only to end up as Project Managers, Architects, Analysts and Technical leads. This happens without any formal process. But at least these are seen as specialisations – estimation itself is just lumped into a skill set they are presumed to have as an innate ability without any education or practice. IT managers (you know who you are) prefer to ignore the fact their own very best software estimate was a leap of faith with more in common with art and social science than programming.
In fact, programmers have a very limited view of what goes into delivering software, beyond the code they write. It is also the case that programmers are often ill suited to these roles, including estimation, but that's another post.
2. Close the loop.
Feedback. The results of your chosen estimation method must be compared with the project outcome. Do not presume that the people doing the work were too slow, maybe the estimate was wrong? But in reality it is usually other factors that doom projects to being late or an utter failure, well before a single hour has been estimated or a line of code written. A blame free project wash-up is better than hearing it in a series of exit interviews!
3. Do NOT get those who will do the work to estimate it.
This one is a doozey, but most organisations fall into the trap. It seems to make sense to work to your own estimates, but in reality it has significant problems:
a. Junior, inexperienced or just plain shy staff will match an estimate to their perception of what is expected, to peer or to management pressure. They want to make a good impression, so bust a gut (all-nighters anyone?) to meet those estimates. If they do (without major quality issues) they are rewarded for a bad estimate with a future expectation of very low estimates and too much work. If they don't there is rarely any consideration that their work rate was actually fine, but the estimate was bad. Even if there is, they are still perceived to have failed in part of the 'software delivery' process.
b. More wily workhorses will have a better idea of how long it will take, but will always add a fudge factor, but may still not want to rock the boat or loose face. Again they have extra reason to work to that (their) estimate, even if it can, or can't, be done in half the time.
So what should happen?
Get a skilled software project estimator. Even if they can do the actual work (they probably are, or were, a programmer) they shouldn't. These mythical beasts will factor in all the things us mortals forget, have equations for normal distributions, research on resourcing levels and matrices on coding effort and complexity we just won't understand. Developers will have to provide input for them, and that will be an ongoing task during the project, but the programmers won't come up with the actual impartial numbers.
You will then have a better chance of discovering if the estimate was wrong early on (the dev won't be backward about saying 'you are joking!'), and you will have better feedback afterwards to identify where the process fell down, be it in the project frame, management, estimation, technology, human factors, or software dev. Combining the work and estimate is like changing two variables in an experiment at the same time – you can't hope to separate the influences, so you'll never be able to get good feedback to improve the process.
4. An estimate is costly, so spend it, or don't estimate at all!
If you aren't prepared to spend what could turn out to be a significant amount of time and effort investigating a project, you won't get an estimate worth having. This is a chicken and egg thing – for anything novel, as software projects tend to be, you have to do a reasonable percentage of the work to have a handle on how long it will take to do it all.
My advice here, if you aren't going to spend the time and money on a good estimate, is just get started without one. WHAT I hear you cry! Well, why not spend the time on real planning, architecture and design tasks that will inform your timescale anyway? I've lost track of the times I've given the required estimate, only to be told the delivery date is fixed – why did we waste each other's time in that case?
5. Don't estimate a moving target ,or a mirage.
Sorry about the mixed metaphor there, but there are classes of projects that you just can't estimate. They are complex, high risk, multi-disciplinary, bleeding edge etc. If it fits the definition of a wicked problem, step back. You’re first going to have to get the vision nailed down, get the stakeholders to agree and go through a seemingly never-ending process of meetings, and all project long communication.
I don't mean projects can't change and evolve, but you have to have agreement on what the project is first. Shared understanding, leading to shared commitment. Cognexus, Issue Based Information Systems (aka Dialogue Mapping) and Compendium can help you here.
And if you have a risk section in your process that's in the 'High' segment overall, you may have to sort those out before you can even consider an estimate. Remember, those risks need to impact the bounds, accuracy or confidence level you give to your estimate
But even after all that, you may have to accept that a project just isn't "estimatable" to any worthwhile degree of certainty.
6. Don't deliver an estimate in double figures.
This statement might sound weird at first, but match the scale of the estimate to the figures given. I would expect estimates like 3 days, 1 week, 7 months, 1 year. If you are doing anything that isn't production line, I would argue you can't estimate to any greater level of accuracy. If someone presents you with an estimate of '34 man-days', throw it back. If they hit that it will be a fluke, or worst a carefully orchestrated conspiracy.
Likewise for your confidence level – not that I've ever seen a process where this is much more than a guess, so I generally don't like them, but try to ensure any figures match your capability to calculate those bounds.
My preference is to couch the estimate in the appropriate units to indicate your level of confidence, and give a relative scale if more detail is needed, rather than a figure.
Conclusion
What's all this got to do with SharePoint? Well, SharePoint provides a powerful but complex platform – it can be used to leverage your solution, or it can sink you in a world of XML and customisations. It requires rare skills and developer discipline across a wide range of technical areas. So it's a risk factor all in itself and can tip a problem into the 'wicked' space, making estimation at best wildly inaccurate.
I hope I've triggered some estimation déjà-vu with these 'best practices'. Everything I've read on estimation tends to focus on a method or process, and ignores the human element. In software as in any endeavour, you ignore that at your peril. Work with human behaviour, don't ignore or fight against it. So to summarise:
Educate, train, mentor and reward people for improving their estimation skills.
Perform 'no blame' wash-up that aim to improve ALL aspects of the project that will result in improved estimates.
Promote estimation as a discreet job or skill set that is not part of, and does not lead on to, performing the task.
Don't ask for quick estimates if the task isn't quick – if you can't estimate it, don't force some poor snap to gamble that they can.
If the project is a fluid mass of politics or technical complexity, solve those issues first.
And even then, remember sometimes you have to start on the journey to know if and when you can get to the destination. Software is not yet, and probably never will be, like engineering with it's anchor in the physical world.
Use units people can relate to.
And dance.

The end of another MOSSuMS post