Previously I defined an accurate estimate as something that will:
- Give you an understanding of risk and unknowns.
- Quantify the known work.
- Be something that you can base a big decision on.
- Be refined as new information becomes available.
- Be a range with a 90% confidence interval.
Identifying Risk and Unknowns
It is inevitable that there is risk associated with the software you're building. Risk in a software project is typically associated in one or more of the following areas:
- Blocking another project.
- Being blocked by another project.
- Requirements or scope that haven't been defined.
If we understand the areas that pose risk to our project we can use that information to inform our estimate. Your project may need additional time to coordinate with another team. You may need to account for another projects schedule and/or risk.
Blocking another project
While blocking another project many not sound like something that needs to be taken into account when estimating software it can actually be the source of unexpected work. The other project may have requirements for your software that you're unaware of. You may have to make last minute changes to your software to account for these requirements. This is especially true if the other project is a higher priority project for the company than yours.
It's important from an estimation standpoint to understand if there are other projects that need to consume your software. If so, how well is the dependency between your project and theirs defined? Does the other project take direct dependencies on your software (for example by compiling against your library)? If you're providing a service how well is the service contract defined?
When you update your software what are the downstream effects on consumers of your software? Does your software require versioning?
Being blocked by another project
What other components, libraries, or services does your software depend on? Have they already been shipped? If so how do you deal with updates to the software? If the software hasn't already shipped, are their milestones known?
What happens if they can't deliver or aren't able to deliver in time for your project to meet it's goals? Do features in your software get removed? How long will it take to remove or update the affected components?
Requirements that haven't been defined
Blocking another project or being blocked by another project are not the only sources of undefined requirements. Additional requirements many come from your product owners due to under-defined user experiences or user interactions.
Are there mock ups of the user experience and user interaction? Have static web based mocks that people can touch and feel been built? Are all the transitions defined? What state does your application need or maintain?
While attrition is often difficult to account for in the actual estimate, asking yourself some attrition related questions will help you identify work that should be accounted for in your estimate.
Does your software require a specialized skillset or tools? How long does it take to aquire the tools? What's the ramp up time to learn the skillset? What's the lead time that it takes to hire someone with the needed skills or platform knowledge?
In my next post I'll explain how to quantify the work that is known.