MotivationMost developers think of a software system as the code and components that are the end result of the software development process. As code is written, developers gradually ignore the initial stages of development, the specifications and the design of the system, the documentation, the component specifications, and the test cases. This narrow view of software is one of the primary causes of the many problems associated with software and its development [9].We visualize an environment where all the aspects of software development evolve consistently as the system is developed and maintained. As any one of these aspects changes, the environment would ensure that all other aspects are updated accordingly. This would simplify both software development and maintenance as it would guarantee that all aspects were relevant, accurate, and up-todate.Such an environment can be built by defining constraints between the artifacts representing the different software aspects. When an artifact is updated, all the constraints on that artifact are triggered and any related artifacts are checked for consistency. Consistency can then be maintained either automatically or by informing the developer what needs to be done before the change is complete.In this paper we demonstrate that such an environment based on constraints can be built and used effectively for a wide range of software artifacts.
Software EvolutionSoftware is not just the source code; instead it is multidimensional [19]. The specifications, design, architecture, test cases, user interfaces, coding conventions, components, constraints, design patterns, system architecture, development history, and documentation are all as much a part of a software system as is the physical code. Furthermore, these other artifacts are sometimes much more valuable than the code itself. Software development and programmer productivity therefore depend on being able to develop, relate, and consistently maintain all these different aspects of the software.Today's software environments provide a wide variety of tools to handle the many of dimensions of software. Environments provide tools for managing, editing, and debugging the source code; tools for developing and experimenting with user interfaces; tools for specifying the design using UML or similar notations; and tools for creating and managing test cases for a system. Research environments have demonstrated tool prototypes for managing design patterns, components, and constraints [3,6,8,16,17,22,24,25,27,29,40]. There are also tools specifically designed to handle software evolution. Most of these tools only deal with the source code and use semantic analysis to either identify code affected by potential changes [2,15,42,47] or that assist in refactoring [5,24,41].These tools, especially those dealing with different aspects of software, are rarely integrated with one another. As a result, software routinely evolves inconsistently along the different dimensions. Typically, developers create an initial design, but, as ...