Thursday, December 19, 2024

Lean Software Development: Decide as Late as Possible

Translated from the original article in Spanish https://www.eferro.net/2024/06/lean-software-development-decidir-lo.html

Lean Software Development starts from the premise that software and digital product development is a constant learning exercise (see Amplify Learning). With this premise, it is clear that the more information we have before making a decision, the better its quality will be. Therefore, deciding as late as possible allows us to be more effective. At the same time, there is a cost (or risk) associated with not making a decision, which increases over time. For this reason, we should aim for the "last responsible moment", the optimal point for making a decision with the most information possible, without the cost of delay outweighing the potential benefit of obtaining more information by postponing it.


Advantages of Delaying Decisions and Keeping Options Open

Postponing decisions is a fundamental strategy in lean software development. Although it is not always easy and requires practice, this tactic enables the creation of sustainable and easy-to-evolve products. One of the main advantages of making decisions later is that it provides a better understanding of both the business and technology, which in turn facilitates more informed and accurate decision-making.

Additionally, delaying decisions leads to simpler and smaller solutions, reducing the effort required to implement them and avoiding unnecessary overhead. By keeping our options open, we focus only on what provides real value in the present, avoiding over-engineering and unnecessary work. This flexibility allows us to react quickly and effectively to any change without fear, which is crucial in the dynamic environment of software development.

Some specific advantages of delaying decisions include:

  • Less work and waste: Implementing only what is necessary at the moment reduces total work and waste.
  • Reduced effort in rework: If changes are needed, less effort is required because over-engineering has been avoided.
  • Greater flexibility and adaptability: Keeping options open enables us to adapt quickly to new requirements or changes in the environment.

A well-designed architecture allows delaying important decisions without compromising the product's quality or flexibility. This not only enables us to make better-informed decisions but also facilitates the creation of good architecture, which in turn allows the postponement of other critical decisions in the future. In short, this strategy allows us to move forward with less burden and greater agility, enhancing our ability to deliver continuous value.

Decision-Making

My teams are empowered, end-to-end teams that have full authority over how to solve problems and, in many cases, even over which problems to solve. In such teams, numerous decisions of all kinds are made daily—decisions about the problem, potential solutions, implementation of those solutions, and the prioritization of where to invest (e.g., solving an issue, reducing uncertainty about a technical or product decision, determining next increments, etc.).

For example, when starting a new product or feature, the level of uncertainty is usually very high. In these cases, we prioritize reducing that uncertainty by breaking down critical decisions and assumptions into smaller parts and investing in product increments to obtain feedback, thereby reducing the uncertainty.

As we receive feedback, we learn more and adjust our assumptions/hypotheses accordingly. This iterative process helps us move from great uncertainty to greater clarity and confidence.

By continuously validating assumptions, we reduce risks and make more informed decisions.



These decisions occur continuously at all levels. It is part of the nature of our profession.

If we had to classify the types of decisions to be made, we could do so as follows:

  • Decisions about the problem and opportunity to explore
    • What: Where we should invest and why.
    • How: What solution or implementation strategy we believe is appropriate for the selected case.
  • Decisions about technology and implementation
    • At the architecture and technologies level.
    • At the design level of the solution at various levels.

It is important to note that decisions are never independent; they must always consider the context and knowledge of the team, as well as the existing system or product. It is as if we see problems and opportunities as the difference in knowledge or implementation between what we know or have and what we want to achieve.

In other words, it is always about making small increments in the direction and with the objective we need. Sometimes, it is about delivering value to the user; other times, it is about reducing the uncertainty of a decision we need to make. Always, it is an increment in the software (product/system) or in the knowledge the team has.



Breaking Down Decisions to Address Them Individually

One of the main ways to increase our chances of postponing decisions is to break down large decisions into small decisions and clearly separate those that are easily reversible from those that are irreversible (or very difficult to reverse).

Therefore, working to decide as late as possible involves doing so in very small steps or increments, which is fully aligned with the Lean mindset (working in small batches).

This process of breaking down is a continuous practice that allows the team to address everything from where to invest in the next quarter to what to do in the next few hours. We should see it as a systematic way of thinking that is recurrently applied at all levels.

Conclusions

Deciding as late as possible is a key strategy in Lean Software Development that maximizes the quality of decisions by leveraging the most information available. This practice contributes to creating more sustainable, flexible, and adaptable products.

The main advantages are:

  • Reduction of waste: Focusing only on what is necessary minimizes redundant work and avoids over-engineering.
  • Greater flexibility: Keeping options open allows for rapid adaptation to environmental or requirement changes.
  • More informed decisions: Postponing decisions until the last responsible moment results in more accurate and effective decisions.
  • Increased adaptability: Facilitates the implementation of simple, small solutions, reducing the effort needed for changes and improvements.

It is essential that empowered teams adopt this mindset and become accustomed to breaking decisions into manageable steps. By doing so, they can incrementally reduce uncertainty, continuously validate their assumptions, and adjust strategies based on received feedback. This iterative approach reduces risks and strengthens the team's ability to deliver continuous value.

In upcoming articles, we will explore strategies and concrete examples of how to effectively postpone decisions, providing practical tools to implement this philosophy in your software development projects.

Related Resources

No comments: