A precondition for reusability is the existence of reusable information. There is a lack of systematic methods for producing reusable information. We propose a method for practical domain analysis, defined as the process of identification, acquisition and evolution of information to be reused in the construction of software systems for restricted classes of applications, or problem-domains.
The method for domain analysis is presented in the context of a domain engineering framework. A framework is not a theory and we do not offer a detailed, canonical scheme of how every type of domain analysis is or ought the be done. We have developed a set of principles providing coherence to a diverse set of findings about domain analysis. These principles (and heuristics) are used to develop instances of methods and representations, and to demonstrate their application in practice.
Reuse systems are viewed as composed of two parts, a performance component and a learning component. The operation of the performance component - the target user - is based on a reuse infrastructure specified by the learning component. Based on feedback from the target reuser, the learning component evolves a model of the problem domain, with the purpose of maintaining or enhancing the level of performance of the reuser. This viewpoint allows for an operational formulation of the domain analysis process as the systematic evolution of the reuser's infrastructure, where this evolution aims to attain and maintain a desired level of performance.
The methods proposed focus on two forms of performance enhancements - competence and efficiency - in the reuse process. Competence enhancements are achieved through model-driven information acquisition from experts and the incremental induction of a domain-specific language. Efficiency enhancements are the result of tuning a reuse infrastructure to explicitly defined patterns of reuse in the environment of the reuser.
Methods and representations are demonstrated in the context of first-order reuse - the reuse of software components.