Before starting off on a new software development project, a software engineer should always consider what might be the underlying, hidden general problem that requires the solution. The general problem may not be as complex as the original problem and there may also be a ready-made solution that is capable of satisfying the requirements.
To illustrate, suppose you are asked to develop a taxonomy system. Categories for the taxonomy have earlier been defined and given to you. You are required to provide a sophisticated search facility that is able to search into the meta-data (such as the title, creator of document, date of creation, last modified date, and document type) and contents of the documents in the taxonomy. You may be tempted to build a customized solution but it may be better for you to consider what the underlying general problems might be before you embark on the software construction process. A quick survey of this problem reveals the need to develop three facilities: Text processing facility including search; Document filtering facility (to process the different document types); Presentation facility (to illustrate the taxonomy as a tree-based structure). These facilities are certainly not new and may have already been developed and archived in some libraries. If so, they are likely to be well-tested and more stable than if you had to start on your own from the beginning.
Instead of developing these facilities from scratch, you might want to examine how the archived solutions might help you in this problem. This, in a nutshell, highlights the essence of the generality principle which encourages software reuse. However, a generalized solution may be more costly, in terms of speed or execution, memory requirements, or development time, than a specialized solution that is tailored to the original problem. Software engineers therefore have to evaluate how this trade-off may affect the overall cost and efficiency of the development project.