Академический Документы
Профессиональный Документы
Культура Документы
Richard Clayton
This is an argument, and like all arguments, it's supports a specific position. I don't try to
defend software estimation; I leave it to my colleagues to present that case. I write about this
issue because I believe the software community needs to have an internal debate about
whether software estimation in its current form is appropriate for projects.
Software estimation is the process of predicting the time and effort required to accomplish
development or maintenance tasks. Estimates are generally used to help customers (this could
be your own organization) make decisions. Customers often want a general idea of how long
it will take to accomplish tasks and since the customer is always right, we engineers have
always agreed to participate in a practice that we frankly despise. We estimate because it's
easier to sell a software solution with a fixed delivery time than to actually admit that the
customer is simply going to get whatever product your team can complete in the allotted
time. The estimate becomes our commitment to delivering a piece of software under some
arbitrary deadline.
Sadly, we commit to these deadlines, despite the likelihood of missing them, and in full
acknowledgement of the consequences of missing our estimates. These consequences
include, but are not limited to:
Loss of credibility with your customer and possibly your own team.
Poor morale, particularly when the team has to work excessive hours to meet a
delivery.
Low quality software if developers rush to meet deadlines and skip quality control
practices like testing.
Project Failure when estimates are consistently off and the customer has completely
lost faith in your team's ability to deliver.
Over the last six years, I've participated in a number of software projects where poor software
estimation has led to very bad outcomes. As a result, I've spent many hours pondering, and
discussing with friends, strategies that would have led these projects to greater success. Given
the difficulty of estimating effort on a software project, not to mention the near-certain
guarantee of getting it wrong, I've come to a radical question...
Tasks not granularly specified - a task is too ambiguous leading to a lot of thrashing
on how it should be implemented.
Task creates new tasks for the same sprint - common with research tasks whose
outcomes include some sort of solution to be built in the sprint.
Estimates made for unfamiliar technologies - trap for developers who inaccurately
estimate the time to completion based on past experience with disparate platforms.
Research tasks with non-tangible outcomes - I've seen people take weeks to
research/prototype some solution. If you don't constrain ambiguous tasks, you're
inviting the task-taker to waste time.
One person estimating for another - common when developer is absent during
planning and another does the estimation for them.
Peer pressure - engineer(s) press another to accomplish a task faster than they
believe they can. This generally happens in high-stress environments when a stronger
personality bullies a developer into working harder.
External pressure: pressure by management to estimate less/more time-tocompletion because of political and financial agenda.
None of these factors should surprise you. In fact, our software estimation processes are
designed to deal with them. Our solution is to apply psychology and mathematical models to
develop better estimates. In fact, I feel like we waste more effort (per capita) than any other
industry analyzing our own development practices seeking better efficiencies.
When you think about it, that's a lot of time and effort lost to come up with estimates that are
going to generally be wrong.
A better appreciation for how much a team can accomplish in a set amount of time.
A nice dashboard with charts that can show individual developer accountability to
management.
Flexibility in planning and execution, particularly if you are planning too far out
and commit to a set of tasks. What happens when your approach changes and you are
going back to the customer to explain a task that was planned to take two weeks will
now take 4 weeks?
Lost resources if you dont have a significantly long project, the overhead of having
someone study and normalize estimations will burden you.
I would like to expand that last bullet. We typically use software estimation as a tool to help
us plan our sprints. How else are we to know how many tasks we should take on in a given
period of time? I contend that this practice really just promotes a host of inefficiencies in your
development process:
Lost effort due to context-switching - Engineers only take as many tasks that fit
within their window (say 2 weeks). This usually means the developer takes a couple
of large tasks and several unrelated ones (hell they may all be unrelated). Working on
unrelated tasks causes context-switching, which reduces overall efficiency since the
developer has to retool for the new tasks.
Lost time due to fragmentation - Just like blocks in a hard drive, you cant perfectly
fit tasks into time slots (3-hour task into a half-day slot). Theres always going to be
some amount of lost time. Of course, you could always reduce the block size, but is
that even realistic (i.e. planning tasks down to the minute!)?
others might gold plate. Ill tell you what I might dotake a nap. Especially, if I just
spent the last four months working my ass off to get a system up and running!
Why estimate?
So I ask again, why should we estimate? The only benefits rendered to our managers and
customers is a prediction that really can't be trusted. The consequences, however, tend to
range from reduced development efficiency, morale issues, low quality software, and
potential loss of work.
4. Development cycles are scoped to tangible deliveries and you should favor smaller
deliveries over larger ones.
Hopefully, I have convinced you (on some level) to rethink the use of software estimation.
The next section discusses principals you can employ if you decide to move from estimation.
Prefer granular specifications - The more granular the specification, the more
accurate you can gauge the scope of a task. This means, don't settle on stories as a unit
of work. Instead, break that story down into technical tasks. Use schema and contract
specification technologies that explicitly define interfaces. Draw mockups.
Essentially, remove the ambiguity from the task.
Group related tasks; prevent context switching and attempt to maximize developer
flow.
Opt for smaller development cycles, particularly if more flexibility is needed. More
importantly, this allows you to demonstrate your work more often and receive
feedback.
Choose the three most important tasks and work on them until completion. Don't
waste your time with filler tasks just because you need to fill a time slot.
Stop and regroup - dont be afraid to stop the sprint if you feel it's necessary. This
might occur if you feel tasks arent specified well enough or if developers are
thrashing (not getting work done efficiently). Take time to organize the team and then
carry on.
Pivot - if things aren't working, or you feel like the team needs to go another
direction, do so. The worst thing you can do in Agile development is not be agile.
Conclusion.
Whether you buy the argument that software estimation is unnecessary, or are still an
ardently supporting the estimation camp, I think we can agree on a couple of ideas:
https://rclayton.silvrback.com/software-estimation-is-a-losing-game