TITLE: Agile Moments: Incremental Design AUTHOR: Eugene Wallingford DATE: June 28, 2010 4:04 PM DESC: ----- BODY: I love the opening of Research Through Development of Installed Tools, a short section in the conclusion of Richard Stallman's 1979 memo, EMACS: The Extensible, Customizable Display Editor:
The conventional wisdom has it that when a program intended for multiple users is to be written, specifications should be designed in advance. It this is not done, the result will be inferior. The place to try anything new is in a research project which users will not see. Some people know better than this, but they have been silenced.
If only it were so. The section explains why incremental design was essential to the creation of Emacs:
EMACS could not have been reached by a process of careful design, because such processes arrive only at goals which are visible at the outset, and whose desirability is established on the bottom line at the outset. Neither I nor anyone else visualized an extensible editor until I had made one, nor appreciated its value until he had experienced it. EMACS exists because I felt free to make individually useful small improvements on a path whose end was not in sight.
Agile development teams also like to learn from the act of creating software, allowing goals for the software to emerge as the software grows and allowing the value of features to be assessed in the context of the overall system. Of course, design still mattered to Stallman and the other developers of Emacs:
While there was no overall goal, each small change had a specific purpose in terms of improving the text editor in general use, and each step had to be individually well designed and reliable.
The resulting design was, according to Hal Ableson (quoted here), good enough to support a new kind of software development community: "Its structure was robust enough that you'd have people all over the world who were loosely collaborating [and] contributing to it. I don't know if that had been done before." Agile teams use test-driven design, refactoring, and metaphor to keep the quality of their designs on track. Like the Emacs project, agile projects take advantage of real users to keep the usability of their systems on track. Raymond talks about the value of experimentation in writing new software, relegating upfront design to implementing new versions of existing features. These new implementations can take "advantage of hindsight". I'm often pleasantly reminded just how often an experimental mindset can benefit me as a software developer, even when implementing systems in domains where I have some experience. -----