on
Postmodern Programming Today
I recently read a paper called Notes on Postmodern Programming by James Noble and Robert Biddle. This is a striking title. Postmodern makes you think of English literature students clicking their fingers to slam poetry at smoky jazz clubs. Not dorky software developers. But the paper is in fact a real gem to read. It was written 20 years ago but its ideas still ring true today. So I thought it would be worth reflecting on postmodern programming with a, well, modern lens!
Postmodernism is a very broad movement that spans architecture, literature, and beyond. It began in the mid-20th century but there is debate about precisely when. For a non-scholar like me, it is hard to get a grasp on exactly what postmodernism means. A lot of things can be considered postmodern yet the concept itself is hard to grasp. No doubt I will commit errors in this article.
But I will tell you what I have worked out. First came modernism. Everyone made things modern: the Cubists painted modern paintings, architects made boxy minimalist buildings, and writers wrote about man’s ability to take charge of his destiny.
Me and the girls (I’m bottom right)
Bet it leaked.
An Objectively good novel.
Then everyone got sick of it around the mid-20th century. They rejected the stability of modernism and chose to break boundaries, embrace relativistic truth, and reject overarching narrative. Postmodernism has also been famously criticised by Jordan Peterson and ridiculed in the Sokal affair.
Portrait of the inside of my microwave.
Building that is most definitely not minimalist.
Yes, even your favourite children’s books were self-referential masterpieces.
But postmodernism is not just fun things like art. For Biddle and Noble, even programming can be postmodern! For a start consider the metaphor problem. Are programmers mathematicians writing theorems that happen to send cat pictures down fibre-optic cables? Or are we engineers who proceed through carefully controlled design, verify, and construct phases? We chop and change metaphors but no one has agreed on one that articulates the work we do. Moreover, programmers do not follow a universal or standardised method to achieve their goals.
Some programmers seek out the ideal program. If we had the time and money we would make poetry of our source code, purify our designs until they hit every SOLID principle, and model the real world with perfect abstractions. But in reality, we are not so lucky. Our employers and clients have limited resources to grant us. There is a lot we want that the capitalist machine cannot grant. Organisational power structures compel us to build something that justWorks()
and makesMoney()
. Our work is a conflict between desiring perfect craftsmanship and dealing with power structures.
Modernist tradition told us that programs were input-process-output devices, nice and tidy. Most programmers today work on a tiny slice of a larger whole that might combine COBOL backends, overworked web servers, cumbersome middleware, and even an Excel spreadsheet that prevents the company from going bankrupt. Postmodernism programming is a lot more intersectional than we anticipated when each of us first typed Hello world! 1. We learn to live with the reality of crappy backends and Byzantine frontends, and we compromise with testy colleagues, bosses, and technologies. Postmodern programming acknowledges the variety and backgrounds of all aspects of the system. Any attempt to rewrite stinks of naiveté (and of privilege).
Programs are becoming less object and more subject. We have seen the evolution of virtualisation. What began with virtual machines moved to container platforms and now to the so-called serverless. We once deployed and managed programs that ran on a real set of servers in an air-conditioned basement (or whatever, I’m not the hardware guy). Now serverless platforms make our software creations even more of a mystery. AWS Lambda replaces the notion of program with function. Our software is softer than ever. Programs are less machinery and more magic spell. Instead of casting them ourselves, we upload our spellbooks to the sorcerers at Google, Amazon, or Microsoft who perform the magic rituals on our behalf.
Businesses love postmodern programming. Modern commerce is too chaotic and fast-moving for stability. In this environment, there is little regard for programs whose form follows function. That’s why they have embraced Agile practices. By relaxing the requirement for programmers to establish truth upfront and leaving it to them to figure it out on an individual basis, Agile is inherently postmodern. Businesses also save time and money by reducing the costs associated with planning upfront and establishing canon. The boss loves the ability to change their mind on a whim, masking it as embracing change, man.
Contemporary approaches such as microservices have embraced postmodernism. In Building Microservices Sam Newman says that software architects are town planners. They set out domain boundaries within which developers build and run their applications. The stable boundary between domains is prescribed (usually REST). But the internals are safely abstracted away. Teams are free to identify with whatever programming language, platform, and worldview best suits them. Software monoliths are a modernist notion. The monolith imposes one programming language. To avoid chaos, monolith developers all must adopt a common programming style, use the same quality assurance processes, and coordinate everything in lock-step. This shared interest creates a common worldview and shared narrative between the programmers and other stakeholders. Microservices may give the economic argument for taking monoliths apart. Postmodernism tells us that the great narrative of the monolith is to be subverted by the collective power of individual applications.
Postmodernism doesn’t mean that modernism is all dead. The beloved Rust combines postmodern and modernist elements (though it could be argued that this defaults it to post-modern status). Conceived by Graydon Hoare, it developed upon the lessons of its predecessors. Evidently it vowed not to make the same mistakes. Unlike JavaScript Rust has a standard package manager. Like C it is fast and systems-like but without its notorious pitfalls. Unlike some open source communities of yore, its community is welcome and embraces identity diversity. “Rewrite it in Rust” is an unsurprising meme from the Rustaceans, who thirst for a codebase that makes sense. Like Nietzsche’s Übermensch, Rust is supposedly the language that will allow us to suppress our inner bugs and control our programming destiny.
I am a busy programmer. Far too busy publishing hot takes about postmodernism to properly research the subject. There just isn’t enough time left in the day to read Gravity’s Rainbow. But all programmers have been dealing with the postmodern without even realising it. The disruptive and constructive nature of the computing field means that what is modern today yields to the postmodern tomorrow. Perhaps we have metamodern programming or post-ironic programming to look forward to next. Humanity has a rebellious spirit. Intellectual movements are mountains, rising slowly. Technology is weather, usually a storm. Whatever comes after postmodern programming, let’s hope it is something we can still make sense of.
1. Yes I am imposing the narrative that everyone's first program was Hello world!.