An area of software development that is greatly underserved by books and other training materials is design. Software design is often the principal factor that determines successful products, and yet so few resources discuss how to do it right. Contrast this with the thousands of books on coding and testing.

Given, then, the great need for this information, I am always happy to hear about new books on design. I was particularly delighted when I heard of the new work from Fred Brooks, “The Design of Design—Essays from a Computer Scientist.” As you’ll see shortly, though, I found it somewhat disappointing, even after discussing it with the author. (You’ll find excerpts from our conversation here.) So then, what are the good design books that are worth the time to read?

The best textbook-style overview of software design, in my opinion, is “Object-Oriented Analysis and Design with Applications (3rd Edition)” by Grady Booch and a host of collaborators. It lays out the principles of object-oriented software design clearly and with considerable detail. With its 720 pages written in a dense, dry style, this volume presents a thorough grounding in object-oriented design, with considerable explanation of the whys and wherefores of various rules and caveats. The book also has value as a reference on software design.

For readers just starting on design, or those wanting a good introduction without the density of Booch’s book, there is no better option than “Head First Object-Oriented Analysis & Design.” The Head First series of tutorials from O’Reilly are informal introductions to topics that include puzzles, quizzes, made-up dialogs, and numerous graphical elements that both entertain and instruct. This style is not to everyone’s liking, but it is undeniably effective as a means of teaching technical topics. In almost every category in which there is a Head First title, that book appears on the list of best-sellers on Amazon’s website. Of the Head First volumes I’ve seen, this one and the one on Java are probably the two best.

Both the Booch and the Head First books rely on UML to communicate designs. This is no surprise, as that notation essentially cleared out all contending notations in the 1990s, when Rational Software absorbed—or, to use its term, unified—its competitors. Whether you like UML or not, it has the important benefit of being universal. So, to learn design, you must have working knowledge of UML.

Both books present the working minimum information on the notation. But you’re likely to find that you’ll want to express ideas outside of the subset you’re shown. In my opinion, the best book for understanding UML is “Learning UML 2.0” by Russ Miles and Kim Hamilton, which is a concise, comprehensive and clear explanation of UML with many examples.

When working on design, it’s often valuable to read discussions of design outside your own domain. Inspiration and understanding come thereby. With little doubt, the most valuable book in this area is Donald Norman’s classic, “The Design of Everyday Things.” This is a highly readable book that explains good and bad design in the context of common objects.

For example, there is a chapter on the design of door handles. How do handles at a store entrance tell us to push or pull? If you’re confused, he contends, this is a design error, and he explores in depth the forms this error takes and how successful designs work. The carryover of these concepts to widget and GUI design is direct and immediate.