How to deal with uncertainty when planning time and cost in software development?

Estimating the time and cost of a software development
project is a notoriously challenging task. Software projects don’t follow an exact formula. In fact, estimation is not
an exact science, but rather a blend of art, experience, and constant adaptation. Let’s explore why this happens and
how we can improve this process to deliver quality products without unpleasant surprises.
The challenges of estimating software projects
Estimating software projects involves many variables
and uncertainties. After all, software is a “living entity” that evolves and adapts as new ideas emerge and the
context changes. Unlike building something physical with static requirements, in software, everything can change halfway through,
and it usually does! Here are some of the main challenges that make estimates so complex:
·
Undefined or changing scope: Projects often start with incomplete requirements or ones subject to change.
If we don’t know exactly what will be delivered, any forecast of effort or deadline becomes inaccurate. Frequent changes
in scope during development directly impact initial estimates, which quickly become outdated.
·
Pressure for unrealistic deadlines: The need to meet market expectations or client demands can lead to overly
optimistic deadlines, based more on wishful thinking than data. Under pressure, teams often underestimate the actual effort
required, resulting in delays and additional costs later on.
·
Complexity and technical uncertainties: Each software has its technical peculiarities. Integrations with legacy systems,
unexpected bugs, performance challenges... Technical surprises are common and hard to predict in advance, affecting the schedule.
·
Variations in team productivity: People are not machines. Factors such as team experience, familiarity with
the technology, member turnover, and even motivation influence the work pace. These variations make it difficult to estimate
with consistent accuracy across all tasks.
All these factors explain why estimation is not
about predicting the future, but about creating forecasts subject to a margin of error. As project managers say: “The
only 100% correct estimate is the one made at the end of the project!” Jokes aside, understanding the challenges is
the first step to handling them better.
Software: a living entity in constant change
A useful way to view software projects is to think
of software as a living organism. During development, it grows, transforms, and reacts to its environment (new business needs,
user feedback, technological changes, etc.). Just like a living being, software needs to evolve to remain relevant. This dynamic
nature has direct implications for project estimation:
At the start of a project, we know very little about
the “organism” we are going to create. Details are hazy and full of assumptions. Unsurprisingly, initial estimates
tend to have a huge margin of error. There’s even a classic management concept called the Cone of Uncertainty that clearly
illustrates this. This cone shows that, in the early stages, uncertainty is huge: the time estimate can vary from 60% to 160%
of the actual value! In other words, a project initially expected to last 20 weeks might end up taking anywhere from 12 to
32 weeks. Only in more advanced stages, when requirements are better defined, does variability reduce to around 15%.
The Cone of Uncertainty, as conceptualized by Steve
McConnell, teaches us two valuable lessons: first, it’s an illusion to think we can have precise forecasts right from
the start; second, it’s essential to refine estimates continuously as we learn more. Planning in software projects should
be an iterative learning process, adjusting expectations as the “living entity” reveals itself.
Consequently, insisting on treating an initial plan
as immutable is a recipe for problems. Imagine declaring a project successful only if it strictly meets the initial schedule,
budget, and all functionalities defined at the start. Sounds reasonable? In reality, this view is dangerous and incomplete.
It doesn’t acknowledge that investments, deadlines, and even objectives can (and should) be revisited periodically as
the context changes. A project that freezes all functionalities from the initial plan risks failing to deliver value. After
all, users won’t be happy if a better idea comes up halfway through and is discarded just because “it wasn’t
in the original scope”. In short, successful software requires adaptability and, with that, flexible estimates.
The desire for exact deadlines and costs vs.
reality
From the client’s and stakeholders’
perspective, the desire to know deadlines and costs in advance is totally understandable. Companies need to plan budgets,
coordinate marketing, train support teams, and so on. In other words, there is real pressure for predictability. How many
times have we heard questions like: “When will it be ready?” or “How much will it cost?” in the very
first project meeting?
The big challenge is balancing this need for firm
answers with the uncertain reality of software development. Often, to win a contract or please the client, teams provide very
precise estimates too early, creating a false sense of security. The result? Plans are made based on these “frozen”
numbers, and when reality inevitably diverges, disappointment follows.
To make matters worse, some clients take estimates
as promises. Then, any deviation is seen as failure or incompetence. It’s crucial to clarify from the start: an estimate
is not a commitment; it’s an initial reference that will be refined. A recent Boston Consulting Group study reinforces
this, revealing that at least one-third of software projects end up delayed or over budget, according to half of the executives
surveyed. Among the main causes are unrealistic deadlines and lack of alignment between technical and business teams. In other
words, poor estimation, whether due to excessive optimism or poor communication, comes at a high price.
So, how do we address the legitimate client need
for forecasts without “selling an illusion”? The answer lies in education, transparency, and active involvement.
From the beginning, we explain to the client that a good estimation process is dynamic. We show that we have a strategic plan
(we’re not working in the dark!) but with room for adjustments as new information emerges. We compare software development
to an exploratory journey, where we start with a rough map and refine the route as we move forward. The promise we make is
not of inflexible precision, but of commitment to delivering value and maintaining constant communication.
Embracing uncertainty: the agile approach and
scrum
Fortunately, the software development world has
long recognized these challenges, and methodologies have emerged precisely to embrace uncertainty instead of denying it. The
main one is the Agile approach, with Scrum as its most famous representative. Unlike traditional project management (waterfall),
where everything is planned in detail from the start and changes are discouraged, Scrum takes the opposite view: changes will
happen, so let’s plan adaptively.
In Scrum, work is done in short iterations called
Sprints (usually 1 to 4 weeks). The team starts by defining a prioritized list of desired features (the Product Backlog).
In each Sprint, the team pulls the most important items from the backlog, estimates the effort for each collaboratively, and
commits only to what they believe they can deliver in that cycle. At the end of the Sprint, there is a real delivery (working
software increment) and a review meeting with the client (Product Owner), where what was done is evaluated and the backlog
priorities are adjusted for the next Sprint.
This iterative cadence brings several benefits for
estimates and deadlines:
·
Continuous feedback: At each Sprint, the client sees tangible progress. This not only builds confidence
but allows early detection if something is off-track. Any scope change or new idea can be discussed and prioritized for future
Sprints before time and money are spent in the wrong direction.
·
Frequent re-estimation: Unlike the traditional model where the estimate is made once and frozen, in
Scrum estimates are reviewed Sprint by Sprint. If the team discovers that certain tasks were more complex than expected, that
information feeds back into future projections. Over time, the team’s velocity (how many points they deliver per Sprint
on average) becomes clear, allowing better prediction of how many Sprints will be needed to complete the current backlog.
In other words, accuracy increases as the project progresses, exactly as illustrated by the Cone of Uncertainty.
·
Flexibility with control: It may sound paradoxical, but Scrum manages to be flexible and offer control.
This is because it fixes short time intervals (the Sprints) and, within them, avoids changes. Thus, each iteration’s
deadline is stable and met. At the same time, between Sprints, everything can be reorganized: the overall plan is always open
to adjustments. This combination of short timeboxes and continuous reprioritization allows responding to unforeseen events
without losing control of the project.
In terms of estimation, an Agile maxim is: “Estimates
are expectations, not guarantees”. In Scrum, this philosophy is clear. We estimate to guide the work, not to predict
the future with absolute certainty. That’s why it is said that traditional methodologies treat estimates as rigid forecasts,
while in Agile they are a flexible plan, a guide that can and should change as needed. Instead of promising that “everything
will be ready in six months costing X thousand dollars”, the Scrum team proposes: “We will deliver incremental
value each iteration and recalibrate what’s left at each delivery”. Ironically, this approach tends to build more
trust because it reduces surprises and keeps everyone informed.
And what about deadlines and costs? A well-managed
Agile project can indeed provide a high-level estimate of duration and investment, but always accompanied by assumptions and
a plan for frequent review. For example: it might be said, “Our initial estimate is approximately 6 months (or approximately
X Sprints) and Y dollars, considering the known scope. However, at each Sprint, we will review these projections with you.”
This way, the client has a direction for planning but also understands that it is not an immutable magic number.
Furthermore, Agile practices emphasize total transparency.
Burndown charts, product demos, retrospectives, all are part of Scrum to ensure the client sees the real progress and participates
in decisions. When the client experiences the process, they come to understand in practice why flexibility in estimates is
necessary to achieve the best final result.
Conclusion
Software project estimation is as important as it
is complex. There is no crystal ball, and admitting this is liberating. It means we can stop pretending we have absolute certainty
about schedule and cost on Day 1, and instead focus on managing uncertainty openly and strategically. By treating software
as the living entity it is, by educating clients about the evolutionary nature of projects, and by adopting Agile frameworks
like Scrum, we transform estimation from a static guess into a dynamic planning process.
Ultimately, the best “estimate” is the
one that is constantly updated, guiding the project like a compass, not like chains. With transparency, collaboration, and
adaptation, it is indeed possible to meet deadlines and budgets while delivering a much better final product. After all, when
the client and team understand they are on the same side dealing with uncertainties, both can work together toward the common
goal: a successfully delivered project, on time, with real value.
Visionnaire has mastered the Scrum technique for
years and is ready to help your business. Contact us to learn more.