You would think that building software was as easy as pressing a button and there it is. Many people have tried and it’s never that easy. If we could do that we would be millionaires because we could generate solutions in minutes/seconds and everyone would be happy.
Unfortunately, in the real world, it’s not like that. When we estimate a project we look at the solution we have promised and work out how long it might take to develop in terms of work days then we work out the Best and Worst case scenarios. We then apply a formula that gives us a weighted average of the time it probably will take to develop that feature.
Sometimes these estimates are wrong, we underestimate the complexity of the requirements. For example, let’s say there is a simple requirement, “The software will work out the Tax for the Sale”. Take the price and add a percentage but when we go to develop the solution we discover that when we need the total price it has not been calculated yet. So we need to work that out first but we might find that at this point in the process we don’t have all the data we expected and we can’t actually work out the total price. (This is a contrived example but hopefully you get the idea)
Situations like this happen all the time. We try our best to figure all these out before we start the development. Sometimes it’s not until you actually start coding you discover these complexities.