Code Complete, Second Edition
|Additional Resources on Design|
Software design is a rich field with abundant resources. The challenge is identifying which resources will be most useful. Here are some suggestions.
Software Design, General
- Weisfeld, Matt. The Object-Oriented Thought Process, 2d Ed. SAMS, 2004. This is an accessible book that introduces object-oriented programming. If you're already familiar with object-oriented programming, you'll probably want a more advanced book, but if you're just getting your feet wet in OO, this book introduces fundamental object-oriented concepts including objects, classes, interfaces, inheritance, polymorphism, overloading, abstract classes, aggregation and association, constructors/destructors, exceptions, and other topics. Buy from Amazon.com
- Riel, Arthur J. Object-Oriented Design Heuristics. Reading, Mass.: Addison Wesley, 1996. This book is easy to read and focuses on design at the class level. Buy from Amazon.com
- Plauger, P.J. Programming on Purpose: Essays on Software Design. Englewood Cliffs, N.J.: PTR Prentice Hall, 1993. I picked up as many tips about good software design from reading this book as from any other book I've read. Plauger is well-versed in a wide-variety of design approaches, he's pragmatic, and he's a great writer. Buy from Amazon.com
- Meyer, Bertrand. Object-Oriented Software Construction, 2d Ed. New York: Prentice Hall PTR, 1997. Meyer presents a forceful advocacy of hard-core object-oriented programming. Buy from Amazon.com
- Raymond, Eric S. The Art of Unix Programming. Boston, Mass.: Addison Wesley, 2004. This is a well-researched look at software design through Unix-colored glasses. Section 1.6 is an especially concise 12-page explanation of 17 key Unix design principles. Buy from Amazon.com
- Larman, Craig. Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and the Unified Process, 2d Ed. Englewood Cliffs, N.J.: Prentice Hall, 2001. This book is a popular introduction to object-oriented design in the context of the Unified Process. It also discusses object-oriented analysis. Buy from Amazon.com
Software Design Theory
Parnas, David L., and Paul C. Clements. "A Rational Design Process: How and Why to Fake It." IEEE Transactions on Software Engineering
SE-12, no. 2 (February 1986): 251-57. This classic article describes the gap between how programs are really designed and how you sometimes wish they were designed. The main point is that no one ever really goes through a rational, orderly design process but that aiming for it makes for better designs in the end.
Parnas, David L. "On the Criteria to Be Used in Decomposing Systems into Modules." Communications of the ACM 5, no. 12 (December 1972): 1053-58.
Parnas, David L. "Designing Software for Ease of Extension and Contraction." IEEE Transactions on Software Engineering SE-5, no. 2 (March 1979): 128-38.
Parnas, David L., Paul C. Clements. and D. M. Weiss. "The Modular Structure of Complex Systems." IEEE Transactions on Software Engineering SE-11, no. 3 (March 1985): 259-66.
- Gamma, Erich, et al. Design Patterns. Reading, Mass.: Addison Wesley, 1995. This book by the "Gang of Four" is the seminal book on design patterns. Buy from Amazon.com
- Shalloway, Alan and James R. Trott. Design Patterns Explained. Boston, Mass.: Addison Wesley, 2002. This books contains an easy-to-read introduction to design patterns. Buy from Amazon.com
Design in General
- Adams, James L. Conceptual Blockbusting: A Guide to Better Ideas, 4th ed. Cambridge, Mass.: Perseus Publishing, 2001. Although not specifically about software design, this book was written to teach design to engineering students at Stanford. Even if you never design anything, the book is a fascinating discussion of creative thought processes. It includes many exercises in the kinds of thinking required for effective design. It also contains a well-annotated bibliography on design and creative thinking. If you like problem solving, you'll like this book. Buy from Amazon.com
- Polya, G. How to Solve It: A New Aspect of Mathematical Method, 2d ed. Princeton, N.J.: Princeton University Press, 1957. This discussion of heuristics and problem solving focuses on mathematics but is applicable to software development. Polya's book was the first written about the use of heuristics in mathematical problem solving. It draws a clear distinction between the messy heuristics used to discover solutions and the tidier techniques used to present them once they've been discovered. It's not easy reading, but if you're interested in heuristics, you'll eventually read it whether you want to or not. Polya's book makes it clear that problem solving isn't a deterministic activity and that adherence to any single methodology is like walking with your feet in chains. At one time Microsoft gave this book to all its new programmers. Buy from Amazon.com
- Michalewicz, Zbigniew, and David B. Fogel. How to Solve It: Modern Heuristics. Berlin: Springer-Verlag, 2000. This is an updated treatment of Polya's book that's quite a bit easier to read and that also contains some non-mathematical examples. Buy from Amazon.com
- Simon, Herbert. The Sciences of the Artificial, 3d Ed. Cambridge, Mass.: MIT Press, 1996. This fascinating book draws a distinction between sciences that deal with the natural world (biology, geology, and so on) and sciences that deal with the artificial world created by humans (business, architecture, and computer science). It then discusses the characteristics of the sciences of the artificial, emphasizing the science of design. It has an academic tone and is well worth reading for anyone intent on a career in software development or any other "artificial" field. Buy from Amazon.com
- Glass, Robert L. Software Creativity. Englewood Cliffs, N.J.: Prentice Hall PTR, 1995. Is software development controlled more by theory or by practice? Is it primarily creative or is it primarily deterministic? What intellectual qualities does a software developer need? This book contains an interesting discussion of the nature of software development with a special emphasis on design. Buy from Amazon.com
- Petroski, Henry. Design Paradigms: Case Histories of Error and Judgment in Engineering. Cambridge: Cambridge University Press, 1994. This book draws heavily from the field of civil engineering (especially bridge design) to explain its main argument that successful design depends at least as much upon learning from past failures as from past successes. Buy from Amazon.com
- IEEE Std 1016-1998, Recommended Practice for Software Design Descriptions. Los Alamitos, CA: IEEE Computer Society Press. This document contains the IEEE-ANSI standard for software-design descriptions. It describes what should be included in a software-design document.
- IEEE Std 1471-2000, Recommended Practice for Architectural Description of Software Intensive Systems. Los Alamitos, CA: IEEE Computer Society Press. This document is the IEEE-ANSI guide for creating software architecture specifications.