Just over 20 years ago Jack W. Reeves wrote an article in the C++ Journal entitled “What is Software Design?” and I missed it. Not only that but no one thought to point out that I was missing a very important article. An article that challenged and changed/clarified my mental model of software design and construction - 20 years after it was published. A copy of the original article can be found here. I guess it is better late than never and it demonstrates that some things stay relevant and important. Sometimes they remain controversial.

Traditional Thinking

Traditional thinking places writing source code or ‘coding’ firmly in the construction phase. Architecture and design being another activity quite often divorced from the actual code and coding activity. Quite often done around whiteboards or visual design tools. I remember long review sessions to make sure that code actually matched the original design. This view has lead to writing code to being viewed as a commodity which I think very often results in sub-optimal solutions (I am being kind here).

In his article Jack Reeves considers construction to be confined to ‘compilation’ and coding to be design. Even with long running builds in this model the act of construction is short compared to design activities. It also (in my view) more closely matches what building/engineering/crafting software is all about. It also highlights why a lot of analogies to other human activities like house building break down pretty quickly. If building a house from the design was cheap and near instantaneous I wonder what sort of world we might live in.

Dynamic interpreted languages

It is interesting to extrapolate this view to interpreted languages like Ruby and JavaScript. For interpreted languages there is no explicit construction/compilation step. Interpreting and compiling happen during execution typically shortening the feedback cycle significantly - albeit with some impact to runtime performance.

Design is hard

Design is hard, iterative, incremental and demands feedback. Writing code is hard, iterative, incremental and demands feedback. Design is a creative process that is informed both by external forces but also the design being created. Writing code is an act of design not an act of construction - that’s the compiler’s job.