Towards uniform support throughout the software life-cycle
Transformations of artefacts like models, schemata, programs, or SoftwareArchitectures provide a uniform and systematic way to express and reason about SoftwareEvolution. For example, in the context of ForwardEngineering, the transition between different abstraction levels (like analysis, design, and implementation) can be described in terms of transformations, like refinement relations or automatic generation of models or code. In ReverseEngineering, transformations are used to build abstractions from implementations, e.g., by detecting design patterns or clichés.
Model-based versus implementation-level solutions
Software evolution can been studied and supported at the level of both models and programs. Model-based software development as proposed, for example, by the OMG's MDA initiative, addresses evolution by automating (via several intermediate levels) the transformation of models into code. In this way, software can be evolved at the model level, relying on automated transformations to keep the implementation in sync. Classical re-engineering technology, instead, starts at level of programs which, due to the poor quality of models found in industrial contexts, provide the only definite representation of the system.
Which approach is better in which situation and how they can be combined is still an open question. At the conceptual level, the laws of software evolution and the theory behind them may provide us with answers about the respective tradeoffs and likely combinations. At the technology level, graphs defined by meta models, and their transformations, have been recognized as a uniform way to support evolution, both at the programming and the model level.