I’m a firm believer that all work should have an agreed end date, but end dates are always a bone of contention and cause endless confusion and wasted arguments and disagreements. These usually hover around the “when will we be finished?” question and, more to the point, no properly defined (empirical) way of working it out.
That in mind I thought I’d lay down the process we use to arrive at our end date. I will also attempt to do this without using the word scrum or agile, not because I don’t like or agree with them, but because those words tend to create predefined thoughts and have a life of their own (unfortunately).
So first the basics: In a nutshell we work in iterations, releasing something (hopefully of value) every 2 weeks based on a prioritized backlog. The backlog is constantly updated as stories are added / removed / completed.
Now for the fun. In order to calculate an end date with reasonable empirical accuracy you need the following: remaining effort and an average effort per sprint / day the team is capable of.
Effort is difficult to define but key to the entire process. Everyone should agree and understand what is meant when we say “X amount of effort”. What you must realize is that it does not matter what unit of measure you use to define your “effort” as long as:
- it is consistently used across all stories
- it is understood by everyone
- something of effort X closely matches another thing of effort X, for small values of X.
- the units should increase roughly exponentially. This is to allow for indication of greater uncertainty with significantly higher numbers. Some people use the Fibonacci sequence (1, 2, 3, 5, 8, 13 …). Also remember to allow for zero effort.
We struggled to settle on our effort scale but eventually had to settle on a time relative scale (for various reasons):
- Very Easy (1 point) – roughly a day to complete
- Easy (2 points) – between a day and 2
- Medium (4 points) - roughly half a sprint
- Hard (7 points) – roughly a full sprint
- Epic (20 points) – unknown or way more than a sprint
and of course 0 points for quickies.
Effort per story
Assigning effort to stories is an exercise the entire team should do but failing that at least the majority of the team. Stories should also be continuously rechecked to see if the effort is still correct, especially stories with high effort assigned to them.
The process we use is as follows:
- Discuss the story
- Vote on an effort, if there’s dispute, use the highest of the choices, if there’s huge uncertainty, assign the highest effort.
- Rinse and repeat
Remember also to compare stories of similar effort. Another way or form of checksumming is to, during planning, assign tasks to the story (as in what you’re going to do to achieve the story) and then assign a rough hour estimate to do the tasks. Sum up the hours for the story and an equivalent effort story should probably have a similar amount of hours, although this is only really useful for well understood stories.
Average Effort Per Iteration
Calculating the effort per iteration (sometimes called the velocity) is a matter of adding all effort units (points in our case) for all completed stories for a sprint. It’s important to only tally up completed stories or the whole process is pointless. Average effort is just the sum of the effort for X number of iterations divided by X. Obviously the more data you have the better. What we also do is remove the highest and lowest values (as anomalies) from the calculation, to account for those strange iterations (over Christmas, Easter etc.)
Remaining effort is simply the sum of all effort that has not been completed.
Calculating the end date then becomes the following:
By Day: date today + (remaining effort / average velocity / number of work days in iteration) divided by 5 and then multiplied 7 to account for weekends = your end date
By Iteration: current iteration number + (remaining effort / average velocity) rounded up to whole number = final iteration of work, end of iteration is end date
and that’s it, you’ve predicted a future date based on historical data using a reasonably empirical method. You can improve the accuracy of this estimation by doing the following on a regular basis:
- Re-evaluate the backlog from an effort point of view, focusing particularly on high effort stories.
- Recalculate your average velocity at the end of each sprint and factor it in.
- Factor in holidays and leave into your calculation.
Comments or suggestions welcome