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

Visionnaire - Blog - Project Estimation

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.