That last post was pretty discouraging, I suppose. So, given that we have to at least try to plan things, what do we do? Some ideas:
- Iterate. Start with a rough idea and refine it as you go. In the meantime, keep track of your actual durations as you implement function points. This way, you gather momentum as you go: you understand the problem space better, you have better data for future estimates, and your customers get more chances to look at your deliverable.
- Plan anyway, but expect uncertainty. Don’t expect to lock yourself in a room for a week, write the perfect plan, and then follow it exactly as is to completion.
- Have contingency plans in the event that something goes wrong. They don’t necessarily have to be finely detailed, but you should try to come up with likely risks and come up with a way to mitigate each one. IMHO, the plan itself is less important than the fact that you have acknowledged the existence of the risks. The worst thing that can possibly happen in a software project is to proceed happily along toward a risk with no idea that it’s even there.
- when you estimate, attach a confidence level to it. In the early stages of the project, your confidence will be low; as you go on, it should get higher.
- Separate out the “boring” parts of the project from the “risky” parts. That is, in there _are_ some elements of the project that you can estimate with high confidence. There may also be some areas where you are engaging in pure research. If you can keep the critical path to mostly predictable and boring stuff, and keep the R&D stuff off the critical path, you are less likely to be derailed by unforeseen issues.
- Attack the biggest unknowns early. Fail early, if you’re going to fail. Ideally, if you have your team in place for the whole project, the architecture and development team can work on prototyping and solving any R&D-type questions in the very early stages of development. By the time that you have a solid set of use cases and are ready to get into full-on development, most of your techincal issues should be solved.