Castles of Abstraction

May 28, 2020 ☼ PhilosophyHumanity

I originally published this on my newsletter.

A few months ago I had a moment of existential crisis.

We were remodeling our basement bathroom and wanted the toilet moved. The contractors came, jackhammered the cement, and laid new pipes. I got home from work and wanted to see the progress, so I poked my head in and saw… dirt.

There was dirt under my house.

I closed the door slowly and backed away.

My house is just a fancy hut.

Don’t get me wrong—I am so privileged to have a nice, safe home. But when I say it’s a fancy hut, I mean it’s not magic: it’s some cement in the ground with some brick, cinderblock, and wood on top.

Sometimes we get extra fancy. We shove stuff in the walls for extra insulation. We pipe water in and out. We hide wires in the walls so we don’t have to see them (so unsightly). Indoor plumbing, which I accept daily as basic fact of life, was not commonplace even in the U.S. as recent as 80 years ago.

My first reaction at seeing the dirt was surprise—I had never really thought about it much. My second reaction was a wave of shame. Of course there was dirt under my house, what else could there be? I felt like a fool, blinded by a privileged life of playing with computers all day for money.

I forgot there was dirt under my house.

I think everyone is capable of understanding anything about computers, but no one is capable of understanding everything.

Computers are complex. We can’t possibly hold all computerdom in our head at once—our brains would ’splode. So, we necessarily establish boundaries and dig foundations for castles of abstraction.

Every day we work hard in our hyper-dimensional castles, and every day the castles expand in new, M.C. Escher-esque ways. Yet we walk their familiar halls with increasing confidence, because we too grow with the castle.

The deeper and more comfortable we are within the walls of abstraction, the easier it is to lose touch with reality.

“The programmer, like the poet, works only slightly removed from pure thought-stuff. [They build] castles in the air, from air, creating by exertion of the imagination…”

— Fred Brooks

Code is a castle of abstraction in which we can live. It’s easy to get lost and forget code is not the only thing that builds software.

Many of us frequently live in Kanban boards or other project management tools. Tools and processes are also abstractions we use to build software.

Then there are even more abstract castles, like culture and teams. They’re sort of like abstract distributed meta-castles. They’re way harder to understand and build than code, but even more critical than code or tools to create good software.

The Fred Brooks quote goes on:

“…Yet the program construct, unlike the poet’s words, is real in the sense that it moves and works, producing visible outputs separately from the construct itself. It prints results, draws pictures, produces sounds, moves arms. The magic of myth and legend has come true in our time. One types the correct incantation on a keyboard, and a display screen comes to life, showing things that never were nor could be.”

Any sufficiently advanced technology is indistinguishable from magic… if you don’t look behind the curtain. When you open the bathroom door and look: it’s just a fancy hut. We forget there is dirt under the castle floor.

Software is a story of humans. Software is built by humans, for humans. The magic of the display coming to life is not a miracle of science; it is a triumph of the human imagination. Code is code. Silicon is silicon. Electricity is electricity.

On and off, ones and zeros, pixels on a display—these have no inherent meaning. It’s humans that craft meaning from nothing, hoping that other humans too will find their work meaningful.

Our choices about what tech stack, processes, or project management software to use—all of it—are secondary to the humanity of software development.

The Agile manifesto, a document which spawned countless software development methodologies, starts with this:

We are uncovering better ways of developing software by doing it and helping others do it. Through this work we have come to value:

Individuals and interactions over processes and tools

Software is built by humans, for humans. Let’s never get so lost in the constructs of our mind that we forget.