The net result of the forces just described is that the creation of the initial architecture must be grounded in a thoroughly pragmatic approach. The emerging discipline of software patterns provides such an approach. Software patterns capture known solutions to recurring problems in ways that enable you to apply that knowledge to new situations. Good patterns have been used in several systems, and the best patterns have been used in dozens or hundreds. Someone, and often, several people, have taken the time to research, understand, and carefully document the problem, and a proven way to solve it, so that others can leverage the experiences learned from systems that are known to work. A software pattern is "pre-digested" knowledge.
Architectural patterns capture fundamental structural organizations of software systems. Primarily addressing the technical aspects of architecture presented earlier in this chapter, they provide descriptions of subsystems, define their responsibilities, and clarify how they interact to solve a particular problem. By focusing on a specific class of problem, an architectural pattern helps you decide if that kind or style of architecture is right.
The pragmatic approach when creating a software architecture is to explore the various documented patterns and choose one that is addresses your situation. From there, you must tailor the architecture to meet your needs, ultimately realizing it in a working system. The tailoring process and the design choices made are guided by the principles described later in this chapter. If you are familiar with architectural patterns, you might want to read the remainder of this book as a way to "fill in the gaps" in each one. For example, every software architecture can benefit from a well-designed installation and upgrade process or sensibly constructed configuration files. The goal is to use all of these approaches to create and sustain winning solutions.