<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>off the grid</title><id>https://ingrids.space/</id><updated>2025-06-17T00:00:00+00:00</updated><author><name>ingrid</name><email>blog@ingrids.email</email><uri>https://ingrids.space/</uri></author><link href="https://ingrids.space/" rel="alternate" type="text/html"/><link href="https://ingrids.space/index.xml" rel="self" type="application/atom+xml"/><entry><title>What Google Translate Can Tell Us About Vibecoding</title><id>https://ingrids.space/posts/what-google-translate-can-tell-us-about-vibecoding/</id><updated>2025-06-17T00:00:00+00:00</updated><link href="https://ingrids.space/posts/what-google-translate-can-tell-us-about-vibecoding/" rel="alternate" type="text/html"/><published>2025-06-17T00:00:00+00:00</published><content type="html">&lt;p&gt;There has been rather a lot of doomsaying (and perhaps astroturfing) lately about LLMs as the end of computer programming. Much of the discussion has been lacking nuance, so I’d like to add mine. I see claims from one side that “I used &lt;code&gt;$LLM_SERVICE_PROVIDER&lt;/code&gt; to make a small throwaway tool, so all programmers will be unemployed in &lt;code&gt;$ARBITRARY_TIME_WINDOW&lt;/code&gt;”, and from the other side flat-out rejections of the idea that this type of tool can have any utility.&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; I think it best sheds light on these claims to examine them in the context of another field that’s been ahead of the curve on this: translation.&lt;/p&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;/sup&gt;
&lt;p&gt;It is reasonable to say that the tools have limited utility though, and that the utility is outweighed by their negative externalities.&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;Google translate has been around for a while, and has gone through some technological iterations; I’m most interested in discussing its recent incarnations since the switch to &lt;a href=&quot;https://arxiv.org/abs/1609.08144&quot;&gt;neural machine translation&lt;/a&gt; in 2016. Over the years I’ve heard much made about how this is the end of translation and interpretation as professions. I suspect the people who say such things have never actually worked with translator or interpreter. The emblematic example I’ve encountered is “I went on holiday to Japan and we used Google Translate everywhere, there’s no need to hire an interpreter or learn Japanese anymore”. While this undoubtedly speaks for the usefulness of current machine translation technology, the second half of the sentence calls for some scrutiny, particularly “anymore”. I feel confident in asserting that people who say this would not have hired a translator or learned Japanese in a world without Google Translate; they’d have either not gone to Japan at all, or gone anyway and been clueless foreigners as tourists are wont to do.&lt;/p&gt;
&lt;p&gt;Indeed it turns out &lt;a href=&quot;https://www.npr.org/sections/planet-money/2024/06/18/g-s1-4461/if-ai-is-so-good-why-are-there-still-so-many-jobs-for-translators&quot;&gt;the number of available job opportunities for translators and interpreters has actually been increasing&lt;/a&gt;. This is not to say that the technology isn’t good, I think it’s pretty close to as good as it can be at what it does. It’s also not to say that machine translation hasn’t changed the profession of translation: in the article linked above, Bridget Hylak, a representative from the American Translators Association, is quoted as saying “Since the advent of neural machine translation (NMT) around 2016, which marked a significant improvement over traditional machine translation like Google Translate, we [translators and interpreters] have been integrating AI into our workflows.”&lt;/p&gt;
&lt;p&gt;To explain this apparent contradiction, we need to understand what it is translators actually do because, like us programmers, they suffer from having the nature of their work consistently misunderstood by non-translators. The laity’s image of a translator is a walking dictionary and grammar reference, who substitutes words and and grammatical structures from one language to another with ease, the reality is that a translators’ and interpreters’ work is mostly about ensuring context, navigating ambiguity, and handling cultural sensitivity. This is what Google Translate cannot currently do.&lt;/p&gt;
&lt;p&gt;To give a simple example, Norwegian is an extremely closely related language to English and should be an easy translation candidate. The languages share a tonne of cognates, very similar grammar, and similar cultural context; even the idioms tend to translate verbatim. Yet there remain important cultural differences, and a particularly friction-prone one is Norwegian’s lack of polite language. It’s technically possible to say please in Norwegian (vær så snill, or vennligst), but Norwegians tend to prefer blunt communication, and these are not used much in practice. At the dinner table a Norwegian is likely to say something like “Jeg vil ha potetene” (literally “I will have the potatoes”, which sounds presumptuous and haughty in English) where a brit might say “Could I please have some potatoes?”. A good interpreter would have the necessary context for this (or ask for clarification if they’re not sure) and provide a sensitive translation, Google Translate just gives the blunt direct translation. You can probably work past such misunderstandings at dinner with your foreign in-laws (and people do), but it should be apparent why it’s inadvisable to &lt;a href=&quot;https://web.archive.org/web/20170811181816/http://www.businessinsider.com/teesside-magistrates-court-forced-to-rely-on-google-translate-because-it-had-no-interpreter-2017-8&quot;&gt;subsititute Google Translate for an interpreter at a court hearing&lt;/a&gt;. And Norwegian is an easy case. Returning to our tourists, Japanese has wildly different grammar to English, including things like omitting subjects from sentences where it’s apparent from context. In many of these cases you can’t construct a grammatical English sentence without a subject, so Google translate will make one up. Would you be comfortable with a computer inserting a made up subject into your sentence?&lt;/p&gt;
&lt;p&gt;All this is not to say Google Translate is doing a bad job. Were I given “Jeg vil ha potetene” with no context or ability to clarify and asked to translate it to English, I’d give the same answer. Maybe the person does want to be rude, how should I know? As a bilingual, I actually do make heavy use of Google Translate, but my use case isn’t “Here’s a block of text, translate it for me”. Instead I have more specific and subtle workflows like “I already know what I want to say, how to say it, and can navigate cultural nuance, but I’m not happy with my wording, I’d like to see the most statistically likely way someone else might phrase this” (A task language models really excel in, as it turns out). I suspect this is what Bridget Hylak meant when she said she has been integrating AI into her workflows (though I also suspect her tools and workflows are more sophisticated than mine).&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;2&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;2&lt;/sup&gt;
&lt;p&gt;Even though I’ve laid out this use case, I don’t intend to take this up in practice anytime soon. I don’t think it’s nearly a groundbreaking enough productivity gain to be worth ignoring the fraught ethical status of the current tools.&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;It’s a similar story for programming. I think it’s even fair to characterise us as translators, just from squishy humans that speak in ambiguity and cultural nuance, to computers that deal only in absolutes.&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#3&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; There’s the added complication that we create new abstractions a lot more aggressively in programming languages, and that’s probably why it took machine translation to programming languagues a little while to catch up to machine translation between natural languages, but Big Tech™ chucked all of open source into a wood chipper, and we’re there now.&lt;/p&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;3&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;3&lt;/sup&gt;
&lt;p&gt;I’ve met plenty of programmers who really seem to believe our main function is to pump out code, and that more code is better. I’d like to think having a code-barfing machine will show them the error in this, but unfortunately I expect a lot of them will continue to survive on pure organisational dysfunction.&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;For what it’s worth, I don’t think it’s inconceivable that some future form of AI could handle context and ambiguity as well as humans do, but I do think we’re at least one more AI winter away from that, especially considering that today’s AI moguls seem to have no capacity for nuance, and care more about their tools appearing slick and frictionless than providing responsible output.&lt;/p&gt;
</content></entry><entry><title>Orientalism - to Fetish and Back Again</title><id>https://ingrids.space/posts/orientalism-and-you/</id><updated>2022-11-02T00:00:00+00:00</updated><link href="https://ingrids.space/posts/orientalism-and-you/" rel="alternate" type="text/html"/><published>2022-11-02T00:00:00+00:00</published><content type="html">&lt;blockquote&gt;
&lt;p&gt;The Orient and Islam have a kind of extrareal, phenomenologically reduced status that puts them out of reach of everyone except the Western expert. From the beginning of Western speculation about the Orient, the one thing the Orient could not do was to represent itself. Evidence of the Orient was credible only after it had passed through and been made firm by the refining fire of the Orientalist’s work.&lt;/p&gt;
&lt;div class=&quot;attribution&quot;&gt;Edward Said, Orientalism&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;This isn’t really about yoga, but I’ve been invited to yoga classes a lot lately, and it makes my skin crawl. In trying to explain to my friends why I felt this way, I landed on a concept that captured the feeling evoked, while remaining broadly relatable: &lt;strong&gt;fetishisation&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For those with the good fortune of never having been fetishised, I’d like to take you on a journey. Imagine yourself as a mother, previously in a romantic partnership, but newly single. A friend you’ve known for years, but never been particularly close with, approaches you with an unsolicited romantic proposal. He launches into a flowery rave about how “beautiful” and “unappreciated” mothers’ bodies are, and how the “warm”, “caretaking” nature of a mother is a “great gift”.&lt;/p&gt;
&lt;p&gt;Shocked, and taken aback by this outburst, your mind flits through various snappy retorts; you have enough “caretaking” to do already without having to worry about some snotty man-child’s feelings. He made assumptions about your body and mind, despite never having experienced pregnancy and motherhood himself. He made assumptions about how you feel about the body he assumes you to have, how society feels about it. And he made assumptions about how you would feel about his assumedly “contrasting” feelings about your assumed body. Your better judgement kicks in though, and you decide it’s unwise to start a conflict over this, so you let him down as gently as you can, and perhaps have a conversation with him sometime later, after feelings have settled, to explain why this was shitty of him, and how you actually feel.&lt;/p&gt;
&lt;p&gt;Just as you start speaking though, he realises you aren’t going to accept his magnanimous proposal, and cuts you off. He calls you a stuck-up bitch, tells you he’s going to make all your mutual friends hate you, and that you’ll die alone like an ungrateful whore should. Well, that escalated quickly…&lt;/p&gt;
&lt;p&gt;What’s striking to me about stories like this is that the subject of discussion, in this case a mother, is stripped of any agency to define herself. Despite being purportedly exalted, she is in reality reduced to an object, a mere vessel for the ideas of the beholder.&lt;/p&gt;
&lt;p&gt;This is what I feel Europeans do when they talk about “yoga”.&lt;/p&gt;
&lt;p&gt;I am constantly told by citizens and the government of the country that has become my home, that the culture I come from is uncivilised and barbaric. I’m told that I must erase every part of that culture from myself, and overwrite it whole-cloth with theirs if I am to fit in to society here. I am told that our cultures are incompatible. Yet an aspect of “my” culture is seemingly everwhere here: yoga. When they talk about yoga, suddenly the choice of adjectives describing my culture turns from “uncivilised” and “barbaric” to “enlightened” and “spiritual”. Yet who defined yoga this way? Certainly not Indians. While the Europeans are busy chanting “Om” and saying “Namaste” as if it is a deep existential treatise rather than a simple greeting, the yoga they practise is one characterised entirely by themselves. It is divorced from its cultural origins, and my thoughts on it are not welcome.&lt;/p&gt;
&lt;p&gt;Just as the fetishist defines a mother by projecting his own desires onto her, failing to see her through his haze of conjurations, the orientalist defines yoga by projecting their desires onto it. They see only what they wish to, and fill in the gaps to match.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Fetish” has always been a word of sinister pedigree. Discursively promiscuous and theoretically suggestive, it has always been a word with a past, forever becoming “an embarassment” to disciplines in the human sciences which seek to contain and control its sense. Yet anthropologists of primitive religion, sociologists of political economy, psychiatrists of sexual deviance, philosophers of modernist aesthetics, have never ceased using the term, even as they testify to its conceptual doubtfulness and referential uncertainty. It seems this word’s usage is always somewhat “indiscriminate”, always threatening to slide, as in Merleau-Ponty’s tentative proposition, into an impossibly general theory. And yet it is precisely in the surprising history of this word as a comprehensive theoretical term indispensible to such crucial social thinkers as Comte, Marx, and Freud that the real inter-disciplinary interest of “fetish” lies.&lt;/p&gt;
&lt;div class=&quot;attribution&quot;&gt;William Pietz, The origin of fetishism&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;In truth, it’s curious that “fetishism” was the concept I reached for to explain all this. Perhaps we ought to explore where that term comes from. The term “fetish” originates from Portuguese explorers on the coast of West Africa in the sixteenth century, who described human made objects to which the Africans were said to have ascribed “undue” supernatural power and value. Oh, I guess we’re back at orientalism, isn’t that funny?&lt;/p&gt;
&lt;p&gt;The Africans go entirely unrepresented in this account, But I can only imagine them being amused at this fuss the Europeans made while ascribing supernatural value and power of their own to metal discs and wooden crosses. Unfortunately, recognising their folly doesn’t spare one having to dance to their tune, and dance we must.&lt;/p&gt;
</content></entry><entry><title>Linguistic Relativity and the Tyranny of the Compiler</title><id>https://ingrids.space/posts/tyranny-of-the-compiler/</id><updated>2022-01-17T00:00:00+00:00</updated><link href="https://ingrids.space/posts/tyranny-of-the-compiler/" rel="alternate" type="text/html"/><published>2022-01-17T00:00:00+00:00</published><content type="html">&lt;p&gt;The idea has been floating around in Linguistics for about a century, that language affects one’s thoughts. Known as &lt;a href=&quot;https://en.wikipedia.org/wiki/Linguistic_relativity&quot;&gt;linguistic relativity&lt;/a&gt;, aka the Sapir-Whorf hypothesis, this comes in two flavours: the strong version, where language &lt;em&gt;determines&lt;/em&gt; and &lt;em&gt;limits&lt;/em&gt; thought; and the weak version, where language only &lt;em&gt;influences&lt;/em&gt; thought.&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; For human languages, linguists largely agree that the strong version is false, and instead hold to the weak version.&lt;/p&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;/sup&gt;
&lt;p&gt;Perhaps this would be better conceived as a spectrum.&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;We can propose a mechanism to explain this starting from two premises: humans are capable of abstract thought in the absence of language, and are capable of modifying their languages. From these, we can conclude not only that the strong version is false, but that the relationship appears to flow in the other direction: one thinks an abstract thought, and modifies their language to express it. Thought determines language.&lt;/p&gt;
&lt;p&gt;To explain how the weak version might hold, we must introduce one more idea: language as a framework for thought. You see, abstract thinking is &lt;em&gt;hard&lt;/em&gt;, and humans usually avoid doing things that are hard when there’s another option. Language offers us a ready-made set of concepts (vocabulary), and systems for connecting them (grammar). Using language feels like building with Lego, where abstract thought can often feel like trying to mix and mould concrete in your living room.&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; Unless you care a lot about how you form or express a thought, you’ll likely default to the ready-made option, and this is where language influences your thoughts.&lt;/p&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;2&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;2&lt;/sup&gt;
&lt;p&gt;And concrete does indeed have more expressive power than lego.&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2&gt;Where does this leave us when considering programming languages?&lt;/h2&gt;
&lt;p&gt;Well, one of our premises has been compromised: capability to modify the language. While it is &lt;em&gt;technically&lt;/em&gt; possible to edit your compiler (or interpreter) on the fly, this is so out of reach for most programmers that it doesn’t even register as an option. Furthermore, even for those who do have sufficient domain knowledge and familiarity with their compiler’s source, it isn’t exactly a trivial task one would undertake on a whim. Compare this to natural human languages, where ordinary people without linguistics degrees modify their languages with such ease that they often don’t even realise they’re doing it.&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#3&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;3&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;3&lt;/sup&gt;
&lt;p&gt;If you don’t believe me on this point, consider how the dialects of English spoken around the world have grown apart over the past few hundred years. To how many of those differences could one ascribe conscious intent?&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2&gt;You only have your chains to lose&lt;/h2&gt;
&lt;p&gt;It doesn’t &lt;em&gt;need&lt;/em&gt; to be this way though, and I can almost see the LISPers throwing their macros at the screen at this point. And indeed, macros are a powerful tool, they let you define syntax on the fly, albeit still limited to the context of s-expressions.&lt;/p&gt;
&lt;p&gt;Yet the LISPs have more to offer. Due to their extremely small and easily-parseable syntax, interpreters for them are easy to write. So easy in fact, that &lt;a href=&quot;https://sarabander.github.io/sicp/&quot;&gt;a textbook aimed at first-year undergrads&lt;/a&gt; casually walks you through implementing interpreters and compilers from scratch.&lt;/p&gt;
&lt;h2&gt;Wait, maybe the chains weren’t such a bad idea&lt;/h2&gt;
&lt;p&gt;Once you’ve gone through the trouble of editing the compiler, you run into a problem. It turns out you have a compatibility nightmare on your hands. Compiling your own code goes just fine, but you can’t compile code from your friend who also edited her compiler, nor can she compile yours. Given how reliant we programmers are on the work of others, we need to reconcile this. We try to form a committee, but everyone disagrees, it devolves into a flame-war, and all ends in tears.&lt;/p&gt;
&lt;p&gt;And here we see how the proposed boon of LISP becomes its bane. Implementations are so easy to write that everyone and their cat wrote one, and we can’t seem to make any progress. It also often feels impossible to figure out which LISP to even use. Which dialect do you pick? Scheme? Common LISP? Guile? Racket? Clojure? Say you pick Scheme, which implementation? Chicken? Chez? Stalin? MIT? Bigloo? They all have their incompatibilities to boot. The situation with macros is fraught too, it’s painful to try to read someone else’s code when they change the syntax out from under you, to the point that some jest that LISPs are “write-only” languages.&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#4&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;4&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;4&lt;/sup&gt;
&lt;p&gt;I actually like LISP, please don’t kill me.&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;Compare this sorry state of affairs to natural languages, where modifications live or die by organic consensus. The gap is wide indeed. Perhaps it is unfair to compare programming languages to natural human languages though, as the former comprises a formal system for computation, and the latter a casual medium for ad-hoc communication. It may be that we are condemned to accept and use what is handed down to us from the ivory tower.&lt;/p&gt;
&lt;h2&gt;Aside: codified vs constructed languages&lt;/h2&gt;
&lt;p&gt;Here’s something that doesn’t sit right with me: the popular dichotomy between “natural” and “constructed” languages. The line is commonly drawn by saying that constructed languages are consciously devised, instead of naturally developed.&lt;/p&gt;
&lt;p&gt;This is an unconvincing distinction to me, because all language constructs originate as an idea in someone’s head, and I believe many of those in “natural” languages came about consciously. I know I am consciously selective of what language constructs I use, and how I break language norms. I’d also posit that many constructs of “constructed” languages and not devised consciously, but are rather blind-spots that the originator unknowingly borrows from languages they are already familiar with.&lt;/p&gt;
&lt;p&gt;One might also draw a distinction based on the number of people involved in creating a language, and when/whether changes to the language are made. This too is unconvincing to me, as many “constructed” languages develop iteratively, through many people. A good example is &lt;a href=&quot;https://tokipona.org/&quot;&gt;Toki Pona&lt;/a&gt;, whose original creator made a point of eschewing standardization, and recently compiled a reference of how the language is used in practice by its speakers. In the world of programming, one might also point out how C++ is an iteration on C, which itself iterated in B, and so on down the line to BCPL, CPL, etc. C++ Also borrows from languages it didn’t directly descend from, like Smalltalk and ML, just like natural languages.&lt;/p&gt;
&lt;p&gt;In my opinion, the more meaningful dichotomy can be drawn between “codified” and “natural” (or “ad-hoc”) languages, where the distinction is made on whether there is a codified standard of correctness applied to usage of the language. Notably, unlike the former dichotomy, this would classify languages like Standard English outside the realm of natural, while letting in things like Toki Pona.&lt;/p&gt;
&lt;p&gt;This provides a clarity on why programming languages can’t seem to behave like “natural” languages; to use them, one &lt;em&gt;needs&lt;/em&gt; codify them through the act of writing a compiler.&lt;/p&gt;
&lt;h2&gt;The actual takeaway: teaching and learning&lt;/h2&gt;
&lt;p&gt;This all seems a bit &lt;em&gt;academic&lt;/em&gt; so far, but I actually came to write all this because I wanted to tackle a practical difficulty. In talking to Informatics and IT students, I noticed one particular topic they all seemed to be failing to grok: first-class functions (or “lambdas”&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#5&quot;&gt;5&lt;/a&gt;&lt;/sup&gt; as they put it). The relevant common denominator, as it turns out, is that they were all taught through Java.&lt;/p&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;5&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;5&lt;/sup&gt;
&lt;p&gt;&lt;em&gt;technically&lt;/em&gt;*** the word lambda is conventionally used to refer specifically to anonymous functions, but who am I to prescribe language to anyone when I just wrote all this about linguistic relativity? I do want to make it clear though, that I’m talking about the concept of first-class functions, not just specifically the anonymous ones.&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;It could be that first-class functions are just a difficult idea to grasp (I have to admit, they were a bit mind-bendy when I first encountered the concept), but I don’t think that’s it, since these students managed to wrap their heads around things like interfaces and abstract classes just fine.&lt;/p&gt;
&lt;p&gt;I think the real reason becomes clear when you look at the syntax for functions in Java:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import java.util.function.Function;

// &quot;Normal&quot; way to define functions (well, methods)
class Incrementor {
    // I know this could be static, but I&apos;m trying
    // to represent typical Java method definition
    public int inc(int arg) {
        return arg + 1;
    }
}

public class Main {
    public static void main(String[] args) {
        // &quot;Normal&quot; way to use a method
        Incrementor incrementor = new Incrementor();
        incrementor.inc(1);

        // Defining a first-class function
        Function&amp;lt;Integer, Integer&amp;gt; inc = arg -&amp;gt; arg + 1;
        // Using a first-class function
        inc.apply(1);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Lua, for reference:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- &quot;Normal&quot; way to use functions
-- these are already first-class
function inc(arg)
    return arg + 1
end

-- anonymous function (which I immediately name...)
inc = function(arg)
    return arg + 1
end

-- applying either (it&apos;s the same)
inc(1)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;What’s immediately striking is how alien the two forms look compared to each other in Java. While that is indeed striking, and certainly doesn’t help a learner’s understanding, I think it’s only a secondary concern. To reach my larger concern, we need to consider what is going on in the student’s head.&lt;/p&gt;
&lt;p&gt;I’ve always viewed methods as a special case of functions, as I think most people would. Imagine, however, that you had never learned about the general concept of functions, but instead only methods. The students in question were flabbergasted when I presented the idea of a function outside the context of a class. Instead of conceiving of functions as abstractions over subroutines or mappings between types, they instead viewed them as components of the interface to an object. It’s understandable that they see it this way, because that’s how they’re presented in Java’s syntax, which goes so far as disallow writing functions outside of classes. When this is all the background you’ve been given on functions, of course “lambdas” seem inscrutable.&lt;/p&gt;
&lt;p&gt;In this clear-cut example of linguistic relativity, after exploring and playing with the concept of functions as presented in other languages, the students grasped “lambdas” with relative ease.&lt;/p&gt;
&lt;p&gt;What can we learn from this? As teachers, we should probably be more conscious of how teaching tools affect learners, both so we can make more informed choices of tooling, and so that we can better identify and rectify gaps in learners’ understanding. As learners, I can’t espouse strongly enough the value of learning a programming language from a different paradigm than the one(s) you’re familiar with, and analyzing problems through the lens of that paradigm. It will make you a better programmer even in the languages you’re already familiar with.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; Why are we teaching programming through Java anyway? Even if one takes the rather cynical view that everything in industry ought to be done in Java, and that the sole purpose of education is to stamp out ready-made cogs to slot into the machine of industry, I find it hard to justify. The ideal traits of a practical language&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#6&quot;&gt;6&lt;/a&gt;&lt;/sup&gt; are not necessarily those of an instructional language,&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#7&quot;&gt;7&lt;/a&gt;&lt;/sup&gt; and, as we saw in the above example, teaching Java first only hampered the learner’s ability to understand and use Java features.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;6&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;6&lt;/sup&gt;
&lt;p&gt;Not that I’m endorsing Java in practice either, mind.&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;7&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;7&lt;/sup&gt;
&lt;p&gt;I’m partial to Scheme because of &lt;a href=&quot;https://sarabander.github.io/sicp/&quot;&gt;the aforementioned textbook&lt;/a&gt;. It has an extremely minimal and consistent syntax that gets out of the way of learning, yet I certainly wouldn’t pick it for a large project.&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;</content></entry><entry><title>Why Decentralised Applications Don’t Work</title><id>https://ingrids.space/posts/why-distributed-systems-dont-work/</id><updated>2021-05-23T00:00:00+00:00</updated><link href="https://ingrids.space/posts/why-distributed-systems-dont-work/" rel="alternate" type="text/html"/><published>2021-05-23T00:00:00+00:00</published><content type="html">&lt;p&gt;&lt;strong&gt;TL;DR: Misaligned profit motives.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This has been on my mind for a while, and with a couple of things lately stoking my ire (the NFT resurgence, and Signal integrating MobileCoin), I’ve finally pushed myself to put it into words.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Before I get started, I want to make one thing clear: although I’m starting from a perspective of cryptocurrency and use some associated language, this post is not about cryptocurrency. The scope is much larger, crypto just provides a nice stepping off point since it’s a poignant and timely example.&lt;/p&gt;
&lt;p&gt;To clarify what I mean by decentralised: applications whose main purpose is fulfilled as part of a network, where that network is not reliant on any preordained nodes. Decentralised applications are also known as “federated”. There is also a more specific term “distributed”, also known as “peer to peer”. I won’t cover the distinction with the more specific terms because it’s not relevant here. I use the word application in a looser sense, to also cover protocols and specifications.&lt;/p&gt;
&lt;p&gt;A practical example of a decentralised application would be email, in contrast to Slack. Although email has some rather dominant nodes (I’m looking at you, Google), I can send an email with my own custom mail client, an email address at my own domain, and a mail server I host myself, to a friend with a similar setup. No Google involved. With Slack, I must use the proprietary Slack client, signed into a Slack account, through Slack’s servers.&lt;/p&gt;
&lt;h2&gt;My history with decentralised applications&lt;/h2&gt;
&lt;p&gt;I was still a child when the original Bitcoin paper&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;  was released. I remember growing up starry-eyed, immersed in the fantastical ideas floating around in its wake. I also grew up with BitTorrent, email, and the web.&lt;/p&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;/sup&gt;
&lt;p&gt;This reads a little differently over a decade later: https://bitcoin.org/bitcoin.pdf&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;Shortly after leaving university, I took a job at a “fintech” (financial technology) company, for a blockchain based project. I was young, we all make mistakes.&lt;/p&gt;
&lt;p&gt;Nowadays, I’m a prolific user of git, I use Matrix for some of my messaging needs, email for others, this blog makes use of the decentralised web, I follow several dozen RSS feeds (and publish one here), and of course, I still use BitTorrent.&lt;/p&gt;
&lt;h2&gt;Case studies&lt;/h2&gt;
&lt;p&gt;Before I get to the underlying reasons of why these systems do not work, I want to justify that assertion with some examples. If you get bored, feel free to skip this section.&lt;/p&gt;
&lt;h3&gt;Blockchain&lt;/h3&gt;
&lt;p&gt;Bitcoin launched with the stated goal of providing an alternative financial system,&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; and other blockchain projects followed with all manner of lavish promises. Bitcoin failed at the stated goal (unless you count the dark net markets). It has instead defaulted to pyramid scheme, with the added externality of wasting a stupefying amount of energy.&lt;/p&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;2&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;2&lt;/sup&gt;
&lt;p&gt;Given its deflationary nature and the huge hoard of bitcoin controlled by Satoshi, one might be forgiven for suspecting this wasn’t the true motive, or at wasn’t least the only motive. If those suspicions are true though, there’s some satisfaction in knowing that Satoshi probably can’t get away with using/selling those coins, as there’s a now huge target painted on their back.&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;As for the rest of the projects, all I can find is an endless pile of “get rich quick” schemes. It’s sad that I now see the word “blockchain” and immediately begin looking for the scam that’s inevitably there. Signal’s MobileCoin partnership is the latest betrayal here, and the one that hurts the most.&lt;/p&gt;
&lt;p&gt;Since I’ve worked in “blockchain”, I’ve got to see this happen firsthand. It’s a common story. You get given a problem spec. You design a decentralised system to solve it neatly. You get told “This doesn’t work, &lt;code&gt;$COMPANY&lt;/code&gt; doesn’t have any way to monetise it”. You go back to the drawing board, and design a centralised system. You get told, “Hey, this is good and all, but it doesn’t have blockchain”. Eventually you end up with the worst of both: a centralised system wrapping a phony pretense of blockchain. All of the energy waste, and none of the decentralisation.&lt;/p&gt;
&lt;h3&gt;The web&lt;/h3&gt;
&lt;p&gt;It feels a little strange to count the decentralised web as a failure, given that I’m out here publishing a blog post on my own domain and server. The decentralised web does still work, but I feel it’s important to acknowledge that this isn’t how most people use the web. It is in many ways impractical, and even in the best case it has some glaring flaws.&lt;/p&gt;
&lt;p&gt;For starters, setting up your own website like this one is not a trivial task unless you’re already inclined to it like I was. Wrangling with domain registration, DNS configuration, hosting, building the actual damn site, and deployment, that is &lt;strong&gt;a lot&lt;/strong&gt;. It’s even worse if yours isn’t a simple static site like this one. Not to mention that for much of the world’s population, the costs of hosting and domain registration are prohibitive. Furthermore, once you’ve got all that working, how do you let anyone else know about it? RSS and aggregators like lobste.rs and Hacker News work for little tech blogs, they don’t work for everyone else.&lt;/p&gt;
&lt;p&gt;And so it is that most of us are trapped in an abusive relationship with platforms like Medium, Twitter, and Instagram.&lt;/p&gt;
&lt;p&gt;All of the above hasn’t even touched on the fact that there’s a near monopoly on client side web rendering.&lt;/p&gt;
&lt;p&gt;Chrome and its derivatives hold an overwhelming majority of the browser market share,&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#3&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; and thus, Google gets to decide how the web works. There’s a pretense of deference shown to standards organisations, but at the end of the day when Google decides on a standard, everyone else must implement it or die. Almost all the front-end web developers I know develop for Chrome. Compatibility with other browsers is an afterthought, if they’re even considered at all.&lt;/p&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;3&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;3&lt;/sup&gt;
&lt;p&gt;The next largest competitor is Firefox, whose development is entirely dependent on financial support from Google.&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;Bringing fresh competition against Chrome isn’t really an option either. Modern browser rendering engines are so complex (especially when you have to implement all of Chrome’s undocumented quirks too), that even Microsoft gave up trying. And if you’re thinking of making your own system that eschews the web standards, good luck trying to bootstrap the entire web’s worth of content.&lt;/p&gt;
&lt;h3&gt;Email&lt;/h3&gt;
&lt;p&gt;I used email as my flagship example above because I think it’s the most familiar and clear among these, but I made it sound a lot better than the reality. While hosting your own email is still possible, anyone capable enough to get that far is probably going to realise how bad an idea it is.&lt;/p&gt;
&lt;p&gt;My statement that email can be used without involving Google is technically true, but anyone they blacklist will quickly realise that they’re largely locked out of the global email network. Not to mention that, in the same way Chrome’s market share gives Google de-facto control over web standards, Gmail’s gives them control over email standards.&lt;/p&gt;
&lt;h3&gt;IRC/XMPP/Matrix&lt;/h3&gt;
&lt;p&gt;IRC has been there since time immemorial, and we’ve seen modern takes on it come and go. Yet, the only people I know using IRC and Matrix are programmers and censorship victims.&lt;/p&gt;
&lt;p&gt;Proprietary centralised services like Slack, Discord, WhatsApp, etc. dominate, most likely because they have the marketing budget for it. Open systems call for interoperability, but the centralised services are disincentivised to partake, because their lock-in allows them to abuse their users.&lt;/p&gt;
&lt;p&gt;Some of the people behind Matrix seem to be of the belief that getting venture capital involved in their own system is the solution here,&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#4&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; I’m not convinced.&lt;/p&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;4&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;4&lt;/sup&gt;
&lt;p&gt;https://www.matrix.org/blog/2019/10/10/new-vector-raises-8-5-m-to-accelerate-matrix-riot-modular&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h3&gt;RSS/Atom&lt;/h3&gt;
&lt;p&gt;Google gets to be a villain here too; RSS has truly been done dirty. From its heyday in the blogging bubble powered by Google AdWords, to its vicious murder with the discontinuation of Google Reader, Google was at the centre. Now there’s talk of it’s use in a Chrome integration? We’ll see what comes of that.&lt;/p&gt;
&lt;p&gt;RSS has, however, had unprecedented (and somewhat invisible) success in the form of podcasts. That too is in grave danger though, with Spotify sinking an absurd quantity of money into trying to make its closed system of not-actually-podcasts dominant. Even Apple, whose good stewardship has long been key to keeping podcasts open, has been making dubious moves. A recent update to the iTunes podcast directory made RSS feeds default to private, and their new “podcast subscription” system is not compatible with open podcasting.&lt;/p&gt;
&lt;h3&gt;Git&lt;/h3&gt;
&lt;p&gt;Git itself is largely ok; It seems that having programmers as the target demographic works out. Even here though, we see signs of corruption.&lt;/p&gt;
&lt;p&gt;Git was originally intended to be used in conjunction with email to coordinate development. Many still use it this way. For most users, however, GitHub has entirely replaced email.&lt;/p&gt;
&lt;p&gt;It’s one thing for git hosting to be quite centralised, that doesn’t afford the host much power over its users. If a host starts to play foul, one can simply&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git remote set-url origin &amp;lt;repo url @ new host&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;and take all the relevant data with them. Even providing a nice UI to wrap the email workflow is alright in my view, emailing patches isn’t for everyone.&lt;/p&gt;
&lt;p&gt;What GitHub does though, is rather more sinister. They tweak the actual development workflow away from email with features like pull requests, and and they lock project data in with features like their issue system. When these changes are combined with GitHub’s marketing, they become dangerous. Almost all the university students and new grads I meet don’t know the difference between git and GitHub, and to them, there is no method of collaborative development other than pull-requests.&lt;/p&gt;
&lt;p&gt;The network effects discussed with the web apply here too. I have a GitHub profile, because I know no-one will look at my code if I don’t.&lt;/p&gt;
&lt;h3&gt;BitTorrent&lt;/h3&gt;
&lt;p&gt;Like crypto, the only real use BitTorrent has ended up with has been outside the law. The only people I know using it for anything other than copyright evasion&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#5&quot;&gt;5&lt;/a&gt;&lt;/sup&gt; are Linux distributions sharing their ISOs.&lt;/p&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;5&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;5&lt;/sup&gt;
&lt;p&gt;I’ll leave my views on copyright for another time&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;Copyright holders have made BitTorrent so synonymous with piracy, that even non-pirate use is regarded scornfully.&lt;/p&gt;
&lt;p&gt;And honestly, it’s sad. Whenever someone wants to send me a file, they either link me to some awful proprietary service like Dropbox, or we fumble about with email. In another timeline, they could just send me a magnet link.&lt;/p&gt;
&lt;h2&gt;Why?&lt;/h2&gt;
&lt;p&gt;At this point, even if you didn’t read the TL;DR, I bet you’ve spotted the trend. In every case there’s someone who stands to make a large profit (or avoid losing their large profit) from ensuring decentralised systems fail.&lt;/p&gt;
&lt;h2&gt;That was depressing… What now?&lt;/h2&gt;
&lt;p&gt;Whenever this topic comes up, I’m used to seeing other programmers declare that the solution is simply to make something &lt;em&gt;better&lt;/em&gt;.&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#6&quot;&gt;6&lt;/a&gt;&lt;/sup&gt; I understand where this thought comes from; when you have a hammer, everything looks like a nail, and it’s comforting to think that your primary skill and passion is exactly what the problem needs. Making better tools doesn’t do anything about the backwards profit motive though, and besides, have you tried using any of the centralised alternatives lately? They’re all terrible. Quality of tools really isn’t what we’re losing on.&lt;/p&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;6&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;6&lt;/sup&gt;
&lt;p&gt;This post by Drew Devault is a good example. No shade intended, I otherwise largely agree with him: https://drewdevault.com/2021/04/07/The-next-chat-app.html&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;No, the solution has to be &lt;strong&gt;political&lt;/strong&gt;. That’s uncomfortable for me, as it probably is for you too. Software I can do, politics though? That’s hard. Something needs to change about these profit motives though. I’m not arrogant enough to declare that I know the one true answer here, I doubt there even is one true answer. I can share some ideas though.&lt;/p&gt;
&lt;p&gt;The current system of profit motives, one might call it a market, was designed to optimise the process of  extracting, refining, and transforming physical resources. It seems to be pretty good at that, though one may question whether its externalities are worth it, or whether that goal should be the top priority.&lt;/p&gt;
&lt;p&gt;What we’re dealing with here is far removed from physical resources, however, and the system has not been adapted at all. Although some like to idealise the aforementioned market as a free and unregulated system, the truth is that it optimises rather poorly under those circumstances, and needs heavy regulation to align profit motives in the direction of efficient processing and distribution of resources. &lt;em&gt;If&lt;/em&gt; we are to keep these profit motives at all,&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#7&quot;&gt;7&lt;/a&gt;&lt;/sup&gt; we need new regulation to align them toward creating software that better serves our society.&lt;/p&gt;
&lt;details class=&quot;footnote-details&quot;&gt;&lt;summary&gt;&lt;/summary&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;7&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;7&lt;/sup&gt;
&lt;p&gt;I’m not convinced we should&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;</content></entry></feed>