Computers have a significant impact on almost every aspect of our lives. Computer systems are used as integral components in the design of many of the artifacts we use and the homes we inhabit. They also control the operation of a number of devices we frequently use, and record information on many of the significant actions we take in our daily lives. The rapid increases in performance and reliability of computer hardware, coupled with dramatic decreases in their size and cost, have resulted in an explosion of uses of computer technology in a wide variety of application domains. A consequence of this trend is that computer software is in great demand. In addition to new software being written, many millions of lines of existing software are in daily use, and require constant maintenance and upgrade. As a result, computer software is very often the overriding factor in a system’s costs, reliability, performance, and usability. Software that is poorly designed, implemented, and maintained is a major problem for many companies that make use of computer systems. These facts have led to increasing attention being placed on the processes by which software is developed and maintained, and on the computer-based technology that supports these activities. Over the past decade or more, this attention has focused on understanding better how software can be produced and evolved, and on providing automated support for these processes where appropriate. One of the consequences of this attention has been the development of the field of computer-aided software engineering (CASE), which directly addresses the needs of software engineers themselves in the use of computerbased technology to support their own development and maintenance activities. The promise of CASE is that automated support for some aspects of software development and maintenance will: • increase productivity and reduce the cost of software development, • improve the quality (e.g., reliability, usability, performance) of software products, • keep documentation in step with software products as they evolve, • facilitate maintenance of existing software systems, and • make the software engineers’ task less odious and more enjoyable.