"The software architecture of a program or computing system is the structure or structures of the system,
which comprise software components, the externally visible properties of those components, and the relationships among them.
By 'externally visible' properties, we are referring to those assumptions other components can make of a component,
such as its provided services, performance characteristics, fault handling, shared resource usage, and so on.
The intent of this definition is that a software architecture must abstract away some information from the system
(otherwise there is no point looking at the architecture, we are simply viewing the entire system)
and yet provide enough information to be a basis for analysis, decision making, and hence risk reduction." (Bass, Clements, and Kazman)