What kinds of problems does this language make unusually natural to solve?

The Mewlang cat, thinking about where to startFive languages, five projects, one question asked five times. This page covers the whole curriculum plan: how it's delivered, prerequisites, recommended order, difficulty, and the full milestone syllabus for every course. Each course's actual material — installation, language crash course, and all twelve milestones — lives in its own instalment, linked at the bottom of this page.

GoDigital Ant Colony. Thousands of independent agents, channels, failure injection, eventually a small distributed system.
RubyAutomation DSL. A pipeline language built out of blocks and metaprogramming that inspects and rewrites itself.
PerlText Archaeologist. Ingest ugly heterogeneous data, extract entities, correlate events, build a searchable graph.
ErlangThe Internet That Never Dies. Thousands of supervised processes that crash, restart, partition, and recover.
RacketLanguage Factory. A toolkit for defining small languages, ending in real #lang implementations.
What is on this page
  1. How the curriculum is delivered
  2. Overview of the five courses
  3. Prerequisites
  4. Recommended order
  5. Difficulty and time estimates
  6. Detailed syllabus for each of the five courses

From here, each course starts with its own instalment: what we're building, installation and first program, then the language crash course, before the twelve milestones begin.

Section 1How the curriculum is delivered

Written in full, these five courses are the size of a book. Delivering them as one document would mean losing exactly the parts that make them worth reading: the line-by-line explanations, the exercises, the debugging sections. So each course is split into instalments — this curriculum map, then five self-contained documents per course, each readable on its own. Every instalment ends with a button to the next one, so you can move through a whole course, or the whole curriculum, by clicking forward.

The instalment sequence, and how far each course currently reaches:

CourseInstalmentsStatus
Go — Digital Ant ColonyParts 0–2, Milestones 1–4, 5–8, 9–12, advanced phase & final challengewritten
Ruby — Programmable Automation DSLParts 0–2, Milestones 1–4, 5–8, 9–12, advanced phase & final challengewritten
Perl — Text ArchaeologistParts 0–2, Milestones 1–4, 5–8, 9–12, advanced phase & final challengewritten
Erlang — The Internet That Never DiesParts 0–2, Milestones 1–4, 5–8, 9–12, advanced phase & final challengewritten
Racket — Language FactoryParts 0–2, Milestones 1–4, 5–8, 9–12, advanced phase & final challengewritten

Instalments are numbered continuously across the whole curriculum — each one says which number it is, and what's next, in a footer at the bottom. If you'd rather reorder the courses themselves — for example, taking Erlang immediately after Go so the two concurrency models sit side by side — nothing here enforces the numbered order; jump straight to that course's instalment from the links at the end of this page.

Section 2Overview of the five courses

Each course is built around one question that the language answers unusually well. The project exists to force you into that answer.

CourseThe question the language answersWhat the project forces you to confront
GoHow do I write a program with tens of thousands of independent activities without drowning in locks?Shared mutable state between concurrent agents, and the discipline of passing ownership through channels instead.
RubyHow do I make a configuration file executable, readable, and extensible by its users?The line between "data describing work" and "code performing work", and how blocks plus metaprogramming erase it.
PerlHow do I turn a pile of inconsistent, half-broken text into structured facts, fast, on the command line?Real-world data that violates every assumption your parser makes, at a scale where you cannot load it into memory.
ErlangHow do I build something that keeps working while parts of it are broken?Failure as a normal, expected, routinely-exercised code path rather than an exception to be prevented.
RacketHow do I build the language the problem wants, instead of encoding the problem in the language I have?The compile-time/run-time boundary, and the fact that syntax is data you can compute with.

There is a deliberate pairing structure. Go and Erlang are both about concurrency and disagree profoundly about how to get it. Ruby and Racket are both about growing a language toward the problem and disagree about whether you do that at run time or compile time. Perl stands alone as the Unix-shaped view of computing: a program is a filter, text is the universal interface.

Section 3Prerequisites

What you need to already know

What you do not need

Any prior exposure to these five languages, functional programming, actor models, compiler theory, or distributed systems. Every term gets defined when it first appears. Where a concept is genuinely hard (hygiene in macros, split-brain in distributed systems) it gets its own section rather than a parenthesis.

Machine and environment

Time

Roughly 180–260 hours for all five if you do the exercises rather than reading past them. At six hours a week that is about a year. At fifteen it is about four months. Doing one course properly beats skimming five.

Section 4Recommended order

The courses are numbered as you listed them, but the order I recommend studying them in is different:

  Go  ──────────►  Erlang  ──────────►  Ruby  ──────────►  Racket
  (1)               (4)                  (2)                (5)
   │                                                          
   └── Perl (3) fits anywhere; it shares no concepts with the others

The reasoning:

If you would rather work strictly in the numbered order, nothing breaks. The Ruby-then-Racket connection is the only one I would try to preserve.

Section 5Difficulty and learning goals

Four different kinds of difficulty, rated 1 (easy) to 5 (hard), because they are not the same thing. A language can have easy syntax and a brutal conceptual model, or the reverse.

CourseSyntaxToolingConceptsDebuggingHours
Go213335–50
Ruby223230–45
Perl432330–45
Erlang435445–65
Racket325340–60

Notes on the ratings. Go's concept score is entirely concurrency; the rest of the language is deliberately small. Perl's syntax score is high because of sigils and context, a rule that has no equivalent in most languages, and its debugging score is high because a typo can be silently valid. Erlang is hard on every axis at once: unfamiliar syntax, an unfamiliar build tool, and a model that asks you to unlearn defensive programming. Racket's syntax is trivial to read after an hour, and its concept score comes entirely from macros and phase separation.

Learning goals, stated as things you will be able to do

Section 6Detailed syllabi

Each course follows the same shape: Part 0 (what we are building), Part 1 (install and first program), Part 2 (language crash course), then twelve milestones, then an advanced phase, a final challenge, and a knowledge check. Below is the milestone plan for each.

Course 1 — Go: Digital Ant Colony

#MilestoneConcepts introduced
1One ant on a grid, tickingstructs, methods, pointers, slices, CLI flags, package layout
2A thousand ants, still sequentialmaps, deterministic randomness, table tests, benchmarks as a baseline
3Behaviour: forage, carry, returninterfaces, state machines, errors and errors.Is
4Each ant becomes a goroutinegoroutines, WaitGroup, the first real data race, go test -race, mutexes
5Replace locks with channelschannels, select, the world as a single owning goroutine, request/reply
6Pheromones and evaporationtickers, fan-in, buffered channels, time in simulations
7Graceful shutdowncontext, signal handling, errgroup, goroutine-leak tests
8Chaos: crashes, drops, slow antspanic/recover, supervisor goroutines, timeouts, fault injection as config
9Metrics and introspectionatomics, expvar, an HTTP endpoint, net/http/pprof
10Live visualisationterminal rendering, a web view over server-sent events, decoupling render from simulation
11Backpressure and performanceworker pools, bounded queues, load shedding, escape analysis, allocation profiles
12Multiple colony nodes over the networkencoding, TCP servers, reconnection, partitions, chaos tests across processes

Course 2 — Ruby: Programmable Automation DSL

#MilestoneConcepts introduced
1A gem skeleton and a Step objectobjects, methods, bundler, project layout, irb
2pipeline "x" do ... end that runsblocks, yield, procs and lambdas, the builder pattern
3Bare keywords inside the blockinstance_eval, self, scope gates, the cost of a clean DSL
4Build an AST instead of executingvalue objects, immutability by convention, separating description from execution
5The execution enginethe interpreter pattern, a context object, step results, logging
6Failure handling: when_failed, retriesexception classes, ensure, retry, designing recoverable steps
7Steps registered dynamicallydefine_method, method_missing, respond_to_missing?, registries
8Steps that do real workHTTP, file and SQLite outputs, pluggable summarisers, configuration
9Testing a DSLRSpec, doubles, a test DSL for the DSL, contract tests for plugins
10Self-inspectionreflection, to_h, dry runs, graph rendering, instrumentation via module prepend
11Pipelines that rewrite themselvesAST transformation at run time, middleware, hooks, safety limits
12Ship it as a gemgemspec, versioning, a CLI, YARD docs, publishing

Course 3 — Perl: Text Archaeologist

#MilestoneConcepts introduced
1A filter that reads standard inputscalars, strict/warnings, perldoc, the diamond operator
2Counting and summarisingarrays, hashes, context (the rule with no equivalent elsewhere), sorting
3Parsing Apache and nginx logsregexes, named captures, anchors, greediness, //x readable patterns
4A record modelreferences, nested data, Data::Dumper, the arrow rule
5Splitting into modulespackages, lib/, use, cpanm, local::lib, dependency management
6Pluggable format readersCSV, JSON and XML modules, dispatch tables, sniffing formats
7Streaming a 10 GB fileline-by-line processing, encodings, memory profiling, malformed-input policy
8Entity extraction and normalisationIPs, timestamps, paths, identifiers; canonical forms; time zones
9Correlation and sessionisationtime windows, joins, SQLite via DBI, indexes
10A real command-line toolGetopt::Long, exit codes, signals, pipes, --help, composability
11Testing and profilingTest2, prove, fuzzing with corrupted input, Devel::NYTProf, optimisation
12The knowledge graphgraph storage, queries, forking for parallelism, plugin architecture, packaging

Course 4 — Erlang: The Internet That Never Dies

#MilestoneConcepts introduced
1The shell and a first moduleerl, expressions, atoms, compiling, rebar3
2Functions over datapattern matching, immutability, lists/tuples/maps, recursion, tail calls, guards
3A node as a raw processspawn, !, receive, mailboxes, selective receive
4Let it crashlinks, monitors, exit signals, trap_exit, why defensive code is discouraged
5The node as a gen_serverOTP behaviours, call vs cast, state, timeouts
6Supervision treesrestart strategies, intensity limits, dynamic children, startup ordering
7A network of a thousand nodesregistries, ETS, process groups, routing, message loss
8Chaos injectionrandom crashes, slow handlers, malformed messages, memory pressure
9Observabilitycounters, observer, recon, tracing a live system safely
10The live dashboardan HTTP server in Erlang, streaming updates, aggregation without slowing the system
11Actually distributedmultiple BEAM nodes, cookies, net_kernel, partitions, split brain
12Releases and property testsEUnit, Common Test, PropEr, relx releases, upgrades

Course 5 — Racket: Language Factory

#MilestoneConcepts introduced
1Racket, DrRacket, and racos-expressions, definitions, modules, the REPL
2Functional groundworklists, pairs, higher-order functions, recursion, match
3Structs and contractsstruct, contracts as executable specifications, error messages
4An interpreter for a config languageAST design, environments, evaluation, quote vs data
5First macrosdefine-syntax-rule, hygiene demonstrated by breaking it
6Real macrossyntax-parse, syntax classes, compile-time errors with source locations
7The finance DSLvalidation passes, a small type checker, phase separation
8The toolkit itselfgenerating parsers, AST types and checkers from a specification
9Your own #langreaders, module languages, #lang finance files that run
10The robot DSLeffects, sequencing, a stepper, interpreters as libraries
11Compiling instead of interpretingmacro-based compilation, benchmarks against the interpreter
12Tooling and the game DSLrackunit, editor integration, packaging, the capstone language

The Mewlang cat, walking off to start the first courseThat's the whole curriculum. Go is first, so its instalment picks up next: what we're building (an ant colony that finds itself corrupting its own state the moment it goes concurrent, and the idiom that fixes it), installing the toolchain, and a full language crash course, before Milestone 1 begins.


Next: Go instalment