Functionality involved in the development of new systems may be classified in two categories.: Invariant and Variant. [#!BB91!#] Invariant functionality is the set of components or components fragments that are used without changes. It provides the kernel of functionality around which new systems are built. By definition invariant functionality cannot create new systems since it lacks the customization needed to meet new requirements. Variant functionality is the set new functionality that must be added/changed to customize invariant components. It provides novel functionality to address new needs. On domain focussed software development, invariant functionality usually represents domain commonalities, core functionality of the domain, that are reproduced from one application to another. Variant functionality is usually added or replaced in an incremental manner and represents a small percentage of the total implemented functionality of the system. This way of development is usually called an incremental evolutionary software development process.
An adaptive software development strategy is extremely well adapted to be used in this context. Such a strategy uses large frame structures as invariants (supporting the invariant functionality) and restricts variability to low level isolated locations within the overall structure. As it attempts to keep most of the overall structure invariant, adaptive strategy helps to keep development costs under control when reusing or leveraging invariant functionality from one existing system to the new one. However, because it also tend to be application specific and relatively inflexible, it may burden the cost of addition of variant functionality, increasing the overall costs of development of new systems.
To avoid this situation and minimize the costs of addition of variant functionality we need to add flexibility to those selected locations within the overall structure where variant functionality is to be plugged. In other words, the key point to master evolutionary software development is the creation of an evolution infrastructure (set of methods, tools and operating practices) that minimizes both, the cost of reusing/leveraging invariant functionality and the cost of addition of variant functionality. Methods and tools are those involved in the domain engineering activity. By operating practices we understood the set of well known rules and mechanisms that allow to obtain results on a systematic and repeatable way.