Code as Design: Three Essays by Jack W. Reeves
The following essays by Jack W. Reeves offer three perspectives on a single theme, namely that programming is fundamentally a design activity and that the only final and true representation of "the design" is the source code itself. This simple assertion gives rise to a rich discussion—one which Reeves explores fully in these three essays.
The first essay, "What Is Software Design?," was first published in the Fall 1992 issue of the now defunct C++ Journal. After a period of obscurity, in recent years the essay has entered the flow of ideas and discussion in the software development community at large, largely due to its exposure on the web and in Robert Martin's book Agile Software Development: Principles, Patterns, and Practices. The essay is published here in its entirety and in its original form.
The second essay, "What Is Software Design: 13 Years Later," is the author’s first writing on the subject of "code as design" since 1992. Over the years Reeves has followed the discussion that grew from the original essay, and here for the first time he responds to the most common arguments he has encountered. In the course of this task, Reeves also considers certain ideas from the original essay in light of more current trends and techniques.
The third essay, titled simply "Letter to the Editor," is the original letter written by Jack W. Reeves to C++ Journal. The letter is published here for the first time. It stands as a rewarding essay in its own right, giving first written expression to the themes and ideas found in "What is Software Design?" In some aspects it is even more comprehensive and spirited than the essay it inspired.
In the thirteen years since their original publication, these ideas—even today still fresh, challenging, and controversial—have taken hold (in different ways and to differing degrees) as key concepts underlying new, increasingly popular techniques and schools of thought such as Agile and craft-based methodologies; test-first design and test-driven development; and refactoring.