Recommended holiday reading for programmers
As many of us go on vacation for the holidays, I thought I’d send you all off with some recommendations of the things that, after a couple decades of writing software, I have continued to profitably revisit over the years. None of these are very long. Some are very short but require a lot of contemplation (think of them as koans or sufi tales).
-
Naur, Programming as theory building
The idea of an underlying theory, a mental state of the programmers, is one of the first step of linking human behavior and programs into a unified view of sociotechnical systems.
-
Parnas, Designing software for ease of extension and contraction
The only paper on software architecture I have ever found that doesn’t make me want to hold my nose in places. The switch from designing a program in your mind to designing a program family is powerful change in how you approach software. Think of it as a meta-theory a la Naur.
-
Parnas, Using assertions about traces to write abstract specifications of software modules
We spend lots of time looking at logs from production. This paper gives the underlying theory of how to think about inferring what’s going on from logs, and correspondingly to decide what to log. It also gives a structure for designing test plans for behaviors of systems.
-
Lamport, Time, clocks, and the ordering of events in a distributed system
This is the underlying mental structure for basically all distributed database and systems work. Lamport himself commented: “This is my most often cited paper. Many computer scientists claim to have read it. But I have rarely encountered anyone who was aware that the paper said anything about state machines. People seem to think that it is about either the causality relation on events in a distributed system, or the distributed mutual exclusion problem. People have insisted that there is nothing about state machines in the paper. I’ve even had to go back and reread it to convince myself that I really did remember what I had written.”
-
Three excerpts from three of the wizards of our fields:
These three are about as far apart as you can get from each other, and they contradict each other at foundational levels. They have all produced amazing things in our field from these world views.
-
Aphyr, Hexing the technical interview
There’s a whole series of these! Aphyr’s Vidrun stories are the most hilarious things ever written in programming to my mind. They are also deep magic. Taking the time to track down what’s going on and understand these are a fast way to grow, and you get to belly laugh so hard it hurts at the end once you finish.
-
Oleg Kiselyov, The Taste of Logic Programming
There’s a joke that Oleg solves NP-complete problems in linear time…in the type system. Here he has provided a small program in Scheme that constructs logic programming from basically nothing. There is a profound lesson in here if you can get your brain rewired for it. This is very much a sufi tale as code.
-
Barbara Liskov, Interview on the occasion of her Turing award
Barbara Liskov is one of my favorite software engineers. Most people know her name from the Liskov substitution principle, but her work is so foundational that it has ceased to even be recognized as a thing in our minds. It’s just how our world works.
-
Formal software design with Alloy 6
Alloy is a formal modeling tool, but I like it best as almost a CAD system for investigating my ideas about programs I want to write, or even better using it as a shared scratch pad for multiple people to build a shared mental model. It only takes a couple hours to work through this text.
-
The opening paragraphs of Structure and Interpretation of Computer Programs
These three bullet points are the most useful lens for software design that I have ever found. All the hype about category theory in programming boils down to working out the details of these three in particular cases.