<?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, 01 Jun 2026 05:03:00 +0200</lastBuildDate><atom:link href="https://deprogrammaticaipsum.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Issue 093: Functional Programming</title><link>https://deprogrammaticaipsum.com/issue-093-functional-programming/</link><pubDate>Mon, 01 Jun 2026 05:03:00 +0200</pubDate><guid>https://deprogrammaticaipsum.com/issue-093-functional-programming/</guid><description><![CDATA[ <p>Welcome to the 93rd issue of <em>De Programmatica Ipsum</em>, about <em>Functional Programming</em>.</p>
<p>In this edition:</p>
<ul>
<li>Graham <a href="/evading-von-neumann/">explains the benefits</a> of solving problems with a functional mindset.</li>
<li>Adrian explores <a href="/functional-programming-the-good-parts/">why functional programming was shunned</a> until it was not.</li>
<li>In our <a href="/category/videotheque/">Vidéothèque section</a>, we watch <a href="/joe-armstrong/">Joe Armstrong</a> explain how functional programming made Erlang a reality.</li>
<li>In the <a href="/category/library/">Library section</a>, we review the most important papers by <a href="/philip-wadler/">Philip Wadler</a>, <a href="/guy-steele-gerry-sussman/">Guy Steele, and Gerry Sussman</a>.</li>
</ul>
<p>Download this issue in DRM-free <a href="/pdf/issue-093-functional-programming.pdf">PDF</a> or <a href="/epub/issue-093-functional-programming.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 93rd issue of <em>De Programmatica Ipsum</em>, about <em>Functional Programming</em>.</p>
<p>In this edition:</p>
<ul>
<li>Graham <a href="/evading-von-neumann/">explains the benefits</a> of solving problems with a functional mindset.</li>
<li>Adrian explores <a href="/functional-programming-the-good-parts/">why functional programming was shunned</a> until it was not.</li>
<li>In our <a href="/category/videotheque/">Vidéothèque section</a>, we watch <a href="/joe-armstrong/">Joe Armstrong</a> explain how functional programming made Erlang a reality.</li>
<li>In the <a href="/category/library/">Library section</a>, we review the most important papers by <a href="/philip-wadler/">Philip Wadler</a>, <a href="/guy-steele-gerry-sussman/">Guy Steele, and Gerry Sussman</a>.</li>
</ul>
<p>Download this issue in DRM-free <a href="/pdf/issue-093-functional-programming.pdf">PDF</a> or <a href="/epub/issue-093-functional-programming.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/@fakurian?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Milad Fakurian</a> on <a href="https://unsplash.com/photos/a-purple-object-with-a-shadow-on-the-ground-Em8glt2OLt0?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>.</p>
]]></content:encoded></item><item><title>Evading Von Neumann</title><link>https://deprogrammaticaipsum.com/evading-von-neumann/</link><pubDate>Mon, 01 Jun 2026 05:02:02 +0200</pubDate><guid>https://deprogrammaticaipsum.com/evading-von-neumann/</guid><description> &lt;p>Programming styles are supposed to be &lt;em>paradigmatic&lt;/em>, in that they structure your thinking about creating software by providing unifying theories and methods that you use to plan, design, construct, and operate your software. In that sense, the way that you think about the software is everything, and the tools that you use are nothing.&lt;/p></description><content:encoded><![CDATA[ <p>Programming styles are supposed to be <em>paradigmatic</em>, in that they structure your thinking about creating software by providing unifying theories and methods that you use to plan, design, construct, and operate your software. In that sense, the way that you think about the software is everything, and the tools that you use are nothing.</p>
<p>Take <a href="/issue/issue-049-object-oriented-programming/">object-oriented programming</a>, for example. Selecting Java as an implementation language does not immediately mean that your solution is object-oriented (though it may have been sufficient to get you some OOP-linked venture capital at the <a href="/the-hype-cycle-of-oop/">peak of the hype cycle</a>). Similarly, when you see an implementation language that does not have object features, FORTRAN-77 for example, that does not mean that you are not looking at the source code of software built using the object-oriented paradigm.</p>
<p>But this is the issue on functional programming, not OOP. The paradigmatic basis of functional programming is that you design your program as algebraic transformations of structured data types. This affects how you discuss your program with stakeholders, how you model requirements, how you architect solutions and deployment…it is not just a matter of reaching for Haskell (indeed using the <code>do</code> form it is very easy to write procedural software in Haskell anyway).</p>
<p>You compose large programs by combining algebraic transformations into more complex operations. As such, you define transformations that are composable. This composability comes from designing transformations with clear contracts and interfaces, so that the result of applying the transformation is evident and safe in the context of the composition. For example, imagine that you have a need to double every element in a list of numbers. It is easy in many imperative languages to write a loop that iterates over the list and multiplies each number by 2. But thinking about this &ldquo;problem&rdquo; using the paradigm of composing algebraic transformations, you can build the solution from two components:</p>
<ol>
<li>Apply an operation to every element of a list.</li>
<li>Multiply a number by 2.</li>
</ol>
<p>So now you can build two functions, which are demonstrated as procedures written in <a href="/issue/issue-065-pascal/">Pascal</a> here because, as I said, tool use is not paradigmatic; and besides, Pascal and Haskell nearly rhyme and both languages are named after mathematicians, so they are almost the same thing. The first function to create is the <code>Map</code> function, which applies a function to every element in a collection and returns a collection of the results:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-objectpascal" data-lang="objectpascal"><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">unit</span><span style="color:#bbb"> </span>Functional;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">interface</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">type</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>generic<span style="color:#bbb"> </span>TArrayU&lt;U&gt;<span style="color:#bbb"> </span>=<span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">array</span><span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">of</span><span style="color:#bbb"> </span>U;
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>generic<span style="color:#bbb"> </span>TMapFunc&lt;T,<span style="color:#bbb"> </span>U&gt;<span style="color:#bbb"> </span>=<span style="color:#bbb"> </span>function(<span style="color:#8b008b;font-weight:bold">const</span><span style="color:#bbb"> </span>Item:<span style="color:#bbb"> </span>T):<span style="color:#bbb"> </span>U;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>generic<span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">function</span><span style="color:#bbb"> </span>Map&lt;T,<span style="color:#bbb"> </span>U&gt;(<span style="color:#8b008b;font-weight:bold">const</span><span style="color:#bbb"> </span>Arr:<span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">array</span><span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">of</span><span style="color:#bbb"> </span>T;<span style="color:#bbb"> </span>Func:
</span></span><span style="display:flex;"><span><span style="color:#bbb">    </span>specialize<span style="color:#bbb"> </span>TMapFunc&lt;T,<span style="color:#bbb"> </span>U&gt;):
</span></span><span style="display:flex;"><span><span style="color:#bbb">    </span>specialize<span style="color:#bbb"> </span>TArrayU&lt;U&gt;;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">implementation</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>generic<span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">function</span><span style="color:#bbb"> </span>Map&lt;T,<span style="color:#bbb"> </span>U&gt;(<span style="color:#8b008b;font-weight:bold">const</span><span style="color:#bbb"> </span>Arr:<span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">array</span><span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">of</span><span style="color:#bbb"> </span>T;<span style="color:#bbb"> </span>Func:
</span></span><span style="display:flex;"><span><span style="color:#bbb">    </span>specialize<span style="color:#bbb"> </span>TMapFunc&lt;T,<span style="color:#bbb"> </span>U&gt;):
</span></span><span style="display:flex;"><span><span style="color:#bbb">    </span>specialize<span style="color:#bbb"> </span>TArrayU&lt;U&gt;;
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">var</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>i:<span style="color:#bbb"> </span><span style="color:#00688b;font-weight:bold">Integer</span>;
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">begin</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="font-style:italic">Result</span><span style="color:#bbb"> </span>:=<span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">nil</span>;
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>SetLength(<span style="font-style:italic">Result</span>,<span style="color:#bbb"> </span>Length(Arr));
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="color:#8b008b;font-weight:bold">for</span><span style="color:#bbb"> </span>i<span style="color:#bbb"> </span>:=<span style="color:#bbb"> </span><span style="color:#b452cd">0</span><span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">to</span><span style="color:#bbb"> </span>High(Arr)<span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">do</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="font-style:italic">Result</span>[i]<span style="color:#bbb"> </span>:=<span style="color:#bbb"> </span>Func(Arr[i]);
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">end</span>;
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">end</span>.
</span></span></code></pre></div><p>The generic interface for the <code>Map</code> function means that even if you did not look at the implementation, you would know something about how it works. Its inputs are an array of <code>T</code>, and a function that turns <code>T</code> into <code>U</code>, and its output is an array of <code>U</code>. Nowhere is anything specified about <code>T</code> or <code>U</code>. That means that the function cannot use any of the operations available on either <code>T</code> or <code>U</code>, so if there is a <code>U</code> in the output the <em>only</em> way that <code>Map</code> created it was by applying the function to one of the <code>T</code>s in its input.</p>
<p>Unfortunately Pascal arrays have a rich interface so it is impossible to say anything about <em>which</em> <code>T</code>s get turned into <code>U</code>s; the function might always return <code>nil</code>, for example. The implementation shows that this Pascal <code>Map</code> works as you might expect a <code>map</code> function; it applies the <code>Func</code> parameter to each <code>T</code> in the input array, and returns an array where the corresponding <code>U</code> is at the same index as the given <code>T</code>.</p>
<p>The second function you create is the <code>DoubleInt</code> function that multiples a number by 2 and returns the result:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-objectpascal" data-lang="objectpascal"><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">function</span><span style="color:#bbb"> </span>DoubleInt(<span style="color:#8b008b;font-weight:bold">const</span><span style="color:#bbb"> </span>i:<span style="color:#bbb"> </span><span style="color:#00688b;font-weight:bold">Integer</span>):<span style="color:#bbb"> </span><span style="color:#00688b;font-weight:bold">Integer</span>;
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">begin</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="font-style:italic">Result</span><span style="color:#bbb"> </span>:=<span style="color:#bbb"> </span>i<span style="color:#bbb"> </span>*<span style="color:#bbb"> </span><span style="color:#b452cd">2</span>;
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">end</span>;
</span></span></code></pre></div><p>Here the interface does not help much at all: the input is an <code>Integer</code>, and the result is an <code>Integer</code>. The function might always return a constant, or square the input, or add it to a constant, or convert it into a <code>String</code>, reverse the characters, and convert that back into an <code>Integer</code> to return. This demonstrates the power of generic component design: the less information available about the types used in a function, the more constraints on the behavior of that function, so the easier that function is to understand.</p>
<p>Now you solve the problem by composing <code>DoubleInt</code> and <code>Map</code>:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-objectpascal" data-lang="objectpascal"><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">program</span><span style="color:#bbb"> </span>Main;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">uses</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>Functional,<span style="color:#bbb"> </span>SysUtils;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">type</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>TIntArray<span style="color:#bbb"> </span>=<span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">array</span><span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">of</span><span style="color:#bbb"> </span><span style="color:#00688b;font-weight:bold">Integer</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">var</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>Ints,<span style="color:#bbb"> </span>Doubled:<span style="color:#bbb"> </span>TIntArray;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">begin</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>Ints<span style="color:#bbb"> </span>:=<span style="color:#bbb"> </span>TIntArray.Create(<span style="color:#b452cd">1</span>,<span style="color:#bbb"> </span><span style="color:#b452cd">2</span>,<span style="color:#bbb"> </span><span style="color:#b452cd">3</span>,<span style="color:#bbb"> </span><span style="color:#b452cd">4</span>,<span style="color:#bbb"> </span><span style="color:#b452cd">5</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>Write(<span style="color:#cd5555">&#39;Original: &#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="color:#8b008b;font-weight:bold">for</span><span style="color:#bbb"> </span>i<span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">in</span><span style="color:#bbb"> </span>Ints<span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">do</span><span style="color:#bbb"> </span>Write(i,<span style="color:#bbb"> </span><span style="color:#cd5555">&#39; &#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>WriteLn;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>Doubled<span style="color:#bbb"> </span>:=<span style="color:#bbb"> </span>specialize<span style="color:#bbb"> </span>Map&lt;<span style="color:#00688b;font-weight:bold">Integer</span>,<span style="color:#bbb"> </span><span style="color:#00688b;font-weight:bold">Integer</span>&gt;(Ints,<span style="color:#bbb"> </span>@DoubleInt);
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>Write(<span style="color:#cd5555">&#39;Mapped (Double): &#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="color:#8b008b;font-weight:bold">for</span><span style="color:#bbb"> </span>i<span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">in</span><span style="color:#bbb"> </span>Doubled<span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">do</span><span style="color:#bbb"> </span>Write(i,<span style="color:#bbb"> </span><span style="color:#cd5555">&#39; &#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>WriteLn;
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">end</span>.
</span></span></code></pre></div><p>These two functions are very simple mappings of their input to their output. You could imagine implementing <code>DoubleInt</code> as a lookup table, where the value at index <code>0</code> is <code>0</code>, the value at index <code>1</code> is <code>2</code>, and so on. In principle you could do the same for <code>Map</code> but it would be a very tedious table to write, and it would lose the simplicity of using the <code>Func</code> parameter to achieve the transformation.</p>
<p>A problem for composability arises when you want to use a program to <em>do</em> something; to store or retrieve a result, or to interact with its environment. These kinds of computations do not show up in the function signature, so you cannot tell the difference between &ldquo;function that accepts a list of <code>T</code> and returns a <code>Boolean</code>&rdquo; and &ldquo;function that accepts a list of <code>T</code>, drops all tables in the database, and returns a <code>Boolean</code>&rdquo;. It is harder to build functions into reusable workflows when they might have side effects like that.</p>
<p>A solution used by people who think in the functional way is <a href="https://learnyouahaskell.github.io/a-fistful-of-monads.html">monads</a>, a class of types that associate values with context and enables computations on the values while maintaining the association with the context. Again, because there is nothing special about programming language choice, you can build that in Pascal:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-objectpascal" data-lang="objectpascal"><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">unit</span><span style="color:#bbb"> </span>Monads;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">interface</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">type</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>generic<span style="color:#bbb"> </span>IMonad&lt;T&gt;<span style="color:#bbb"> </span>=<span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">interface</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">    </span>[<span style="color:#cd5555">&#39;{7A8D8C30-5A2C-4B9F-8F8D-9E9C9B9A9D9E}&#39;</span>]
</span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">function</span><span style="color:#bbb"> </span>Execute:<span style="color:#bbb"> </span>T;
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="color:#8b008b;font-weight:bold">end</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>generic<span style="color:#bbb"> </span>TIOReturn&lt;T&gt;<span style="color:#bbb"> </span>=<span style="color:#bbb"> </span>class(TInterfacedObject,<span style="color:#bbb"> </span>specialize<span style="color:#bbb"> </span>IMonad&lt;T&gt;)
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="color:#8b008b;font-weight:bold">private</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">    </span>FVal:<span style="color:#bbb"> </span>T;
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="color:#8b008b;font-weight:bold">public</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">constructor</span><span style="color:#bbb"> </span>Create(<span style="color:#8b008b;font-weight:bold">const</span><span style="color:#bbb"> </span>V:<span style="color:#bbb"> </span>T);
</span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">function</span><span style="color:#bbb"> </span>Execute:<span style="color:#bbb"> </span>T;
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="color:#8b008b;font-weight:bold">end</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>generic<span style="color:#bbb"> </span>TIOBind&lt;A,<span style="color:#bbb"> </span>B&gt;<span style="color:#bbb"> </span>=<span style="color:#bbb"> </span>class(TInterfacedObject,<span style="color:#bbb"> </span>specialize<span style="color:#bbb"> </span>IMonad&lt;B&gt;)
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="color:#8b008b;font-weight:bold">public</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">type</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>TBF<span style="color:#bbb"> </span>=<span style="color:#bbb"> </span>function(<span style="color:#8b008b;font-weight:bold">const</span><span style="color:#bbb"> </span>V:<span style="color:#bbb"> </span>A):<span style="color:#bbb"> </span>specialize<span style="color:#bbb"> </span>IMonad&lt;B&gt;;
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="color:#8b008b;font-weight:bold">private</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">    </span>FPrev:<span style="color:#bbb"> </span>specialize<span style="color:#bbb"> </span>IMonad&lt;A&gt;;
</span></span><span style="display:flex;"><span><span style="color:#bbb">    </span>FFunc:<span style="color:#bbb"> </span>TBF;
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="color:#8b008b;font-weight:bold">public</span>
</span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">constructor</span><span style="color:#bbb"> </span>Create(<span style="color:#8b008b;font-weight:bold">const</span><span style="color:#bbb"> </span>P:<span style="color:#bbb"> </span>specialize<span style="color:#bbb"> </span>IMonad&lt;A&gt;;<span style="color:#bbb"> </span><span style="color:#8b008b;font-weight:bold">const</span><span style="color:#bbb"> </span>F:<span style="color:#bbb"> </span>TBF);
</span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">function</span><span style="color:#bbb"> </span>Execute:<span style="color:#bbb"> </span>B;
</span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="color:#8b008b;font-weight:bold">end</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">implementation</span>
</span></span><span style="display:flex;"><span><span style="color:#228b22">{...}</span>
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">end</span>.
</span></span></code></pre></div><p>All this makes it look like there is nothing to a &ldquo;functional programming language&rdquo; other than the convenience of expressing paradigmatic functional thinking efficiently. For example, if you had access to a programming language that is like Pascal but also has partial application (function currying, to use Haskell Curry&rsquo;s family name) then you could create the <code>DoubleInt</code> function in the first example above by applying <code>2</code> to the <code>Multiply</code> function, and avoid needing to write a custom component for such a simple operation.</p>
<p>Using the idea that all <a href="https://en.wikipedia.org/wiki/Turing_completeness">computationally universal</a> models are equally powerful, you can do your functional thinking in your brain and then convert it into Haskell, Pascal, or even languages that do not rhyme and are not named after mathematicians. This statement, true as it goes, is not helpful. Functional programming as a style does benefit from specifically designed programming languages, that perform for software engineering what John Locke achieved for national goverment in the 17th Century: the separation of [Alonzo] Church and state.</p>
<p>The Pascal functions above might present interfaces that represent composable algebraic primitives, but under the hood their implementations are sequential applications of state transitions in a slightly abstracted version of the computer&rsquo;s memory. Pascal&rsquo;s model of computation might let it reorder some instructions a little, but fundamentally it, and similar languages like Algol, C, Rust, and Python, are there to make it easy for you to sequence changes to the computer&rsquo;s memory.</p>
<p>A goal of functional programming is to <a href="https://dl.acm.org/doi/10.1145/359576.359579">escape the von Neumann bottleneck</a>, describing programs in ways that are not limited by the sequencing of changes to memory states. Yes, that has to happen, but it does not have to be the programmer&rsquo;s responsibility. Instead, the programmer&rsquo;s task is to explain what the program should do, and the <em>computer&rsquo;s</em> task is to find an efficient way to do it. Tail-call recursion, lazy or applicative evaluation, memoization, parallelism—none of those are your problem.</p>
<p>The most widespread examples of programming tools that embody this notion of communicating intent, not computation, are query languages (and these days, coding AIs). You do not tell SQL, or LINQ, how to loop over the elements in a collection; you tell it which properties you want from what elements (for example, composing primitives expressed in the <a href="https://www.cbcb.umd.edu/confcour/Spring2014/CMSC424/Relational_algebra.pdf">Relational Algebra</a> like &ldquo;Select&rdquo; and &ldquo;Project&rdquo;), and <em>the computer</em> works out an efficient way to make that happen.</p>
<p>You can reap the benefits of functional thinking in whatever programming language you happen to use. To truly escape the clutches of von Neumann and take advantage of functional <em>computation</em>, you do in fact need to choose your tools wisely.</p>
<p>Horrific disestablishment pun by <a href="https://www.cs.ox.ac.uk/jeremy.gibbons/">Prof. Jeremy Gibbons</a>. Photo by <a href="https://unsplash.com/@sanketshah?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Sanket Shah</a> on <a href="https://unsplash.com/photos/cooked-food-in-black-cooking-pot-eEWlcfydzQ4?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>.</p>
]]></content:encoded></item><item><title>Functional Programming: The Good Parts</title><link>https://deprogrammaticaipsum.com/functional-programming-the-good-parts/</link><pubDate>Mon, 01 Jun 2026 05:02:01 +0200</pubDate><guid>https://deprogrammaticaipsum.com/functional-programming-the-good-parts/</guid><description><![CDATA[ <p>In a <a href="https://dl.acm.org/doi/10.1145/286385.286387">famous paper</a> published in 1998, <a href="/philip-wadler/">Philip Wadler</a> complained that no one used functional programming languages. It is safe to say that in 2026 everybody is using some kind of functional programming language, albeit to a certain extent, but the underlying reason for this spread had more to do with fashion and hype rather than market economics or academic support.</p>]]></description><content:encoded><![CDATA[ <p>In a <a href="https://dl.acm.org/doi/10.1145/286385.286387">famous paper</a> published in 1998, <a href="/philip-wadler/">Philip Wadler</a> complained that no one used functional programming languages. It is safe to say that in 2026 everybody is using some kind of functional programming language, albeit to a certain extent, but the underlying reason for this spread had more to do with fashion and hype rather than market economics or academic support.</p>
<p>&ldquo;Modern&rdquo; programming languages include, almost without exception, features borrowed from the realm of functional programming languages. This can be briefly summarized as follows: &ldquo;lambdas&rdquo; or &ldquo;closures&rdquo; that can be passed around and called <em>a piacere</em>; a series of functions to manipulate arrays called <code>map()</code>, <code>filter()</code>, and <code>reduce()</code> (provided either as standalone functions or as methods of some <code>Array</code> class provided by the languages&rsquo; runtime libraries); immutable records or classes, guaranteed to be unchanged throughout the execution of the program; and sometimes even a &ldquo;pipe operator&rdquo; looking like this: <code>|&gt;</code>.</p>
<p>In the latter case, we can include the humble <a href="/the-toyota-corolla-of-programming/">PHP</a> programming language, which <a href="https://php.watch/versions/8.5/pipe-operator">features</a> such a contraption since version 8.5, released last November at the time of this writing. Which means that the two statements below produce similar results:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#00688b">$result1</span> = trim(str_shuffle(strtoupper(<span style="color:#cd5555">&#34;hello&#34;</span>)));
</span></span><span style="display:flex;"><span><span style="color:#00688b">$result2</span> = strtoupper(<span style="color:#cd5555">&#34;hello&#34;</span>) |&gt; <span style="color:#cd5555">&#39;str_shuffle&#39;</span> |&gt; trim(...);
</span></span></code></pre></div><p>Spoiler alert: the ellipsis (since PHP 8.1) makes a closure out of a pre-existing function, but as shown above, you can just use a string with the name of the function you would like to &ldquo;pipe&rdquo; your output into. Oh, and beware of the fact that <code>array_map()</code> takes the callback function as the <em>first</em> argument rather than the second, which means that… you need a wrapper to invert the arguments. Yeah, as one author <a href="https://dev.to/delacry/php-85s-pipe-operator-hits-a-wall-on-array-code-5c7e">describes</a> the current situation in PHP,</p>
<blockquote>
<p>The deeper issue is the stdlib itself. PHP&rsquo;s stdlib was never shaped for chaining. array_map and array_filter taking arguments in different orders is a 1995 design that calcified before anyone thought about composition. The pipe operator works around the symptom. Native methods on arrays and strings would fix the cause.</p>
</blockquote>
<p>(Takes a deep breath.)</p>
<p>Other than such small shenanigans, and thanks to the introduction of the pipe operator, recently laid-off developers coming from the F#, Elixir, OCaml, Elm, or Julia galaxies should now feel at home with PHP (well, almost). Note to Haskell developers struggling to pay rent and willing to jump on the very lucrative market of PHP: in your case the pipe operator looks like an <code>&amp;</code>. You have been warned. Oh, and JavaScript developers will have to wait for their own pipe operator, but <a href="https://github.com/tc39/proposal-pipeline-operator">it might happen</a> sooner than expected.</p>
<p>Let us be even more radical: <a href="https://www.youtube.com/shorts/YPSGL2MsES4">according to Kevlin Henney</a>, Excel is the world&rsquo;s most popular functional programming language, and even better, it now comes <a href="https://www.youtube.com/watch?v=Rm4y5UqauRw">bundled</a> with a <code>LAMBDA()</code> function. How about that?</p>
<p>Are these features enough to make PHP (or Excel) a <em>real</em> functional programming language? Let us recap. Closures? <a href="https://www.php.net/manual/en/class.closure.php">Check</a>. Map, filter, and reduce functions? Check. Readonly classes? <a href="https://wiki.php.net/rfc/readonly_classes">Check</a>. Pipe operator? As we have seen above, check.</p>
<p>But of course, no, PHP is not really a <em>pure</em> functional programming language. It still allows for side effects, and that is a big no-no-no in that world. Even worse, it is quite obviously a procedural language, not really a declarative one. But with a little bit of attention, and maybe with the help of your preferred LLM-powered IDE and some unit tests, your PHP code can reach levels of &ldquo;functional compliance&rdquo; Rasmus Lerdorf could only dream of (well, perhaps he never dreamt of such a thing; I give you that).</p>
<p>The real question is the following: why does a parochial programming language such as PHP now include these features? The reasons behind the choice to add them as part of the specification have a strong element of hype.</p>
<p>The jump to <a href="/the-age-of-concurrency/">concurrency</a> and the economics of <a href="/somebody-elses-computer-as-a-service/">cloud computing</a> have given functional programming constructs a boost that neither desktop nor mainframe applications ever could. Let us be honest here: in the world of concurrency, multicore CPUs, at the end of the &ldquo;free lunch&rdquo; world, functional languages shine.</p>
<p>The trend was apparent at the beginning of the 2000s, and it simply exploded during the 2010s. Scala was released in 2004, becoming the first functional programming language built on top of the JVM; standard Java developers would have to wait until Java 8 (released in 2014) to be able to write code including lambda expressions and its associated <code>map</code>, <code>filter</code>, and <code>reduce</code> functions. On the other side, the C# community discovered <a href="https://learn.microsoft.com/en-us/dotnet/csharp/linq/">LINQ</a> in 2005 already, effectively transforming array manipulation into a SQL-like contraption. In the galaxy of Apple, Objective-C blocks and their associated <a href="https://fuckingblocksyntax.com/">arcane syntax</a> appeared together with <a href="https://en.wikipedia.org/wiki/Grand_Central_Dispatch">Grand Central Dispatch</a> around 2009. C++ debuted lambda expressions in its <a href="https://en.cppreference.com/cpp/language/lambda">specification</a> in 2011.</p>
<p>Languages created in the past 20 years almost inevitably include one or another of the functional programming features enumerated above: Go functions are first-class objects. TypeScript builds on top of the already existing JavaScript language. Rust closures come in various &ldquo;traits&rdquo; depending on how they capture their surrounding environment. Elixir brought closures on top of the Erlang BEAM. Dart has supported closures since its first version. F# brought rather pure functional programming features to the .NET runtime. Swift had first-class functions from day one, and for a while, even object-oriented methods were implemented as closures. Finally, Kotlin brought a shorter, simpler syntax for closures on top of the JVM.</p>
<p>Oh, and then PHP followed the trend, obviously. By the way, it is worth mentioning that Python, Perl, and Lua have had support for lambdas since the 1990s, at a time when these concepts were still considered fringe.</p>
<p>Undeniably, in the same vein, the rise in popularity of Python, Ruby, and JavaScript during the past two decades also contributed to the slow march of functional thinking into the minds of software developers worldwide. Speaking (again) about JavaScript, we have talked about Douglas Crockford&rsquo;s <em>magnum opus</em> in a <a href="/douglas-crockford/">previous article</a> of this magazine, and it was obvious to him that one of the &ldquo;good&rdquo; parts of JavaScript was, precisely, its functional programming roots:</p>
<blockquote>
<p>JavaScript is built on some very good ideas and a few very bad ones. <br>
<br>
The very good ideas include functions, loose typing, dynamic objects, and an expressive object literal notation. The bad ideas include a programming model based on global variables. <br>
<br>
JavaScript&rsquo;s functions are first class objects with (mostly) lexical scoping. JavaScript is the first lambda language to go mainstream. Deep down, JavaScript has more in common with Lisp and Scheme than with Java. It is Lisp in C&rsquo;s clothing. This makes JavaScript a remarkably powerful language.</p>
</blockquote>
<p>The quote above explains why, at the time of this writing, the latest version of the quintessential book on functional programming, <a href="https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs">&ldquo;Structure and Interpretation of Computer Programs&rdquo;</a>, by Abelson and Sussman, is the <a href="https://mitpress.mit.edu/9780262543231/structure-and-interpretation-of-computer-programs/">&ldquo;JavaScript Edition&rdquo;</a>. The choice of JavaScript somehow gives reason to <a href="/philip-wadler/">Philip Wadler</a>, who in 1987 <a href="https://dl.acm.org/doi/10.1145/24697.24706">argued</a> that using Scheme was probably not the best idea to begin with.</p>
<p>Lisp would certainly deserve a whole issue of this magazine, but chapter 5 of Waldrop&rsquo;s &ldquo;The Dream Machine&rdquo;, a book we <a href="/j-c-r-licklider-m-mitchell-waldrop/">reviewed</a> precisely a year ago, contains a beautiful description of its early history and its impact:</p>
<blockquote>
<p>Nonetheless, it&rsquo;s fair to say that one of Lisp&rsquo;s two greatest legacies to the art of programming was a certain style, a certain exploratory approach to pushing back the software frontiers. <br>
<br>
And the other legacy? An undeniable grace, beauty, and power. As a Lisp programmer contined to link simpler functions in to more complex ones, he or she would eventually reach a point inwhere the <em>whole program</em> was a function–which, of course, would also be just another list. So to execute that program, the programmer would simply give a command for the list to evaluate itself in the context of all the definitions that had gone before. And in a truly spectacular exercise in self-reference, it would do precisely that. In effect, such a list provided the purest possible embodiment of John von Neumann&rsquo;s original conception of a stored program: it was both data and executable code, at one and the same time.</p>
</blockquote>
<p>Since its presentation in a now legendary <a href="https://dl.acm.org/doi/10.1145/367177.367199">paper by John McCarthy</a>, Lisp&rsquo;s power and beauty have often been mentioned by pundits and entrepreneurs alike. In the latter group, we cannot avoid mentioning Paul Graham: his 2001 article <a href="https://paulgraham.com/avg.html">&ldquo;Beating the Averages&rdquo;</a> tells the story of his 1995 e-commerce startup <a href="https://en.wikipedia.org/wiki/Viaweb">&ldquo;Viaweb&rdquo;</a>, built in Lisp, a language he <a href="https://www.paulgraham.com/onlisp.html">deeply</a> <a href="https://www.paulgraham.com/diff.html">loved</a>. That article also makes a surprising connection between Lisp and the (badly named) &ldquo;Sapir-Whorf hypothesis&rdquo; of <a href="https://en.wikipedia.org/wiki/Linguistic_relativity">linguistic relativity</a>:</p>
<blockquote>
<p>By induction, the only programmers in a position to see all the differences in power between the various languages are those who understand the most powerful one. (This is probably what Eric Raymond meant about Lisp making you a better programmer.) You can&rsquo;t trust the opinions of the others, because of the Blub paradox: they&rsquo;re satisfied with whatever language they happen to use, because it dictates the way they think about programs.</p>
</blockquote>
<p>Paul Graham was not the first to make the connection to the Sapir-Whorf hypothesis, by the way: <a href="https://amturing.acm.org/award_winners/iverson_9147499.cfm">Kenneth Iverson</a>, creator of the <a href="https://en.wikipedia.org/wiki/APL_(programming_language)">APL</a> programming language, also explained this during his 1980 Turing Award lecture, <a href="https://dl.acm.org/doi/10.1145/358896.358899">&ldquo;Notation as a Tool of Thought&rdquo;</a> as follows:</p>
<blockquote>
<p>Concerning language, George Boole in his <em>Laws of Thought</em> asserted &ldquo;That language is an instrument of human reason,, and not merely a medium for the expression of thought, is a truth generally admitted.&rdquo; <br>
<br>
Mathematical notation provides perhaps the best-known and best-developed example of language used consciously as a tool of thought.</p>
</blockquote>
<p>Those of us brave enough to have written code in APL can only agree that its notation brings a whole new meaning to the word &ldquo;programming&rdquo;.</p>
<p>So it was that, standing on the shoulder of this giant called Lisp, people came up with projects ranging from <a href="https://interlisp.org/">Medley Interlisp</a> to a Lisp interpreter built <a href="https://woodrush.github.io/blog/posts/2022-01-12-lisp-in-life.html">as Conway&rsquo;s Game of Life</a>.</p>
<p>Lisp, and later functional programming languages, have enlightened software programmers to go above and beyond what commercial offerings could even dream of. They have stretched our thinking, opening doors to concurrency, mathematical breakthroughs, early artificial intelligence efforts, and the widest possible array of scientific exploration about computation.</p>
<p>Yet, already in the 1990s it was apparent that Lisp (and, to a large extent, functional programming) <a href="https://dl.acm.org/doi/abs/10.1145/192590.192600">was at risk</a> of being relegated or even of becoming extinct, and today some influencers <a href="https://www.youtube.com/watch?v=gE6nnDsh5Ck">ask themselves</a>, where did all the functional programmers go? The answer is simple: they are all among us; we are all, to a small or large degree, better software engineers because there has been a healthy breeding process between procedural, object-oriented, and functional programming languages that begat modern tools for a modern world.</p>
<p>All things considered, the most important contribution of functional languages in the modern world was a <em>certain way of thinking</em> about programming, more than just actually adopting &ldquo;pure&rdquo; functional compilers in our day-to-day jobs. Put in other words, mastering functional programming concepts fundamentally transformed the way we create software. And in the best possible way.</p>
<p>Cover photo by <a href="https://unsplash.com/@pablomp?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Pablo Martinez</a> on <a href="https://unsplash.com/photos/silver-and-red-metal-tools-S1xZ5GmpdM8?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>.</p>
]]></content:encoded></item><item><title>Joe Armstrong</title><link>https://deprogrammaticaipsum.com/joe-armstrong/</link><pubDate>Mon, 01 Jun 2026 05:01:01 +0200</pubDate><guid>https://deprogrammaticaipsum.com/joe-armstrong/</guid><description><![CDATA[ <p>If there was a contest for the single most beloved person in the functional programming galaxy, <a href="https://en.wikipedia.org/wiki/Joe_Armstrong_(programmer)">Joe Armstrong</a> would have effortlessly won the first prize. For decades, he constantly showed the world that the principles behind functional programming were the key for resilient, concurrent, and highly available systems. And he showed it in the best possible way, which most probably made <a href="/pastor-manul-laphroaig/">Pastor Manul Laphroaig</a> very proud: with an astonishingly serious &ldquo;PoC&rdquo; called <a href="https://en.wikipedia.org/wiki/Erlang_(programming_language)">Erlang</a>.</p>]]></description><content:encoded><![CDATA[ <p>If there was a contest for the single most beloved person in the functional programming galaxy, <a href="https://en.wikipedia.org/wiki/Joe_Armstrong_(programmer)">Joe Armstrong</a> would have effortlessly won the first prize. For decades, he constantly showed the world that the principles behind functional programming were the key for resilient, concurrent, and highly available systems. And he showed it in the best possible way, which most probably made <a href="/pastor-manul-laphroaig/">Pastor Manul Laphroaig</a> very proud: with an astonishingly serious &ldquo;PoC&rdquo; called <a href="https://en.wikipedia.org/wiki/Erlang_(programming_language)">Erlang</a>.</p>
<p>That is why we have chosen as this month&rsquo;s Vidéothèque choice his presentation titled <a href="https://www.youtube.com/watch?v=cNICGEwmXLU">&ldquo;Systems that run forever self-heal and scale&rdquo;</a> at the <a href="https://web.archive.org/web/20130603195022/http://lambdajam.com/">2013 Lambda Jam</a>, a conference that featured an impressive <a href="https://web.archive.org/web/20130623055057/http://lambdajam.com/schedule/">schedule</a> with talks by <a href="https://en.wikipedia.org/wiki/Ola_Bini">Ola Bini</a>, <a href="https://www.thoughtworks.com/profiles/c/chris-ford">Chris Ford</a>, <a href="https://www.davethomas.net/biography_index.html">Dave Thomas</a> (not the <a href="https://en.wikipedia.org/wiki/Dave_Thomas_(programmer)">Pragmatic Dave</a>), <a href="https://bartoszmilewski.com/">Bartosz Milewski</a>, <a href="https://scholar.google.com/citations?user=k73mdkkAAAAJ&amp;hl=en">Adam Granicz</a>, <a href="https://www.informit.com/articles/article.aspx?p=1399235">Steve Vinoski</a>, and <a href="https://en.wikipedia.org/wiki/Gerald_Jay_Sussman">Gerald Jay Sussman</a>.</p>
<p>As you most probably know by now, Joe Armstrong (1950-2019) is mostly known for his work on Erlang, a massively concurrent and functional programming language, coupled with BEAM, the virtual machine that enabled telcos, starting in the 1990s, to serve millions of users with complex systems in the most efficient and resilient way.</p>
<p>Kids, this was 20 years before <a href="/the-age-of-concurrency/">Go</a> or <a href="/antonomasia/">Kubernetes</a> were even conceived. Erlang enabled companies to scale their services in ways that were unthinkable even by today&rsquo;s standards, running on hardware way underpowered compared to that of our modern world of 2026.</p>
<p>Joe kicked off his acclaimed book &ldquo;Programming Erlang&rdquo; (released in 2007 by The Pragmatic Programmers, with a <a href="https://pragprog.com/titles/jaerlang2/programming-erlang-2nd-edition/">second edition</a> published in 2013) with a clear disclaimer:</p>
<blockquote>
<p>In many places we&rsquo;ll be extolling the virtues of functional programming. Functional programming forbids code with side effects. Side effects and concurrency don&rsquo;t mix. You can have sequential code with side effects, or you can have code and concurrency that is free from side effects. You have to choose. There is no middle way.</p>
</blockquote>
<p>And he goes on to explain on page 44 (mind you, this was written in 2007) what &ldquo;functional&rdquo; means in this context:</p>
<blockquote>
<p>Erlang is a functional programming language. Among other things this means that funs can be used as arguments to functions and that functions (or funs) can return funs. <br>
<br>
Functions that return funs, or functions that can accept funs as their arguments, are called <em>higher-order functions</em>. We&rsquo;ll see a few examples of these in the next sections.</p>
</blockquote>
<p>I stress the fact that this was written in 2007 because merely 20 years ago, as we were entering the &ldquo;plateau of productivity&rdquo; in the <a href="/the-hype-cycle-of-oop/">hype cycle</a> of Object-Oriented Programming, we were also witnessing how Twitter (the original name of a decadent social network still active as this article hits the press) was suffering with &ldquo;fail whales&rdquo; shown on its home page, while millions of users were trying to read the tweets on their (not yet algorithm-driven) feeds. The time was ripe for a new paradigm… but apparently, unbeknownst to the Twitter team, it already existed.</p>
<p>Interestingly, the WhatsApp developer team knew exactly that they needed something else to create a system potentially usable by billions of simultaneous users, so they chose Erlang, and boy did that work well. More on that later.</p>
<p>In his 2013 conference talk, Joe Armstrong started with some simple observations: the real world is parallel. Boom. It turns out that Erlang processes are the perfect way to model such a world: they can be thought of as a group of people communicating by message passing.</p>
<p>Let us remember <a href="https://lists.squeakfoundation.org/pipermail/squeak-dev/1998-October/017019.html">what Alan Kay said</a> about messaging in 1998:</p>
<blockquote>
<p>The big idea is &ldquo;messaging&rdquo; &ndash; that is what the kernal of Smalltalk/Squeak is all about (and it&rsquo;s something that was never quite completed in our Xerox PARC phase). The Japanese have a small word &ndash; ma &ndash; for &ldquo;that which is in between&rdquo; &ndash; perhaps the nearest English equivalent is &ldquo;interstitial&rdquo;. The key in making great and growable systems is much more to design how its modules communicate rather than what their internal properties and behaviors should be.</p>
</blockquote>
<p>So here we have a programming language that allows you to model a world with certain characteristics that Joe describes around minute <a href="https://youtu.be/cNICGEwmXLU?t=330">05:30</a>: many computers distributed all over the place, working concurrently, detecting their own failures and repairing them as soon as possible, and even featuring a radical concept called live code upgrades.</p>
<p>Sounds familiar? Any parallels with Kubernetes are just a coincidence. In Erlang, there is no such thing as an atomic update of the &ldquo;stop it, upgrade, restart&rdquo; kind (<a href="https://youtu.be/cNICGEwmXLU?t=409">06:50</a>): Erlang applications are continuously partially upgrading themselves whenever needed.</p>
<p>Needless to say, this was beyond impressive in the mid-1990s, but <a href="/issue/issue-024-java/">Sun</a> had a bigger marketing budget than Ericsson. Insert sad face emoticon here.</p>
<p>Erlang was designed from the ground up for &ldquo;5 nines reliability&rdquo; (<a href="https://youtu.be/cNICGEwmXLU?t=429">07:10</a>) because of a simple observation: it is much better to design a system for 10 million users and scale it down to 10,000 than to scale it up from 10 to 10,000. The result is that by 2013 there was a 50% chance that smartphones went through Erlang to talk to the mobile Internet.</p>
<p>But Erlang is just a piece of the whole architectural cake, albeit a critical one. Joe goes on to elaborate on the patterns required for system consistency and fault tolerance, distributed consensus (<a href="https://youtu.be/cNICGEwmXLU?t=1416">23:36</a>), and the evolution from Lamport&rsquo;s <a href="https://en.wikipedia.org/wiki/Paxos_(computer_science)">Paxos</a> to Ongaro&rsquo;s and Ousterhout&rsquo;s <a href="https://en.wikipedia.org/wiki/Raft_(algorithm)">Raft</a>. He also mentions six rules for fault tolerance (<a href="https://youtu.be/cNICGEwmXLU?t=1769">30:00</a>), applicable to any massively distributed system running on your nearest Kubernetes cluster nowadays: process isolation, concurrency, failure detection, fault identification, live code upgrade, and stable storage.</p>
<p>Legendary computer scientist <a href="https://en.wikipedia.org/wiki/Jim_Gray_(computer_scientist)">Jim Gray</a> wrote a widely quoted paper in 1986 titled <a href="https://pages.cs.wisc.edu/~remzi/Classes/739/Fall2018/Papers/gray85-easy.pdf">&ldquo;Why Do Computers Stop and What Can Be Done About It?&rdquo;</a> where he said:</p>
<blockquote>
<p>The top priority for improving system availability is to reduce administrative mistakes by making self-configured systems with minimal maintenance and minimal operator interaction. <br>
(…) <br>
As with hardware, the key to software fault-tolerance is to hierarchically decompose large systems into modules, each module being a unit of service and a unit of failure. A failure of a module does not propagate beyond the module.</p>
</blockquote>
<p>Now you understand why your Kubernetes <code>Deployment</code> YAML contains a readiness and a liveness probe, for example. You are welcome.</p>
<p>Towards <a href="https://youtu.be/cNICGEwmXLU?t=2749">minute 46</a> of the video, Joe goes on to talk about Erlang in detail, enumerating some success stories: <a href="https://en.wikipedia.org/wiki/Mnesia">Mnesia</a>, <a href="https://en.wikipedia.org/wiki/Apache_CouchDB">CouchDB</a>, <a href="https://en.wikipedia.org/wiki/Riak">Riak</a>, <a href="https://en.wikipedia.org/wiki/Ejabberd">ejabberd</a>, <a href="https://en.wikipedia.org/wiki/RabbitMQ">RabbitMQ</a>, and, yes, of course, WhatsApp, snapped up by Facebook for a hefty 20 billion dollars of pocket money. And then he goes on to discuss the future of Erlang as seen from the perspective of 2013: <a href="https://en.wikipedia.org/wiki/Elixir_(programming_language)">Elixir</a>, a programming language based on BEAM and OTP but offering an admittedly much friendlier syntax (inspired by <a href="/issue/issue-089-ruby/">Ruby</a>) with interesting metaprogramming possibilities.</p>
<p>Watch this month&rsquo;s Vidéothèque entry, &ldquo;Systems that run forever self-heal and scale,&rdquo; by Joe Armstrong, <a href="https://www.youtube.com/watch?v=cNICGEwmXLU">on YouTube</a>. Continue binge-watching &ldquo;Erlang: The Movie,&rdquo; a 1990 short nowadays available on <a href="https://www.youtube.com/watch?v=xrIjfIjssLE">YouTube</a> and the <a href="https://archive.org/details/ErlangTheMovie">Internet Archive</a>, showing a demo of a bug-fixing session on a live Erlang system. Let us repeat for the people in the back: <a href="http://lambda-the-ultimate.org/node/197">1990</a>.</p>
<p>Cover snapshot chosen by the author.</p>
]]></content:encoded></item><item><title>Guy Steele &amp; Gerry Sussman</title><link>https://deprogrammaticaipsum.com/guy-steele-gerry-sussman/</link><pubDate>Mon, 01 Jun 2026 05:00:02 +0200</pubDate><guid>https://deprogrammaticaipsum.com/guy-steele-gerry-sussman/</guid><description><![CDATA[ <p>Imagine a world in which two people take the best ideas from programming languages, and create an interpreter for their own programming language. Then they demonstrate that most of the features in that programming language&mdash;indeed, in <em>all</em> programming languages&mdash;can be constructed out of just three features of their interpreter: lambda application, conditional execution, and variable assignment. Then, they show that variable assignment is the wrong way to think about variable assignment, and show that their interpreter points to the most efficient way to make language compilers, and made a compiler for their interpreted language to show how good that could be. Then, imagine that they share this knowledge with the world, for free, through a series of memos.</p>]]></description><content:encoded><![CDATA[ <p>Imagine a world in which two people take the best ideas from programming languages, and create an interpreter for their own programming language. Then they demonstrate that most of the features in that programming language&mdash;indeed, in <em>all</em> programming languages&mdash;can be constructed out of just three features of their interpreter: lambda application, conditional execution, and variable assignment. Then, they show that variable assignment is the wrong way to think about variable assignment, and show that their interpreter points to the most efficient way to make language compilers, and made a compiler for their interpreted language to show how good that could be. Then, imagine that they share this knowledge with the world, for free, through a series of memos.</p>
<p>That world that you just imagined? We live in it. Meet Guy L. Steele, Jr., and Gerald J. Sussman, two of the luminary thinkers from the Massachusettes Institute of Technology Artificial Intelligence Lab. This is the first go around the AI hype cycle, back when computers were routinely called <a href="https://www.sciencemuseum.org.uk/objects-and-stories/thinking-machines-stories-history-computing">thinking machines</a> but before people even <a href="https://machinelearning.apple.com/research/illusion-of-thinking">pretended that computers were doing any thinking</a>.</p>
<p>However, it is really not that valuable to distinguish between AI computing and non-AI computing, because <a href="https://www.sicpers.info/2026/03/on-thinking-machines/">all computation is an emulation of intelligence</a>. The AI research community is best thought of as an advanced computational techniques community that began life exploring computational methods to understand thought, and that is where this story begins. The person who coined the phrase &ldquo;Artificial Intelligence&rdquo; was John McCarthy, and for no more highbrow reason than that he thought if he presented his work in symbolic computation techniques as &ldquo;cybernetics&rdquo; then he would end up having an argument with Norbert Weiner, and if he called it &ldquo;information processing&rdquo; then the argument would be with Claude Shannon. Both of these intellectual giants were too scary to argue with.</p>
<p>McCarthy consulted for IBM on <a href="https://dl.acm.org/doi/10.1145/800025.1198360">the addition of a List Processing library to FORTRAN</a>, but preferred to use an algebra based on symbolic expressions so created his own programming language, LISP. For the first few years LISP users had to execute their programs by hand using pencil and paper, until Steve Russell noticed a huge opportunity. The language includes a neat trick called <code>eval</code> which interprets a LISP expression as a LISP program, and Russell realised he could implement <code>eval</code> in machine language (by punching holes into punchcards) on the IBM 704. Thus is was, with the creator of LISP and the creator of AI research being the same person, that LISP became the preferred programming language of AI researchers.</p>
<p>Fast-forward to the mid-1970s, and the MIT AI Lab (counting McCarthy among its alumni, of course) used a LISP dialect called Maclisp: nothing to do with the later personal computer model, but named after the Project on Mathematics And Computation that hired the original AI group (including McCarthy, of course). Maclisp&rsquo;s innovation over LISP is the use of <a href="https://softwarepreservation.computerhistory.org/LISP/MIT/Moon-MACLISP_Reference_Manual-Apr_08_1974.pdf">value cells</a> to associate objects with symbols, where LISP maintained a list of associations that it scanned through to find the object. Two of the AI lab members&mdash;the heroes of this story&mdash;wanted to explore the <a href="https://dl.acm.org/doi/abs/10.5555/1624775.1624804">Actor model</a> of computation (another product of the AI research galaxy), and did so in their own, minimalist LISP interpreter, which they wrote (inevitably) in Maclisp.</p>
<p>They borrowed a neat idea from the ALGOL programming language: block structure, and lexical scope. A variable (or function, or label) can be declared inside a block, in which case it is <em>local</em> to the block: it only exists while that block&rsquo;s in scope. If the variable has the same name as an existing variable from another scope, it <em>shadows</em> that variable, replacing uses of variables of that shared name with itself. But only within the block.</p>
<p>Steele and Sussman documented this Lisp interpreter, which they called <a href="https://www.scheme.org">Scheme</a>, through a series of AI Memos <a href="https://research.scheme.org/lambda-papers/">now sometimes called the LAMBDA papers</a>, after the recurring form &ldquo;LAMBDA: the Ultimate <code>X</code>&rdquo; in their titles. In <a href="https://dspace.mit.edu/entities/publication/a40a9ba3-619a-4495-b357-5c2eb2442066">LAMBDA: the Ultimate Imperative</a>, they show that lambda application can model almost every feature of an imperative language (using ALGOL in their case, but the same would apply to FORTRAN, C, Swift, Rust, or your favourite poison). Steele then issued a correction a few months later, <a href="https://dspace.mit.edu/entities/publication/4b273252-5dbe-488f-891b-0c63eaaf25a1">LAMBDA: the Ultimate Declarative</a>.</p>
<p>Whoops! Did we say that lambda was the ultimate imperative? What we meant was that function calling is the ultimate imperative if you think of a function call as a <code>GO TO</code> statement with a message alongside it (sending messages? That is the actor model achieved!); what lambda gives you is a way to rename variables, defining an environment in which your fancy <code>GO TO</code> operates. That is a powerful idea in itself, because it means you do not have to mess around copying values into registers or onto the stack whenever you call a function; you just associate the new name with the existing value. He further explored this idea in <a href="https://dspace.mit.edu/entities/publication/77b3eea1-50be-4e3f-b578-264484ee0f1a">Lambda: the Ultimate GOTO</a>.</p>
<p>Eventually, in 1979, the two authors published <a href="https://dspace.mit.edu/entities/publication/e70f4d48-b51c-4b29-996f-44ecb22441a4">LAMBDA: the Ultimate Opcode</a>, in which they design the LISP machine: a hardware implementation of a state machine that evaluates LISP expressions, along with operations that work efficiently with the linked data structures native to the language.</p>
<p>Reading this series of AI memos in 2026, which are written in a straightforward, tutorial style, gives one first the feeling that understanding the complexity of computers and programming languages might not be so difficult, after all. Then, one remembers that their current problem involves multiple programming languages and script files and YAML files and TOML files, and the effect is more like being Charlton Heston looking up at the Statue of Liberty.</p>
<p>Cover photo by the author.</p>
]]></content:encoded></item><item><title>Philip Wadler</title><link>https://deprogrammaticaipsum.com/philip-wadler/</link><pubDate>Mon, 01 Jun 2026 05:00:01 +0200</pubDate><guid>https://deprogrammaticaipsum.com/philip-wadler/</guid><description><![CDATA[ <p>On page 138 of the second edition of his 1971 book, <a href="https://en.wikipedia.org/wiki/Categories_for_the_Working_Mathematician">&ldquo;Categories for the Working Mathematician&rdquo;</a>, American mathematician <a href="https://en.wikipedia.org/wiki/Saunders_Mac_Lane">Saunders Mac Lane</a> inadvertently coined one of the most famous <a href="https://www.reddit.com/r/mathmemes/comments/10tnkwu/based_definition/">memes</a> ever made around programming. It is there, precisely there, and not anywhere else, where the phrase <em>&ldquo;a monad in X is just a monoid in the category of endofunctors&rdquo;</em> was published for the first time. As is often the case, the true origin of the meme got lost in collective memory, and it ended up being falsely attributed to <a href="https://en.wikipedia.org/wiki/Philip_Wadler">Philip Wadler</a>, although, in hindsight and all things considered, it was an understandable oversight.</p>]]></description><content:encoded><![CDATA[ <p>On page 138 of the second edition of his 1971 book, <a href="https://en.wikipedia.org/wiki/Categories_for_the_Working_Mathematician">&ldquo;Categories for the Working Mathematician&rdquo;</a>, American mathematician <a href="https://en.wikipedia.org/wiki/Saunders_Mac_Lane">Saunders Mac Lane</a> inadvertently coined one of the most famous <a href="https://www.reddit.com/r/mathmemes/comments/10tnkwu/based_definition/">memes</a> ever made around programming. It is there, precisely there, and not anywhere else, where the phrase <em>&ldquo;a monad in X is just a monoid in the category of endofunctors&rdquo;</em> was published for the first time. As is often the case, the true origin of the meme got lost in collective memory, and it ended up being falsely attributed to <a href="https://en.wikipedia.org/wiki/Philip_Wadler">Philip Wadler</a>, although, in hindsight and all things considered, it was an understandable oversight.</p>
<p>The source of the confusion is none other than an excerpt of a masterpiece <a href="/search/?q=james+iry">often quoted</a> in the pages of this magazine: James Iry&rsquo;s 2009 brilliant <a href="https://james-iry.blogspot.com/2009/05/brief-incomplete-and-mostly-wrong.html">&ldquo;A Brief, Incomplete, and Mostly Wrong History of Programming Languages&rdquo;</a>:</p>
<blockquote>
<p>1990 - A committee formed by Simon Peyton-Jones, Paul Hudak, Philip Wadler, Ashton Kutcher, and People for the Ethical Treatment of Animals creates Haskell, a pure, non-strict, functional language. Haskell gets some resistance due to the complexity of using monads to control side effects. Wadler tries to appease critics by explaining that &ldquo;a monad is a monoid in the category of endofunctors, what&rsquo;s the problem?&rdquo;</p>
</blockquote>
<p>The jury is still out debating the role that Ashton Kutcher had in the creation of Haskell, but as usual, I digress.</p>
<p>What is important to consider is that, yes, Philip Wadler might as well have coined the &ldquo;endofunctors&rdquo; meme; after all, he has singlehandedly done more to popularize and to extend the usage of functional programming languages than anyone else in the history of computing. And he has even coined the term &ldquo;list comprehension&rdquo;, which might ring a bell among Python developers, among others.</p>
<p>On the other hand, monads are a relatively recent addition to the arsenal of functional programmers; Italian computer science professor <a href="https://en.wikipedia.org/wiki/Eugenio_Moggi">Eugenio Moggi</a> was the first to describe the use of monads in programming in two papers published between <a href="https://doi.org/10.1109/LICS.1989.39155">1989</a> and <a href="https://doi.org/10.1016/0890-5401(91)90052-4">1991</a>. Philip Wadler took the idea, bolted it down into Haskell, James Iry wrote his blog post, and the Internet <a href="https://sauropods.win/@futurebird/114392527567949088">did the rest</a>.</p>
<p>I am kidding; Wadler did more than just take the idea: he helped everyone <a href="https://dl.acm.org/doi/abs/10.1145/91556.91592">comprehend</a> how monads could be used to marry the &ldquo;impure&rdquo; necessities of actual programming with the &ldquo;pure&rdquo; realm of functional programming:</p>
<blockquote>
<p>Purity has its regrets, and all programmers in pure functional languages will recall some moment when an impure feature has tempted them. For instance, if a counter is required to generate unique names, then an assignable variable seems just the ticket. In such cases it is always possible to mimic the required impure feature by straightforward though tedious means. For instance, a counter can be simulated by modifying the relevant functions to accept an additional parameter (the counter&rsquo;s current value) and return an additional result (the counter&rsquo;s updated value).</p>
</blockquote>
<p>A quick search shows that Mr. Wadler had a strong interest in such a marriage early on; case in point, his 1985 paper <a href="https://link.springer.com/chapter/10.1007/3-540-15975-4_33">&ldquo;How to replace failure by a list of successes: a method for exception handling, backtracking, and pattern matching in lazy functional languages&rdquo;</a> where he argues that</p>
<blockquote>
<p>The method itself is straightforward. Each term that may raise an exception or backtrack is replaced by a term that returns a list of values.</p>
</blockquote>
<p>Mr. Wadler went above and beyond, explaining that monads were <a href="https://dl.acm.org/doi/10.1145/143165.143169">&ldquo;the essence of functional programming&rdquo;</a> (1992) and then using them to perform input/output in a pure functional way in the widely acclaimed 1993 paper <a href="https://dl.acm.org/doi/10.1145/158511.158524">&ldquo;Imperative functional programming&rdquo;</a> (winner of the 2003 ACM SIGPLAN <a href="https://sigplan.org/Awards/POPL/">Most Influential POPL Paper Award</a>):</p>
<blockquote>
<p>We need a way to reconcile <em>being</em> with <em>doing</em>: an expression in a functional language <em>denotes</em> a value, while an I/O command should <em>perform</em> an action. We integrate these worlds by providing a type <code>IO a</code> denoting actions that, <em>when performed</em>, may do some I/O and then return a value of type <code>a</code>.</p>
</blockquote>
<p>Speaking about &ldquo;monads&rdquo; and &ldquo;functions&rdquo; and whatnot, the astute reader will remark that mostly everything that has to do with functional programming is related, eventually, to some obscure <a href="/in-praise-of-mathematics/">mathematical</a> theory most self-taught software developers (like the one writing these words) have never heard about, created by a long list of mathematicians including Peano, Cantor, <a href="/bertrand-russell/">Russell</a>, and <a href="/douglas-hofstadter/">Gödel</a>.</p>
<p>And let us not forget the list of functional programming languages whose names derive from mathematicians: Haskell, <a href="https://en.wikipedia.org/wiki/Curry_%28programming_language%29">Curry</a>, <a href="https://en.wikipedia.org/wiki/Church_(programming_language)">Church</a>, <a href="https://en.wikipedia.org/wiki/G%C3%B6del_(programming_language)">Gödel</a>, <a href="https://freesourcelibrary.com/the-legacy-of-russell-language/">Russell</a>, <a href="https://github.com/Frege/frege">Frege</a>, <a href="https://en.wikipedia.org/wiki/Rocq">Rocq</a> (originally named &ldquo;Coq&rdquo; after French mathematician <a href="https://en.wikipedia.org/wiki/Thierry_Coquand">Thierry Coquand</a>), <a href="https://dl.acm.org/doi/10.1145/2837614.2837647">Kleenex</a> (named after American mathematician <a href="https://en.wikipedia.org/wiki/Stephen_Cole_Kleene">Stephen Cole Kleene</a>), and <a href="/joe-armstrong/">Erlang</a>. Honorific mentions of the non-functional languages <a href="https://en.wikipedia.org/wiki/Euler_(programming_language)">Euler</a>, <a href="/issue/issue-065-pascal/">Pascal</a>, <a href="https://en.wikipedia.org/wiki/Napier88">Napier88</a>, <a href="https://en.wikipedia.org/wiki/Occam_(programming_language)">occam</a>, <a href="https://en.wikipedia.org/wiki/Z_notation">Z notation</a> (whose name derives from <a href="https://en.wikipedia.org/wiki/Ernst_Zermelo">Ernst Zermelo</a>), and Ada are definitely worth mentioning.</p>
<p>Wait, what is Russell&rsquo;s name doing in the previous lists? Well, according to a <a href="https://www.tandfonline.com/doi/abs/10.1080/0144534031000076237">2003 paper</a> by Kevin Klement, from the University of Massachusetts, unpublished papers from Russell suggest that he did much more than just suggest the notation that Alonzo Church used for lambda calculus. But we leave this bit to the reader to explore.</p>
<p>A certain D. A. Turner, from the University of Kent &amp; Middlesex University,  wrote in <a href="https://link.springer.com/chapter/10.1007/978-3-642-40447-4_1">&ldquo;Some History of Functional Programming Languages&rdquo;</a> (2013) that the lineage of functional programming starts in the 1930s with Church &amp; Rosser&rsquo;s Lambda Calculus (a very mathematical theory of computation), then flows through McCarthy&rsquo;s LISP, Algol 60 (believe it or not), and Gordon &amp; Milner&rsquo;s ML, culminating in the creation of Haskell from 1987 onwards:</p>
<blockquote>
<p>In what follows I have, firstly, focussed on the developments leading to lazy, higher order, polymorphically typed, purely functional programming languages of which Haskell is the best known current example.</p>
</blockquote>
<p>Would we be too picky to argue that Mr. Turner forgot to include John Backus, of FORTRAN and ALGOL fame, who in his <a href="https://amturing.acm.org/bib/backus_0703524.cfm">1977 Turing Award</a> lecture <a href="https://dl.acm.org/doi/10.1145/359576.359579">proposed</a> functional programming as a viable alternative to the Von Neumann programming model?</p>
<blockquote>
<p>In this section we give an informal description of a class of simple applicative programming systems called functional programming (FP) systems, in which &ldquo;programs&rdquo; are simply functions without variables. The description is followed by some examples and by a discussion of various properties of FP systems.</p>
</blockquote>
<p>Philip Wadler is a member of the original committee behind Haskell, probably the most successful exception in the world of committee-created things. Not only that, he also co-created this thing called XQuery (which you might have used 20 years ago to parse some XML, a format not so much <em>en vogue</em> these days) and was also heavily involved in bolting generics on top of Java 5 (a language and a feature that, yes, you might have had a much higher probability of using).</p>
<p>Haskell enjoys quite a level of popularity in our century, similar to that of Lisp in previous decades. Even Edsger Dijkstra <a href="https://www.cs.utexas.edu/~EWD/transcriptions/OtherDocs/Haskell.html">defended it</a> in 2001, when a group at the University of Austin, Texas, decided to replace Haskell with Java in the introductory programming course:</p>
<blockquote>
<p>A very practical reason for preferring functional programming in a freshman course is that most students already have a certain familiarity with imperative programming. Facing them with the novelty of functional programming immediately drives home the message that there is more to programming than they thought.</p>
</blockquote>
<p>But again, Haskell is a subject in itself, and I cannot help but digress once again.</p>
<p>As explained in the <a href="https://people.cs.nott.ac.uk/pszgmh/faq.html">&ldquo;Frequently Asked Questions for comp.lang.functional&rdquo;</a> page, Philip Wadler collaborated in 1997 with a certain Martin Odersky to create <a href="https://dl.acm.org/doi/10.1145/263699.263715">&ldquo;Pizza&rdquo;</a>, a functional superset of Java… any similarities with Scala are, I suppose, just a coincidence.</p>
<p>Oh, and Mr. Wadler is a prolific writer of research papers and <a href="https://www.oreilly.com/pub/au/2440">books</a>, among which stand out the chapters he contributed to &ldquo;The Implementation of Functional Programming Languages&rdquo; (1987) by his aforementioned partner in crime, Simon Peyton-Jones (and <a href="https://www.microsoft.com/en-us/research/publication/the-implementation-of-functional-programming-languages-2/">available for free</a> on the Microsoft Research website at the time of this writing). Also notable is <a href="https://www.goodreads.com/book/show/3791460-introduction-to-functional-programming">&ldquo;Introduction to Functional Programming&rdquo;</a> (1988), co-authored with Richard Bird and renamed &ldquo;Introduction to Functional Programming using Haskell&rdquo; for its second edition published in 1998.</p>
<p>Among his most famous papers, let us mention <a href="https://dl.acm.org/doi/10.1145/99370.99404">&ldquo;Theorems for Free!&rdquo;</a> (1989), <a href="https://dl.acm.org/doi/10.1145/944705.944723">&ldquo;Call-by-Value is Dual to Call-by-Name&rdquo;</a> (2003), <a href="http://portal.acm.org/citation.cfm?doid=143165.143169">&ldquo;The essence of functional programming&rdquo;</a> (1992), and <a href="https://dl.acm.org/doi/10.1145/1238844.1238856">&ldquo;A History of Haskell: Being Lazy With Class&rdquo;</a> (2007), the latter being a very appropriate entry for the upcoming HOPL V conference in 2035. Furthermore, a full-text search for his family name on the Journal of Functional Programming (of which Wadler was editor from 1990 to 2004) <a href="https://www.cambridge.org/core/journals/journal-of-functional-programming/listing?q=wadler&amp;searchWithinIds=49AD4731AAB0E94D8EF98BBB4EE56A7F&amp;fts=yes">returns</a> a staggering 421 entries at the time of this writing.</p>
<p>All this record of writing and <a href="https://www.youtube.com/watch?v=gui_SE8rJUM">conference talks</a> is quite opinionated. Philip Wadler has made his life&rsquo;s mission to show that functional programming languages could be used in the real world as a counterstrike against the overwhelming marketing campaigns around those languages that are not. In his <a href="https://dl.acm.org/doi/10.1145/274930.274933">&ldquo;An Angry Half-Dozen&rdquo;</a> paper (1998), he describes 6 major technological wonders brought to life thanks to functional programming, and one of them is Erlang:</p>
<blockquote>
<p>Erlang bears a striking resemblance to another modern phenomenon, Java. Like Java, Erlang (along with all other functional languages) uses heap allocation and garbage collection, and ensures safe execution that never corrupts memory. Like Java, Erlang comes with a library that provides functionality independent of a particular operating system. Like Java, Erlang compiles to a virtual machine, ensuring portability across a wide range of architectures. And like Java, Erlang achieved its first success based on interpreters for the virtual machine, with faster compilers coming along later.</p>
</blockquote>
<p>That same year, he tried to explain why <a href="https://dl.acm.org/doi/10.1145/286385.286387">no one was using functional languages</a>:</p>
<blockquote>
<p>If a manager chooses to use a functional language for a project and the project fails, then he or she will certainly be fired. If a manager chooses C++ and the project fails, then he or she has the defense that the same thing has happened to everyone else.</p>
</blockquote>
<p>Ouch. The following year he repeated himself, merging the previous two papers into another one called <a href="https://link.springer.com/chapter/10.1007/978-3-642-60085-2_9">&ldquo;How enterprises use functional languages, and  why they don&rsquo;t&rdquo;</a>. Was anybody listening at all?</p>
<p>Philip Wadler has kept a record of every important use of functional programming on his own website since at least 1999, as the Internet Archive can <a href="https://web.archive.org/web/19990209081452/http://www.cs.bell-labs.com/who/wadler/realworld/index.html">testify</a>, and this effort <a href="https://homepages.inf.ed.ac.uk/wadler/realworld/">continues</a> at the time of publication of this article.</p>
<p>However, and rather surprisingly, <a href="https://pandoc.org/">Pandoc</a> is not mentioned in this list, and yet, it is literally made with Haskell! We are delighted to use Pandoc every month to produce the beautiful (DRM-free, by the way) PDF and EPUB files that you can download from this website.</p>
<p>I hope the core idea of this article is clear. Philip Wadler is a <a href="https://homepages.inf.ed.ac.uk/wadler/vita.pdf">towering</a> figure in the field of functional programming, and the pervasiveness of functional features in most mainstream programming languages nowadays owes a lot to the efforts of this single person.</p>
<p>Haskell is a subject in and of itself, and there have been an incredible number of excellent books written about it in the past two decades. At the risk of leaving aside some obviously outstanding entries, we should mention at least <a href="https://web.archive.org/web/20080901052313/http://book.realworldhaskell.org/">&ldquo;Real World Haskell&rdquo;</a> by Bryan O&rsquo;Sullivan, Don Stewart, and John Goerzen; <a href="https://web.archive.org/web/20081013110019/http://learnyouahaskell.com/">&ldquo;Learn You a Haskell for Great Good!&rdquo;</a> by Miran Lipovača (this one taking more than a few cues from <a href="/_why/">_why</a>&rsquo;s &ldquo;Poignant Guide to Ruby&rdquo;); and the more recent <a href="https://haskellbook.com/">&ldquo;Haskell Programming from First Principles&rdquo;</a> by Christopher Allen and Julie Moronuki.</p>
<p>However, if you are just interested in a rather short and high-level overview of the Haskell language, <a href="https://pragprog.com/titles/btlang/seven-languages-in-seven-weeks/">&ldquo;Seven Languages in Seven Weeks&rdquo;</a> by Bruce Tate (2010) will give you an excellent starting point for your exploration. Precisely, Chapter 8, dedicated to Haskell, starts like this:</p>
<blockquote>
<p>Haskell represents purity and freedom for many functional programming purists. It&rsquo;s rich and powerful, but the power comes at a price. You can&rsquo;t eat just a couple of bites. Haskell will force you to eat the whole functional programming burrito.</p>
</blockquote>
<p>You have been warned.</p>
<p>To close this article, we feel that the general functional programming literature is so vast, we can only scratch the surface by enumerating some hallmark titles; please do not be offended if your favorite title does not appear on this list:</p>
<ul>
<li><a href="https://simon.peytonjones.org/slpj-book-1987/">&ldquo;The Implementation of Functional Programming Languages&rdquo;</a>, by Simon Peyton Jones and Philip Wadler.</li>
<li><a href="https://dl.acm.org/doi/book/10.5555/113903">&ldquo;Introduction to Functional Programming&rdquo;</a>, by Richard Bird and Philip Wadler.</li>
<li><a href="https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs">&ldquo;Structure and Interpretation of Computer Programs&rdquo;</a>, in either edition, in Scheme or in JavaScript, by Harold Abelson and Gerald Jay Sussman.</li>
<li><a href="https://berksoft.ca/gol/">&ldquo;The Genius of Lisp&rdquo;</a>, a recently released gem by Cees de Groot.</li>
<li><a href="https://en.wikipedia.org/wiki/Practical_Common_Lisp">&ldquo;Practical Common Lisp&rdquo;</a>, a classic book by Peter Seibel.</li>
<li><a href="https://norvig.github.io/paip-lisp/#/">&ldquo;Paradigms of Artificial Intelligence Programming&rdquo;</a>, another historically relevant book by Peter Norvig.</li>
<li><a href="https://www.cse.chalmers.se/research/group/logic/TypesSS05/Extra/geuvers.pdf">&ldquo;Introduction to Lambda Calculus&rdquo;</a>, a freely available book by Henk Barendregt and Erik Barendsen.</li>
<li><a href="https://www.fm2gp.com/">&ldquo;From Mathematics to Generic Programming&rdquo;</a>, by Alexander Stepanov &amp; Daniel Rose.</li>
<li><a href="https://fsharpforfunandprofit.com/">&ldquo;F# for Fun and Profit&rdquo;</a> and <a href="https://pragprog.com/titles/swdddf/domain-modeling-made-functional/">&ldquo;Domain Modeling Made Functional&rdquo;</a>, both by Scott Wlaschin.</li>
<li><a href="https://www.objc.io/books/functional-swift/">&ldquo;Functional Swift&rdquo;</a>, by Chris Eidhof, Florian Kugler, and Wouter Swierstra.</li>
<li><a href="https://www.informit.com/store/scala-for-the-impatient-9780138033651">&ldquo;Scala for the Impatient&rdquo;</a>, by Cay Horstmann.</li>
<li>And finally, <a href="https://alvinalexander.gumroad.com/l/learnfp">&ldquo;Learn Functional Programming the Fast Way!&rdquo;</a>, by Alvin Alexander, also using Scala to teach concepts.</li>
</ul>
<p>Cover photo by the author.</p>
]]></content:encoded></item><item><title>Issue 092: Linux</title><link>https://deprogrammaticaipsum.com/issue-92-linux/</link><pubDate>Mon, 04 May 2026 05:03:00 +0200</pubDate><guid>https://deprogrammaticaipsum.com/issue-92-linux/</guid><description><![CDATA[ <p>Welcome to the 92nd issue of <em>De Programmatica Ipsum</em>, about <em>Linux</em>.</p>
<p>In this edition:</p>
<ul>
<li>Graham reports on the state of GNU Hurd <a href="/have-you-hurd-the-gnus/">with very good news</a>.</li>
<li>Adrian <a href="/overchoice-in-the-new-non-aligned-world/">untangles the Linux distro jungle</a> and helps you choose the best one for your needs.</li>
<li>In our <a href="/category/videotheque/">Vidéothèque section</a>, we watch &ldquo;The Code&rdquo; by <a href="/hannu-puttonen/">Hannu Puttonen</a>.</li>
<li>In the <a href="/category/library/">Library section</a>, we review &ldquo;Just for Fun&rdquo; by <a href="/linux-torvalds-david-diamond/">Linus Torvalds &amp; David Diamond</a>, and &ldquo;The Linux Programming Interface&rdquo; by <a href="/michael-kerrisk/">Michael Kerrisk</a>.</li>
</ul>
<p>Download this issue in DRM-free <a href="/pdf/issue-092-linux.pdf">PDF</a> or <a href="/epub/issue-092-linux.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 92nd issue of <em>De Programmatica Ipsum</em>, about <em>Linux</em>.</p>
<p>In this edition:</p>
<ul>
<li>Graham reports on the state of GNU Hurd <a href="/have-you-hurd-the-gnus/">with very good news</a>.</li>
<li>Adrian <a href="/overchoice-in-the-new-non-aligned-world/">untangles the Linux distro jungle</a> and helps you choose the best one for your needs.</li>
<li>In our <a href="/category/videotheque/">Vidéothèque section</a>, we watch &ldquo;The Code&rdquo; by <a href="/hannu-puttonen/">Hannu Puttonen</a>.</li>
<li>In the <a href="/category/library/">Library section</a>, we review &ldquo;Just for Fun&rdquo; by <a href="/linux-torvalds-david-diamond/">Linus Torvalds &amp; David Diamond</a>, and &ldquo;The Linux Programming Interface&rdquo; by <a href="/michael-kerrisk/">Michael Kerrisk</a>.</li>
</ul>
<p>Download this issue in DRM-free <a href="/pdf/issue-092-linux.pdf">PDF</a> or <a href="/epub/issue-092-linux.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/@evanescentlight?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Ian Parker</a> on <a href="https://unsplash.com/photos/standing-penguin-on-sand-near-snow-covered-mountain-covering-the-sun-from-view-at-daytime-TLcLDigmTKE?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>.</p>
]]></content:encoded></item><item><title>Have You HURD The GNUs?</title><link>https://deprogrammaticaipsum.com/have-you-hurd-the-gnus/</link><pubDate>Mon, 04 May 2026 05:02:02 +0200</pubDate><guid>https://deprogrammaticaipsum.com/have-you-hurd-the-gnus/</guid><description><![CDATA[ <p>Those of us who have been extremely online for a very long time will remember that Linus Torvalds <a href="https://www.cs.cmu.edu/~awb/linux.history.html">announced</a> his Linux kernel to a usenet newsgroup (or &ldquo;froup&rdquo;, as the internet lexicon had it at the time) for the <a href="https://www.minix3.org">Minix operating system</a>. Minix is a Unix-like operating system that Andrew S. Tanenbaum created to teach his class on operating systems, and that he published in the book <a href="https://www.minix3.org/doc/">&ldquo;Operating Systems: Design &amp; Implementation&rdquo;</a>.</p>]]></description><content:encoded><![CDATA[ <p>Those of us who have been extremely online for a very long time will remember that Linus Torvalds <a href="https://www.cs.cmu.edu/~awb/linux.history.html">announced</a> his Linux kernel to a usenet newsgroup (or &ldquo;froup&rdquo;, as the internet lexicon had it at the time) for the <a href="https://www.minix3.org">Minix operating system</a>. Minix is a Unix-like operating system that Andrew S. Tanenbaum created to teach his class on operating systems, and that he published in the book <a href="https://www.minix3.org/doc/">&ldquo;Operating Systems: Design &amp; Implementation&rdquo;</a>.</p>
<p>Minix uses a microkernel design, in which the kernel is responsible for a limited subset of system services—typically, process scheduling and inter-process communication (IPC) are all that is needed—and everything else runs as a process in &ldquo;user space&rdquo;, including device drivers, file systems, and virtual memory managers, in addition to the &ldquo;applications&rdquo; that you actually bought the computer to use. The typical alternative is the approach that Torvalds chose for Linux: a monolithic kernel, in which operating system services all run in the kernel, and user space processes provide applications.</p>
<p>Each design has its trade-offs. The kernel is a single, high-privilege space where any code running has very little restriction, so the microkernel approach reduces the &ldquo;blast radius&rdquo; of the security risk by strongly restricting the amount of code that runs in the kernel. Because all operating system services happen using IPC, a microkernel can further define the security controls in place in a running system by limiting which processes can communicate with which other processes—and it can do so dynamically, so that a process might be able to make some calls but not others, or make a call at one time that it cannot at another time.</p>
<p>However, all of this IPC comes at a cost, as any system call that an application makes might translate into multiple IPC communications, in which the calling process needs to rewrite its data to fit the interface format of the protocol with the receiving process, then tell the kernel to receive the message, which write the data into the receiving process&rsquo;s memory space and schedules that process to run. Additionally, microkernel designs run the risk of an <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-22980">&ldquo;upcall deadlock&rdquo;</a>, where the kernel cannot make progress because it is waiting on a user-space process that is blocked in a system call. As an example, imagine that an application needs to open a file, and the filesystem process encounters an error that it tries to write to the kernel&rsquo;s log—which is on the filesystem that encounters the error.</p>
<p>Conversely, the monolithic kernel design makes it easier for any kernel component to directly access any other kernel component: faster, harder to deadlock, but easier to create bugs in and easier to exploit. All those drivers running in the privileged kernel memory space, potentially from multiple vendors or other sources, introduce risks of potentially exploitable problems at the core of the operating system.</p>
<p>Tanenbaum and Torvalds famously had some heated discussions about the <a href="https://www.oreilly.com/openbook/opensources/book/appa.html">relative merits of each architecture</a>, which probably seemed important at the time but are less relevant these days as the microkernel design eventually won out in many contexts (consider mobile phone baseband environments and car management systems, which typically run microkernels like QNX or an L4 derivative), with a hybrid approach (Windows NT is a microkernel design that runs a lot of services in the kernel for performance, and XNU—macOS, iOS etc.—is a microkernel with a monolithic kernel grafted on, but that then runs a lot of secure services in out-of-kernel &ldquo;exclave&rdquo; environments) also being popular. At this point, the outlier is the one frequently-observed monolithic kernel design in the wild: Linux.</p>
<p>Anyway, back to that announcement. Torvalds explained that Linux was a hobby project, and &ldquo;won&rsquo;t be big and professional like GNU&rdquo;. Well, these days, Linux is at the core of most operating environments that use GNU software, to the point that they are called &ldquo;Linux distros&rdquo; no matter how much some people might like everyone to call them <a href="https://www.gnu.org/gnu/incorrect-quotation.html">&ldquo;GNU plus Linux&rdquo;</a>. So what gives?</p>
<p>The GNU project <a href="https://www.gnu.org/gnu/initial-announcement.html">started in 1984</a>—a full seven years before that Usenet announcement—as a small collection of tools under an umbrella project whose creator&rsquo;s aim was to offer a full replacement for a UNIX operating system that preserves and promotes the &ldquo;four freedoms&rdquo; of free software. Initially, those tools were the GNU Emacs text editor and the GNU C Compiler (later GNU Compiler Collection), both created by project leader Richard M Stallman. During the next few years, people contributed other components to the GNU system and built them in a way that meant they work on many different flavors of UNIX and UNIX-like operating systems, as well as less UNIX-like environments including the Amiga and Windows. However, the whole environment could not be free because there was no GNU kernel (the closest alternative being the BSD kernel, which had licensing restrictions that were interpreted as not freedom-respecting, and which was soon to become <a href="https://en.wikipedia.org/wiki/UNIX_System_Laboratories,_Inc._v._Berkeley_Software_Design,_Inc.">embroiled in a lawsuit with the original UNIX creators</a>, AT&amp;T).</p>
<p>The effort to create a kernel, known as <a href="https://landley.net/history/mirror/gnu/GNU-HURD-2.html">Trix</a>, was not close to ready. Eventually the GNU project entered into an agreement with Carnegie-Mellon University to use their Mach kernel (actually in May 1991, after Torvalds had begun work on Linux). Mach is found in operating systems you likely have not used including OSF/1 and NEXTSTEP, and operating systems you may well have used if you have been near the Apple galaxy since about 1997—or earlier, if you are one of the few people who used <a href="http://www.tenon.com/products/machten/">Tenon&rsquo;s MachTen</a> or <a href="https://www.mklinux.org">Apple&rsquo;s MkLinux</a>. Reigniting that debate about monoliths or microkernels, GNU Mach—the GNU project&rsquo;s own implementation of Mach 3, begun in 1997—operates as a microkernel that loads the <a href="https://www.gnu.org/software/hurd/">Hurd</a> (HIRD of UNIX-Replacing Daemons, where HIRD stands for HURD of Interfaces Representing Depth, where HURD…you get the idea). Immediately snuffing the debate back out, GNU plus Linux is used and useful, where GNU (including the Hurd) has been perpetually &ldquo;nearly ready&rdquo; for the intervening decades, including several attempts to replatform the whole system on to a different microkernel (the L4 family of microkernels, Coyotos&rsquo; microkernel, and a new project called Viengoos <a href="https://www.gnu.org/software/hurd/history/port_to_another_microkernel.html">have all been candidates</a>).</p>
<p>Well, this is a nice story, but I am afraid it is out of date. At some point last year, GNU Hurd became relevant again, which long-time contributor Samuel Thibault <a href="https://mirror.as35701.net/video.fosdem.org/2026/k4201/7FZXHF-updates_on_gnuhurd_progress_rump_drivers_64bit_smp_software_bootstrapping.mp4">explained to a packed room at the FOSDEM conference</a> earlier this year. A port of the Rust compiler greatly increased the amount of application software available. A 64-bit port of GNU Mach and GNU MIG (the Mach Interface Generator, the interface description language that describes the data structures Mach processes use for IPC) is complete, so the OS can take advantage of modern processors and large amounts of system memory. When I say &ldquo;modern processors&rdquo;, x86_64 support is mostly ready, and AArch64 (64-bit ARM) is experimental.</p>
<p>By running a <a href="https://archive.fosdem.org/2022/schedule/event/dzammit/attachments/slides/4850/export/events/attachments/dzammit/slides/4850/rump_hurd_talk.pdf">&ldquo;rump&rdquo; NetBSD kernel in user-space</a>, Mach gets modern networking, USB, and other drivers so that it can actually run on computers that contain those modern processors. Long-dormant multiprocessor code (CMU Mach was originally designed for supercomputers, which were envisioned at the time as symmetric multiprocessing systems) has been rewritten, so that GNU Mach is now multicore, albeit with most Hurd processes still residing on a single core while the team audits their parallelism safety. Journaling filesystems are nearly ready.</p>
<p>So complete is GNU Mach and GNU Hurd, that the <a href="https://guix.gnu.org">GNU Guix system</a> offers it as an alternative kernel choice in the installer, if you do not want to use the Linux-libre default kernel. There has been a <a href="https://www.debian.org/ports/hurd/">Debian GNU/Hurd distribution</a> for donkey&rsquo;s years. It may have been April Fool&rsquo;s when Gentoo announced that <a href="https://www.gentoo.org/news/2026/04/01/gentoo-hurd.html">they were switching to the Hurd</a>, but the availability of scripts and a virtual machine image with running Gentoo/Hurd was no joke. Your author is running it now, with this repository checked out in git and the GNU emacs editor making some final corrections to this article.</p>
<p>Today, GNU is fully usable, it is just not big and professional like GNU plus Linux. Some of the ideas that had to be bolted on to Linux to make it &ldquo;big and professional&rdquo; are native parts of the design when you use GNU Mach and the Hurd. Making isolated environments like the <a href="https://podman.io">podman</a> containers we use to create and publish &ldquo;De Programmatica Ipsum&rdquo; requires an unholy amalgam of cgroups, namespaces, and other features that Linux has sprouted over time. In a Hurd system, you just define and launch a <a href="https://www.gnu.org/software/hurd/hurd/subhurd.html">subhurd</a>: an independent set of the UNIX-replacing daemons that has limited access to the host HURD&rsquo;s capabilities. GNU Guix also offers the intriguing possibility of the <a href="https://guix.gnu.org/manual/devel/en/html_node/Virtualization-Services.html#Childhurd">&ldquo;childhurd&rdquo;</a>—a Hurd environment you define and run in your Linux-based Guix environment.</p>
<p>If your idea of the Hurd is that it was a nice idea once upon a time that never came to anything, I would recommend revisiting it now. You will be pleasantly surprised.</p>
<p>Cover photo by <a href="https://unsplash.com/@pixbyhelena?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Helena Pfisterer</a> on <a href="https://unsplash.com/photos/a-herd-of-wildebeest-running-across-a-dry-grass-field-xSbyDPqSZ-c?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>.</p>
]]></content:encoded></item><item><title>Overchoice In The New Non-Aligned World</title><link>https://deprogrammaticaipsum.com/overchoice-in-the-new-non-aligned-world/</link><pubDate>Mon, 04 May 2026 05:02:01 +0200</pubDate><guid>https://deprogrammaticaipsum.com/overchoice-in-the-new-non-aligned-world/</guid><description><![CDATA[ <p>The <a href="https://en.wikipedia.org/wiki/Non-Aligned_Movement">Non-Aligned Movement</a> was born in 1961, during the most dramatic period of the Cold War, in opposition to the nuclear escalation threats between NATO and the Warsaw Pact. Countries from what it is now known as the &ldquo;Global South&rdquo; got together to figure out ways to help each other in a period of great turmoil.</p>]]></description><content:encoded><![CDATA[ <p>The <a href="https://en.wikipedia.org/wiki/Non-Aligned_Movement">Non-Aligned Movement</a> was born in 1961, during the most dramatic period of the Cold War, in opposition to the nuclear escalation threats between NATO and the Warsaw Pact. Countries from what it is now known as the &ldquo;Global South&rdquo; got together to figure out ways to help each other in a period of great turmoil.</p>
<p>Similar to those days of yore, &ldquo;dramatic&rdquo; is quite an appropriate word to describe the times we are living in; we are very far away from &ldquo;the end of history&rdquo; thesis <a href="https://en.wikipedia.org/wiki/The_End_of_History_and_the_Last_Man">proposed</a> by Francis Fukuyama between 1989 and 1992. In our nerd minds, the sense of dread is accelerated by the fact that no dystopian sci-fi author ever came up with a scenario like the one we are doomscrolling on our devices every morning. The future used to look like flying cars and teleportation to Mars; instead, we had a fascist comeback streamed live over TikTok.</p>
<p>It is in such historical context that, while we were busy preparing this very text, the French government <a href="https://www.zdnet.com/article/france-leaves-windows-for-linux-desktop/">announced plans</a> to migrate an as-of-yet unknown number of computer desktops from Windows to Linux. Big tech, an admittedly US-based contraption, has turned against old allies and made Google&rsquo;s old &ldquo;don&rsquo;t be evil&rdquo; mantra a forgotten memory from a bygone era.</p>
<p>Linux becomes, as a matter of fact, the &ldquo;non-aligned&rdquo; option of operating systems, in stark opposition to the cold war represented by the duopoly of Windows and (admittedly, to a lesser extent) macOS. (We have already talked about the mobile duopoly in a <a href="/on-the-duopoly-of-mobile/">previous article</a>, a market in which Linux is present in a different yet very strong way.)</p>
<p>The French decision, albeit late, is wise, commendable, and reasonable. If there is one thing we should learn for the current times, is that we cannot trust anymore in the desires and values of a psychotic government. And this includes operating systems, software, SaaS offerings, or whatever comes from the other side of the Atlantic.</p>
<p>(As a Swiss citizen, I would love to see my government follow the same path as France in this respect, but Switzerland has a track record of siding with the wrong side of history in order to maintain their beloved neutrality, so I am not holding my breath at this point.)</p>
<p>The problem is that, as far as options go, Linux is a terrible third one.</p>
<p>Do not get me wrong; I am a very happy Fedora Linux user, and I am using it at this very moment to write the lines you are reading. But I work in IT, and I am willing to put up with the myriad shenanigans Linux brings upon users. The work that French IT administrators is about to start is pharaonic, and I am not mincing my words.</p>
<p>Why do I say that Linux is a terrible option? Because of <a href="https://en.wikipedia.org/wiki/Overchoice">overchoice</a>, and because we are all very tired indeed.</p>
<p>Overchoice is a psychological factor with quite a history. First explained by <a href="https://en.wikipedia.org/wiki/Alvin_Toffler">Alvin Toffler</a> in his 1970 book <a href="https://en.wikipedia.org/wiki/Future_Shock">&ldquo;Future Shock&rdquo;</a>, and then popularized as &ldquo;The Paradox of Choice&rdquo; by the <a href="https://en.wikipedia.org/wiki/The_Paradox_of_Choice">2004 book of the same name</a>, it is an intuitive part of our current world.</p>
<p>Here is a fun observation; one of the biggest criticisms that communism has received across the ages is that of lack of choice. Common was the mockery between the spartan looks of a Soviet grocery store, offering a very limited set of products (if any), with the overabundance of American supermarkets, created thanks to the forces of the &ldquo;free market&rdquo; that should never be stopped.</p>
<p>Yet, in the computing world, one of the most striking byproducts of capitalism, we have at most two versions of Windows (&ldquo;Pro&rdquo; and &ldquo;Home&rdquo;) and just one of macOS (remember when there was a <a href="https://en.wikipedia.org/wiki/Mac_OS_X_Server">&ldquo;Server&rdquo;</a> version thereof?)</p>
<p>Readers well-versed in the history of Apple will surely remember Steve Jobs&rsquo; matrix of products when he returned to save the company from bankruptcy in 1997, drastically reducing the amount of products offered by the company to just four: two laptops and two desktops, one of each for &ldquo;home&rdquo; and &ldquo;pro&rdquo; users. Somehow, solving the paradox of choice was exactly what Apple needed to become the most valuable company on Earth merely 20 years later.</p>
<p>On the non-aligned side of things, and against all market logic, the Linux galaxy, itself, is a realm with a myriad choices. Maybe too much?</p>
<p>First of all, let us bring some terminology first. Nobody installs just &ldquo;Linux&rdquo; <em>per se</em>. What users install on their laptops are &ldquo;Linux distributions&rdquo;, also known as &ldquo;distros&rdquo; in the jargon and slang of this fringe realm. Longtime Linux expert <a href="/michael-kerrisk/">Michael Kerrisk</a> explains distributions much better that I could:</p>
<blockquote>
<p>Precisely speaking, the term Linux refers just to the kernel developed by Linus Torvalds and others. However, the term Linux is commonly used to mean the kernel, plus a wide range of other software (tools and libraries) that together make a complete operating system. In the very early days of Linux, the user was required to assemble all of this software, create a file system, and correctly place and configure all of the software on that file system. This demanded considerable time and expertise. As a result, a market opened for Linux distributors, who created packages (distributions) to automate most of the installation process, creating a file system and installing the kernel and other required software. <br>
<br>
The earliest distributions appeared in 1992, and included MCC Interim Linux (Manchester Computing Centre, UK), TAMU (Texas A&amp;M University), and SLS (SoftLanding Linux System). The oldest surviving commercial distribution, Slackware, appeared in 1993. The noncommercial Debian distribution appeared at around the same time, and SUSE and Red Hat soon followed. The currently very popular Ubuntu distribution first appeared in 2004. Nowadays, many distribution companies also employ programmers who actively contribute to existing free software projects or initiate new projects.</p>
</blockquote>
<p>So a &ldquo;Linux distribution&rdquo; is just a wonderful thing composed of a myriad different software thingies, forming what most users would end up calling an &ldquo;operating system&rdquo;. And just how many different thingies could be distributed this way? Hang on tight little tomato, this is going to be quite a ride.</p>
<ul>
<li>Some distributions are &ldquo;free as in beer and free as in freedom&rdquo;, in which case support means talking to fanatic users on a Discord forum telling each other to RTFM. On the other hand, some other distros actually cost money, in exchange for actual support, maybe even a 0-800 phone number to call when in despair, better compatibility with a variety of hardware, or some other warm feeling for you to feel inside. This latter case is usually preferred by businesses, for reasons that should be obvious by now.</li>
<li>Some distributions are explicitly designed for beginners, others for more advanced users (the definition of which is always vague), or for specific use cases like conducting business, playing games, writing software, <em>und so weiter</em>.</li>
<li>Some distros have specific hardware targets: some work fine on a standard laptop, while others work better on dedicated workstations, or maybe on servers, or even supercomputers, mainframes, or some embedded system NASA ships inside a probe to Mars.</li>
<li>Some are easier to install that others: some might include a graphical &ldquo;wizard&rdquo; interface, while others… well, I hope you enjoy typing on your keyboard.</li>
<li>Some are already localized for specific countries, which is something some users might prefer (or be forced to use). Most notably come to mind the ones from <a href="https://en.wikipedia.org/wiki/Red_Star_OS">North Korea</a>, <a href="https://www.deepin.org/index/en">China</a>, <a href="https://www.extix.se/">Sweden</a>, <a href="https://www.pardus.org.tr/">Turkey</a>, <a href="https://peropesis.org/">Lithuania</a>, <a href="https://redcorelinux.org/">Romania</a>, <a href="https://mxlinux.org/">Greece</a>, <a href="https://www.kumander.org/">Philippines</a>, <a href="https://blendos.co/">Colombia</a>, <a href="https://www.linuxliteos.com/">New Zealand</a>, <a href="https://www.modiciaos.cloud/">Italy</a>, <a href="https://www.winux.is/">Brazil</a>, and of course <a href="http://www.ututo.org/">Argentina</a>.</li>
<li>Then there are the <a href="https://en.wikipedia.org/wiki/List_of_Linux-supported_computer_architectures">CPU architectures supported</a>, for an outstanding variety of computers out there… even though if most humans are running on some &ldquo;86&rdquo;-compatible thing. Of such variety, each distribution <a href="%5Bpicks%5D(https://help.ubuntu.com/community/SupportedArchitectures)">picks</a> their own preferred targets, changing their mind as years go by.</li>
</ul>
<p>And then come the esoteric parameters that make or destroy distributions:</p>
<ul>
<li>The Kernel (the what?): the official from kernel.org, or the one from Linux-libre, Illumos, GNU Hurd, Haiku…</li>
<li>Rolling release or not?</li>
<li>Able to run <a href="https://www.winehq.org/">Windows</a> and/or <a href="https://www.darlinghq.org/">Mac</a> apps, or not?</li>
<li>&ldquo;Non-free&rdquo; packages and drivers, available or not?</li>
<li>File system: ZFS, FAT, ext, Btrfs, XFS…?</li>
<li>Init system: runit, systemd, sysvinit, OpenRC…?</li>
<li>Window system &amp; protocol: X or Wayland? (Whatever those things are, they will restrict your ability to run some of your preferred software. You have been warned.)</li>
<li>Package manager: <a href="https://en.wikipedia.org/wiki/APT_(software)">APT</a>, <a href="https://rpm.org/">RPM</a>, <code>apk</code>, <code>pacman</code>, <a href="https://pacstall.dev/"><code>pacstall</code></a>, <a href="https://brew.sh/">Homebrew</a>, <code>flatpak</code>, <code>snap</code>…</li>
<li>C standard library: <a href="https://www.gnu.org/software/libc/">glibc</a>, <a href="https://musl.libc.org/">musl</a>, <a href="https://www.uclibc.org/">µClibc</a>, <a href="https://uclibc-ng.org/">µClibc-ng</a>, <a href="https://en.wikipedia.org/wiki/Klibc">klibc</a>, <a href="https://www.sourceware.org/newlib/">Newlib</a>, <a href="http://www.eglibc.org/home">EGLIBC</a>, <a href="https://www.fefe.de/dietlibc/">diet libc</a>, <a href="https://en.wikipedia.org/wiki/Bionic_(software)">Bionic</a>…</li>
<li>Desktop environment (inhale deeply): <a href="https://www.gnome.org/">GNOME</a>, <a href="https://kde.org/">KDE</a>, <a href="https://en.wikipedia.org/wiki/LXDE">LXDE</a>, <a href="https://xfce.org/">Xfce</a>, <a href="https://en.wikipedia.org/wiki/Common_Desktop_Environment">CDE</a>, <a href="https://herbstluftwm.org/">herbstluftwm</a>, <a href="https://i3wm.org/">i3</a>, <a href="https://github.com/baskerville/bspwm">bspwm</a>, <a href="https://www.enlightenment.org/">Enlightenment</a>, <a href="https://swaywm.org/">Sway</a>, <a href="https://en.wikipedia.org/wiki/Cinnamon_(desktop_environment)">Cinnamon</a>, <a href="https://fluxbox.org/">Fluxbox</a>, <a href="https://mate-desktop.org/">MATE</a>, <a href="https://joewing.net/projects/jwm/">JWM</a>, <a href="https://qtile.org/">Qtile</a>, <a href="https://en.wikipedia.org/wiki/Openbox">Openbox</a>, <a href="https://en.wikipedia.org/wiki/Blackbox">Blackbox</a>, <a href="https://www.ctwm.org/index.html">Claude&rsquo;s Tab Window Manager</a>, <a href="https://fastestcode.org/">EMWM</a>, <a href="https://github.com/NsCDE/NsCDE">NsCDE</a>, <a href="https://www.fvwm.org/">FVWM</a>, <a href="https://system76.com/cosmic/">COSMIC</a>, <a href="https://en.wikipedia.org/wiki/Olwm">olwm</a>, <a href="https://en.wikipedia.org/wiki/OpenWindows">OpenWindows</a>, <a href="https://en.wikipedia.org/wiki/Java_Desktop_System">Java Desktop System</a>, <a href="https://en.wikipedia.org/wiki/NeWS">NeWS</a>…</li>
</ul>
<p>(Takes a deep breath, shakes his head, keeps writing.)</p>
<p>Imagine going to a McDonald&rsquo;s (another pillar of our capitalist world) and similarly being asked a myriad of questions before ordering a Happy Meal. You would run away in despair; yet, this is the reality of the Linux galaxy, where for better or worse, choice is king.</p>
<p>So much for <a href="https://www.theregister.com/2000/07/31/ms_ballmer_linux_is_communism/">communism</a>, am I right Steve?</p>
<p>The reality is that most users in 2026 compute very happily with a relatively recent 64-bit Intel-based laptop, with 8 or 16 GB of RAM and a 512 GB hard disk, probably formatted with Btrfs, bundled with the GNOME or KDE desktop environment on Wayland, using systemd, consuming software from either the APT or RPM package managers, including Flatpak for a more end-user-friendly interface to install userland applications, and with LibreOffice and Firefox pre-installed, thank you so much. And that means in general <a href="https://ubuntu.com/">Ubuntu</a> (or any of its variants, like <a href="https://zorin.com/os/pro/">Zorin OS</a>) or <a href="https://fedoraproject.org/">Fedora</a> (for slightly more advanced users).</p>
<p>If you are into building containers, we cannot recommend <a href="https://www.alpinelinux.org/">Alpine</a> too much.</p>
<p>And if you are a really, really, really advanced user, particularly of the paranoid kind, some mix of <a href="https://archlinux.org/">Arch</a> or <a href="https://www.qubes-os.org/">Qubes OS</a> will do just fine. We have mentioned the latter in a previous article about <a href="/joanna-rutkowska/">Joanna Rutkowska</a>:</p>
<blockquote>
<p>She is also the founder and main developer behind Qubes OS, described as a &ldquo;reasonably secure operating system&rdquo;, and praised by none less than Edward Snowden himself.</p>
</blockquote>
<p>Finally, for the French government officials reading these lines in quest of enlightenment, you might want to consider using <a href="https://www.suse.com/">SUSE</a>, <a href="https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux">RHEL</a>, or even some business-friendly versions of Ubuntu. (Disclaimer: I am currently working for the company that makes RHEL and Fedora.)</p>
<p>There you go, I have just solved your Linux overchoice in a couple of paragraphs. <a href="/contribute/">You are welcome.</a> If all else fails, you can even test individual distros directly <a href="https://distrosea.com/">from the comfort of your browser</a>, no need to install anything on your laptop.</p>
<p>Cover photo by <a href="https://unsplash.com/@cdd20?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">愚木混株 Yumu</a> on <a href="https://unsplash.com/photos/a-group-of-red-arrows-on-a-black-surface-HQH-GOZ6K2c?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>.</p>
]]></content:encoded></item><item><title>Hannu Puttonen</title><link>https://deprogrammaticaipsum.com/hannu-puttonen/</link><pubDate>Mon, 04 May 2026 05:01:01 +0200</pubDate><guid>https://deprogrammaticaipsum.com/hannu-puttonen/</guid><description> &lt;p>Paraphrasing Apple and their &lt;a href="https://en.wikipedia.org/wiki/Think_different">famous advertising campaign&lt;/a>, we can safely say that Finnish movie director Hannu Puttonen (1960–2023) was very interested in the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square holes. The ones who see things differently. He made a living telling their stories: those of fringe characters, edgy culture movements, and radical artistic outsiders. And that is why, in 2001, he directed the first documentary ever made about Linux, because if you think carefully about it, its story can be seen as a savant mixture of those three attributes.&lt;/p></description><content:encoded><![CDATA[ <p>Paraphrasing Apple and their <a href="https://en.wikipedia.org/wiki/Think_different">famous advertising campaign</a>, we can safely say that Finnish movie director Hannu Puttonen (1960–2023) was very interested in the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square holes. The ones who see things differently. He made a living telling their stories: those of fringe characters, edgy culture movements, and radical artistic outsiders. And that is why, in 2001, he directed the first documentary ever made about Linux, because if you think carefully about it, its story can be seen as a savant mixture of those three attributes.</p>
<p>Hannu Puttonen followed his gut instincts, and directed <a href="https://www.imdb.com/title/tt0410339/">&ldquo;Mr. Bragg Goes to Moscow&rdquo;</a> (1988), his first documentary, in which followed British songwriter and left-wing activist <a href="https://en.wikipedia.org/wiki/Billy_Bragg">Billy Bragg</a> on a concert tour of the Soviet Union during the Perestroika era. Because of course, <a href="https://www.youtube.com/watch?v=Q8v5dYH0IiQ">why not</a>. In the same vein, came later <a href="https://www.imdb.com/title/tt0233381/">&ldquo;Bring the Beat Back!&rdquo;</a> (1992), one of the earliest documentaries to pay attention to the burgeoning techno scene, featuring pioneers like Bill Drummond (from <a href="https://en.wikipedia.org/wiki/The_KLF">The KLF</a>) and Richard H. Kirk (from <a href="https://en.wikipedia.org/wiki/Cabaret_Voltaire_(band)">Cabaret Voltaire</a>). This documentary was released well before Prodigy, Daft Punk, or Moby made electronica mainstream. Or last but definitely not least, <a href="https://www.imdb.com/title/tt0410330/">&ldquo;Momus Man of Letters&rdquo;</a> (1994), an experimental documentary about the eccentric Scottish musician Nicholas Currie, aka <a href="https://en.wikipedia.org/wiki/Momus_(musician)">Momus</a>, featuring appearances by Jarvis Cocker of British britpop legend <a href="https://en.wikipedia.org/wiki/Pulp_(band)">Pulp</a>.</p>
<p>Still reading? If any of the names in the previous paragraph rang any bell in you without having to click to read their Wikipedia entries, it means that you are, just like the author of this article, a proud member of Generation X.</p>
<p>Hannu Puttonen was, then, the perfect filmmaker for the first documentary about Linux, and as explained above, not only because he was Finnish like Linus Torvalds himself. So came to be <a href="https://www.imdb.com/title/tt0315417/">&ldquo;The Code&rdquo;</a> (2001), a very fittingly hour-long documentary that we have decided to feature as this months&rsquo; Vidéothèque entry.</p>
<p>By the time Puttonen interviewed Linus, the Kernel (in uppercase, please) was barely a decade old, and yet it was gently starting to stir the pot of technology economics. For the sake of narration, the early story of the Kernel is then split in three major sections: birth, philosophy, and economics.</p>
<p>First and foremost, Linux was born a true hobby project. We all know that by now. But back in 1991, having an operating system developed via the collaboration of developers (or <a href="http://www.youtube.com/watch?v=zPt_e9Cdk08&amp;t=244">&ldquo;worker ants&rdquo;</a>) spread all over the world was unprecedented, radically subversive, and fascinating. Of course, the documentary explains around <a href="http://www.youtube.com/watch?v=zPt_e9Cdk08&amp;t=421">minute seven</a> that &ldquo;Linux&rdquo; the kernel is not the same as &ldquo;Linux&rdquo; the operating system.</p>
<p>Then comes the philosophy. As I wrote in a <a href="/open-always-wins/">previous article</a> of this magazine,</p>
<blockquote>
<p>Everything changed in 1998. That is when Christine Peterson coined the phrase &ldquo;Open Source,&rdquo; deliberately masking the business-unfriendly moniker of &ldquo;Free Software&rdquo; which Wall Street abhored so much. More or less at the same time, Netscape decided to rewrite its own product. Such wise decision, widely celebrated by the &ldquo;community&rdquo; helped Microsoft win the infamous browser wars; this situation ultimately begat Internet Explorer 6 and its horrible crush on web development for the next decade.</p>
</blockquote>
<p>Richard Stallman has spent countless hours for the past 30 years explaining people that Free Software ≠ Open Source, but few people are paying attention. This, also, is explained in the documentary.</p>
<p>Microsoft took notice and decided to attack the whole concept. Hence the final part of &ldquo;The Code&rdquo;, telling us about the economics and dynamics of the Linux Kernel project. From Torvalds&rsquo; &ldquo;Benevolent Dictator&rdquo; status, to the &ldquo;dot com boom&rdquo; of the late 1990s, and even showing an interview of Bob Young, one of the founders of Red Hat around <a href="http://www.youtube.com/watch?v=zPt_e9Cdk08&amp;t=2292">minute 38</a>. It all ends with a nice bow, predicting the impact of Linux in emerging markets and its impact in software intellectual property, a never ending issue, around <a href="http://www.youtube.com/watch?v=zPt_e9Cdk08&amp;t=2906">minute 48</a>.</p>
<p>Oh, and our preferred quote, from legendary Kernel maintainer <a href="https://en.wikipedia.org/wiki/Alan_Cox_(computer_programmer)">Alan Cox</a> around <a href="https://www.youtube.com/watch?v=zPt_e9Cdk08&amp;t=1448s">minute 24</a>:</p>
<blockquote>
<p>To me code has more in common with for example poetry or some kinds of writing. The beauty of it is in the structure, in putting ideas across one at a time in a clear way. So a good piece of code you read without comments and it&rsquo;s immediately obvious why it&rsquo;s been written, how it&rsquo;s elegant. So you&rsquo;re looking for code which is both clean and elegant. But also doesn&rsquo;t rely on clever programming tricks, doesn&rsquo;t make assumptions which may not be true in the future. Because the last thing we want to do is having much code in the Linux kernel which requires large amounts of effort to keep it working. We want code which will just continue to work, and work forever.</p>
</blockquote>
<p>This film having been released in 2001, no mentions <del>can</del> should be found therein about &ldquo;The Cloud&rdquo;, Android, <a href="/shipping-your-computer/">containers</a>, Kubernetes, NASA&rsquo;s <a href="https://en.wikipedia.org/wiki/Ingenuity_(helicopter)">Ingenuity</a>, Valve&rsquo;s <a href="https://en.wikipedia.org/wiki/SteamOS">Steam Deck</a>, <a href="https://arstechnica.com/cars/2024/04/linux-is-now-an-option-for-safety-minded-software-defined-vehicle-developers/">cars</a>, or other interesting things people have built upon Linux during the first quarter of the 21st century. On the other hand, TiVo was around at the time of the release of this film, it was already using Linux, and not without <a href="https://en.wikipedia.org/wiki/Tivoization">controversy</a>.</p>
<p>Internet wisdom usually advocates for <em>not reading comments</em>, but I feel the need to reproduce one from YouTube user <a href="https://www.youtube.com/@Thepilgrimingtrinh">Peter Trinh</a>, which faithfully conveyed the spirit of the documentary, resonating ideas around a &ldquo;decentralized economic systems based on mutual aid and voluntary cooperation&rdquo; we talked about <a href="/the-conquest-of-code/">in a previous article</a>:</p>
<blockquote>
<p>I just saw this documentary. I really enjoyed it. I loved the passion and beliefs of people that showed through. This is the kind of stuff that enamored me to computers and Linux in the first place. A sort of innocence, curiousity, and a deep desire to do something good, and doing the work for a vague something-something that is larger than us. So much that we would be willing to do this lovingly as a hobby. I really miss the days like this when we could share this together, even across distances and mindsets.</p>
</blockquote>
<p>There is nothing preventing us from bringing those days and those feelings back into fashion, other than our own will, that is.</p>
<p>Watch this month&rsquo;s Vidéothèque entry, &ldquo;The Code&rdquo; (2001), by Hannu Puttonen, <a href="https://www.youtube.com/watch?v=zPt_e9Cdk08">on YouTube</a>.</p>
<p>(Oh, and if you are fluent in Finnish and cannot get enough computer history in your system, we can recommend watching the <a href="https://www.youtube.com/watch?v=Pd3P-68at9E">launch</a> of Linux 1.0 on March 30th, 1994, by Linus Torvalds himself. You are most welcome.)</p>
<p>Cover snapshot chosen by the author.</p>
]]></content:encoded></item></channel></rss>