Complexity is an inevitable by-product of every successful software system. More users will push the limits of availability, scalability, and performance. New features will be bolted on and wedged in wherever they fit. As software grows, the sheer size of the system can overwhelm the teams who develop it. Without constant vigilance, software systems eventually become victims of their own success.
All hope is not lost. When complexity rears its ugly head, we have options for keeping it in check. We can make the software smaller again by altering the requirements and snipping out code. We can divide big, complex things into smaller things that are easier to reason about and manage. We can also hide details and think about the software from the perspective of coarser-grained abstractions.
In Define the Essential Structures you learned that architecture is made up of structures, which in turn are composed of elements and relations. In this chapter you’ll learn how to use these basic building blocks to create meaningful models that help us reason about our designs.
3.145.12.34