Skip to main content

Project Management

Managing the Uncertainty and Complexity in Software Development – Flags and Lessons (part 3/3)

Project manager at computer

This is the third post of a blog series which summarizes the lessons I learned during a technological migration with high uncertainty and complexity. In the previous post, I talked about how I faced the problem. In this post, I’ll summarize the flags and lessons.


I can conclude that no matter how hard a project with high uncertainty and complexity is, most of the time it can be solved. Fortunately, we are not alone, and we don’t have to figure out everything on our own, and besides the client input, we have a team, peers, or in the worst scenario a community, with whom we can communicate our findings, ask for help, bounce ideas, and discuss different approaches when we get stuck.

Facing the Problem

This is a quick recap of the flags that will help us identify that we are probably facing a project with a high level of uncertainty or complexity and that we probably need to change our approach to find a solution.

  1. “Easy” requirements with no guidance or a clear path to start working.
  2. Feeling more challenged than expected by a requirement that sounded easy.
  3. Requirements with little information, like acceptance criteria or documentation.
  4. Legacy code that is hard to read, mainly because it’s poorly written.

Adaptable to Changes Working with Collaborative Teams

Also here are the lessons of working with a collaborative team that is also adaptable to changes:

  1. Identifying blockers and communicating them early to the team will give us time to act.
  2. Having a defined scope will always help us to manage the size and effort of a requirement. The scope can always be defined if it wasn’t defined at the beginning, redefined, or renegotiated when we communicate our findings early.
  3. Talking and bouncing ideas with our peers, leaders, product owners, or the client, to get more information, but more importantly, to get a different perspective to bring a plan to solve any difficulty.
  4. Understanding the code could be stopping you. Get rid of the complexity and iterate over it. Instead of expecting the code to be easy to understand we can shift our mindset and keep the analysis simple by removing layers of complexity to keep moving. Use your abstraction skills.
  5. Giving the opportunity to unfamiliar approaches, even if they sound weird if the familiar work style fails.
  6. Planning and updating it according to the discoveries you make on every iteration, identifying the milestones, and dividing the work into several steps to accomplish a requirement will help to prevent you from getting overwhelmed by the uncertainty and complexity of a project.
  7. Keep on learning, trying different perspectives, and getting amazed when finding a new solution.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Luz Galindo

Luz Galindo is a Senior .NET Software Engineer passionate about technology, analysis, development, and solving problems creatively. She likes to create new things and expresses herself through writing, music, and crafts.

More from this Author

Follow Us