Skip to content
DevMeme
3839 of 7435
Levels of abstraction: programmers versus those who write their tools
Compilers Post #4182, on Feb 8, 2022 in TG

Levels of abstraction: programmers versus those who write their tools

Why is this Compilers meme funny?

Level 1: Playing the Game vs Inventing It

Imagine you’re playing a fun board game, moving your pieces and having a great time. Now imagine sitting next to you is the person who invented that board game – the one who created all its rules and designed all its pieces. In the cartoon, the little character is like the game player, and the big statue character is like the game inventor. The little one only has to think about a very simple game (they have just two pieces on the chessboard, almost like an easy version of chess), and they’re super happy moving those pieces. The big one, however, understands the whole game because they made it – they know every rule by heart.

This is funny because it shows a huge difference in scale and knowledge in a sweet, cartoon way. The small guy is proud and content with his little accomplishment (just like a kid might be proud of stacking two blocks). The giant figure gently pats him on the head, kind of like a proud parent or a teacher would do, smiling at the child’s effort. It’s saying, “Good job, kiddo, enjoy playing – I built this game for you!” There’s no hostility, just a warm, supportive vibe.

In real life terms, think of a child riding a bicycle with training wheels versus the engineer who designed the bicycle. The child is excited to pedal and turn (that’s a big deal for them!), while the engineer knows about all the hidden work – like how the gears, frame, and physics of the bike were figured out. The engineer isn’t bragging; they’re happily watching the child ride, glad that their invention works and brings joy.

So the heart of this meme is about appreciation of different roles: one person is using something, and another person made that thing. It’s cute and funny because we don’t usually visualize it so literally. The little programmer in the meme writes a small program (plays a simple chess game), and the big programmer created the programming tools (invented the whole chess game) that make the small program possible. It makes us smile because we recognize ourselves in that little character whenever we use technology, and it reminds us there’s often a genius inventor behind the scenes, quietly enabling our success. The big sunny sky and the smiling sun in the picture also give it a happy, reassuring tone – everything is okay because the “giant” who built the world is friendly and watching over the little guy.

In short, it’s like a kid building a tiny sandcastle while sitting next to a master architect who built a real castle. The kid is delighted with their sandcastle, and the architect is patting them, proud and happy to see the kid having fun with something akin to what they themselves do on a much larger scale. That contrast is both humble and humorous. It reminds us to be proud of what we create, but also to remember with a smile that someone else made the tools that let us create it.

Level 2: Toolmakers vs Coders

This meme is comparing two types of programmers: toolmakers and application coders. The “programmer who programs programs” in the first panel is the typical developer who writes applications or scripts using existing programming languages and tools. That cute blob in overalls could be you or me writing a Python script, a website, or a game. We write code in a high-level programming language like Python, Java, or C#, and we use editors or IDEs (Integrated Development Environments) to help us. We’re focused on our specific problem – maybe calculating some statistics or building a user interface – and we rely on our tools to handle the low-level details.

Now, the second panel’s caption “the programmer who programmed the programming program” refers to the developer who made those very tools or languages. This big statue-like figure is the tool developer or language developer. If the little blob is writing a program, the big statue wrote the compiler or interpreter that the blob’s program runs on. A compiler is itself a program that translates code from one language to another (usually from a high-level language that humans write, down to machine code that computers execute). For example, when you write a C++ program, a compiler like GCC or Clang translates your C++ code into assembly language and then into machine code that the computer can run. An interpreter, on the other hand, directly executes the code instructions line by line (for example, the CPython program interprets Python code on the fly). Both compilers and interpreters are "programming programs" – programs designed to work with other programs as their input or output.

So in simpler terms: the small programmer uses tools; the big programmer builds those tools. The first is playing a game, the second invented the game and its rules. The meme humorously contrasts these roles by showing the small guy with just a couple of chess pieces (a very simple view) and the big guy as a strong, wise entity who gave him those pieces. The phrase “levels of abstraction” is key here. An abstraction is a way to hide complexity behind a simpler interface. High-level programming is an abstraction over the computer’s complex operations. When you use a high-level language, you don’t need to think about details like memory addresses or CPU instruction sets – those are handled by the language’s implementation. The toolmaker is the one who worries about those details so that the application coder doesn’t have to.

Let’s break down some terms and concepts to connect it to the meme:

  • Programming Language: This is like a set of rules and vocabulary for writing programs (chess rules in the meme analogy). For example, Python and Java are programming languages. The little blob in the cartoon writing code is using a programming language to express what they want the computer to do. The language provides abstract concepts (variables, loops, functions) that are much easier to think about than binary ones and zeros. The programmer who programmed the programming program (big statue) is someone who created or implemented a programming language. They decide what those rules and vocabularies are and how they work behind the scenes.

  • Compiler/Interpreter (Programming Program): This is the actual tool that runs or translates the code written in a programming language. You can think of it as a bridge between the human-friendly instructions and the machine-friendly instructions. The compiler or interpreter is itself a program – one written by the toolmakers. For instance, the Python interpreter is written in the C language (a lower-level language). The job of the Python interpreter is to take the Python code you write and execute the appropriate actions on the computer. In the meme, the compiler/interpreter is “the programming program” – a program that deals with other programs. The huge figure wrote this program. In practical terms, it’s like the big statue is the team of engineers who wrote, say, the Java Virtual Machine or the C# compiler, enabling millions of developers (the little blobs) to write software in those languages.

  • Tooling: This refers broadly to the tools developers use – not just compilers and interpreters, but also editors, debuggers, build systems, etc. For example, an IDE like Visual Studio Code or IntelliJ is also a “programming program” because it’s a program designed to help write other programs. Those tools themselves are very complex programs created by developers. The meme specifically highlights compilers/language, but it applies to tooling in general: a few very skilled people build these heavy-duty tools, and a lot of others use them daily. The categories given (Compilers, Tooling, Languages) are exactly these aspects. We often take it for granted that we have a button that says "Run" or "Compile" in our IDE – and magic happens – our code runs. But someone engineered that magic. They decided how code gets turned into an actual running application.

  • High-Level vs Low-Level: We often describe languages or programming tasks as high-level (far from hardware, very abstract and human-readable) or low-level (closer to hardware, more detailed and manual). The small blob is working at a high level – for instance, they might be writing a Python script to make a simple game. The concerns are like “move this character” or “print this message” – very straightforward. The big statue operates at a lower level. That toolmaker might have written parts of the Python interpreter in C or even some assembly. They have to manage things like memory allocation or CPU registers, which are considered low-level details. LowLevelProgramming (as tagged) usually means dealing with those fundamental operations, often in languages like C or C++ or assembly, where you can directly manipulate memory and processor instructions. Compiler developers often need to do low-level programming because they produce code that runs on the machine efficiently. They have to understand how the computer really executes instructions so they can generate correct and fast machine code. Meanwhile, the high-level application developer can work with easier concepts (like objects, lists, and so on), because the compiler will translate those into the low-level stuff automatically.

  • MetaProgramming: This term means "programming about programming". It includes techniques where programs have the ability to treat code as data, or even generate code. Writing a compiler is a prime example of metaprogramming: you’re writing a program whose input is code written by someone else. Other examples include writing scripts that generate code for you, or using templates/macros that expand into actual code at compile time. For instance, a compiler-compiler (yes, that’s a thing!) like YACC/Bison takes a description of a grammar (rules of a programming language) and automatically produces the source code of a parser (which is part of a compiler). That’s a program writing another program according to some rules – very meta! The context tags mention “metaprogramming_layers” – this refers to the multiple layers at which metaprogramming can happen, exactly like the meme showing one layer of programmer versus a deeper layer. The cartoon is a lighthearted nod to the fact that, at some layer, a programmer has written the tools that other programmers use. It’s like a pyramid: at the base are the architects of computing (language designers, OS builders), and higher up are the application builders who rely on that base.

In summary, the meme’s two characters show the hierarchy of abstraction in software. The small happy programmer (first panel) lives in a world that’s made simple by those abstractions. The huge patting programmer (second panel) represents the experts who create those abstractions by writing compilers and languages. The idyllic scene (with a smiling sun and puffy clouds) suggests everything is peaceful – because it is! Thanks to the hard work of toolmakers, application coders can enjoy a relatively easier, sunnier experience. The big figure patting the small one is almost paternal or mentor-like, which is how it often feels: for example, the creators of a language often provide documentation, libraries, and support so that developers can succeed using the language. They want us to do well with what they built.

For a newcomer or junior developer, this meme is a playful introduction to the idea that someone, somewhere wrote the software that you are using to write software. It might not be obvious at first. When you start coding, you focus on writing your code to get a job done. The tools (like the programming language compiler or the code editor) feel almost like part of the computer. But as you learn more, you realize those tools are also just programs created by other people. It can be kind of mind-bending: “Wait, the programming language itself was created by programmers?!” Yes! There are teams of compiler engineers and language architects who design how the language works (syntax, keywords, etc.) and implement it. That’s their full-time job. For instance, Guido van Rossum wrote the first version of Python (he’s often called Python’s "Benevolent Dictator For Life" jokingly), and a whole team maintains the Python interpreter now. Similarly, Linus Torvalds created the Linux kernel (an operating system), which is another layer of tool underneath many programs. These folks are like the giant statue in the meme. They create the conditions that allow millions of smaller programs to run.

The chessboard cartoon simplifies all this with a clear visual: simple game vs. game creator. You might also think of it like a child using an iPad app to draw vs. an engineer who coded the drawing app. Different levels of creation. Neither is “bad” – both are doing something useful – but one is a far deeper level of complexity. The meme isn’t saying the little programmer is stupid or anything; it’s just cute how our day-to-day programming tasks compare to the monumental effort that goes into building the platforms we use. It’s a good reminder of why we have software abstractions: without them, each programmer would have to understand every nuance of hardware and write extremely detailed code for even simple tasks. Thankfully, we have high-level languages (each a programming program gift from a toolmaker) so we can get results with less effort.

So if you’re relatively new to development, take a moment to appreciate that when you code in, say, JavaScript, the JavaScript engine (like Google’s V8 in Chrome) is doing amazing work – and it was written by other developers. Likewise, the operating system (Windows, macOS, Linux) running your programs was made by developers, and even the microprocessor running machine code was designed by computer engineers. It’s layers upon layers. You don’t see all that when you write a few lines of code. The meme joyfully pokes fun at this by personifying one of those layers and having it literally pat the other on the head. And indeed, many toolmakers are happy to see people use their creation to build cool new things – that’s the whole point! The relationship is symbiotic. We, the application coders, are productive and happy (like the smiling blob) because the toolmakers built solid abstractions for us. And the toolmakers (the statue) are content seeing their “children” thrive on the playground they built.

Level 3: On the Shoulders of Giants

For seasoned developers, this meme hits a familiar chord: we all stand on the shoulders of giants. The caption “programmer who programs programs” describes the typical software developer – the one building an app or a website using existing languages and tools. The second caption, “the programmer who programmed the programming program,” refers to that almost mythical breed of engineer who creates the languages, compilers, and tooling that the rest of us rely on. It’s a playful take on the hierarchy in software engineering skill and abstraction. If you’ve ever felt proud of a little script you wrote, imagine the folks who wrote the language interpreter that runs your script – their accomplishment is orders of magnitude more complex! This contrast is the crux of the joke.

In the meme’s first panel, the small happy blob with overalls is contently playing with a minimal chess set – only two pieces on the board. This represents the application developer dealing with a simplified problem space, because so much has been abstracted away. Two pieces are easy to manage! In the second panel, when we zoom out, we see the giant statue with a CRT monitor for a head patting the little guy. That giant figure symbolizes the toolmaker – perhaps an old-school systems programmer or language designer. The CRT monitor head is a clever detail, invoking images of early computing days (CRT monitors, think 1980s or 1990s computers) and suggesting old wisdom or fundamental technology. The giant is like a kindly mentor or guardian. Rather than a smug “elite” mocking the newbie, it’s gently affectionate. It’s as if the big programmer is saying, “Aww, you wrote a little program. That’s cute – I remember building the compiler that runs it. Good job, keep at it!” There’s camaraderie in that pat on the head, something many veteran engineers feel towards newcomers (and the tools they use).

The humor resonates because as developers gain experience, we come to appreciate how much heavy lifting our tools do for us. The meme exaggerates it in a whimsical way – literally depicting the tool-builder as a giant stone deity. But any senior dev who’s peeked under the hood of an IDE or read some compiler source code (like the millions of lines in GCC or the sophisticated design of LLVM) has had that humbling “wow” moment. We realize writing a simple app is like moving a pawn on a chessboard, whereas designing a programming language or a compiler is like strategizing an entire chess tournament. The giant figure has already anticipated every move we could possibly make in our code; they’ve created the rules and mechanisms that make our code run. In developer terms, they handled things like memory management, garbage collection algorithms, parsing ambiguous syntax, optimizing machine code for different CPU architectures – all the hard stuff that just works for us. No wonder the small blob looks so carefree – their programming world is made simple and sunny (note the smiling sun in the background) by the abstractions the giant provided.

Many of us have encountered this hierarchy in real life. Perhaps you struggled with a tricky bug in your application for hours, only to discover it was actually a bug deep in the language’s runtime or a library – something a tool developer had to fix. Or maybe you’ve attended a tech talk by a compiler engineer or read about someone implementing a new language from scratch, and thought, “That’s next-level wizardry.” It’s a common developer joke that when we’re griping about why our code is slow, somewhere a compiler dev is optimizing millions of such operations at a level we’re not even aware of. The meme captures that disparity perfectly.

There’s also an implicit “thank you” in the joke. The big statue patting the little programmer can be seen as a symbol of how tool authors empower regular programmers. The giant made it possible for the little blob to even play his tiny chess game. In practice, tooling folks and language designers often take pride in enabling others – they create frameworks, debuggers, and languages so that application devs can be more productive and creative without needing to reinvent the wheel. It's a benevolent giant situation. We joke about “toolchain author supremacy” – that rarefied air of those who build compilers or operating systems – but we also deeply appreciate it. Every high-level feature we love (like list comprehensions or async/await keywords or a slick GUI builder) exists because someone slogged through the hard work to implement it correctly under the hood.

Consider a concrete example of this contrast: as an app developer, you might call a simple function like sort(list) and trust that it will sort your list of data. It’s a one-line, trivial call for you. But think of the people who wrote that function in the language’s standard library or those who designed the language to include generic sorting. They had to worry about efficiency (O(n log n) algorithms, choosing QuickSort vs MergeSort), handling different data types, and edge cases (in some languages, even ensuring the routine doesn’t crash on weird inputs). They essentially built a miniature chess engine so you could make one easy move. Another scenario: you write code in C# using LINQ queries, which feel almost like natural language – meanwhile, the LINQ designers wrote complex compiler logic to translate those queries into efficient database calls or in-memory operations. When you start to peel these layers, you can’t help but chuckle at how much of the “magic” in our daily programming is really someone else’s hard-core engineering.

The chessboard imagery is spot on. Chess is a complex game with rules and strategies, but the little blob’s two-piece game is like an extremely simplified version – maybe just a pawn and king. This reflects how high-level programming abstracts away many details. The compiler dev is the one who set up the full chessboard of the programming language: they decided how pieces move (syntax/semantics), what moves are legal (type rules, compile-time checks), and what constitutes checkmate or illegal positions (runtime errors, compiler errors). The app dev just plays within those rules, moving a couple of pieces (using the language constructs to solve a problem). It’s easier to play a game than to invent one, just as it’s easier to use a language than to design and implement one. The meme’s joke lands because every programmer, deep down, knows this hierarchy exists. No matter how good we are at playing the game of coding, there was someone who invented the game we’re playing. And that person probably had an even harder job.

To illustrate how much is hidden beneath a simple program, consider a tiny piece of code and what the tool-builder must account for:

# A simple high-level code snippet an application developer writes:
print("Hello, world")

That one line seems trivial. But under the hood, the programming toolchain is doing a lot:

// Inside the Python interpreter (a program written in C) there is logic akin to:
PyObject *msg = PyUnicode_FromString("Hello, world");
PySys_WriteStdout(msg);  // This sends the text to the standard output (console)
; Deeper down, the operating system (written in C and assembly) executes instructions like:
mov edx, 13         ; length of the string "Hello, world\n" (13 characters)
mov ecx, [msg_ptr]  ; pointer to the string data in memory
mov ebx, 1          ; file descriptor 1 (standard output)
mov eax, 4          ; system call number for write on Linux x86
int 0x80            ; interrupt to invoke the kernel's write function

In the above breakdown, the application developer writes one line and sees "Hello, world" on the screen. Meanwhile, the compiler and runtime developers had to implement all the machinery to make that happen: creating string objects, interfacing with the OS, and ultimately pushing bytes to the console. They basically defined and built both the rules of the language (how print works, how strings are represented) and the plumbing underneath (how to interface with system calls to actually output text).

From a senior engineer's perspective, the meme is both humorous and a gentle reality check. It reminds us of the abstraction ladder we climb every day. It's easy to forget, when battling a tough bug in our code at 2 AM, that the entire environment our code runs in is someone else’s code. There’s an old joke: “Any problem in computer science can be solved by another level of indirection.” Abstractions on abstractions – that’s how our field progresses. The flip side is the equally famous quip: “...except for the problem of too many layers of indirection!” In other words, each new abstraction layer (like a fancy framework or a higher-level language) makes life easier for its users but adds complexity underneath. The meme captures that trade-off with an image: the top layer looks simple and happy (sunshine and a tiny game), but supporting it is a massive, stone-hewn foundation – the work done by the toolmaker.

Ultimately, the joke inspires a mix of admiration and self-aware laughter. As developers, we’ve all been the small blob, excited about our code chess match, perhaps not realizing we’re playing on a board that someone else built for us. And many of us also aspire to be (or have been) that big CRT-headed guru at times – writing a library, a game engine, or even a little compiler, feeling like the stone giant concocting a world others will play in. It’s a humorous acknowledgement of the unsung heroes of software and a nod to the developer humor that comes from recognizing one’s place in the grand scheme of the code universe. No matter how advanced you are, there’s always that next level down where someone had to solve even more fundamental problems. And if you ever meet those folks (the language and compiler engineers), you might just feel like a cartoon blob next to a stone giant – and that’s okay, because that giant is patting you on the head, happy to see you create something using their tools.

Level 4: Turtles All The Way Down

At the deepest level, this meme highlights the metaprogramming continuum – a recursive hierarchy where programs create other programs, which in turn may create yet more programs. The “programmer who programmed the programming program” evokes the realm of compiler design and language development, which sits a tier below everyday application coding. It's a nod to the fact that our software stack is built on layer upon layer of abstraction, almost like an infinite tower of turtles supporting the world of computing. Each turtle (or layer) represents a level of abstraction that rests on the one below it, all the way down to the hardware at the bottom.

In theoretical computer science, this relates to the idea of a formal language being processed by a machine. A compiler (the "programming program" in the meme) is essentially a program that takes as input code written in a high-level programming language and produces low-level machine instructions. Designing a compiler means dealing with concepts like lexical analysis and parsing (often defined using formal grammars like BNF), abstract syntax trees (ASTs), semantic analysis, and code generation. These are not terms a typical app developer uses every day – they're the chess moves invisible to someone playing a simplified game. The humor of the meme comes from recognizing this vast complexity hidden behind the simplest code.

To put it another way, the small blob character in the first panel plays with just two chess pieces (a trivial scenario), while the giant stone figure in the second panel knows the entire rulebook of chess and probably invented the game. In computing terms, the small application developer worries about a few high-level constructs (“two pieces”), whereas the tool-builder grasps the whole system – from high-level syntax down to CPU instructions (“the entire chess game”). There’s a beautiful inevitability here: abstractions are built on other abstractions. For instance, a high-level language like Python is written in C, its interpreter a program that runs on an operating system, which itself is built on C and assembly, running on hardware whose behavior is defined by microcode and logic gates. This cascading stack means there's always another programmer at a lower layer who enabled the layer above. It’s literally programs all the way down, until you hit electrons switching in transistors.

One fascinating aspect is how compilers and tools often bootstrap themselves. Ever wonder who compiles the compiler? Initially, someone writes a simple version of a compiler in another language or assembly. As the language matures, they might rewrite the compiler in its own language – a self-hosting compiler. This process is like the tool-builder teaching the tool to build itself, a profoundly meta concept. It’s akin to a chess grandmaster creating a new chess variant, then using that new game to analyze itself. The nerdy delight here is recognizing such recursive ingenuity: the compiler developers operate one level above (or below, depending how you look at it) everyone else, implementing features that we app devs might take for granted (garbage collection, just-in-time optimization, type inference, etc.). They wrestle with theoretical limits too – for example, ensuring a language is Turing-complete (able to compute anything computable) while also making it safe and efficient. They even brush against unsolvable problems: no compiler can magically determine for all possible programs whether a given program halts (that’s the famous Halting Problem). Yet, these toolsmiths craft heuristics and analyses to catch as many errors as possible at compile-time – like checkmating bugs before the game even starts.

So the meme’s giant CRT-headed Buddha-like figure patting the little programmer is a tribute to these foundational toolchain creators. It hints at the almost spiritual level of respect (and mystique) we have for them. They tackle the ultimate “programmer’s programming” problems: building the languages, compilers, and runtime engines that the rest of us use to build everything else. It’s a gentle reminder of the abstraction hierarchy in computing. Each time we write code, we’re leveraging countless hours of someone else’s highly complex work. The situation is absurd and amazing at once – a single line of Python code might trigger a cascade of events deep into silicon, orchestrated by multiple programs that other developers wrote. The meme humorously personifies this reality: the everyday coder’s cute little “chess move” (high-level code) is being watched over by the grandmaster who defined the rules of the game (the language/tool creator). In essence, it’s celebrating the meta – those wizards behind the curtain who make modern programming possible, playing a 4D chess of anticipating and enabling everything we do in our simpler coding playground.

Description

Two - panel cartoon meme in bright, pastel colors. Panel 1: a small, white, smiling blob-character wearing blue overalls sits at a chessboard with only two pieces; over its head is the caption text “programmer who programs programs”. Panel 2: the viewpoint zooms out to reveal a huge stone statue-like figure with a CRT monitor for a head, seated cross-legged and gently patting the smaller blob; the caption reads “the programmer who programmed the programming program”. A smiling sun and puffy clouds complete the idyllic scene. The joke contrasts everyday application developers with the deeply knowledgeable engineers who build compilers, IDEs, and other meta-programming toolchains, illustrating the hierarchy of abstractions within software engineering

Comments

16
Anonymous ★ Top Pick Me spending a sprint refactoring microservices for “clean architecture,” while somewhere a compiler engineer commits an escape-analysis tweak that deletes half my abstractions and pats me for the CPU cycles I almost saved
  1. Anonymous ★ Top Pick

    Me spending a sprint refactoring microservices for “clean architecture,” while somewhere a compiler engineer commits an escape-analysis tweak that deletes half my abstractions and pats me for the CPU cycles I almost saved

  2. Anonymous

    The guy who wrote the compiler in assembly thinks he's enlightened until he meets the person who toggled in the bootstrap loader using front panel switches

  3. Anonymous

    It's turtles all the way down until you hit the one person who still maintains the C compiler - be nice to them

  4. Anonymous

    The real flex isn't writing elegant code - it's writing the compiler that makes everyone else's 'elegant' code possible. While most developers argue about tabs vs spaces, these legends are defining what constitutes valid syntax in the first place. They're the architects who built the chess board, wrote the rules, and then casually mentioned they also invented chess notation. It's the ultimate 'I use Arch btw' energy, except they literally wrote Arch. Or as they say in compiler circles: 'You merely adopted the abstraction layers. I was born in them, molded by them - I didn't see user-facing code until I was already a man.'

  5. Anonymous

    Architects tower over UML chessboards plotting CAP theorem endgames; coders cradle that one leaky service like a pawn about to promote - or crash

  6. Anonymous

    We call ourselves full-stack; the compiler engineer wrote the stack frames, SSA, and optimizer that make our bad ideas look fast

  7. Anonymous

    Your biggest bug is a null pointer; theirs is a stage-2 bootstrap miscompile that only appears when -O3 inlines the register allocator into itself

  8. @QutePoet 4y

    It's a joke about Kite?

    1. @affirvega 4y

      I think it's a joke about IDEs, compilers, linters, etc

      1. @sylfn 4y

        linters?

        1. @qwnick 4y

          He meant linkers

          1. @sylfn 4y

            no, he didn't > "those help with auto completion"

            1. @dsmagikswsa 4y

              I think linter is for rules of code format.

  9. @karim_mahyari 4y

    Did you mean deephell's text editor?

  10. Deleted Account 4y

    That's what I was thinking when I first got to the computer. Like, how do I create a program? What is the first program where programs were created? So I literally googled and downloaded Pascal and I had no idea what is this.

    1. @dsmagikswsa 4y

      Like a Philosophy question 😂

Use J and K for navigation