Estimating and Planning and monitoring day to day development is a lot of what's involved in the job of a team leader. This is the approach I take to this, I don't claim to have created any of this, rather it's just the collection of agile methods and tools that I find useful. This is what I do for sprint planning every 2 to 3 weeks. When doing ball-park planning for a longer period I follow the same basic process but at a less granular level with corresponding drop in accuracy.
Before Planning
There are a couple of questions that really need to be answered pre-planning. This is the side of planning that's often not visible to the juniors in the team. It's the bit that gets forgotten about and contributes to that wonderful "I don't know what my manager does, but when they're away it all goes bad" feeling in so many well run development teams.
The two questions you need to answer are
- How much time do you have?
- What are you trying to do?
How Much Time Do You Have?
The whole point of planning in an agile project is to commit to a given set of tasks to be delivered at the end of a sprint. To do this you need to know how much time your team actually has available. This can look like quite a daunting question, there is any number of meetings, sicknesses and other distractions to take your developers away from your sprint.
The good news is that it actually doesn't matter that much, all of these things can be rounded up into "good enough" percentages or buckets so that they balance out over time. If it all goes horribly wrong, then you can always stop and re-plan. There is a cost to this but there are times when it is necessary.
Like all managers, my worlds seems to revolve around a series of spreadsheets, so of course I use a spreadsheet to work out how much time I have available. Nice and low-tech. Basically I crate a table like the one below. The days of the sprint (or period being planned) down the left and how many hours each developer will be contributing to the sprint.
Bob | Mary | Alice | |
Mon 17 Oct | 6 | 6 | 2 |
Tues 18 Oct | 6 | 6 | 2 |
Wed 19 Oct | 0 | 6 | 2 |
Thurs 20 Oct | 0 | 6 | 2 |
| |||
Total | 30 | 48 | 14 |
Grand Total | 92 |
I plan based on 6 hour days which gives enough time for the general meetings, interruptions, email and the like which is just part of a normal day. When I have someone new in the team that's still coming up to speed I scale back the amount of hours they logically contribute to take account of the lesser productivity and impact on the other members of the team. E.g. in the table above Alice could be new and while working exclusively on my project is only logically contributing 2 hours.
It's tempting to extend this to try and account for the difference in productivity between Juniors and Seniors. But I find that this just complicates the process and warps the results. The standing differences are easy enough for the team to take into account while estimating as they know each others abilities. The reason we decrease hours for a new member is more about the fact that they're an unknown quantity to the team and at least a part of their contribution will be cancelled out by training and support time from the existing team members.
So now that we've done that we've got 92 hours right? No. In addition to the usual non-project stuff that's covered by assuming only 6 hours a day, there's generally an amount of project stuff that needs to be accounted for but is not so easily quantifiable as tasks. This is things like support of existing versions that are already deployed, supporting testers, technical writers and other members of the wider team and even fixing show-stopper bugs that block testing of your last sprint (there's never any of those right?).
I find it's good to actually track these things as it creates visibility on what the team is doing and provides a good bell-weather to see if these things are getting out of hand and derailing your planned work. I generally pick a reasonable "hours per day" number for the entire team and then multiply by the total number of days regardless of the number of developers. E.g. I'll generally pick something like 2 hours per day for "general support", so in a 7 day sprint I'll have a 14 hour bucket task for support that the developers can draw on.
If these bucket tasks start to blow out above your allocated time then it's time to re-plan because something unexpected has happened. Generally these estimates can be refined sprint to sprint by looking at how much time the developers actually spent on these buckets.
One thing to remember about buckets is that unlike time-boxes they decrease as the sprint goes on. I don't care if you haven't done any support all sprint, you can't do 14 hours of it on the last day.
What are You Trying to Do?
The other key question you need to answer is what are you trying to do. What are the candidate tasks. This may seem obvious but I find the biggest single indicator of how good planning will be is whether the feature is broken down into good sized tasks before we actually start planning.
I find it makes planning work a lot better if the initial breakdown and approach have been thought through before hand by at least one person. The key is that this pre-planning breakdown is only a straw-man and a starting point. It will change during the planning but it helps to have a starting point to frame the discussion.
There are three things that I consider when breaking down tasks for planning. These are the same things that I consider when breaking down tasks before planning and during the planning session.
- Small
- Testable
- Independent
I try to break features into small enough tasks that they can be completed in 2 developer days. That's 12 hours based on my 6 hour days. This is not a big period of time. The reasoning for this small size is that if you get much bigger then the details tend to be forgotten during estimation and the estimates become overly optimistic. Developers will need to constantly re-estimate the time remaining on each task as they work on it. Having such small tasks makes this easier as the developers are only needing to think a couple of days out at most during this re-estimation.
There are cases where you really can't break things down to this level. Generally this means that you really don't know enough about what you're doing to get an accurate estimate in the first place. In these circumstances you generally need to just allocate a time-box to investigate the issue. The core deliverable in this case is not actually the change it's self, but the broken down tasks to be estimated in the next sprint.
Equally important is that each task results in something that is complete and testable. The main reason for this is to avoid thinking something is done then having to come back and re-work it. If the task results in something that can actually be tested then you can be far more confident that it's done and dusted and you won't need to come back. This also means that you can't generally split off the non-coding tasks. Each task needs to include the code change, unit testing it, updating the documentation, development guides, handover of the task to testing etc. This means that 12 hours is starting to look really short indeed.
There are some secondary reasons for this which are worth keeping in mind. Because each task is testable, it's also visible to the project sponsors. This avoids the situation where it appears there is no progress because infrastructure is being worked on first. This allows for a tight feedback loop that can nip problems in the bud. The other benefit is that because everything is testable, system testing can take place on nightly builds or the like as soon as the task is complete. This can result in bugs being found and reported while the code is fresh in the developers mind, reducing the cost of fixing them.
The final criteria I aim for is to keep tasks as independent of one another as possible. The goal is to allow as many tasks to be done in parallel as possible. If this is forgotten about you can get chains of tasks that while effort wise will fit in the available resource, will not actually fit in the time allocated to the sprint because they can only be done one at a time. There will always be some dependency but they key is to avoid this where possible, but if it can't be avoided, at least identify it to ensure the first tasks in the chain are done early in the sprint.
For all three of these concerns I generally find that taking a vertical slice through the feature is a good starting point and then enhance around the sides. This does mean you usually have a first task that has to be done, followed by several enhancements that extend the edges. These enhancements can generally be done in any order and even done in parallel you have enough developers.
For example, take a slice through the entire system, add a screen, service and data access layer that don't really do anything but get the communication happening. Then add one field or function into all three levels. Rinse and repeat. It's always tempting to break the feature down by levels, e.g. do the data access first, then the service, then the screen. This is problematic though, because you don't know that you won't have to revisit the data layer when you do the screen.
Tools
All the above is really just general approaches it doesn't require any tools beyond a spreadsheet. That said the right tools can make this easier. Particularly if you can do the breakdown and planning in the tool you're using to manage your backlog it avoids a lot of double handling.
Personally I use Jira with the greenhopper plugin. These are not free tools but they're not overly expensive either. Jira is our source of truth about what we're working on and what is coming up. All tasks, features and bugs are raised in Jira.
Greenhopper gives some nice tools for working with the above process. A virtual kan-ban board (those post-its that people get so focused on when they hear about agile). There is also good support for doing a the burn-down and other charts that are useful for monitoring the work in progress.
On the planning front, Greenhopper provides a really quite stramlined UI for triaging, ordering and breaking doww tasks as they come in which lightens the load of doing this stuff.
Comments !