Alexander, Christopher. Notes on the Synthesis of Form. Cambridge: Harvard University Press, 1964.
The book that introduced patterns. The basic idea is that each design decision resolves some of the conflicting constraints and creates (one hopes smaller) constraints to be resolved by future decisions. These configurations of constraints repeat, hence the word “pattern.”
---. The Timeless Way of Building. New York: Oxford University Press, 1979.
I can’t recommend this book highly enough. It starts by re-imagining the relationship between designers and those designed for. Who should have the power to do what? It then applies patterns and novel construction techniques to defer most design decisions far beyond what would seem sensible (is this sounding familiar yet?).
Ball, Philip. Branches: Nature’s Patterns. New York: Oxford University Press, 2011.
---. Flow: Nature’s Patterns. New York: Oxford University Press, 2011.
---. Shapes: Nature’s Patterns. New York: Oxford University Press, 2011.
As designers of an intellectual artifact, we tend to believe that we can design whatever we want however we want to design it. Nope. Our work is subject to natural laws (more about this in the next Empirical Software Design book). This trilogy is a cabinet of curiosities from design in the natural world.
Beck, Kent. Smalltalk Best Practice Patterns. New York: Pearson Education, 1997.
---. Implementation Patterns. Upper Saddle River: Addison-Wesley, 2007.
These two books address design at the scale addressed by Tidy First?. The question answered is, “How would we code if we wanted to communicate with other humans?”
Feathers, Michael. Working Effectively with Legacy Code. Upper Saddle River: Pearson Education, 2004.
An inspiring take on continuing to design in spite of the constraints created by legacy and production code.
Fowler, Martin. Refactoring: Improving the Design of Existing Code. Boston: Addison-Wesley, 1999.
A handbook of ways to improve existing designs.
Hanson, Chris, and Gerald Jay Sussman. Software Design for Flexibility. Cambridge: MIT Press, 2021.
Small-scale design approaches that tend to support ongoing change.
Lemaire, Maude. Refactoring at Scale. Sebastopol: O’Reilly Media, 2021.
This book resolves the often-conflicting constraints of new features, better structure, and the need for reliable production.
Mollison, B.C. Permaculture 1. London: Transworld Publishers, 1988.
My definition of design as “beneficially relating elements” restates the definition of permaculture. Permaculture is a discipline of designing ecosystems that yield value while retaining the resilience of natural ecosystems.
Myers, Glenford J. Composite/Structured Design. New York: Van Nostrand Reinhold, 1978.
An early approach to information hiding—functions in modules that assume as little about each other as possible.
Norman, Don. The Design of Everyday Things. New York: Basic Books, 2013.
You’ll never again blame yourself for pulling a door instead of pushing it. Also, the “affordances” Don describes are applicable to software design.
Normand, Eric. Grokking Simplicity. Shelter Island: Manning, 2021.
Some folks think it’s “functions versus objects.” I agree with Eric that the more valuable perspective is “functions inside objects.” This book addresses the cost of change by applying functional programming.
Ousterhout, John. A Philosophy of Software Design. Palo Alto: Yaknyam Press, 2018.
This is the book that got me off my butt writing. John’s points are well taken about making design better, but they are presented dogmatically—always keep your code as clean as you possibly can. The question mark in Tidy First? is a direct response.
Page-Jones, Meilir. What Every Programmer Should Know About Object-Oriented Design. New York: Dorset House, 1995.
A translation of coupling into the world of objects. Since the definitions of “coupling” and “connascence” are identical, I use “coupling.”
Parnas, David Lorges. Software Fundamentals: Collected Papers by David L. Parnas. Edited by Daniel M. Hoffman and David M. Weiss. Boston: Addison-Wesley Professional, 2001.
Professor Parnas knew about design before pretty much everyone. His thinking and vocabulary shape our conversations.
Petre, Marian, and Andre Van Der Hoek. Software Design Decoded. Cambridge: MIT Press, 2016.
Describes activities you’ll see expert designers apply. Since it’s such a short, approachable book, there is little detail about any given activity. Use it as a prompt: “Well, I don’t ever do that, so I’d better try it.”
Seemann, Mark. Code That Fits in Your Head. Boston: Addison-Wesley Professional, 2021.
The human brain doesn’t come with an operator’s manual. This book is close to an operator’s manual for the programming brain.
Weinberg, Gerald M. The Psychology of Computer Programming. New York: Dorset House, 1998.
The book that pioneered the radical approach of assuming programmers are humans.
Yourdon, Edward. Techniques of Program Structure and Design. Upper Saddle River: Prentice Hall, 1975.
An early description of software design, superseded by…
Yourdon, Edward, and Larry L. Constantine. Structured Design. Upper Saddle River: Prentice Hall, 1979.
This is the bible of software design. Newton’s laws for software designers. Everything in Tidy First? restates points made in Structured Design.