|
|
|
Software is invisible to most of the world. Although individuals, organizations, and nations rely on a multitude of software-intensive systems every day, most software lives in the interstitial spaces of society, hidden from view except insofar as it does something tangible or useful.
Despite its transparency, as Bjarne Stroustrup has observed, "our civilization runs on software." It is therefore a tremendous privilege as well as a deep responsibility to be a software developer. It is a privilege because what we do collectively as an industry has changed and will continue to change the world1. It is a responsibility because the world in turn relies on the products of our labor in so many ways2. In the context of that labor, software is perhaps the ultimate building material: it springs from pure thought and is intrinsically malleable, yet it can be made manifest in our hardware systems, limited only by our vision (and by certain immutable laws of physics and software3). As software professionals, we seek to develop and to deploy useful systems of quality in a manner that reduces the distance from vision to execution. That the fruits of our labor are transparent to the world is as it should be: users want results and value, not more technology. For this reason, the primary challenge of every software development team is to engineer the illusion of simplicity in the face of essential complexity.
Software development has been, is, and will likely remain fundamentally hard. To that end, the entire history of software engineering is one of rising levels of abstraction, for abstraction is the primary way we as humans deal with complexity. We see this reflected in the maturation of our programming languages, platforms, processes, tools, and patterns. Indeed, every well-structured software-intensive system is full of patterns, ranging from idioms that shape the use of a particular programming language to mechanisms that define the collaboration among societies of objects, components, and other parts to architectural styles that shape entire systems. At the highest level of abstraction, every system has an architecture, encompassing the key abstractions and mechanisms that define that system's structure and behavior as seen from the perspective of different stakeholders, each with a different set of concerns. In every case - from idioms to mechanisms to architectures - these patterns are either intentional or accidental, but insofar as they are visible, such patterns reflect the style and inner beauty of each system.
It is a sign of maturity for any given engineering discipline when we can name, study, and apply the patterns relevant to that domain. In civil engineering, one can study the fundamental elements of architecture in references that expose and compare common architectural styles; if you want to become an architect, you study the work of the masters who have come before you. Similarly, in chemical engineering, mechanical engineering, electrical engineering, and now even genomic engineering, there exist libraries of common patterns that have proven themselves useful in practice.
Unfortunately, no such architectural reference yet exists for software-intensive systems. Although the patterns community has pioneered the vocabulary of design patterns through the work of the Hillside Group and the Gang of Four (in their seminal book, Design Patterns4), our industry has no parallel to the architecture handbooks found in more mature design disciplines, such as Calloway and Cromley's The Elements of Style5, Alexander's The Nature of Order6, The Phaidon Atlas of Contemporary World Architecture7, Perry's Chemical Engineers' Handbook8, Sclater and Chironis' Mechanism and Mechanical Devices Sourcebook9, Christiansen's Electrical Engineers' Handbook10, or the ICRF Handbook of Genome Analysis11.
This Handbook seeks to fill this gap for software-intensive systems.
1 Paul Levy, one of the founders of IBM Rational, once remarked, "Ultimately, building software is the world's most important industry. Software today allows a brother in San Jose to call a sister in St. Petersburg. Software today speeds the process of drug discovery, potentially curing Alzheimer's. Software today drives the imaging systems that allow the early detection of breast cancer and other maladies. Software controls the passive restraint systems and antilock breaking systems that save children's lives in automobiles every day. Software powers our communication and transportation technologies. Software allows us to peer deep within ourselves and study the human genome. Software allows us to explore and understand our universe. And, make no mistake about it, we are just getting started."
2 See also Computer Professionals for Social Responsibility.
3 Harel, D. Computers, Ltd. Oxford, England: Oxford University Press, 2000.
4 Gamma, E., Helm, R., Johnson, R., and Vlissides, J. Design Patterns: Elements of Reusable Object-Oriented Software. Reading, Massachusetts: Addison-Wesley, 1995.
5 Calloway, S. and Cromley, E. The Elements of Style. New York, New York: Simon and Schuster, 1997.
6 Alexander, C. The Nature of Order: A Vision of the Living World, vol. 3. Berkeley, California: Center for Environmental Structure, 2004.
7 Editors of Phaidon Press. The Phaidon Atlas of Contemporary World Architecture. Boston, Massachusetts: Phaidon Press, 2005.
8 Perry, R. and Green, D. Chemical Engineers' Handbook. New York, New York: McGraw Hill, 1997.
9 Sclater, N. and Chironis, N. Mechanism and Mechanical Devices Sourcebook. New York, New York: McGraw Hill, 2001.
10 Christiansen, D. Jurgen, R., and Fink, D. Electronics Engineers' Handbook. New York, New York: McGraw Hill, 1996.
11 Spurr, N., Young, B. and Bryant, S. ICRF Handbook of Genome Analysis. Oxford, England: Blackwell Science, 1998.
|
|
|
|