All software problems are large or complex as a direct result of the tremendous reuse potential of software. Consider two alternatives:

  • The problem is relatively well understood. Solution: locate an open source or commercial solution and use or adapt that solution.
  • The problem is not well understood. Solution: study enough to realize that existing solutions are not appropriate. The problem will be like existing problems, but different enough that existing solutions are inappropriate. The use or adapt possibilities are limited or non-existent.

The consequence is the need for a disciplined approach to software problem-solving. This is a step removed from the technical mastery of tools. A skilled programmer may not always be a good problem solver. We know that skilled tool-users often have their vision narrowed by their tools: "If all you have is a hammer, every problem looks like a nail."

Let's talk about Armour's Five Orders of Ignorance:

  • 0 - When you already know. In this case, you either have software or have a complete design for software. You can construct the software with no mysteries about business problem, software solution, technology stack or productivity.
  • 1 - When you know that you don't know. These are configuration parameters for a product. Things are well-understood; so well understood that you have a checklist and that is a framework for your ignorance. The list of parameters is defined, you only need to supply the values.
  • 2 - When you don't know what you don't know. This is where custom software starts. If you knew what you were doing, you'd download it. You know that you can't download it: either because you don't really know what you're doing, or you were hoping for a mythical perfect fit between problem and available solutions. Since you don't know what you don't know, you assume the gaps can be bridged only by custom software.
  • 3 - When you don't even have a process for identifying your knowledge gaps. This is why we can't find a applicable existing software package.
  • 4 - When you don't even know that there is ignorance. That's precisely the level of bravado needed to write custom software.