<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>De Programmatica Ipsum</title><link>https://deprogrammaticaipsum.com/</link><description>Recent content on De Programmatica Ipsum</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Mon, 05 Oct 2026 05:03:00 +0200</lastBuildDate><atom:link href="https://deprogrammaticaipsum.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Issue 097: File Systems</title><link>https://deprogrammaticaipsum.com/issue-97-file-systems/</link><pubDate>Mon, 05 Oct 2026 05:03:00 +0200</pubDate><guid>https://deprogrammaticaipsum.com/issue-97-file-systems/</guid><description><![CDATA[ <p>Welcome to the 97th issue of <em>De Programmatica Ipsum</em>, about <em>File Systems</em>, starting our 9th volume.</p>
<p>In this edition:</p>
<ul>
<li>Graham <a href="/no-file-system-is-fit-for-purpose/">wonders</a> whether the idea of a hierarchical file system makes sense at all in 2026.</li>
<li>Adrian goes back in time to find the origin of the <a href="/everything-is-a-file/">&ldquo;everything is a file&rdquo;</a> moniker.</li>
<li>In our <a href="/category/videotheque/">Vidéothèque section</a>, Adrian reviews a documentary about the Unix file system <a href="/at-t-tech-channel/">on the AT&amp;T Tech Channel</a>.</li>
<li>In the <a href="/category/library/">Library section</a>, Graham reviews the <a href="/apple-computer-inc/">Apple Computer, Inc.</a> developer manual explaining the file system in the 1990s.</li>
</ul>
<p>Download this issue in DRM-free <a href="/pdf/issue-097-file-systems.pdf">PDF</a> or <a href="/epub/issue-097-file-systems.epub">EPUB</a> format, and read it on your preferred device. You can also subscribe to <a href="/index.xml">our RSS feed</a>, featuring the full content of our articles.</p>]]></description><content:encoded><![CDATA[ <p>Welcome to the 97th issue of <em>De Programmatica Ipsum</em>, about <em>File Systems</em>, starting our 9th volume.</p>
<p>In this edition:</p>
<ul>
<li>Graham <a href="/no-file-system-is-fit-for-purpose/">wonders</a> whether the idea of a hierarchical file system makes sense at all in 2026.</li>
<li>Adrian goes back in time to find the origin of the <a href="/everything-is-a-file/">&ldquo;everything is a file&rdquo;</a> moniker.</li>
<li>In our <a href="/category/videotheque/">Vidéothèque section</a>, Adrian reviews a documentary about the Unix file system <a href="/at-t-tech-channel/">on the AT&amp;T Tech Channel</a>.</li>
<li>In the <a href="/category/library/">Library section</a>, Graham reviews the <a href="/apple-computer-inc/">Apple Computer, Inc.</a> developer manual explaining the file system in the 1990s.</li>
</ul>
<p>Download this issue in DRM-free <a href="/pdf/issue-097-file-systems.pdf">PDF</a> or <a href="/epub/issue-097-file-systems.epub">EPUB</a> format, and read it on your preferred device. You can also subscribe to <a href="/index.xml">our RSS feed</a>, featuring the full content of our articles.</p>
<p>We would like to thank our patrons who generously contribute every month (or have contributed in the past) to our work and help us run this magazine. Thank you so much! In alphabetical order: Adam Guest, Adrian Tineo Cabello, Benjamin Sheldon, Christopher Nascone, Colin Powell, Franz Lucien Moersdorf, Guillermo Ramos Álvarez, Jean-Paul de Vooght, Dr. Juande Santander-Vela, Patryk Matuszewski, Paul Hudson, Quico Moya, Roger Turner, Szymon Licau, and countless more leaving anonymous tips every month.</p>
<p>Enjoy this issue! Please share our articles on social media, or <a href="/contribute/">contribute</a> if you would like to support our work with a donation via <a href="https://liberapay.com/akosma/donate">Liberapay</a>.</p>
<p>Cover photo by <a href="https://unsplash.com/@qwitka?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Maksym Kaharlytskyi</a> on <a href="https://unsplash.com/photos/file-cabinet-Q9y3LRuuxmg?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>.</p>
]]></content:encoded></item><item><title>No File System Is Fit For Purpose</title><link>https://deprogrammaticaipsum.com/no-file-system-is-fit-for-purpose/</link><pubDate>Mon, 05 Oct 2026 05:02:02 +0200</pubDate><guid>https://deprogrammaticaipsum.com/no-file-system-is-fit-for-purpose/</guid><description> &lt;p>The hierarchical file system—a directed graph database that is not quite an adirected tree—in which every node is either a container of other nodes that has no content itself (a folder, or directory, or drawer for those lucky enough to work with Amiga Workbench) or a leaf node that has content but no other nodes (a file). To effectively use one of those, you need random-access storage; if you are using a tape you do not bother, you have a single table of contents at the front with offsets to the starts of the various files. If you use punchcards then your filing system is literally the cabinets full of drawers and folders you keep the cards in.&lt;/p></description><content:encoded><![CDATA[ <p>The hierarchical file system—a directed graph database that is not quite an adirected tree—in which every node is either a container of other nodes that has no content itself (a folder, or directory, or drawer for those lucky enough to work with Amiga Workbench) or a leaf node that has content but no other nodes (a file). To effectively use one of those, you need random-access storage; if you are using a tape you do not bother, you have a single table of contents at the front with offsets to the starts of the various files. If you use punchcards then your filing system is literally the cabinets full of drawers and folders you keep the cards in.</p>
<p>Early examples of such file systems have a single level of structure; you create directories at the top level, and files in those directories (this actually means that there are two levels of directory, because there must be a top-level index to find the directories you create). These have one of two purposes:</p>
<ol>
<li>Help a person organise their files in a way that makes it easier to find them.</li>
<li>Keep multiple people who use a time-sharing system from getting in each others&rsquo; way, by giving them separate areas to store their files.</li>
</ol>
<p>In 1965, someone on the Multics project notices that the laws of physics do not apply to computers, and you can <a href="https://dl.acm.org/doi/abs/10.1145/1463891.1463915">fit a folder inside another folder</a>. The arbitrarily-nested hierarchical file system is born. Now users on Multics and its progeny, Unix, can organise their files, and do so while keeping out of each others&rsquo; way! Access control stops any account reading, writing, or deleting another account&rsquo;s files, unless someone who can change the rules gives that account explicit permission.</p>
<p>Unfortunately, as anybody who ever deleted <code>/vmunix</code> or <code>C:\COMMAND.COM</code> knows, saving user accounts from each other is not the whole story. We also need to save the operating system from the people using the computer. This means a new requirement:</p>
<ol start="3">
<li>Keep multiple people who use a time-sharing system from interfering with the operating system, by making operating system files inaccessible from regular accounts.</li>
</ol>
<p>But because we already shipped the multi-user filesystem and designed the file-access APIs around it, we cannot add this requirement to the model. So we invent a fiction: the operating system is another user account, or a collection of user accounts, that share the filesystem with the actual people who use the computer. So maybe the mail server has its own user account, and the print spool daemon, and so on.</p>
<p>Unfortunately, even this does not solve the problem, because the person who runs the computer needs to be able to configure, patch, and update the operating system. That person then gets access to an account that can work with all the files on the filesystem, starting at the root of the whole hierarchy: call it the root account.</p>
<p>They get that access, but they do not <em>need</em> that access, and indeed they should not <em>have</em> that access, because a person with the root account can violate requirements 2 and 3: they can get in another user&rsquo;s way, and they can interfere with the operating system. Ideally the filesystem would help with requirement 1 and strictly enforce requirements 2-3, but the user-permissions model does not lend itself to that possibility. So add another layer to the cake: mandatory access controls stop people from fiddling with particular files, even if their user account has discretionary permission to operate on those files.</p>
<p>Unfortunately, computers no longer exist in isolation (nor did they at the time; but we assumed that someone who connected up a tape drive and spooled the contents of the tape into their local installation had a reason for doing so). People download files from the internet, and they download files from the internet that are programs, and they expect to run those programs, and they do not want for one bad (or well-intentioned but poorly coded) program to break the files they use in other programs, or even to read those files unless that is their explicit intent. Time to add a new requirement:</p>
<ol start="4">
<li>Keep the documents that a person creates using a computer private and intact, even when that person runs arbitrary software.</li>
</ol>
<p>Mandatory access control no longer cuts it; now the filesystem needs a dynamic level of protection, in which files created by different processes are maybe usable from other processes run by the same user account, but maybe not. It depends on what those processes are, and what the files are, too. And where the files came from, and whether the person using the computer intended to get the file, or whether the process they ran just sorta created it for them without telling them. And also, those processes want to keep their own files, to cache downloads, to store the working set from complex computations, to save configuration options, and for whatever purposes.</p>
<ol start="5">
<li>Keep the files that arbitrary software creates private and intact, even when a person uses that or other arbitrary software.</li>
</ol>
<p>Oh, and by the way, while all of that is going on, there are now so many files that even requirement 1 is long forgotten. People cannot remember whether that important report due tomorrow is in their <code>Desktop</code> folder, or in <code>Desktop/Desktop.old</code>, or in <code>Desktop/Desktop.old/from_dell</code>, or in their <code>Documents</code> folder, or in some unique folder that is managed by whichever app it is they use to edit the file.</p>
<ol start="6">
<li>Help a person to find documents in a labyrinthine structure of folders that they do not understand.</li>
</ol>
<p>…it is always possible that they accidentally deleted the file they need, or that they kept the file but deleted a critical section of the report that, on reflection, they realised the audience is actually going to care about.</p>
<ol start="7">
<li>Help a person to browse and restore previous versions of a file, and deleted files.</li>
</ol>
<p>…or maybe they were just saving the file as the battery on their laptop finally discharged?</p>
<ol start="8">
<li>Provide resilience to common hardware failures that lead to incorrectly or partially committed filesystem changes.</li>
</ol>
<p>…or, no, wait, I remember, the correct version of the report is on my desktop, I have been editing the version on my laptop, I will get that other version once it syncs via my cloud provider.</p>
<ol start="9">
<li>(to a high number, probably around 94). Act as a cache to a remote file storage system; maintain most recently-used files locally while still evicting files as needed to make space for other files a person requests; resolve version conflicts when the remote version and the local version both have changes since the last sync point; resolve conflicts when one version has changes and the other version is deleted; retain confidentiality and integrity over the remote sync interface…</li>
</ol>
<p>And we need to go back and redefine the idea of &ldquo;users of a time-sharing system&rdquo; that we mentioned in requirements 2-3, and invented in about 1965. You see, those time-sharing systems have changed somewhat. Some are little portable devices, so the person whose &ldquo;account&rdquo; is &ldquo;logged in&rdquo; gives them to a passing acquaintance to share a fun meme they saw. Some are big wall-mounted devices, so the person is using the system alongside six other people who can all see and interact with it.</p>
<p>But yeah, sure, I guess it is neat that the last time we improved the file system was ZFS circa 2005, and that the other file systems are still catching up.</p>
<p>Photo by <a href="https://unsplash.com/@jackkrzysik?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Jack Krzysik</a> on <a href="https://unsplash.com/photos/green-and-white-cardboard-boxes-r1oeiXFHQIY?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>.</p>
]]></content:encoded></item><item><title>Everything Is A File</title><link>https://deprogrammaticaipsum.com/everything-is-a-file/</link><pubDate>Mon, 05 Oct 2026 05:02:01 +0200</pubDate><guid>https://deprogrammaticaipsum.com/everything-is-a-file/</guid><description><![CDATA[ <p>In page 227 of the wonderful book &ldquo;The Dream Machine&rdquo; by M. Mitchell Waldrop, covered in a <a href="/j-c-r-licklider-m-mitchell-waldrop/">previous issue</a>, telling the story of the early development of computers, we can learn that <a href="https://en.wikipedia.org/wiki/Fernando_J._Corbat%C3%B3">Fernando Corbató</a> and his team were busy in 1965 adding a new feature to <a href="https://en.wikipedia.org/wiki/Compatible_Time-Sharing_System">CTSS</a>, the first interactive and multi-user operating system for the <a href="https://en.wikipedia.org/wiki/IBM_7090#IBM_7094">IBM 7094</a> computer. That feature was, you guessed it, a file system.</p>]]></description><content:encoded><![CDATA[ <p>In page 227 of the wonderful book &ldquo;The Dream Machine&rdquo; by M. Mitchell Waldrop, covered in a <a href="/j-c-r-licklider-m-mitchell-waldrop/">previous issue</a>, telling the story of the early development of computers, we can learn that <a href="https://en.wikipedia.org/wiki/Fernando_J._Corbat%C3%B3">Fernando Corbató</a> and his team were busy in 1965 adding a new feature to <a href="https://en.wikipedia.org/wiki/Compatible_Time-Sharing_System">CTSS</a>, the first interactive and multi-user operating system for the <a href="https://en.wikipedia.org/wiki/IBM_7090#IBM_7094">IBM 7094</a> computer. That feature was, you guessed it, a file system.</p>
<blockquote>
<p>CTSS&rsquo;s fundamental model of human-computer interaction (…) can still be found today at the heart of MS-DOS, Windows, Macintosh, Linux, and many other operating systems. So can such innovations as CTSS&rsquo;s &ldquo;hierarchical&rdquo; file system, a scheme devised by Corbató and his team to enable individual groups and individual users to organize their personal files into &ldquo;directories&rdquo; and &ldquo;subdirectories&rdquo; on the 7094&rsquo;s hard disks. (In modern-day Windows and Macintosh systems, of course, such directories are called folders.)</p>
</blockquote>
<p>Waldrop forgot to mention Linux, itself a derivative of Unix, where a quick <code>man 7 hier</code> command will display the complete description of the filesystem hierarchy, finally providing some light on the intricacies of the various <code>/etc</code>, <code>/usr</code>, <code>/home</code>, and <code>/var</code> folders.</p>
<p>Beyond the mere organization of data, the Unix lineage of operating systems took Corbató’s hierarchical concept and elevated it into something akin to an arcane voodoo artiluge. This is true of Linux, macOS, and the BSDs, but not so much Android and iOS, because let us be honest, it is quite tough to use a command line with these last two, and iOS&rsquo;s &ldquo;File&rdquo; application is an absolute clusterfuck of an idea.</p>
<p>This &ldquo;feature&rdquo; of a voodoo-like file system is probably one of the most salient aspects of Unix-based systems, and it is captured in a famous, four-word axiom of the Unix philosophy: <em>everything is a file.</em> This is one of those phrases that have echoed throughout the ages, similar to <em>you are doing it wrong</em> or <em>the network is the computer</em>; or at least, it did until file systems disappeared beneath the rugged interface of an S3 bucket somewhere in 2005.</p>
<p>To understand the reason behind this idea, we have to look back to the creators of Unix at Bell Labs: <a href="https://en.wikipedia.org/wiki/Ken_Thompson">Ken Thompson</a>, <a href="https://en.wikipedia.org/wiki/Dennis_Ritchie">Dennis Ritchie</a>, and <a href="https://en.wikipedia.org/wiki/Douglas_McIlroy">Douglas McIlroy</a>. When they were building Unix from the ashes of the overly complex Multics project, they sought simplicity. Instead of creating a dozen different APIs to talk to a hard drive, a keyboard, a printer, and a network connection, they created just one.</p>
<p>Scarcity is the actual mother of invention, because nobody needed this, really.</p>
<p>They decided that if an abstraction worked for a text document, it should work for everything. (I know, stay with me.) In their worldview, a file was simply a stream of bytes. Consequently, the same system calls used to manipulate a text file (<code>open()</code>, <code>read()</code>, <code>write()</code>, and <code>close()</code>) could be used to interact with virtually every component of the computer. Because why not.</p>
<p>(See? The world was much simpler back in the day.)</p>
<p>Take a walk through the <code>/dev</code> (device) directory on any modern Linux or macOS machine, and you are no longer looking at data stored on a magnetic platter or solid-state drive; you are looking at the hardware itself, masquerading as files!</p>
<p>It goes even deeper. When you type on your keyboard or watch text scroll on your screen, you are interacting with a TTY device (like <code>/dev/tty</code>), a direct descendant of the physical <a href="https://en.wikipedia.org/wiki/Teleprinter#Teletype_Corporation">Teletype</a> machines of the 1970s. If you wanted to send text directly to a parallel-port printer in the early days of Linux, you did not need a dedicated printing application; you simply redirected your text into the printer’s file: <code>echo &quot;Hello World&quot; &gt; /dev/lp0</code>. Of course, you would still need a printer, which can be a problem in and of itself.</p>
<p>There are &ldquo;block devices&rdquo; like <code>/dev/sda</code> or <code>/dev/nvme0n1</code>, which represent your actual physical hard drives. You can read them directly, bypassing the traditional file system entirely, simply by pointing a tool like <code>cat</code> or <code>dd</code> at them.</p>
<p>Then there are the esoteric, conceptual devices. Need an endless stream of zeroes to wipe a hard drive? Read from <code>/dev/zero</code>. Need a place to send error messages so you never have to see them again? Throw them into the abyss of <code>/dev/null</code>, the file system&rsquo;s built-in black hole. Need cryptographic randomness? Just read from <code>/dev/urandom</code>, where the kernel distills the chaotic entropy of hardware interrupts into a stream of random bytes. Try it by yourself: run <code>cat /dev/urandom | hexdump -C | head -n 5</code> in your nearest terminal (well, do not try it if you are running Windows) and you will see some… well, random garbage printed out.</p>
<p>The &ldquo;everything is a file&rdquo; philosophy enters the realm of LSD when we look at Inter-Process Communication, or &ldquo;IPC&rdquo;. How do two completely isolated programs talk to each other in Unix? By reading and writing to files, of course!</p>
<p>The most iconic manifestation of this is the pipe (represented by the <code>|</code> character in your shell). Conceived by Douglas McIlroy, the pipe takes the standard output (file descriptor 1) of one program and connects it to the standard input (file descriptor 0) of another. But Unix also allows for <em>named pipes</em>: again, you guessed it: persistent files residing on the disk that act as FIFO (First In, First Out) queues. One program opens the file and writes to it, another opens the file and reads from it. To the programs involved, they are just doing standard file I/O.</p>
<p>This abstraction scales up to networking. When you browse the web, your browser communicates over a network socket. In Unix, that socket is treated as a file descriptor. The program writes its HTTP request to the &ldquo;file&rdquo; and reads the web server&rsquo;s response from that same &ldquo;file.&rdquo; The underlying networking stack (TCP handshakes, IP routing, Ethernet frames) is completely hidden behind the familiar <code>read()</code> and <code>write()</code> interface. Even complex virtualization tools like <a href="/shipping-your-computer/">Docker</a> rely on this, listening for instructions via a Unix domain socket, usually located at <code>/var/run/docker.sock</code>. Anyone reading this who has ever debugged REST APIs using <code>curl</code> knows this mechanism very well.</p>
<p>If Unix established the &ldquo;everything is a file&rdquo; paradigm, the research operating system <a href="https://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs">Plan 9 from Bell Labs</a> perfected it, and modern Linux heavily borrowed from there, taking it from LSD to full-on <a href="https://en.wikipedia.org/wiki/Ayahuasca">Ayahuasca</a> level.</p>
<p>Boot up a Linux machine and navigate to <code>/proc</code>. The files you see there take up exactly zero bytes on your hard drive. They exist entirely in the computer&rsquo;s RAM, dynamically generated by the kernel on the fly. Magic!</p>
<p>The <code>/proc</code> (process) filesystem is an illusion that maps the internal state of the operating system into the file hierarchy. Want to know what CPU you are running? You do not need a specialized hardware diagnostic tool; you just type <code>cat /proc/cpuinfo</code>. Want to see how much memory is free? <code>cat /proc/meminfo</code>.</p>
<p>Every running program on your computer has a dedicated directory in <code>/proc</code> named after its Process ID (PID). Inside that directory are files containing everything from the exact command used to launch the program, to the environmental variables it holds, to the specific areas of memory it is currently using.</p>
<p>Similarly, the <code>/sys</code> (sysfs) directory provides a window into the Linux kernel&rsquo;s device model. If you are on a Linux laptop and want to check your battery percentage, you do not need a graphical widget. Oh noes, that is for simpleton users. No, you, my dear IT expert, you can simply <code>cat /sys/class/power_supply/BAT0/capacity</code>. Want to change the brightness of your screen? Just write a new number into <code>/sys/class/backlight/intel_backlight/brightness</code>. <em>Und so weiter.</em></p>
<p>Good luck remembering all of those commands, but hey! Now you know you can.</p>
<p>The Unix file abstraction is considered by many one of the greatest engineering triumphs in software history. Sadly, those &ldquo;many&rdquo; are not simple computer users, but actual experts of the industry. Of course, if you look at it closely, yes, it enables composability. Keyboards, displays, network connections, random number generators, and kernel diagnostics all share the exact same interface as a simple text file, making this standard toolkit universally applicable.</p>
<p>I personally think that the Unix file system analogy is not enough. We should be able to listen to Mark Snow&rsquo;s famous &ldquo;X-Files Theme&rdquo; by just typing <code>cat /music/spotify/track/3pDZSfOSszYWMYygDiuPJx</code>. We should be able to swipe Tinder profiles using <code>left /social/tinder/34564576891457</code>. We should be able to search and buy plane tickets with <code>fly /AF/CDG/PPT/business/2027-03-02/2027-04-10</code>. You get the idea. And to be honest, none of the scenarios above would be too complicated to implement (well, except the airline thing, really).</p>
<p>But the truth is that in terms of usability, let us be honest, it is a terrible system. Even for people from the world of IT, it is usually impossible to actually remember all of the myriad combinations available, and which one represents what. You might have a few in mind, or you might create an <code>alias</code> to quickly type one or the other, but the fact that &ldquo;everything is a file&rdquo; is barely more than a curiosity to pretty much everyone. Add some complexity points if you switch from Linux to FreeBSD, and suddenly you must <code>cat</code> for files in other locations.</p>
<p>As I said at the beginning, we have not cared about file systems for more than 20 years now. (Remember when you could not have spaces in DOS filenames until circa 1995? If you can, I have bad news for you: you are old.) In Linux, arguably the most nerdy of all operating systems, you might still be choosing between ZFS, EXT, BTRFS, or XFS when formatting a new drive, but nobody cares anymore, really. Windows users are fine with NTFS, Mac users do not even know what <a href="https://en.wikipedia.org/wiki/Apple_File_System">APFS</a> is. Gone are the days of using <code>fdisk</code>. Nostalgic OS/2 users might even remember <a href="https://en.wikipedia.org/wiki/High_Performance_File_System">HPFS</a> and shed a tear. Most users probably even use some kind of encryption on top of their file system, just in case. And some ultra-nerd Linux users might be even be interested in <a href="https://gobolinux.org/">Gobolinux</a>, a distribution that literally reorganized the whole hierarchy for… reasons.</p>
<p>These days people are more interested in knowing whether we have a fast SSD in our home computer, or if we have properly configured Ceph, Gluster, or Longhorn within our Kubernetes cluster. And if all else fails, you can always format your USB thumbdrives with <a href="https://en.wikipedia.org/wiki/File_Allocation_Table">FAT32</a> and make sure that virtually every operating system on Earth can read and write to it.</p>
<p>But whatever you do, remember that this article only caters to systems deriving from Unix, and in particular, do not even think of creating a file named <code>CON</code> on your Windows hard disk. <a href="https://superuser.com/questions/86999/why-cant-i-name-a-folder-or-file-con-in-windows">You have been warned.</a></p>
<p>Cover photo by <a href="https://unsplash.com/@alexeydemidov?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Alexey Demidov</a> on <a href="https://unsplash.com/photos/graphical-user-interface-application-teams-7bWbVyjd8mA?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>.</p>
]]></content:encoded></item><item><title>AT&amp;T Tech Channel</title><link>https://deprogrammaticaipsum.com/at-t-tech-channel/</link><pubDate>Mon, 05 Oct 2026 05:01:01 +0200</pubDate><guid>https://deprogrammaticaipsum.com/at-t-tech-channel/</guid><description><![CDATA[ <p>There is a sense of vertigo when one watches the 1982 documentary <a href="https://www.youtube.com/watch?v=tc4ROCJYbm0">&ldquo;The UNIX Operating System&rdquo;</a>, preserved on YouTube by the AT&amp;T Archives channel. For anyone interested in the archaeology of our craft, it acts as a portal into an era where computer science was still wearing diapers. We see Brian Kernighan typing thoughtfully on a terminal; we see Ken Thompson and Dennis Ritchie, the quiet architects of our modern digital reality, speaking with the understated confidence of craftsmen who had just discovered fire.</p>]]></description><content:encoded><![CDATA[ <p>There is a sense of vertigo when one watches the 1982 documentary <a href="https://www.youtube.com/watch?v=tc4ROCJYbm0">&ldquo;The UNIX Operating System&rdquo;</a>, preserved on YouTube by the AT&amp;T Archives channel. For anyone interested in the archaeology of our craft, it acts as a portal into an era where computer science was still wearing diapers. We see Brian Kernighan typing thoughtfully on a terminal; we see Ken Thompson and Dennis Ritchie, the quiet architects of our modern digital reality, speaking with the understated confidence of craftsmen who had just discovered fire.</p>
<p>The video is a masterpiece of technical communication, explaining everything from pipelines to the YACC parser generator. But for our purposes this month, as we delve into the nature of file systems, there is a specific segment of this documentary that deserves our attention. It reminds us of a time when data storage was a field ripe for disruption.</p>
<p>To truly understand the revolution that the Unix file system represented, one must first understand the bureaucratic nightmare of the systems that preceded it. In the days of the <a href="https://en.wikipedia.org/wiki/OS/360_and_successors">IBM OS/360</a> (a system the documentary slyly critiques by quoting <a href="https://en.wikipedia.org/wiki/Fred_Brooks">Fred Brooks&rsquo;</a> estimation that it required &ldquo;5,000 staff-years of effort&rdquo; to produce) data was not merely stored; it was administered. Files were heavily structured entities. A programmer had to define record lengths, block sizes, access methods (sequential, indexed, direct), and physical disk geometries. You had to negotiate fiercely with the operating system just to write a string of characters to a persistent medium.</p>
<p>(COBOL developers enjoying their well-deserved retirement while reading this magazine will surely remember that you can specify such attributes when creating files in mainframes. Ah, the good old times.)</p>
<p>The narrator of the documentary captures this historical friction perfectly:</p>
<blockquote>
<p>&ldquo;In many systems, you have to say an awful lot about a file before you can do anything with it. You have to say where it is, and how big it is, and what kind of information that&rsquo;s going to be in it—all kinds of things that are basically, utterly, completely irrelevant.&rdquo;</p>
</blockquote>
<p>Notice the epistemological shift contained in that last word. <em>Irrelevant.</em> What was considered the very substance of systems programming by the establishment was dismissed by the Bell Labs team as unnecessary friction. This is what rebellion tastes like in the world of hackers: Unix was a masterpiece of reductionism. It stripped away the metadata, the proprietary formatting, and the structural baggage, presenting a radically new, universally applicable definition:</p>
<blockquote>
<p>&ldquo;A file is simply a sequence of bytes. Its main attribute is its size. By contrast, in more conventional systems, a file has a dozen or so attributes to specify or create a file; it takes endless amounts of chitchat. If you want a Unix system file, you simply ask for a file and you can use it interchangeably wherever you want a file.&rdquo;</p>
</blockquote>
<p><em>A file is simply a sequence of bytes.</em> This single sentence is arguably one of the most important conceptual leaps in the history of software engineering. By rendering the file formatless, the operating system relinquished the responsibility of understanding the data. The OS became a dumb, reliable conduit; the interpretation of those bytes was left entirely to the user-space programs.</p>
<p>This separation of concerns is the bedrock upon which the entire Unix philosophy was built. Before exploring the deeper implications of this design, let us consider the practical demonstration Kernighan provides in the video. To build a spellchecker, he does not write a monolithic C program. Instead, he orchestrates a ballet of small, focused utilities. He pipes a sentence into a program to break it into individual words, then into another to convert them to lowercase, then to <code>sort</code>, then to <code>uniq</code> to remove duplicates, and finally to a program that checks the stream against a dictionary.</p>
<p>(This demo will also be used by generations of IT experts to dismiss the bloat of word-processing software entirely. Whether they are right or wrong depends on whether your income depends on finishing that report before the meeting.)</p>
<p>&ldquo;So what we have here is five separate programs cooperating to do this job, and in one giant pipeline,&rdquo; Kernighan explains, noting proudly that he accomplished a complex task without writing any new code.</p>
<p>This seemingly simple trick is entirely dependent on the file system&rsquo;s minimalist architecture. Because the file system imposes no record structure and no proprietary encoding, text becomes the universal interface. The output of <code>sort</code> is just a sequence of bytes separated by newlines; <code>uniq</code> natively understands this sequence because it expects nothing else. If Unix files had retained the heavy metadata of the mainframes, this pipeline would have required endless format conversions and API negotiations at every step.</p>
<p>But a sea of formatless files is useless without organization. Here, Unix introduced its next stroke of genius: the hierarchical directory structure.</p>
<blockquote>
<p>&ldquo;The Unix system consists of a hierarchy of directories. A directory is simply a file that contains the names of either other directories or files, and this whole thing goes on recursively.&rdquo;</p>
</blockquote>
<p>Again, we see the principle of recursive simplicity at play. A directory is not a special, magical entity with its own esoteric API; it is <em>simply a file</em>. It is a file that the operating system happens to read to figure out the mapping of names to underlying identifiers. Because a directory is just a file, the structure can nest infinitely. Every folder on your modern desktop, every directory on a cloud server, and every path in a URL traces its lineage directly back to this exact abstraction.</p>
<p>Yet, the Unix file system wonders go beyond mere data storage. It is the concept of device independence: the realization that if a file is just a sequence of bytes, then hardware peripherals can be treated as files too.</p>
<blockquote>
<p>&ldquo;In addition, the I/O devices, the peripheral devices connected to the computer, are also files in the file system. For example, the line printer, and the tape drive, and even the thing that dials telephone numbers, are all devices in the file system. And the same program that will copy information from one disk file to another disk file will also copy information from a disk file to the line printer.&rdquo;</p>
</blockquote>
<p>This is a moment of orthogonal perfection. You do not need a special &ldquo;print&rdquo; API or a &ldquo;modem&rdquo; API. You just redirect the byte stream. The tools do not know, and do not care, whether the bytes are resting on a magnetic platter, being displayed on a cathode-ray tube, or being punched onto paper by a line printer. The file system acts as the universal namespace, the grand unified theory of the machine&rsquo;s resources.</p>
<p>Watching this 1982 artifact from our vantage point today feels almost melancholic. We live in an era where the simplicity of &ldquo;a file is a sequence of bytes&rdquo; is increasingly obfuscated. We build walled gardens on mobile apps, social networks, and LLMs, where applications cannot see each other&rsquo;s data, actively subverting the shared namespace of a local file system. We rely on opaque cloud storage buckets, proprietary databases, and complex APIs that require reams of authentication tokens and structured JSON payloads just to persist a piece of text.</p>
<p>We have, in many ways, returned to the &ldquo;endless amounts of chitchat&rdquo; that Thompson and Ritchie sought to abolish. <em>Le sigh.</em></p>
<p>Yet, underneath all our modern layers of abstraction (beneath the containers, the hypervisors, and the distributed key-value stores) the Unix file system remains. The heart of the system is still beating. There is an enduring power in getting the fundamentals right. When you strip away the noise, the hubris, and the bureaucratic complexity of software engineering, what remains is the silent, elegant truth: it is all, in the end, just a sequence of bytes.</p>
<p>Watch &ldquo;AT&amp;T Archives: The UNIX Operating System&rdquo; <a href="https://www.youtube.com/watch?v=tc4ROCJYbm0">on YouTube</a>, a website that sadly does not allow you to save videos locally as a file on your computer.</p>
<p>Cover snapshot chosen by the author.</p>
]]></content:encoded></item><item><title>Apple Computer, Inc.</title><link>https://deprogrammaticaipsum.com/apple-computer-inc/</link><pubDate>Mon, 05 Oct 2026 05:00:02 +0200</pubDate><guid>https://deprogrammaticaipsum.com/apple-computer-inc/</guid><description> &lt;p>Good technical documentation does not need to provide drama, though some people manage to introduce that anyway—consider the second edition of Object-Oriented Software Construction by &lt;a href="/bertrand-meyer/">Bertrand Meyer&lt;/a>, which builds up a case, like a consulting detective in a crime fiction novel, for a programming language based on a structured and consistent model of object-oriented software design. Only at the end does Meyer reveal that this language existed all along, and that it is… well, no spoilers here.&lt;/p></description><content:encoded><![CDATA[ <p>Good technical documentation does not need to provide drama, though some people manage to introduce that anyway—consider the second edition of Object-Oriented Software Construction by <a href="/bertrand-meyer/">Bertrand Meyer</a>, which builds up a case, like a consulting detective in a crime fiction novel, for a programming language based on a structured and consistent model of object-oriented software design. Only at the end does Meyer reveal that this language existed all along, and that it is… well, no spoilers here.</p>
<p>What good technical documentation <em>does</em> need to do is five things. Four of these are expressed clearly in the <a href="https://diataxis.fr">Diátaxis</a> framework, and I have <a href="https://www.sicpers.info/agency/">augmented that</a> to fill in the obvious gap. Those things are:</p>
<ol>
<li>Guide you through learning the technology.</li>
<li>Give you recipes for solving particular problems.</li>
<li>Help you understand how the technology works.</li>
<li>Provide a reference to the technology&rsquo;s capabilities.</li>
<li>Create a common model that you share with the people who build, support, and manage the technology.</li>
</ol>
<p>People use the different types of documentation to different extents; when someone says that a particular technology &ldquo;has good documentation&rdquo;, they typically mean that it has the types of documentation they tend to lean on, presented in ways they find usable. When someone says that a particular technology &ldquo;has bad documentation&rdquo;, they either mean that the types of documentation they would like to see are missing, or they exist but are not to their liking.</p>
<p>This means it is possible for people to talk across purposes about the same collection of documentation, not seeing the other&rsquo;s point of view because they get different things out of the documentation. So one person might think their project has great docs because they have a lot of fantastic how-to articles and reference, but another person wishes they would add conceptual guidance because they do not want to know how to complete a task, they want to think about how they might achieve <em>any</em> task.</p>
<p><em>Inside Macintosh</em>, the official source of documentation for Mac software development in the classic era, caters to (almost) everyone. This being the <em>De Programmatica Ipsum</em> issue on file systems, I will dive into the <em>Inside Macintosh: Files</em> volume for a closer look. For those who are reading along at home, I am using the (printed and bound, thank you very much, by Addison-Wesley) edition that corresponds to version 7.0 of the Macintosh System.</p>
<p>The first chapter, <em>Introduction to File Management</em>, includes conceptual guidance (&ldquo;About Files&rdquo;), how-tos (in the section on &ldquo;Using Files&rdquo;), and reference (&ldquo;File Management Reference&rdquo;). There is even a sort of reference to the reference, in a pair of &ldquo;Summary of File Management&rdquo; sections at the end. One is the Pascal Summary and the other is the C Summary, and they are everything that a module interface or a header file would tell you about the constants and functions available.</p>
<p>Note: no tutorial content. If someone new to Macintosh wants to write software and never used random-access storage before, and does not know how an application might work with multiple files and what operations to expose in their UI, they are not learning that from <em>Inside Macintosh: Files</em>. In fact, they are not learning that from <em>Inside Macintosh: Human Interface Guidelines</em> either, which explains that File menu operations &ldquo;pertain to housekeeping tasks for documents&rdquo; and describes each of the common items in turn (in which we notice an inconsistency: the File &gt; Close menu item does not pertain to housekeeping tasks for documents at all, it is a <em>window management</em> operation). This might seem like a weird niggle but it is not, it is a huge gap: the 1980s-1990s microcomputer platforms like the Macintosh, Amiga, Atari ST, or Archimedes were the first exposure many people had to graphical user interfaces with windows, icons, menus, and pointers, and simultaneously the first exposure many had to non-sequential storage. You have to remember that this was an era when broadcast TV included <a href="https://www.youtube.com/watch?v=Tl6092fMkZY">minutes-long segments describing how to use a mouse</a>. it is entirely possible that someone wanted to write an application without understanding how a computer could find multiple files, or how a user might be expected to juggle multiple files, and without knowing how the New, Save, and Open actions interact.</p>
<p>If you <em>do</em> understand that, you will get a lot of nerdy details on the innards of the system! You learn about how the Hierarchical File System allocates storage blocks on the device to files; how it separates a file&rsquo;s data from its resources using two forks (surely it should be one fork with two tines?); how catalog node IDs, B*-trees, directory records, and directory thread records all work together to organise the hierarchical structure of the storage. You could write your own implementation of HFS from scratch, but still not know how apps model documents as files. Anyone who lived through the various transitions in identifying files on the Mac—from file system specifications, to <code>FSSpec</code> records, to <code>FSRef</code> structures, to <code>-[NSString filesystemRepresentation]</code>, to <code>NSURL</code>, to bookmarks—can relive that history if it is really what you want to do, by diving in to the documentation. Anyone who wants to know how Apple&rsquo;s developers conceptualize files on the Macintosh, and how they think Apple&rsquo;s users should work with files on the Macintosh, needs to fill in that gap themselves.</p>
<p>Nonetheless, I still think that <em>Inside Macintosh</em> is &ldquo;good&rdquo; documentation. That is mostly because I learned what the expectations for files, and random-access storage, were from other sources, so I do not <em>need</em> the tutorial content it lacks. Plenty of successful developers created applications for the Macintosh that used files in ways that people with Macs expected them to. But you have to wonder how many people who <em>wanted</em> to write Mac apps did not, because the <em>Inside Macintosh</em> documentation did not bootstrap their understanding of the inside of the Macintosh.</p>
<p>Cover photo by the author.</p>
]]></content:encoded></item><item><title>Issue 096: Software Factories</title><link>https://deprogrammaticaipsum.com/issue-96-software-factories/</link><pubDate>Mon, 07 Sep 2026 05:03:00 +0200</pubDate><guid>https://deprogrammaticaipsum.com/issue-96-software-factories/</guid><description><![CDATA[ <p>Welcome to the 96th issue of <em>De Programmatica Ipsum</em>, about <em>Software Factories</em>.</p>
<p>In this edition:</p>
<ul>
<li>Graham makes us realize that <a href="/fully-automated-luxury-communistical-software-factories/">you cannot get rid of programmers</a>.</li>
<li>Adrian is dismayed reviewing <a href="/on-the-illusion-of-control/">the history of Software Factories</a>.</li>
<li>In our <a href="/category/videotheque/">Vidéothèque section</a>, we listen to <a href="/damon-edwards/">Damon Edwards</a> tell us the story of how the DevOps movement got started.</li>
<li>In the <a href="/category/library/">Library section</a>, we review <a href="/anneke-kleppe-jos-warmer-wim-bast-ivar-jacobson-pan-wei-ng/">&ldquo;MDA Explained&rdquo;, &ldquo;Aspect-Oriented Software Development with Use Cases&rdquo;</a>, and <a href="/don-batory/">&ldquo;Science of Software Product Lines&rdquo;</a>.</li>
</ul>
<p>Download this issue in DRM-free <a href="/pdf/issue-096-software-factories.pdf">PDF</a> or <a href="/epub/issue-096-software-factories.epub">EPUB</a> format, and read it on your preferred device. You can also subscribe to <a href="/index.xml">our RSS feed</a>, featuring the full content of our articles.</p>]]></description><content:encoded><![CDATA[ <p>Welcome to the 96th issue of <em>De Programmatica Ipsum</em>, about <em>Software Factories</em>.</p>
<p>In this edition:</p>
<ul>
<li>Graham makes us realize that <a href="/fully-automated-luxury-communistical-software-factories/">you cannot get rid of programmers</a>.</li>
<li>Adrian is dismayed reviewing <a href="/on-the-illusion-of-control/">the history of Software Factories</a>.</li>
<li>In our <a href="/category/videotheque/">Vidéothèque section</a>, we listen to <a href="/damon-edwards/">Damon Edwards</a> tell us the story of how the DevOps movement got started.</li>
<li>In the <a href="/category/library/">Library section</a>, we review <a href="/anneke-kleppe-jos-warmer-wim-bast-ivar-jacobson-pan-wei-ng/">&ldquo;MDA Explained&rdquo;, &ldquo;Aspect-Oriented Software Development with Use Cases&rdquo;</a>, and <a href="/don-batory/">&ldquo;Science of Software Product Lines&rdquo;</a>.</li>
</ul>
<p>Download this issue in DRM-free <a href="/pdf/issue-096-software-factories.pdf">PDF</a> or <a href="/epub/issue-096-software-factories.epub">EPUB</a> format, and read it on your preferred device. You can also subscribe to <a href="/index.xml">our RSS feed</a>, featuring the full content of our articles.</p>
<p>This issue closes the 8th <a href="/volumes/">volume</a> of this magazine, also available as DRM-free <a href="/pdf/volume-08-2025-2026.pdf">PDF</a> and <a href="/epub/volume-08-2025-2026.epub">EPUB</a> files.</p>
<p>We would like to thank our patrons who generously contribute every month (or have contributed in the past) to our work and help us run this magazine. Thank you so much! In alphabetical order: Adam Guest, Adrian Tineo Cabello, Benjamin Sheldon, Christopher Nascone, Colin Powell, Franz Lucien Moersdorf, Guillermo Ramos Álvarez, Jean-Paul de Vooght, Dr. Juande Santander-Vela, Patryk Matuszewski, Paul Hudson, Quico Moya, Roger Turner, Szymon Licau, and countless more leaving anonymous tips every month.</p>
<p>Enjoy this issue! Please share our articles on social media, or <a href="/contribute/">contribute</a> if you would like to support our work with a donation via <a href="https://liberapay.com/akosma/donate">Liberapay</a>.</p>
<p>Cover photo by <a href="https://unsplash.com/@m_simpsan?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Alex Simpson</a> on <a href="https://unsplash.com/photos/gray-and-red-factory-building-under-a-calm-blue-sky-9GwMIek9jnY?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>.</p>
]]></content:encoded></item><item><title>Fully Automated Luxury Communistical Software Factories</title><link>https://deprogrammaticaipsum.com/fully-automated-luxury-communistical-software-factories/</link><pubDate>Mon, 07 Sep 2026 05:02:02 +0200</pubDate><guid>https://deprogrammaticaipsum.com/fully-automated-luxury-communistical-software-factories/</guid><description> &lt;p>Almost since the dawn of programming (certainly since before the &lt;a href="https://dl.acm.org/doi/10.5555/1102021">1969 NATO Science Committee conference on software engineering techniques&lt;/a>), software managers have been looking for ways to create programs without relying on programmers. In addition to being expensive to hire (at least if you are not asking about salaries in the direct aftermath of 1970s energy crisis, the dot-com crash, the Great Recession, or the post-COVID layoffs bubble), programmers have a habit of doing the wrong thing.&lt;/p></description><content:encoded><![CDATA[ <p>Almost since the dawn of programming (certainly since before the <a href="https://dl.acm.org/doi/10.5555/1102021">1969 NATO Science Committee conference on software engineering techniques</a>), software managers have been looking for ways to create programs without relying on programmers. In addition to being expensive to hire (at least if you are not asking about salaries in the direct aftermath of 1970s energy crisis, the dot-com crash, the Great Recession, or the post-COVID layoffs bubble), programmers have a habit of doing the wrong thing.</p>
<p>To quote from the aforementioned report, conference attendee Jules Schwartz says &ldquo;Programmers must be controlled, so that they don’t invent beyond the requirements which are assigned to them.&rdquo; This is such a big problem, that the software engineering memeplex has phrases that describe both its occurrence (<a href="https://blog.codinghorror.com/gold-plating/">&ldquo;Gold-Plating&rdquo;</a>) and its avoidance (<a href="https://martinfowler.com/bliki/Yagni.html">&ldquo;You Aren&rsquo;t Gonna Need It&rdquo;</a> or &ldquo;YAGNI&rdquo;); the latter being a technique that rightfully <a href="http://www.extremeprogramming.org/">got labeled &ldquo;Extreme&rdquo;</a> on its introduction.</p>
<p>In both theory and in practice, you do not need programmers to write programs. Once you have a description of your system&rsquo;s capabilities and design, you can automatically generate a program that does what you need. No programmer to create features you do not need; to turn a quick design tweak into a general data-driven layout engine; to rewrite the whole application using a technique they just read about in a Yourdon Press book.</p>
<p>In practice, this approach has drawbacks. Firstly, the implementation that you mechanically derive from a specification probably is not optimised for your target platform; it does not use design idioms from that platform&rsquo;s UI, it does not use all of the hardware facilities available, and so on. You either tweak the implementation for the platform (by hiring programmers), or you optimise the compiler for the platform (by hiring programmers). Ugh. Programmers.</p>
<p>Secondly, a specification that is precise enough to turn directly into a functional implementation has many of the features of a computer program anyway. You know who can work with computer programs? Ugh, that is right. Programmers.</p>
<p>So through a combination of coercion—managers weaponised Agile, throwing so many tasks into each short iteration that there is no time for gold-plating—and compromise—programmers stopped reading books about programming—programmers and managers reached an uneasy truce. Programmers would (mostly) only write the software that their employers needed (or pretend to, with gold-plating saved for &ldquo;corporate open source&rdquo;), in return for which managers would (mostly) tolerate the programmers&rsquo; continued presence (or pretend to, until the next software factory hype cycle).</p>
<p>But now, everything has changed. Now we have a new magic pixie dust we can sprinkle over our projects to make everything beautiful and to get rid of those pesky programmers: AI. Does AI now succeed where computer-aided software engineering (CASE) failed? Can we make a software factory out of LLMs?</p>
<p>Yes, and no. Firstly, I will quickly dismiss the idea that Spec-Driven Development takes us back to the CASE days. This is quick to do because I already made <a href="https://youtu.be/wLCZ3hKv69U">a video on it</a>.</p>
<p>But a software factory is a specific kind of CASE product, and a specific application of specification to the software world. It is a collection of pre-made components, with templates and recipes that an implementor can use to adapt it on to their specific problem. That kind of thing is so much in the wheelhouse of an LLM-based coding assistant that there are two different technical ways to solve the problem.</p>
<p>A software factory vendor could package their factory as an <a href="https://agentskills.io/home">Agent Skill</a>. The SKILL.md file tells the LLM how the software factory is structured, and what to do. Recipes/playbooks are scripts in the scripts/ folder that the LLM runs to fulfil certain tasks. Pre-made components and templates are in the assets/ folder, and documentation, of course, goes in documentation/. To build an instance of the factory software, invoke the skill.</p>
<p>But they could also deliver it as an <a href="https://modelcontextprotocol.io/docs/2026-07-28/getting-started/intro">MCP server</a>. This time, the recipes and playbooks are tools that the LLM uses, and the components, templates, and documentation are resources that the server makes available to the LLM. The server also shares prompts over MCP, providing the same templated interaction with the coding assistant that an Agent Skill would.</p>
<p>Now would this work? Yes, of course it would. The real question is: who would make it work? Who understands how to tweak the factory&rsquo;s output to meet the specific demands of the organisation? Who knows how to integrate it into the existing system? Who knows how to tailor the configurable components to suit the goals of the specific system you are building? Who knows how to fix problems when the LLM does not quite generate the correct code? Ugh, that is right. Programmers.</p>
<p>Cover photo by <a href="https://unsplash.com/@npi?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Pavel Neznanov</a> on <a href="https://unsplash.com/photos/white-concrete-building-with-red-star-flag-Q-XNyse0X20?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>.</p>
]]></content:encoded></item><item><title>On The Illusion Of Control</title><link>https://deprogrammaticaipsum.com/on-the-illusion-of-control/</link><pubDate>Mon, 07 Sep 2026 05:02:01 +0200</pubDate><guid>https://deprogrammaticaipsum.com/on-the-illusion-of-control/</guid><description><![CDATA[ <p>One of the oldest and wettest dreams of managers since the invention of the computer has been that of getting rid of that pesky layer of human programmers in their organizations. A lot has been written about the <a href="/gerald-weinberg/">psychology</a> of programmers, about how to deal with them <a href="/tom-demarco-timothy-lister/">as human beings</a>, and about how the dialog between managers and programmers <a href="/the-impossible-dialogue/">is broken</a>. Evidence shows that neither developers nor managers are interested in knowing how to deal with one another, and hence, managers have tried again and again to promote themselves into a programmer-free world.</p>]]></description><content:encoded><![CDATA[ <p>One of the oldest and wettest dreams of managers since the invention of the computer has been that of getting rid of that pesky layer of human programmers in their organizations. A lot has been written about the <a href="/gerald-weinberg/">psychology</a> of programmers, about how to deal with them <a href="/tom-demarco-timothy-lister/">as human beings</a>, and about how the dialog between managers and programmers <a href="/the-impossible-dialogue/">is broken</a>. Evidence shows that neither developers nor managers are interested in knowing how to deal with one another, and hence, managers have tried again and again to promote themselves into a programmer-free world.</p>
<p>Of course, this has not happened yet, and it will not likely happen anytime soon.</p>
<p>But to learn the history of programming is to see that every major advance in the field was driven by the quite explicit aim of getting rid of those programmers altogether, in one way or another, and to achieve a degree of control over the quality of the final product.</p>
<p>It is safe to say that such control is an illusion, as all control is.</p>
<p>Let us enumerate some famous examples of technologies that promised to bring some kind of control into the process of programming, or at least to free it from the all-powerful hand of programmers: <a href="/issue/issue-095-fortran/">FORTRAN</a> and COBOL in the 1960s; <a href="/edward-nash-yourdon/">structured programming</a> and <a href="/the-og-low-code-platform/">spreadsheets</a> in the 1970s; <a href="/the-hype-cycle-of-oop/">object-oriented programming</a> and <a href="https://en.wikipedia.org/wiki/Computer-aided_software_engineering">CASE tools</a> in the 1980s; <a href="/the-gang-of-four/">design patterns</a> and <a href="/the-three-amigos-among-others/">UML</a> in the 1990s; <a href="https://en.wikipedia.org/wiki/Model-driven_architecture">Model-Driven Architecture</a> and <a href="/kent-beck/">TDD</a> in the 2000s; <a href="/antonomasia/">DevOps</a> and <a href="/enough-agile/">Agile</a> in the 2010s; and the latest fad, <a href="https://factory.strongdm.ai/">Agentic AI</a> via <del>statistical bullshit machines</del> LLMs, in the troubled 2020s during which these words are being poured.</p>
<p>Given all of these efforts, one would think that software in 2026 would be a flawless product of the human mind, a perfect contraption, reliable in its feature set, and easily maintainable by the teams in charge. Built with safety and usability in mind, with respect for privacy and ecology concerns, and even with aesthetic considerations. Would that not be a safe assumption? Have we not been building software for over 65 years at this point?</p>
<p>(This author will wait for the reader of these lines to stop laughing uncontrollably.)</p>
<p>Of course not. Quite the opposite. If anything, software has bloated to the point where all the common sense that could be safely thrown out of the window has suffered precisely that fate, where every new wave of hype takes the industry into yet another roller coaster tour and where all rationality has long ago left the building.</p>
<p>No wonder many of us are seriously thinking of raising sheep in the Kerguelen Islands, as far away as possible from any software or human beings, for that matter.</p>
<p>(Catches breath.)</p>
<p>The idea of &ldquo;software factories&rdquo; is not new, and as many things in our industry, it was an <a href="/think/">IBM</a> engineer who came up with it: <a href="https://en.wikipedia.org/wiki/Bob_Bemer">Bob Bemer</a>, one of the original designers of COBOL and ASCII. He published a paper titled <a href="https://web.archive.org/web/20010406041743/http://www.bobbemer.com/FACTORY.HTM">&ldquo;The Economics of Program Production&rdquo;</a> in <em>annus mirabilis</em> 1968, in which he described the idea of a software factory, outlining three clear goals:</p>
<blockquote>
<p>a. Maximizing programmer effectiveness and personnel resources. <br>
b. Minimizing time and costs for original production, changes and checkout. <br>
c. Maintaining the best-conditioned system from a quality viewpoint.</p>
</blockquote>
<p>Generation after generation of programming team managers have been trying to optimize these three variables by whichever means required. Developers, like Schrödinger cats aware of the fact that they are in a box with a lethal isotope next to them, have time and again silently boycotted these efforts (for better or for worse), and the resulting patchwork of technologies and approaches has had an effect akin to that of <a href="https://en.wikipedia.org/wiki/Scientific_management">Taylorism</a> in our field.</p>
<p>Precisely, this author made a painful comparison in this magazine <a href="/divide-et-impera/">almost 5 years ago</a>:</p>
<blockquote>
<p>Software workers are the new factory workers of the 21st century; a group of workers whose obesity, deafness induced by earphones worn in noisy open spaces, and carpal tunnel syndrome, are all visual marks of stress and abuse. The invisible ones having mental health issues; burnout, harassment, depression, all conveniently ignored by insurances, managers, and other board members.</p>
</blockquote>
<p>And in this new age of LLMs and <a href="https://simonwillison.net/2026/Feb/7/software-factory/">Agents</a>, they are also the ones that are conveniently laid off, for the sake of efficiency… and also to raise the market price of the stocks of their respective companies. Those CEOs could always use yet another yacht, after all.</p>
<p>Eliezer Talon, in a discussion about yet another modern software factory concept called the &ldquo;pull request&rdquo;, <a href="https://elitalon.com/2026/07/27/are-pull-requests-good-for-your-team/">wrote</a> that</p>
<blockquote>
<p>The problem is that software development organisations are not assembly lines. Most of the effort goes into understanding the problem, validating assumptions, and adapting when we discover we were wrong. Those activities benefit from collaboration rather than isolation.</p>
</blockquote>
<p>Bingo. Somehow, even in the age of LLMs, programmers still have a job; if anything, at least to check that the output of those chatbots <a href="/banning-adopting-reckoning/">makes any sense</a> whatsoever. This raises another crucial question, quite uncomfortable for many, about how to <a href="/issue/issue-075-teaching-programming/">train</a> future generations of programmers to have precisely the skills required to distinguish the wheat from the chaff.</p>
<p>As an old man screaming to a cloud, this author thinks that we could still bring a sense of ethics in our future generations of programmers and software engineers, instead of teaching them yet again how to fool an AI interview process to get a job. I thus hope for a management style where control is neither the carrot nor the stick but a healthy consequence of a well-working dialogue between managers and programmers. Maybe it is not too late to dream of that.</p>
<p>Or perhaps, as usual, I am just being too idealistic.</p>
<p>Cover photo by <a href="https://unsplash.com/@steve_j?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Steve A Johnson</a> on <a href="https://unsplash.com/photos/a-couple-of-people-standing-on-top-of-a-striped-floor-GJHT7OGhVBE?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>.</p>
]]></content:encoded></item><item><title>Damon Edwards</title><link>https://deprogrammaticaipsum.com/damon-edwards/</link><pubDate>Mon, 07 Sep 2026 05:01:01 +0200</pubDate><guid>https://deprogrammaticaipsum.com/damon-edwards/</guid><description><![CDATA[ <p>DevOps is, by far, the closest thing we have to a software factory at the time of this writing. We had dedicated a whole issue to DevOps <a href="/issue/issue-016-devops/">in January 2020</a>, but this month&rsquo;s topic makes it a natural object of interest. The analogy goes so deep that even the word <em>&ldquo;pipeline&rdquo;</em> fits into the world of DevOps like a glove.</p>]]></description><content:encoded><![CDATA[ <p>DevOps is, by far, the closest thing we have to a software factory at the time of this writing. We had dedicated a whole issue to DevOps <a href="/issue/issue-016-devops/">in January 2020</a>, but this month&rsquo;s topic makes it a natural object of interest. The analogy goes so deep that even the word <em>&ldquo;pipeline&rdquo;</em> fits into the world of DevOps like a glove.</p>
<p>Hence, this month&rsquo;s Vidéothèque entry is <a href="https://www.youtube.com/watch?v=o7-IuYS0iSE">&ldquo;The (Short) History of DevOps&rdquo;</a> by Damon Edwards, a 12-minute video published in September 2012, explaining the early memories of DevOps and how it evolved from 2009 to then. Pay attention to the release date of this video: we are talking about DevOps before Terraform, Docker containers, or Kubernetes.</p>
<p>The video explores the origins and evolution of the DevOps movement, documenting how it transitioned from a niche frustration into a globally recognized IT buzzword. Damon aims to clarify the often-misunderstood roots of DevOps, highlighting key individuals, conferences, and community efforts that shaped its decentralized development. The most important part here is to understand that no individual vendor took part in the creation of DevOps; this is quite an important point.</p>
<p>So the history begins in 2007 in Belgium with a certain <a href="https://www.jedi.be/">Patrick Debois</a>, who experienced deep frustration at his job (we can all relate to him here) due to the constant friction and conflicting workflows between agile development teams (&ldquo;Dev&rdquo;) and traditional operations (&ldquo;Ops&rdquo;) while working on a data center migration. This disconnect led to a pivotal moment at the Agile 2008 conference in Toronto, where <a href="https://www.profound-deming.com/profound-podcast/s4-e19-andrew-shafer-unpacking-devops-evolution-and-the-future-of-digital-transformation">Andrew Clay Shafer</a> proposed a session on &ldquo;agile infrastructure&rdquo; (minute <a href="https://www.youtube.com/watch?v=o7-IuYS0iSE&amp;t=94">01:34</a>) that nobody attended. Like, literally nobody, except for Patrick. Their resulting conversation spawned a Google group, but the true turning point occurred during the 2009 O&rsquo;Reilly&rsquo;s Velocity conference, when John Allspaw and Paul Hammond delivered a famous presentation on &ldquo;Dev and Ops cooperation&rdquo; at Flickr, as explained at minute <a href="https://www.youtube.com/watch?v=o7-IuYS0iSE&amp;t=183">03:03</a>.</p>
<p>Stuff went fast from that point. Inspired by the Velocity presentation, Patrick Debois organized a local gathering in Ghent, Belgium, in late 2009 to bring developers and systems administrators together, named &ldquo;DevOpsDays,&rdquo; a term that was quickly shortened to the hashtag &ldquo;#DevOps&rdquo; by attendees wanting to save character space on Twitter (minute <a href="https://www.youtube.com/watch?v=o7-IuYS0iSE&amp;t=282">04:42</a>). Somehow, this sparked a global community out of nowhere, leading to more face-to-face meetings in places like Australia and the United States and eventually causing the movement to cross the chasm into mainstream adoption.</p>
<p>In just 3 years, from 2009 to 2012, DevOps became the definitive software factory concept: a set of best practices and activities, mindsets, and (yes) rituals so that software could be put into production not just 2 times a year but potentially 20 times per hour, with better quality and less friction. Ah, the dream.</p>
<p>DevOps is, then, an experience-based, grassroots movement created by practitioners, for practitioners (minute <a href="https://www.youtube.com/watch?v=o7-IuYS0iSE&amp;t=561">09:21</a>). It was never designed as a rigid standard, a specific product, or a corporate job title imposed by vendors. Keep that in mind the next time you get to use the Azure DevOps Server console for your project. No, Microsoft did not come up with the name or the concept.</p>
<p>Watch &ldquo;The (Short) History of DevOps&rdquo; by Damon Edwards <a href="https://www.youtube.com/watch?v=o7-IuYS0iSE">on YouTube</a>.</p>
<p>Cover snapshot chosen by the author.</p>
]]></content:encoded></item><item><title>Don Batory</title><link>https://deprogrammaticaipsum.com/don-batory/</link><pubDate>Mon, 07 Sep 2026 05:00:02 +0200</pubDate><guid>https://deprogrammaticaipsum.com/don-batory/</guid><description> &lt;p>I guarantee you have used software that is the output of a Software Product Line. If you have got an Android phone, tablet, or audio player; use Linux on your desktop, laptop, set-top box, smart home device, Wi-fi router, server, or cloud computing provider; or you use a web application that is hosted on Linux, then you have used a Linux kernel. Not &lt;em>the&lt;/em> Linux kernel, as there are many Linux kernels.&lt;/p></description><content:encoded><![CDATA[ <p>I guarantee you have used software that is the output of a Software Product Line. If you have got an Android phone, tablet, or audio player; use Linux on your desktop, laptop, set-top box, smart home device, Wi-fi router, server, or cloud computing provider; or you use a web application that is hosted on Linux, then you have used a Linux kernel. Not <em>the</em> Linux kernel, as there are many Linux kernels.</p>
<p>When you build a Linux kernel (or someone builds it for you), an important step is configuring the build. The project uses a domain-specific language called <a href="https://docs.kernel.org/kbuild/kconfig-language.html">kconfig</a> to define various parameters and feature settings. You (or the person who does it for you) choose what features you want in the kernel, and what values you want for the other parameters, and those define the way that the build system builds <em>a</em> (not <em>the</em>) Linux kernel for you. The kernel build system is a factory, Linux is a software product line, and the specific Linux kernel you build is a product in the product line.</p>
<p>Or, as <a href="https://en.wikipedia.org/wiki/Don_Batory">Don Batory</a> points out in the important, if somewhat idiosyncratically written, <em>&ldquo;Science of Software Product Lines&rdquo;</em>, the output of kconfig is the Linux kernel you <em>might</em> build, <em>if you get lucky</em>. 87% of the configurations you can create using kconfig result in a product that does not even compile. Clearly Linus Torvalds needs to read this book.</p>
<p>Much of the time, software designers think about features and about codebases as orthogonal concerns. Yes, &ldquo;the business&rdquo; wants me to add a feature to the code, so what I am going to do is to read the code and work out some changes to make that I think integrate the feature into the existing <del>ball of mud</del> architecture. OK, maybe they want me to soft-launch the UI behind a feature flag, so I will find some places where I can put <code>if(featureIsEnabled)</code> into the code so that the feature gets turned on when the flag is set.</p>
<p>Technically, that product with the feature flags in <em>is really</em> a software product line. Each person gets their own version of the product determined at runtime, based on the state of the collection of feature flags defined for that person. But, like the Linux kernel, the creators of that feature-flag-rich app have not read <em>&ldquo;Science of Software Product Lines&rdquo;</em>, so they are not getting the full benefit of decades of research in the area.</p>
<p>Those of us with long memories—or who still build venerable GNU projects like Emacs or GCC from source—remember the &ldquo;fun&rdquo; to be had with the GNU autotools, specifically <a href="https://www.gnu.org/software/autoconf/">GNU autoconf</a> and <a href="https://www.gnu.org/software/automake/">GNU automake</a>. The concept was simple: you could make your software both portable, and flexible, by defining macros that configure build settings and enable or disable features. In fact, and perhaps surprisingly, it did not work like that at all. What it did was to inspect the target system and the options someone used to run the script, and define a collection of configuration points that instruct the build system to create different products, with distinct feature sets and internal behaviour. Yes, that is right, a GNU autoconf build system defines a software product line, and none of us had read Don&rsquo;s book, either. How could we? It was published in 2026.</p>
<p>The typical way that autotools projects configure a software product line is to provide C preprocessor macros that the compiler uses to conditionally include or exclude feature code, switch implementations of routines, or set concrete values for abstract ideas, like the size of a memory region. Batory shows us that the C preprocessor (CPP) is one of the most powerful and capable tools available for creating software product lines—and also one of the most dangerous, as its text-substitution approach readily leaves code in an uncompilable state, particularly when features compose in unexpected ways (hence the dice roll every time you try to configure the Linux kernel). This mess is to the compiler what <a href="https://dl.acm.org/doi/abs/10.1109/MAHC.2018.2877913">DLL Hell</a> is to the runtime environment.</p>
<p>His book shows the theory behind slicing software by feature, and composing the code fragments that add features, and the second-level code fragments that ensure two features play nicely when they are both selected. He shows that a feature map is the space of all possible software products that a software product line produces, and that it is finite, even if potentially humungous; the Linux kernel SPL has far more possible configurations than the number of particles in the universe (when I worked at Facebook in 2014, so did the set of feature flags in their mobile apps).</p>
<p>He shows practical tools, like the <a href="https://dl.acm.org/doi/10.1145/3109729.3109750">X15 refactoring engine</a> that uses Java annotations to build and transform SPLs in semantically valid ways. He demonstrates how object-oriented modelling can yield flexible designs that are amenable to supporting SPLs; including novel OO capabilities as in the <a href="https://beta.cs.au.dk">BETA programming language</a>. BETA is similar to the SIMULA language, but inheritance runs in the opposite way than you are used to. A parent class can inherit behaviour from its subclasses, and include instructions in its method definitions that tell the runtime to invoke the subclass&rsquo;s implementation of the method. It is no surprise that OOP is a great technique for building SPLs from components, given that <a href="/brad-cox">Brad Cox</a> showed us how to do this with Software ICs, and how to monetise it with Superdistribution.</p>
<p>By far the most interesting chapter is towards the end, where Batory lists open challenges in SPL research with their complexity, reading like the higher-difficulty &ldquo;exercises&rdquo; in <a href="/the-art-of-the-art-of-computer-programming/">&ldquo;The Art of Computer Programming&rdquo;</a>. These range from the most modern of 2026 challenges (how to work with SPLs in the LLM era) to the most basic and surprising of fundamental knowledge gaps: nobody has ever provided a scientific basis for believing that modularity is beneficial in software design. Even the most worthy of luminaries, Edsger Dijkstra, axiomatically accepts &ldquo;the separation of concerns&rdquo; as a good idea, as if its alternative is something that should be <a href="/harmfully-considered/">considered harmful</a> with no further thought. This, ironically, in a paper called <a href="https://www.cs.utexas.edu/~EWD/ewd04xx/EWD447.PDF">&ldquo;On the role of scientific thought&rdquo;</a>!</p>
<p>Cover photo by the author.</p>
]]></content:encoded></item></channel></rss>