2018-06-13
___T_h_e__T_i_m_e_l_e_s_s__W_a_y__o_f__B_u_i_l_d_i_n_g_______________

During my vacation I came to read Christopher Alexanders excellent
book "The Timeless Way of Building"[0]. It describes (the following
is oversimplified) a generative way of describing architecture so
that the built results are places where people enjoy being in, they
get used in the intended way and have a 'quality withouth a name'
attached to them that make them beautiful, practical and enjoyable.

In contrast most modern architecture seems to be ugly, uninhabitable,
boring, depressing. One reason for this according to Alexander is the
missing connection between the architect's pattern langugage and the
people inhabitating, building and using ta house or town.

Old buildings seem to connect all people involved to create a thing
that's unique and built specifically to meet the needs and
requirements for its inhabitants and the location. This is done by
interpreting the patterns and adapting their variety to the local
needs. Hence all parties need to be involved.

So this seemed to have inspired people to carry the notion of
generative patterns that create inherently good things over to
software. And that's where we see them as 'design patterns'.

I find that metaphor a bit stretching but it seems Alexander got
invited to give a keynote speech on OOPSLA 1996 [1].

There one finds that both parties Alexander and the SW community
aren't on the same page. He gives the following caveat in his speech:

  When I look at the object-oriented work on patterns that I've
  seen, I see the format of a pattern (context, problem, solution,
  and so forth). It is a nice and useful format. It allows you to
  write down good ideas about software design in a way that can be
  discussed, shared, modified, and so forth. So, it is a really
  useful vehicle of communication. And, I think that insofar as
  patterns have become useful tools in the design of software, it
  helps the task of programming in that way. It is a nice, neat
  format and that is fine.

  However, that is not all that pattern languages are supposed to
  do. The pattern language that we began creating in the 1970s had
  other essential features. First, it has a moral component. Second,
  it has the aim of creating coherence, morphological coherence in
  the things which are made with it. And third, it is generative: it
  allows people to create coherence, morally sound objects, and
  encourages and enables this process because of its emphasis on the
  coherence of the created whole.

  I don't know whether these features of pattern language have yet
  been translated into your discipline.

So apart from the benefit of being able to reason about design using
pattern language other qualities should be present at the same time.
And this is were the metaphor is ending for software, even today.

There is hardly any moral aspect in today's design language. The UX
folks have a start when discussing manipulative or deceptive design
but there aren't any patterns for good design so far.

The patterns don't strive for coherence with the things they are made
with. Software is not written for a single purpose (other than to
generate revenue in most cases...) and hardly with the user in mind.
And noone really cares about the generated whole. Maye in closed
systems like Apples this was more dominant than in others (iPhone UIs
come to mind). But with ubiquitous web interfaces this is not the
case anymore.

Also another pattern langugage rule that's violated with software
patterns is: They have to be simple and widerspread known and can be
understood by anyone. If it is not easy to tell people orally, it's
not a pattern. I think the design patterns that fill our bookshelves
will most likely fail in this regard.

Maybe they are too low level. Hardly anyone trying to get work done
with a piece of software cares about the singleton factory facade
underneath.

Also Alexander argues that to test a pattern language one should
generate designs (or 'play out' designs) from the language and
evaluate those to fitness of the requirements. I am not aware of any
methodology in SW design that does this. SW patterns are somewhat
passed around as the given solution to a problem but there's no way
to check whether the whole design will make sense.

We need an easier language to describe our designs and design
decisions. We need morally sound software. Software that service
people, do not betray them and are clear in what they do.

I still think a pattern language is helpful to specify and argue
about design in software.  How should a language like this look like?
Who should be formulating the requirements?

I think programmers will need to close the loop and distance between
them and the users. This has been said many times of course and
people are arguing whether everyone needs to be a programmer.

I think that's a bit of an exaggeration. Not everyone needs to be a
programmer. But everyone should be able to discuss design and this
includes software design. So the next step in our evolution would be
to relearn a language that allows us to formulate designs in a way
other humans will understand and are able to evaluate.

Much like everyone used to be able to tell a builder what a good
house / barn looks like for them.  The builder can handle the
necessary technical details and choose the tooling but the outcome
would be inspectable and also up for discussion.

I think a way to accomplish this is to abandon a lot of stock
software and return to building tiny pieces tailored to individual's
needs. If needs change tools must change too. Like moving into
another building or rebuilding a house to fit the new needs of a
growing or shrinking family.

I have no idea how this would work in practise, but let's build
small, working things for people we know and care about. That may
contribute to a better software world too.

___References________________________________________________________

[0]: gopher://gopherpedia.com/0/The%20Timeless%20Way%20of%20Building
[1]: http://www.patternlanguage.com/leveltwo/archivesframe.htm?/leveltwo/../archives/ieee/ieee.htm