Project Estimation
- Posted by Keith Casey on October 26th, 2005
- Keith Casey's blog
- Login or register to post comments
While on the train heading to Paul Graham's Startup School, I brought along quite a bit of reading material. I was hoping to sleep, but I was also hoping to catch up on some reading while I couldn't be distracted with various tasking, email, etc, etc.
For example, the first thing I read was an article on "Software Development Cost Estimating" and I dug into it with interest. I happen to have a very particular way that I do my estimating - which seems to be quite accurate by the way - but I'm always looking out for more and better methods. This wasn't one of them... let me analyze this one step by step.
Step 1: Create an accurate estimate of the project's overall size.
So in order to estimate the project, I have to estimate the size of the whole project? Hmm... sounds like time for a WAG to me.
The two most common metrics for this step are determining either the number of lines of code (LOC) or the number of Function Points (FP).
Alright, now this is more like it. I've never been a good LOC estimator - even when I'm writing the code - but Function Points is something that I can understand. I know that implementing a "Search by Name" function is probably trivial while a "Search by any subset of Name, Date, Shoe Size" is a bit more effort.
Step 2: Estimate the number of person-months or person-hours necessary to reach the LOC or FP estimates.
This screams "The Mythical Man Month" to me. Fred Brooks must be rolling in his grave*.
Step 3: Convert the results of Step 2 to calendar months.
Alright, put it against a calendar. Makes sense, let's move on.
Step 4: Convert the results from Step 3 into dollars.
Multiply. Got it. And that's it... those are all the steps described.
Now I admit that the core points of Project Estimation are covered... but this still feels inadequate.
Let me describe how my tactic varies. I do #2 completely, but I actually expand it and break each area down into smaller and smaller pieces consisting of classes, functions, modules, databases, tables, reports, screens, or even individual functions on a screen. Is this a bit neurotic? Quite possibly. Does it work? You bet.
In fact, it allows me and the rest of the team to track tasking to a finer detail and determine which tasks have run over/under and then ask why. If one task took double the projected time, we immediately know how that affects everything else. In addition, similar tasking can be grouped together and/or parallelized in order to benefit the project as a whole. I believe it allows us to track the project velocity and allows to be schedule tasking towards my team's strengths from day one.
Personally, I feel the best when I can break tasking down into tasks of 5-10 hours each. It is enough to alow someone to get started, make progress and sometimes wrap it up in a day and other times have some time to think about it between starting it and finishing it. Now, just because I break things down to this detail doesn't mean the client sees the end results.
* [When I wrote this, I was pretty sure that Mr. Brooks was dead. I've now found out that I was wrong and am only keeping this in here to have a complete record. Mr. Brooks, I do not wish harm upon you and hope you continue sharing your insights and wisdom with those who have come after you. Thank you for what you've already shared.]




Why Cost?
I am a web programmer and I see your blog as a helpful tip for beginners like me. Like what you have said, cost is an interesting topic to discuss. In fact, cost management can make or break a project. I realized that the first time I developed a game like software.
intuition based estimation
This may sound non-analytical, but I've actually found intuition to be a good guide when doing estimates. Most developers (and managers who've built software) have a pretty good idea how many days it takes to build a given feature or eradicate a known bug. What undermines most good estimates are the details that aren't known until implementation begins. For example, it may be trivial to create a user login feature, but experience tells us that you also need mechanisms to let the user update the password or recover from forgetting it.
To that end, your effort to elaborate on a functional requirement is probably the best defense I can imagine.
One PMP's method
Sometimes it's easier to get the dba and lead developer into a room and let them brainstorm some of the development thinking. Let them whiteboard it for awhile until there's a very clear networked path of milestones. At that point I usually grab the marker and start turning everything (including components, littie apps that feed each other, even stubs) into work packages. This is a great way to get a WBS going on the fly. At some point when everybody is in agreement and the work packages are mapped out all nice and neat either in a picture or on my laptop in MS Project, people are thinking how long each "piece" of development is going to take. This could mean building an XML DTD or creating applications -- whatever. There is a creative flow and immersion that takes place where everybody knows who they are and how they work. Once I get them to estimate the hours, I usually add 20% to everyone's time -- and then in MS Project I change them from 100% dedicated to 85% dedicated because I expect them to be distracted at least an hour a day by some other task or work. All of this may seem elaborate to you but it only takes a couple of hours and the results are surprisingly accurate. For small projects it's good to try levelling. For bigger projects it's a huge mistake to level anything - just link the tasks and dependancies manually according to anticipated handoffs (my .02)