Good, practical book. Concerning what is difficult to predict, time. Wha I don't like are reffers to previous authors book, nevertheless I think that short book is worth refreshing from time to time.
Some quotes:
An initial project estimate is your best guess at the time you make the estimate. The accuracy of that estimate depends on the people doing the estimation and what they know about the project.
Your estimate is a guess, a prediction. It is not fact. If I have trouble estimating my driving time, which has far fewer variabilities than a project, how can you expect your project estimate to be accurate? You can’t, not with the very first estimate you create. You can iterate on the estimate and make it better over time.
Managers and sponsors ask a project team for estimates all the time. Sometimes, managers use those estimates to plan which project to do first—which is a terrible idea. More on that later. Sometimes, managers use those estimates to predict a target date. Sometimes, managers use those estimates as a commitment. None of those ways are the way we should use estimates. Here is the problem with using estimates that way: Estimates expire. Estimates change. Estimates are guesses.
Here’s one problem I have with estimation. Software is not construction. We can’t build software the same way we construct or manufacture something. Software is all about learning and innovating as a team. Some people think that software is invention. Whatever you think about software, it is not construction.
Since software is about learning, and we rarely, if ever, do the same project twice, we are always estimating the unknown.
cautions: Never, ever, ever provide a single date for a project or a single point for a budget without a range or a confidence level. Expect to iterate on the release date and on the budget, and train your managers to expect iterative, improved estimates from you. If you get a ranked feature set, you can provide working product in the order in which your managers want the work done, while you keep refining your estimates. This has to be good for everyone. If you can say this without being patronizing, practice saying, “Remember, the definition of estimate is guess.”
You report all estimates with a confidence range. If you report estimates as a single point in time, people think your estimates are accurate and precise. If you report them as a confidence range, people realize how inaccurate and imprecise your estimates are, and you have a shot of people treating them as real estimates.
Managers and senior architects tend to underestimate the amount of work. They tend to think the work is easy to do, especially if the requirements are clear.
You have options for estimation, once you have met the preconditions. If you don’t have the feature set in a ranked order, you are in trouble.
Managers think they can predict team size from the estimate. You might be able to add more teams and/or people. You cannot guarantee a larger team or more feature teams will meet an estimate, or decrease the time needed. This is the problem of splitting work in the mistaken belief that more people make it easier to do more work. More people make the communications burden heavier.
As you continue to manage the project, track your initial completion date estimate. Each month, or in a short project, each week, take 5 minutes out of your project team meeting, and ask: “When do you think we will finish the project?” Track that estimate on a chart set up with the release dates on the Y-axis, and the date that you asked the question on the X-axis.
Any 100% date I give now will be wrong, wrong, wrong.
It doesn’t matter what kind of life cycle you use, the further out the dates are, the less you know. You can use probabilistic scheduling to help you, the project team, and your sponsors see the risk in the schedule.
Exact estimates are an oxymoron. Estimates that you update? Those are useful. I can’t understand why any manager wouldn’t want those.
The best guess I have is to estimate the number of cycles you’ll need for testing, the duration of one cycle, and the time it takes for developers to fix problems between cycles. Add up the testing plus fixing/cycle and multiply by the number of cycles you think you’ll need, and you’ll have an estimate of the testing time needed.
By the way, when I do this, I never give a single number; I always give time per cycle (“It will take us six days per cycle”), my estimate of the number of cycles (“We’ll need four cycles”), and my estimate of defect-fixing and verification time (“Plus three days between test cycles for developers to fix problems”). That way I can show the costs of not performing proactive defect prevention in a nice way. And I can show my uncertainty in my estimation (“That’s a minimum of thirty-six working days, longer if the defects take longer to fix and verify”).
If you want to reduce testing time and create a low-defect product, test all the way through the project with a variety of test techniques. Use test iterations so you know at the end of one test cycle where you stand with defects. The lower the number of defects and the more sophisticated your tests, the faster your testing time.