Software architecture is a discipline focused on the quality attributes of a system, the "ilities". While functional requirements and constraints are important to understand, the software architect is primarily concerned with the quality attribute requirements. The Software Engineering Institute at Carnegie Mellon University uses the following definition of software architecture.
The software architecture of a program or computing system is the structure or structures of the system, which comprise the software elements, the externally visible properties of those elements, and the relationships among them.
Bass, L.; Clements; P. & Kazman, R. Software Architecture in Practice, Second Edition. Boston, MA: Addison-Wesley, 2003.
Others define it differently but in most cases you can begin to communicate intelligently about a software architecture by answering the following questions to the level required by the parties who need to communicate about it.
- What are the elements of the system?
- What are the roles and responsibilities of the elements?
- What are the externally visible characteristics of the elements?
- How do the elements relate to each other?
- What are the characteristics of the relationships?
These questions can be applied to various aspects (or views) of a system to produce a helpful composite which can be used to communicate about the architecture, including evaluation and refinement of the architecture. The main aspects of a system can be grouped into three major categories.
- Module Views -- the non-runtime views of the software (e.g., uses, layers, generalization, etc)
- Component and Connector Views -- the runtime views of the software (e.g., publish-subscribe, client-server, peer-to-peer, etc)
- Allocation views -- the mapping of software elements onto hardware or humans (e.g., deployment, implementation, work assignments, etc)