This book introduces the concepts and practice of software architecture-what a system is designed to do, and on how its components are meant to interact with each other. An architecture is an abstract view, distinct from the details of implementation, algorithm, and data representation. Its creation is the first step in designing a system with properties desired by customers, end users, developers, maintainers, and other interested parties. The authors cover here not only essential technical topics for specifying and validating a system, but, for the first time, emphasize the importance of the business context in which large systems are designed. Enhancing both technical and organizational discussions, key points are illuminated by substantial case studies undertaken by the authors and the Software Engineering Institute