This text presents software engineering as an evolving discipline, and current practices are explained in the context of their initial goals and historical setting. The software process is one of problem solving, and the solutions must be expressed as formal models. This cohesive work provides a basic grounding in the process of software development and explains how a disciplined application of methods and tools can improve the quality and productivity of projects such as information systems, software tools, and engineering analyses. Designed as a text for upper-class undergraduates, or first-year graduates, this book offers an integrated and pragmatic overview of software engineering that should be of interest to practitioners as well. Techniques are compared and contrasted, and the way in which each responds to particular problems inherent in software engineering is demonstrated. All illustrations are drawn from a central case study--the development of a software configuration management system. The book contains exercises and an extended reading list.