This chapter presents a survey of software architecture approaches. It is intended for a broad audience of students, practitioners, and researchers, in particular those who may be new to the area of software architecture. The chapter begins with a brief history of software architecture as a discipline. This is followed by a survey of established and emerging software architecture approaches. In the section on established approaches software architecture concepts are presented, which include software architecture views, decomposition strategies, description languages, and patterns; overviews of two established approaches (structured design and object-oriented design) are provided. In the section on emerging approaches, agent-, aspect-, and component-oriented approaches are included. For each of these approaches an overview, survey of the literature in the area, and a discussion are presented. The discussion includes current research issues in the community. The conclusions provide a summary of the chapter; future research directions follow.
Software engineering has a number of established activities used in developing systems including requirements engineering, designing the software at multiple levels of abstraction, implementing, testing, and so forth. One of the design activities is to create a software architecture, which realizes the functional and nonfunctional requirements for the system. Today, a software architecture is generally understood to be a collection of components, which have externally visible properties (i.e., the provided services, performance characteristics, fault handling, shared resource usage, etc.) and the relationships among the components (Abowd, 1998; Clements, 2003; IEEE 1471, 2000; Shaw & Garlan, 1996). The concept of software architecture is beyond the algorithms and data structures of the computation and focuses on designing and specifying the overall system’s gross organization and global control structure; protocols for communication, synchronization, and data access; assignment of functionality to design elements; physical distribution; composition of design elements; scaling and performance and selection among design alternatives.
The discipline of software architecture has its roots in the early work of Dijkstra (1968) and Parnas (1972), where the importance of well structured, or modularized, system was described. The term architecture was used by Brooks and Iverson in the 1960s (1969); they defined it as the “conceptual structure of a computer...as seen by the programmer.” This work has made a clear distinction between the description of what each module should do and its implementation, a distinction that remains in place today. As the discipline matured, topics within software architecture have received substantial attention, including the definition of architectural styles, or patterns, architecture description languages, and approaches to analyze software architectures. A broad survey of the history of the discipline is available in Shaw and Garlan (2006), providing a valuable organization and presentation of software architecture work. Due to its breadth, however, more recent architectures are not included (e.g., aspect-oriented architecture) or receive light treatment (e.g., agent- and service-oriented). This chapter proposes a complementary comparison, which surveys more recent approaches in more depth. Established approaches and three newer approaches (aspect-oriented, agent-oriented, and component-oriented architecture) are included. The three newer approaches have been selected based on the research interests of the authors; the survey is not exhaustive and could be extended in the future to include additional approaches, for example, supporting the design of dynamically adaptable systems.
Each of these emerging approaches included in the survey has been proposed to offer a distinct improvement to the established approaches. The aspect-oriented approach improves the ability to modularize capabilities, such as security, availability, and so forth, in an architecture that would typically crosscut many parts of a more traditional design; this improves the maintainability of the design. The agent-oriented approach improves the ability to model the social complexity of systems, as modern systems may need to operate in distributed environment composed of diverse, interacting business organizations that have their own goals and strategies. The component-oriented approach improves the ability to rapidly deploy high quality systems in order to meet the needs of quickly changing business environments. The approaches included in the survey for these emerging software architecture approaches have been selected because they provide a (standardized) reference model, a novel software architecture solution, or a software architecture methodology. This survey is expected to be of interest to students, researchers and practitioners, in particular those who may be new to the area of software architecture.