Decoding Success and Failure: A Rational Approach

November 1, 2023

In the ever-evolving world of software engineering, we are often presented with the challenge of assessing successes and failures. When evaluating our own performance, we frequently attribute our successes to our skills and our failures to bad luck. However, when it comes to evaluating the results of our competitors, the tendency is quite the opposite: we tend to ascribe their failures to a lack of skill and their successes to sheer luck. These cognitive biases significantly impact our ability to make informed decisions and engage in meaningful self-improvement. In this article, I’d like to introduce the concept of probabilistic thinking, as highlighted in Annie Duke’s book “Thinking in Bets”.

The Role of Luck and Skill

Annie Duke’s central idea is that every result is influenced by a combination of skill and luck. This concept challenges the binary way we often think about success and failure. In software engineering, this perspective is particularly relevant, as our work is inherently probabilistic. It’s not always easy to distinguish whether a project’s success or failure is solely due to the skills of the team or external factors beyond our control.

Probabilistic Thinking in Software Engineering

  1. Self-Reflection: When evaluating our own work, it’s essential to recognize the role of luck. Sometimes, despite our best efforts, external factors can lead to failure. Embracing the idea that not every failure is a reflection of our skills allows for more constructive self-reflection. We can focus on improving our skills and strategies, even when luck doesn’t go our way.

  2. Empathy and Collaboration: When assessing the work of our colleagues, understanding that they too face elements of luck can foster better collaboration and support. Instead of dismissing their failures as incompetence, consider the external factors that may have influenced the outcome. This shift in perspective can lead to more effective teamwork.

  3. Evaluating Competitors: Just as we often attribute our own failures to bad luck and our successes to skill, we tend to attribute our competitors' successes to luck. By recognizing that competitors also possess skills and face their own share of challenges, we can engage in healthier competition and learn from their successes rather than dismissing them as mere luck.

  4. Better Decision-Making: Embracing probabilistic thinking can improve our decision-making processes. In software engineering, where outcomes are often uncertain, acknowledging the role of luck allows us to make more informed choices. We can assess risks and uncertainties, plan for contingencies, and adopt a more adaptive and resilient approach to our projects.

  5. Continuous Learning: Recognizing the interplay of skill and luck in software engineering encourages a culture of continuous learning. When successes are attributed to both skills and luck, we are more inclined to understand the areas where improvement is needed. Similarly, acknowledging the impact of luck on failures can prevent a demoralizing blame game and instead promote a focus on learning from mistakes.


Annie Duke’s concept of probabilistic thinking challenges the conventional wisdom of attributing success solely to skills and failure solely to bad luck. In the dynamic world of software engineering, where outcomes are often uncertain, this perspective is invaluable. By embracing the role of both skill and luck, we can make better decisions, engage in more constructive self-reflection, and foster collaboration and empathy among team members.

As software engineering leaders, let’s encourage our teams to adopt this probabilistic mindset. It can help us navigate the complexities of our field with a more open and rational perspective, leading to better results, improved teamwork, and a culture of continuous improvement. Ultimately, acknowledging the role of luck doesn’t undermine our skills; it simply helps us approach our work with a more nuanced understanding of the factors at play.