Software engineers have a love affair with the word ‘pragmatic’. There’s The Pragmatic Programmer, often hailed as a bible of software engineering, and the Pragmatic Bookshelf publishing imprint it spawned. There’s The Pragmatic Engineer, the most popular tech newsletter on Substack. Fed up with agile? No worries, just switch over to Pragmatic Agile™!
As wonderful as many of these resources are, strangely absent are discussions of why ‘pragmatic’ is an appropriate name for the specific style of engineering being advocated. Perhaps some would say that a pragmatic engineer values real-world results over theory, or delivers improvements incrementally, or is not dogmatic, or focuses on impact. But many of the greatest feats of software engineering have come from people working on seemingly unimpactful problems and operating in decidedly dogmatic, non-incremental, or theory-laden ways, a fact often discreetly brushed under the table.
Usually, ‘pragmatic’ comes off as merely a filler word selected for its friendly connotation. At times it nefariously joins forces with phrases like ‘clean code’ to become a vague stand-in for all that is good and right in the world, and thus a conversation-stopper. Once you define your style as ‘pragmatic’ or ‘clean’, arguing against it becomes futile. (Of course, this sort of conversation-stopping is deeply anti-pragmatist.) A word which stands for everything stands for nothing—some excavation work is needed.
During college I became enamored with philosophy, and ever since I’ve kept up an on-again off-again personal study. These days I’m most interested in the history of philosophy. It is dazzling to peruse the vast array of ideas that have been held dear by human beings over the years and to trace back the often arbitrary and unexpected ways that today’s ideas derive from previous thinkers.
Of all the philosophical schools I’ve come across, the one that cuts closest to my core—the label I am most tempted to intellectually identify with—is called, you guessed it, pragmatism. In the world of philosophy, unlike in software, it refers to something relatively well-defined (albeit hotly debated). Pragmatism is a school of thought which emerged in the United States in the late 19th century. It germinated in informal discussions of a “metaphysical club” at Harvard and then emerged in the writing and lectures of two great thinkers: Charles Sanders Pierce and William James.
I won’t attempt to give a complete overview of what pragmatism is here; if you’re interested, check out the Stanford Encyclopedia of Philosophy entry. But very broadly, pragmatism is a tradition which insists that change, malleability, and contingency are fundamental features of the world, and that human inquiry and action are inextricable from understanding the world.
Early pragmatists were heavily influenced by Darwinian evolutionary theory, and I find it helpful to understand pragmatism as a philosophical extension of his thought. Darwin discovered that species are not static entities or reflections of idealized forms; they emerge by gradually adapting to external environments, a product of their own natural history. Pragmatists believe that our understanding of the world—our ideas and beliefs—are analogously in a state of flux. Our ideas do not progress linearly towards some metaphysical form and our societies do not march towards some end of history with scientific precision; they adapt, like species, as we continue to inquire and act in the world around us.
Perhaps most incendiary is the upshot of this outlook on truth. Many philosophical traditions accept a correspondence theory of truth: that statements are true insofar as they properly mirror or correspond to external reality. But the pragmatists find this theory useless, because they don’t think a static external reality is something we have access to. It doesn’t do much good to have a theory of truth under which we can’t know anything that is true. They are instead interested in a theory of truth that explains humans come to believe things are true and why true beliefs are valuable. The specifics are a matter great controversy1, but generally involve understanding truth as downstream of the process of inquiry used to arrive at an idea or the consequences of believing it. James put it better than I can: “the truth of an idea is not a stagnant property inherent in it. Truth happens to an idea. It becomes true, is made true by events”2. Crazy stuff, right?
Ok, so… what does this have to do with software? It’s quite straightforward: I believe pragmatist philosophy provides a helpful vocabulary for talking about software. Philosophers have put a great deal of blood, sweat, and tears into clarifying what pragmatism means and working out its consequences, and software engineers would be well served by the usual: copying and pasting someone else’s work, with a few edits to make things run. This blog will be the working out of an extended metaphor: as the pragmatist philosopher views the world, so the pragmatist programmer views software.
James famously called pragmatism “a new name for an old way of thinking”, and I think this is an apt description for my proposed appropriation of the term too. A philosophically pragmatist undercurrent already ripples through the lingo and culture of software development, but I hope that being explicit about the link between philosophical pragmatism and software yields new insights about how we should create software that a common-sense usage of the word misses or even obscures.
Wilfred Sellars3 wrote that “the aim of philosophy, abstractly formulated, is to understand how things in the broadest possible sense of the term hang together in the broadest possible sense of the term”. That’s a lofty goal, but I think he’s mostly right, and we’ve got to start somewhere. For me, that might as well be software. So that’ll be the aim of this blog, abstractly formulated: to understand how software in the broadest possible sense of the term hangs together in the broadest possible sense of the term.
Pierce tried to rename his philosophy ‘pragmaticism’ to distance it from the abuses he felt it was enduring at the hands of James and his theory of truth. He claimed that the new name was “ugly enough to be safe from kidnappers”. He was right, and the rebrand didn’t stick. I’m also siding with James on this one, mostly because pragmaticistprogramming.com would probably be worse for SEO.
William James. "Pragmatism's Conception of Truth". Lecture 6 in Pragmatism: A New Name For some Old Ways of Thinking.
I’ll do my best not to butcher ideas and thinkers, but this blog is not aimed at philosophical rigor. So you can save yourself the trouble of typing out that angry rant about how Sellars isn’t actually a pragmatist or how naïve my reading of Rorty is or whatever it is you’re up in arms about. Valuing such petty squabbles over usefulness wouldn’t be very pragmatist of me, anyways.