About the Book
Software Architecture: Foundations, Theory, and Practice is arguably the first full-length textbook on the subject of software architecture. It is primarily intended for use in upper-division undergraduate or graduate courses in software architecture or software engineering, and it expands upon the material generally introduced in a first course in software engineering. Although it has all the elements of a textbook—review questions, exercises, an extensive bibliography, and so on—we also wrote the book for readers outside the classroom. We hope that the book’s practical advice and broad scope are also of interest to practicing software engineers and architects, or anyone interested in learning about the field.
The first edition of the book appeared in January 2009. The book is published by John Wiley & Sons, Inc.
The book is notionally broken up into three parts.
The first part, Chapters 1 to 5, presents the critical concepts of software architecture. Chapter 5 also bridges to the next section, the nuts and bolts of applying the concepts, which encompasses Chapters 6 through 10. Chapters 11 through 17 treat associated issues: topics that may be critical in one development context, but not in another.
Chapter 1: The Big Idea
The chapter introduces software architecture through discussion of three primary examples of its application: in the very large (the architecture of the World Wide Web), in the very small (pipe-and-filter on the desktop), and in the product/in the many (the Philips/Koala architecture for consumer electronics).
Chapter 2: Architectures in Context: The Reorientation of Software Engineering
The role of software architecture in the major activities of software engineering is explored, including application conception, design, implementation, and analysis. An architecture-centric perspective on development is presented.
Chapter 3: Basic Concepts
Definitions of the key terms and concepts are presented. The definitions build from the examples in the preceding chapters and form the foundation for the subsequent chapters.
Chapter 4: Designing Architectures
The concepts of the preceding chapters are made productive in this one. This chapter presents, at length, techniques and approaches for designing applications from an architecture-centric perspective. The central focus is on the ways in which refined experience may be used to guide new developments.
Chapter 5: Connectors
Connectors play a distinguished role in architecture-centric development. They are also, perhaps, the most unfamiliar concept to those unskilled in the art of system design. This chapter reveals the breadth and depth of the concept, and includes an extensive guide to the numerous techniques available.
Chapter 6: Modeling
This chapter surveys an extensive range of modeling notations used for capturing the design decisions that make up an architecture. Notations from research and practice are examined, and the distinctive aspects of each notation are called out. A consistent running example application is used throughout the chapter to demonstrate each notation.
Chapter 7: Visualization
This chapter draws a distinction between how architectures are modeled-the syntax and semantics of how design decisions are documented-from how they are visualized. Visualization encompasses both depiction-how design decisions are presented-and interaction-the ‘user interface’ through which stakeholders interact with those depictions. Various visualization approaches are surveyed and compared, along with techniques for constructing and integrating new visualizations.
Chapter 8: Analysis
One of the primary benefits of software architecture is that it can enable early assessment of a given system, before significant resources are invested in the system’s implementation and deployment. This chapter provides a broad overview of the various analysis techniques that can be applied at the architectural level, their strengths, and limitations.
Chapter 9: Implementation
This chapter describes the problem of moving from architectural design decisions to implementation artifacts. Special attention is paid to the use of architecture implementation frameworks, special-purpose middleware that bridges the gap between architectural styles and existing platform services. Two complete implemented applications in alternative frameworks are presented with commentary.
Chapter 10: Deployment and Mobility
This chapter addresses deployment and mobility, two related topics that have become important in contemporary distributed, embedded, and pervasive systems. The objective of the chapter is not to provide a complete treatment of these two topics, but rather to isolate and focus on their characteristics from an explicit software architectural perspective.
Chapter 11: Applied Architectures and Styles
Several examples from “the practice” are explored, showing how various of the ideas in the preceding chapters have been applied to solve deep and commercially important problems. The architectures of the World Wide Web, Napster, Gnutella, Skype, BitTorrent, robotics systems, Google, and Akamai are all discussed. The pedagogical goal is showing how multiple simple architectural approaches can be combined effectively.
Chapter 12: Designing for Non-Functional Properties
This chapter selects a set of non-functional properties that are frequently required of large and complex software systems: efficiency, complexity, scalability, adaptability, and dependability. The role of software architecture in achieving the desired level of each property is discussed, and many specific architectural design guidelines are provided and discussed.
Chapter 13: Security and Trust
Architecture-based techniques are presented for coping with security and trust needs in application system design. After a general introduction to security issues attention is focused on architecture-based access control and reputation-based trust systems.
Chapter 14: Architectural Adaptation
The theme of this chapter is use of an architectural model to guide long-term system adaptation. A comprehensive conceptual framework for adaptation is presented, followed by consideration of numerous specific techniques for effecting adaptation and for designing applications to be accommodating of post-release adaptation.
Chapter 15: Domain-Specific Software Engineering
Architecture-centric development is perhaps most valuable when applied in the context of a specific domain, where reuse of hard-won engineering knowledge and principles can substantially reduce the amount of effort, cost, and risk involved in system development. This chapter surveys a variety of techniques for applying architecture-centric development within a domain, and ends with an extensive treatment of product-line architectures.
Chapter 16: Standards
A practicing architect or system developer is faced with a panoply of de facto and de jure standards-IEEE 1471, UML, SysML, DoDAF, RM-ODP, and so on. The chapter opens with a discussion of standards, how they are created and evolved, and how they can add value to development efforts. The remainder of the chapter surveys the most influential standards and attempts to put them in perspective, identifying their strengths and weaknesses explicitly.
Chapter 17: People, Roles, and Teams
An effective architect may need to possess many different skills, beyond just being a good software designer. An architect is an integral part of a larger organization, and may be one of several architects working on a project. The context within which software architects operate, and therefore their job description, can get quite complex. This chapter overviews the various roles software architects may play in a project and, more broadly, an organization.