It’s easy to underestimate the complexity of software development. One of the challenges developers and project managers face every day is managing the Unknown. What is the Unknown, and what does it mean to manage it?
Unknowns are nothing new. Common sense suggests that nothing in life is certain. People are naturally empathetic when plans fail due to catastrophic events. However when plans fail for reasons not understood, it’s up to the planner to manage those expectations and create a plan B. For example, manufacturers that anticipate defective products set up refund policies so that customers can get their money back.
In software development, the Unknown is the difference between the developer’s current working knowledge, and the actual knowledge needed in order to make a feature work. In a world of infinite knowledge, developers would be able to describe precisely how a feature will be implemented and how long it will take to build. However, the reality is that some features will be less understood than others.
There are at least three factors that determine how quickly a feature can be built:
You might think that these factors are less of an issue when your team is made of rockstar developers. But the reality is that you won’t get 10x output just because you drop a rockstar team onto a project. There are many reasons why development might lag in one project versus another even with the same team:
Developers know these problems like the back of their hand. They’re not surprised when they have to spend hours trying to figure out the correct parameters to pass in order to connect to a REST endpoint. This is why they hate giving estimates. When someone asks how long something will take to build, they’re making an intuitive guess based on past experience and their current knowledge of the situation.
Fundamentally, estimates of this kind are intuitions, and therefore unreliable.
It’s important to recognize that estimates of this kind are intuitions. They’re not data-driven. There are no hard facts backing them up. There are no probability numbers defining the accuracy of these estimates. They are just guesses.
Management that doesn’t understand the nature of these estimates, naturally assumes that they’re concrete. Intuitively, they think that spending more time calculating estimates leads to higher accuracy. To some degree, this is true. However, we’re still dealing with the Unknown. Fundamentally, we don’t know the full answer yet, and there’s an unknown possibility that we’ll hit a landmine in the process.
This is what typical software development looks like:
In this illustration, the developer starts writing code. Everything seems to be going as planned. But all of sudden, he/she runs into a landmine and the rest of the project is delayed.
What is a landmine? Here are some examples:
Essentially, a landmine is an Unknown that results in an unmet expectation (typically a missed deadline) that has to be managed. Developers can help absorb a landmine by working longer hours or by making shortcuts in the implementation (shortcuts that create technical debt and will take more time to fix later). The product team can help prevent a landmine from affecting the launch of the product by pushing lower priority features to later sprints. But when developers are burned out, and the product team can’t defer any more features, the business has ultimately promised more than it can deliver.
Landmines also aren’t just problems that need to be addressed at a later point in time. Their damage often grows exponentially the longer they are put off. They’re basically time bombs waiting to bring down the entire project. Ignoring them just isn’t an option.