A better model of programmer temperament

Last updated: August 22, 2012

Steve Yegge stirred up a bunch of controversy recently with a simple model of programmer attitudes: programming has a political axis ranging from liberal to conservative. He declares static typing to be conservative, dynamic typing to be liberal, and a bunch of other such things.

Of course, the model is wrong. To paraphrase Box, “all models are wrong; some are useful”. This one is useful in a limited way: it makes explicit the vast gaps between how different programmers think about programming. The observations that led him to this model are extremely valuable.

But given those observations, I think we can have a much more useful model, one that has both better descriptive power and eschews the loaded terms “conservative” and “liberal”.

Digression: Don’t build models in analogy to political spectra. The notion of a political spectrum is actually quite recent, dating from the French Revolution. In the meeting of the estates general, the third estate sat to the left of the entrance; the first and second estates sat to the right. Thus we have the political left and the political right. Prior to that, the closest thing to a spectrum we had was the Guelphs versus the Ghibbelines in Renaissance Italy. The political spectrum in France led to one side killing everyone in the other side. No use of it or analogy to it since then has been noticeably more productive. Using it is a good heuristic that your model could be profitably reformulated. End Digression.

I’m going to shamelessly steal Scott McCloud’s Big Triangle model. You should go read his presentation. It’s a brilliant piece of work and will forever change how you think about graphic arts. Then go buy his book Understanding Comics. Trust me. It’s worth every penny.

The model space is, appropriately, a big triangle:

The programmers who fall along the left side of the triangle think in terms of specification. They are writing instructions in a language with semantics. Those instructions result in actions when executed by something that obeys those semantics.

Programmers along the right side think in terms of behavior. There is some real system with which they interact to cause certain behaviors. They have a mental model of the system which guides them, but in the end the units of their thought and action are behavioral actions.

Languages are designed to support certain areas of the triangle. Haskell lies not too far from the specificational side, and theorem provers like Coq and the dependently typed languages like Cayenne approach it. Assembly is on the behavioral side by definition (unless you’re an electrical engineer, in which case it’s pretty far towards specification).

However there are very different levels within this. Lambda calculus is an assembly language for a very certain kind of a machine, but placing it near the machine instructions for an Intel processor is somewhat ludicrous. This leads to our vertical axis: the farther towards the upper point someone lies, the more abstractly mathematical their thought about computing.

This may be better phrased as how much they regard entities in the machine as immutable artifacts. A non-programmer, on the bottom side of the triangle, must accept the specified interaction modes of his machine as artifacts which he cannot change. Systems administrators live a few steps up, still primarily in the world of artifacts. Most programmers live in a world where something things are artifacts and some aren’t. For many, languages are artifacts they regard as immutable, but go talk to a compiler specialist or a smug Lisp weeny, and languages become mutable thoughtstuff. Go farther up and the machine, and even what logic you work in, become mutable things at the mercy of the programmer’s mind.

And now we come to why it’s a triangle. The gap between a specificational systems administrator and a behavioral one is vast. A specificational one will work entirely through Chef and Puppet, Fabric to bring up machines, a whole layer of programs meant to provide a semantics in which he can specify his systems. A behavioral one logs into each machine and runs shell commands on it, possibly collecting his commands into scripts. At the top of the triangle, a computational theorist working on higher order logic has no difference between specification and behavior. The question makes no sense for him.

So to summarize,