How to Handle Uncertainty in Software Development Projects

In software development, we often face projects with tight deadlines and a lot of uncertainty. At first, it can feel overwhelming - you may feel frustrated, doubtful about skills and abilities, or even feel stupid. In my career I’ve worked on many projects like this, where nothing is clear, and every time I was stressed at the beginning. But over time, I learned how to handle these situations. In this post, I will share tips and techniques that have helped me manage uncertainty and work more effectively.

Uncertainty is normal in software development. It can be caused by many things: a project manager changing requirements for the project again, some technical constraints unexpectedly appearing and limiting your solution, or a colleague unexpectedly taking a sick leave, etc. I think many of you have faced the same things, so I prepared some advice for you based on my experience and psychology. The ability to deal with uncertainty is essential for Senior Software Engineers.

1 Accept Uncertainty

Instead of being afraid, try to see an opportunity to learn and improve. Use the tips from this article to deal with it. Your main task isn't to be a jack-of-all-trades, but on the contrary, you should focus on solving one small problem at a time.

2 Break Down the Project

This advice follows from the previous one. Decompose the bigger problem into smaller ones, and then divide them into two parts: what you know and what you don’t know. The tasks you know are ready for development and can be delegated on your team. For tasks you don’t know, make a plan to research the unknown parts step by step. Once you  have done this, you can delegate them like the other tasks or do them by yourself. To know how to effectively research unknown tasks, refer to the next advice.

Sometimes you may face a task where just doing research won’t lead to understanding or conducting such research is too expensive in terms of time or resources. In this situation I would advise you, based on my university experience: sometimes it’s easier to conduct an experiment to prove something than trying to calculate it.  Regarding software engineering this thought could be rephrased as trying to make Minimum Viable Product (MVP) or something like Proof of Concept (PoC), test it and make conclusions.

3 Use Tools to Organize Work

As I said in the previous paragraph, sometimes it’s easier to make an “experiment” than trying to find out something through the thought process. In this case maybe you may need some “technical” tools for acquiring information from your proof of concept and handling it. For example, collect logs, filter, group and transform them to find out something or just parse the timing values from some metric and make calculations over them. I don’t want to recommend some software for data-handling because it is outside the scope of this article.

If we talk about non-“technical” tools for organizing our work, I would like to outline the following tools:

  • Use Mind Maps or Miro for drawing the relations between your tasks from the whole project’s perspective;
  • Try to create a Gantt chart or Kanban-board for planning and visualization of progres
  • Try to write Architecture Decision Records (ADR) – it’s a format of project architecture description. It allows you to describe which ways are considered, enumerate their pros and cons, show your thought process and explain to other people why you chose the specific way to solve the problem. Please, visit the website if you want to learn more about ADRs.

4 Communicate with the Team

Always ask questions if something is unclear to you. If you are in the role of a task executor, then ask the project tech-lead or project manager. If you are the tech lead for the project you could ask clarifying questions to the project manager or any other stakeholders involved to the project. On the other hand, if we look from another point of view, you should ask your subordinates if something went wrong with their job. Share your progress and challenges with your team (encourage your team to do the same) to get feedback early.

5 Manage the stress

Anyway, working with uncertainty is stressful, it requires you to apply additional efforts and spend much more resources than usual. To avoid decreasing productivity or even worse to be burned-out, you should know how to manage stress and how to rest the most efficiently. Some of these things are too personal, but there are general tips to deal with it:

  • Don’t let the stress overwhelm you, if you feel stressed take a short break or focus on deep breathing;
  • Try to watch at the problem from another angle or discuss your vision with a colleague (also good technique is “talk with a duck”);
  • It’s important to stay calm and concentrate on the next step;
  • Focus on a task at a time and be consistent - don’t jump from problem to problem.
  • Don’t work overtime, rest and sleep enough, and do physical exercises. I really love to do aerobic exercises like running or fast-pace walking. It refreshes my head and inspires new ideas.

So, uncertainty is part of software development, but you can manage it by accepting it, breaking down tasks, using tools, and communicating well. Don’t forget to take care of yourself, because we aren’t robots and our resources aren’t unlimited. But at the same time, all people are different and possibly some advice may not work for you. Use this advice to know yourself and create your own techniques for managing stress and dealing with uncertainty. With practice, working in uncertain situations will feel easier. Don’t be afraid of the unknown - it’s a chance to grow.

How do you handle uncertainty and stress in your projects? Share your thoughts in the comments!