We're pretty bad at estimating software development costs. I rely a lot on gut feel for my estimates, but I'm doing research today to see what I can learn from others in being better at estimating software development.
- Don't forget to include time for testing, some debugging, deployment, training others how to use what you built, and documentation. Those areas usually get overlooked when coming up with a software estimate.
- Break the project down into components. It's often easier to come up with a cost estimate if the entire project is broken down into smaller, more manageable pieces.
- Quote the project one module at a time. When estimating large projects, it's often very difficult to estimate the cost of the project that will take many months to complete with all of the features the client has asked for. Rather than trying to come up with one large number, come up with a smaller, more manageable chunk (an initial release, for example) and estimate that. Don't bother estimating what the next release will be until you've finished the first early release.
- Don't forget touch points. When estimating software we need to count and remember the number of "touch points" -- the number of points where two systems need to interact. Here are some examples of touch points:
- Integrating with another API
- An email is sent when a certain condition occurs
- Two users need to do some action in order for something to happen (e.g. friending each other on a social network site)
- The system needs to talk to two database systems
- Look at what similar projects actually took (not what was estimated).
- Don't forget learning curve time in estimates.
- Identify and beware of areas that are high and low risk. A part of software is "high risk" when there is a lot of uncertainty as to how you're going to try to solve a problem. Examples include relying on another API, using new software or tool, trying something that we don't have any experience doing.
I look forward to studying this topic more in depth and becoming better at estimating software.