There is an old adage that if your only tool is a hammer, everything looks like a nail. We use the lessons learned and experience we have gained to address current issues. But if the problem (or software project) we face today is fundamentally different from those we’ve dealt with previously, past experience isn’t the proper framework. In effect, we will be using a hammer when a saw or a chisel might be the tools we need.
The solution, of course, is to first gain an understanding of the problem at hand. What are its defining features? How does it behave? Only then can a proper solution be designed and the appropriate tools selected.
To a large degree, our understanding of how products are developed comes from knowledge gained from manufacturing since the beginning of the Industrial Revolution. Mentally, our first instinct is to try to apply those lessons learned to software development. But there is a huge problem with this approach. The creation of software is not a manufacturing process, but rather a knowledge acquisition and learning process that follows different rules. Here is a simple example. If I have an assembly line and want to double my output, I have several choices. I might add a second shift of workers or I could install an additional assembly line. Because manufacturing is a repetitive process in which design problems are solved before product construction begins, the relationship between labor required and output remains fairly constant. In a nutshell, we already know exactly what we need to do (and how to do it).