"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)