Effective Techniques for Agile Teams to Reduce Uncertainty

The development of digital products is often a complex and unpredictable process, filled with uncertainty and ambiguity. Despite the best planning and preparation, things don’t always go as expected, and unexpected challenges can arise at any moment.

This is where Agile methodologies can be particularly helpful, providing teams with the flexibility and adaptability needed to navigate uncertainty and stay on track. But even with an Agile approach, working in an unforeseeable context can be a daunting task. How do you manage unpredictability without sacrificing quality or derailing the project? In this article, we’ll explore some effective techniques that Agile teams can use to master uncertainty in digital product development.

Understanding Uncertainty

The Cone of Uncertainty was coined by Steve McDonnell in his book “Software Project Survival Guide” (based on Boehm’s work) and it’s a key concept because it has been widely used to explain why software development projects have so many difficulties to finish on time relative to their original plan.

It describes how the level of uncertainty in a project decreases over time as more information becomes available and is often represented as a cone-shaped graph that shows the range of uncertainty associated with different phases of a project.

The figure shows software cost estimation accuracy versus phase and it’s part of the article “Software Engineering Economics” by Barry Boehm (1983).

For example, let’s consider a typical software development project. In the early phases, the level of uncertainty is high because there is little information available (the requirements are not yet fully defined), and the cone of uncertainty is wide. As the project progresses and more information is gathered (the requirements are better understood), the level of uncertainty decreases, and the cone becomes narrower. Eventually, as the project nears completion and all the information is known, the shape becomes a point.

Agile as the key to reduce uncertainty

Years ago, Henrik Kniberg used the following picture to illustrate how Agile can reduce uncertainty, specifically through an iterative and incremental approach to planning.

On the left is a chart that displays the cost (in red) and the value (in green) of a project using a predictive approach, which involves creating a plan to develop all components and delivering them all together at the end of the plan. Consequently, customers receive something that (hopefully) has value for them, but only towards the end of the project’s lifespan.

Instead, an Agile team working on that project would apply techniques such as user stories, iterations, and prototypes to gather feedback from stakeholders and validate assumptions after each iteration. They would also conduct retrospectives to reflect on their progress and make necessary adjustments. This is commonly referred to as an iterative and incremental approach to planning. On the right-hand side of the chart, you can see how customers may receive something valuable after each iteration, while the cost remains constant. Maintaining team stability helps ensure the quality of deliverables, as knowledge is retained and handovers or extensive documentation become unnecessary.

Risk and uncertainty

From a financial perspective, this chart is also interesting because it shows how risk management is closely linked to uncertainty. Look at the area beneath the cost line. Since customers receive nothing, we consider all that space to be the risk of misunderstanding their expectations. Traditional approaches attempt to reduce this risk with lengthy phases of analysis and strict contracts that make a relationship based on distrust instead of collaboration. By releasing more frequently and using feedback to adapt our plans, we cultivate a relationship founded on trust and a more cooperative environment for all involved. The chart is very expressive, as the area is significantly reduced. The more often you release, the lower the amount of risk you take.

Effective Agile techniques to manage uncertainty

Besides the iterative and incremental approach to planning, releasing frequently to reduce risk, including feedback with a user-centric approach to product development, and regular retrospectives to improve the way of work, there are also some other techniques that can help you to manage and/or reduce uncertainty.

Spikes, rapid prototypes, or proofs of concept

Spikes, rapid prototypes, and proofs of concept are techniques commonly used to reduce uncertainty and validate assumptions. Sometimes we use them as interchangeable terms but they are different.

  • A spike is a time-boxed investigation that aims to explore a particular aspect of a project that is not well understood, such as a technical feasibility study or a research task. Its objective is to gather more information about the problem and propose possible solutions.
  • A rapid prototype is a quick and simple representation of a product or feature, which is used to gather feedback from stakeholders, validate assumptions, and test different ideas. These prototypes are usually built with low-fidelity materials, such as paper, cardboard, or wireframes, to focus on functionality rather than aesthetics.
  • A proof of concept (PoC) is a small-scale implementation of a project idea that aims to demonstrate its feasibility and potential benefits. PoCs are used to test the viability of a solution and gather feedback from stakeholders before investing significant time and resources in the development of a full-scale product.

By using these techniques, Agile teams have a low-risk way of testing ideas, gathering feedback, and making adjustments based on results, ultimately leading to a better understanding of the project and higher quality deliverables.

User stories

User stories are one of the most powerful Agile techniques. They help to reduce uncertainty by capturing the user’s perspective and needs.

By breaking down features into small, testable, and customer-centric stories, the team can focus on delivering value incrementally. As we’ve learned above, this iterative and incremental approach allows us to collect feedback and decrease the possibility of delivering something that our users do not require or use. In combination with user stories, this approach encourages collaboration between the team and stakeholders, allowing them to clarify assumptions, discuss requirements, and validate ideas. This ensures that the project is on track and aligned with the customer’s expectations.

The acceptance criteria of user stories are essential for Agile teams. They clearly define what is expected from a feature and provide specific requirements for the team to meet for the story to be considered “done”. This provides a common understanding of what is expected, allowing the team to focus on delivering value without wasting time and resources.

Continuous delivery

In short, Continuous Delivery (CD) is an approach to software development where code changes are automatically built, tested, and deployed to production. It helps in reducing uncertainty by allowing teams to deliver software frequently and consistently in small increments.

This approach enables faster feedback cycles and ensures that the team is continuously validating assumptions and incorporating feedback from stakeholders. As a result, teams can quickly identify and address issues and pivot if necessary, reducing the risk of delivering something that customers may not need or want. Additionally, with each release, the team gains more confidence in their ability to deliver high-quality software, reducing uncertainty and increasing trust in the team’s capabilities.


TDD stands for Test-Driven Development, a systematic approach to designing, implementing, and testing code that involves writing automated tests for a specific feature or functionality before writing the code to implement it.

By writing tests before the code, TDD helps to clarify the requirements and expectations for a feature, which reduces the risk of misunderstanding and helps ensure that the code is correctly implemented. TDD also provides a safety net for making changes to the code in the future, as any regressions or issues can be caught by the existing tests. This helps to build confidence and reduces the uncertainty associated with making changes to the system.


Introducing these techniques can greatly reduce uncertainty in projects. While using all of them together can be particularly effective, project managers often face the question: “When will you deliver this?”. However, I will address this question in a future post.