---
title: I can't believe I missed this!
url: https://www.grahambrooks.com/post/2013-02-06-i-cant-believe-i-missed-this/
date: 2013-02-06T00:00:00+00:00
author: Graham Brooks
tags:
- architecture
---

# I can't believe I missed this!

Just over 20 years ago
[Jack W. Reeves](http://www.bleading-edge.com/Publications/list.htm)
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](http://www.developerdotstar.com/mag/articles/reeves_design.html). 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](http://www.ruby-lang.org) and
[JavaScript](http://en.wikipedia.org/wiki/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.
