Erik is the co-author of Cocoa Design Patterns.
The two most important books ever written about software development are Fred Brooks’ The Mythical Man-Month: Essays on Software Engineering published in 1975 and Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides published in 1994. Whenever a large software project struggles, the root cause can almost always be traced to inadequate observance of the lessons provide by those two books.
The lessons are more relevant today than ever.
Design Patterns has revolutionized software development over the last 15 years. I have replaced my own dog-eared copies a few times; I keep wearing them out. During interviews, I ask potential new hires about their familiarity with design patterns and terminology. I give a copy to each new hire who doesn’t already have one.
Software development is still a young discipline. If software is analogous to bridge building, we are barely past the phase of throwing a log across the chasm. The art and science of bridge building progressed as reusable designs were disseminated among builders. Designs that are know to be reliable provide confidence that bridges are safe. A catalog of known bridge designs captures the current state of the art and frees bridge designers to concentrate on evolving and optimizing for new technology.
Design Patterns remains so important because there are still many software developers who have never seen the software equivalent of a stone arch or spandrel braced cantilever or subdivided warren truss. If you set out to build software without knowing about the existing successful designs, you are condemned to either reinvent them or likely build a less reliable and less efficient solution. Design Patterns contains a concise catalog of successful low level software designs along with the analysis and trade-offs that engineers must consider when selecting a design. Design Patterns enables developers to think at higher levels. Design Patterns provides reusable engineering solutions that integrate well with the artful pursuit of computer science.
Most importantly, Design Patterns defines an invaluable software-specific technical vocabulary to discuss designs. I can propose the use of the “Command” pattern to a colleague, and the colleague will understand the trade-offs implicit in the design. A colleague may tell me that a software object is a “Singleton,” and I immediately infer the goals and usage of that object in the same way that a bridge designer infers information from the suggestion of a spandrel braced cantilever design. Design Patterns frees practitioners from starting at first principles in technical discussions.