All of these definitions include some notion of the function and form of a system in terms of components,
their static and dynamic interrelationships and environmental relationships, and the principles and
guidelines for the design, evaluation, and evolution of the components and the system as a whole. All of
these are begging definitions because the definitions are themselves based on abstract, ill-defined concepts.
These concepts and the overall definition of software architecture shall become clear throughout the course
of this book.
Software systems have architectures, regardless of how simple they are in terms of components. However,
an architecture is not a system. In early systems the main attributes of real concern were functionality,
ortability, memory usage, and performance—basically, an architecture with relatively few dimensions of
quality attributes. There was no pressing need for software architectural descriptions. Functionality could
be comprehended by looking at the source code itself or executing the system with some reasonable set of
test data. Portability was achieved by simply using higher-level general-purpose programming languages.
Performance could be comprehended by executing the system or studying the algorithms of the program.
When systems started becoming more complex in terms of function and information, the use of structured
rogramming techniques and data modeling methods helped with the design and comprehension of the
software. It was even possible to start modeling the system abstractly as a hierarchy of functions and a
graph of information structures, which made it possible to reason about some aspects of the correctness of
the program before implementing the specific functions and data structures. Programmers would execute
the system or portions of the system to validate the functions and to identify performance bottlenecks.
They would then correct those functions or make those functions more efficient or refactor the functions if
necessary. Similarly, the programmers would study the system for memory and other resource usage.
As software systems continued to grow in complexity, the structured programming and data modeling
techniques could not scale in terms of number of functions or semantic complexity of data, or in terms of
other attributes like modifiability and reliability that were becoming more important in software systems.
In response, object orientation took over as the dominant programming methodology in new application
development. Object orientation could handle the increasing complexity of information semantics and
functions as well as address quality attributes that were becoming increasingly important: reusability and
modifiability. As you can see, it is not enough to model the system directly in source code and reason
about its properties. How do you evaluate source code for reliability, modifiability, or usability? Even the
use of models such as class hierarchies and object collaboration diagrams are not enough to reason about
the many quality attributes required in today's software systems. We need additional tools and techniques
to design software as the architecture of software grows in complexity.
CIVIL ARCHITECTURE: A METAPHOR FOR SOFTWARE DESIGN
The field of civil architecting has become a popular metaphor for the development of software-intensive
systems. In civil architecture the architect creates a representation of a building's physical structure that is
limited in scale or number of dimensions. The architect identifies the constraints on the design such as the
location and local building laws and integrates structural, business, and aesthetic concerns. The architect is
the client's advocate and is trusted to coordinate all aspects of the building project but does not extend to
all aspects of the project. The architect addresses usage, value, cost, and building risks within the client's
requirements. The architect aids the client in making a build or no-build decision.
Software systems today really are more analogous to urban developments than to individual buildings.
Consider how a software system evolves (albeit in condensed time compared to that of cities). If buildings
evolved as drastically as software, we would see buildings where new floors are added or blocks of floors
are removed, or where additional buildings are appended to the existing one. However, when compared to
cities and especially urban development, we do see analogous evolution such as new housing
developments sprouting up where there were none, new roads being created, many highways being
widened to allow for new traffic requirements, and old neighborhoods being razed and replaced with
malls. Two separate urban areas eventually merge and become indistinguishable. This is more like what is
going on in software development today. Of course, with all metaphors there are areas where the two
thin
s bein
com
ared sim
l
don't e
uate, and this is where we need to be careful and avoid the fallac