Skip to content
liter8.sh
More
~/liter8/Makefile

The roadmap

Where to start, and why.

Nineteen gyms is a menu, not a path. This is the path. A Makefile is the oldest dependency graph in software: a target, what it needs first, and the recipe. Every gym below is listed after the ones it needs, with the reason on the edge.

The road, in two minutes

› read the transcript instead
  1. 1. What the job is

    Someone taps Pay. The tap becomes a request. It crosses a network to a server. Code runs. It asks a database. The answer travels all the way back. That trip is the job: knowing what happens between the tap and the answer.

  2. 2. The model writes now

    Today a model writes most of that code, in seconds. It is usually right. Here, one line is not. Writing got cheap. Judging did not. Someone has to read it: you.

  3. 3. The floor

    Reading starts lower than code. Everything is typed into a prompt: shell. Every change is a commit, and a diff is two commits compared: git. And you run the program in your head. b = a; b.push(3). What is a? Both. They are the same list. That is run, the first gym. Optional extras: regex to read patterns, vim to stop thinking about your editor.

  4. 4. Reading

    Back to the line nobody noticed. Review: find the defect, then prove it with one input that breaks it. Test: a green suite is a claim. Break the code and see if it notices. This is the whole idea. The rest is reading in special places.

  5. 5. The trip: data and wire

    Now replay the trip. Every stop is a place you will learn to read. The database: a query is a program (sql), and a migration is a lock (schema). The wire: DNS, TCP, TLS and HTTP before your code sees anything (net). The machine: processes and pipes (linux), two threads at once (concurrency).

  6. 6. The trip: ship and operate

    Shipping: packed in a container, rolled out by deploy, servers declared by infra. License: trace the grants, notices and source obligations in the release. Operating: build a system and break it under load (system-design). Find the hole, and prove it with one request (secure). It breaks at 3am. You get paged, read the trace, prove why (debug).

  7. 7. Why gyms

    Not a video and a quiz. A gym. Predict what happens. A real engine runs it. See if you were right. Real engines, grading you can check, no account. Free.

  8. 8. Where you start

    So, where do you start? Never written a loop? Learn to code first. start8 is for that. Can write a loop? Start at run, and follow the path below.

Complete beginner? Run make all and start at the top. Know what you want? Pick a goal and the list shrinks to what that goal actually needs. Mark what you already have as up to date; make skips those.

There is no syntax course or algorithms gym at the top, and that is deliberate. Both grade you on writing code that passes, which is the part a model now does. The top is run: the code already exists, and you say what it will do before it does it. Sorting and caching still turn up there, as programs to predict rather than problems to solve.

Never written a line of code? Learn to code anyway, even though the model will write most of it — you cannot judge code you have never written. start8 ↗ teaches exactly that, outside the path. Come back to run when you can write a loop over a list.

Goal
make

The whole path, every target in dependency order. Start here if you do not know what you would fail.

19 targets for ‘all’

Dependency graph

the graph · left needs nothing, right needs everything · click a target to jump to its rule

1. The floor

# What you type into, and what happens when you press enter. Every other gym is driven from a prompt and written in a language; the machine under the program, the shell, the object model under your commits, and the patterns in your greps are the substrate.

  1. [1/19]run.liter8.shstart here

    Run — Predict the state before you press run

    # Needs nothing, and everything after it assumes it. This is where a basic-programming or algorithms course would sit, and it is neither: those grade code you wrote, and a model now writes that. Before you can read what a model wrote you have to be able to execute it in your head: what a name holds, which two names hold the same object, and what runs next.

    first
    if you cannot write a loop over a list yet: start8 ↗ — outside the path.
    needs
    — nothing. This is where the path starts.
    unlocks
    Review
    skip if
    you can say what a holds after const a = [1,2]; const b = a; b.push(3)
    Open run.liter8.sh ↗9 lessons · 16 exercises
  2. [2/19]shell.liter8.sh

    Shell — The last interface that does not guess what you meant

    # Needs nothing. Everything else is typed into this: the filesystem, the process, the quote you forgot.

    needs
    — nothing. This is where the path starts.
    unlocks
    GitRegexVimNetLinux
    skip if
    you can say why rm -rf "$DIR"/ and rm -rf $DIR/ differ when DIR is unset
    Open shell.liter8.sh ↗24 lessons · 7 tracks
  3. [3/19]git.liter8.sh

    Git — Practise on a real object model

    # A diff is the unit of review, and a diff is a difference between two commits. Learn what a commit points to before you read what changed between them.

    needs
    • Shellgit is a command-line tool; the prompt, paths and pipes are assumed
    unlocks
    ReviewInfra
    skip if
    you can explain what git reset --hard does to the index, the worktree and the reflog
    Open git.liter8.sh ↗22 lessons · 26 drills
  4. [4/19]regex.liter8.shelective · nothing needs it

    Regex — Say what it matches before you run it

    # The first thing you will read that looks like line noise. Predict what a pattern matches before you trust a grep, a validator, or a generated route.

    needs
    • Shellpatterns show up first in grep and sed at the prompt
    unlocks
    — a leaf.
    skip if
    you can say what a*? matches, and what makes (a+)+$ hang
    Open regex.liter8.sh ↗18 lessons · 36 drills · 23 tasks
  5. [5/19]vim.liter8.shelective · nothing needs it

    Vim — Practise until it becomes instinct

    # Optional and orthogonal. Speed, not understanding. Do it whenever; it only asks that you already live in a terminal.

    needs
    • Shellthe editor lives in the terminal
    unlocks
    — a leaf.
    skip if
    you already have an editor you do not think about
    Open vim.liter8.sh ↗51 lessons · 120 drills

2. Reading

# The thesis of the site. The model writes the code; you make the call — and reading is how you make it. Everything after this is a specialised way of reading.

  1. [6/19]review.liter8.sh

    Review — Read the diff like it's lying to you

    # The thesis. Read a diff the model wrote, find the one defect, prove it with an input. Never skip this.

    needs
    • Runa defect is something the program does; you cannot find one in a diff you cannot execute in your head
    • Gita diff is a difference between commits; you need the object model to know what a diff is
    unlocks
    TestLicenseSecure
    skip if
    don't. This is the thesis.
  2. [7/19]test.liter8.sh

    Test — A green suite is a claim

    # A green suite is a claim about the code. You have to be able to read the code before you can judge the claim; then watch an engine break the code under your tests.

    needs
    • Reviewmutation testing is code review run backwards: you judge whether the test would catch the defect you learned to spot
    unlocks
    Concurrency
    skip if
    you know what a mutant is and have killed one
    Open test.liter8.sh ↗10 lessons · 8 tracks

3. Data

# The first place the cost is not in the source. A query is a program a planner runs; a migration is a lock you did not see.

  1. [8/19]sql.liter8.sh

    SQL — Read the plan, not the query

    # A query is a program that a planner runs. Read the plan the way you read the diff: the cost is in the pages, not the SELECT.

    needs
    — nothing. You can start here, whatever you have done before.
    unlocks
    SchemaSystem DesignSecure
    skip if
    you can read EXPLAIN and say why a sequential scan happened
    Open sql.liter8.sh ↗23 lessons · 7 tracks
  2. [9/19]schema.liter8.sh

    Schema — Migrations that don't lock the table

    # A migration is a lock you did not see. You need tables, indexes and transactions in hand before you watch a lock queue form behind an ALTER.

    needs
    • SQLlocks are taken on tables you must already know how to query and index
    unlocks
    Deploy
    skip if
    you know which ALTER TABLE takes ACCESS EXCLUSIVE and for how long
    Open schema.liter8.sh ↗9 lessons · 10 tasks · 5 audits

4. The wire and the machine

# Requests cross a network and land on a kernel. What a handshake costs, what a file descriptor is, and why two threads disagree.

  1. [10/19]net.liter8.sh

    Net — Read the handshake, not the docs

    # Every request crosses DNS, TCP, TLS and HTTP before your handler sees it. Reading a capture is reading a trace; the latency budget is arithmetic.

    needs
    • Shellcaptures and curl are read from the prompt; the shell gym is where you learned to read command output at all
    unlocks
    DeploySystem DesignSecureDebug
    skip if
    you can read a TCP handshake in a capture and say where the third round-trip went
    Open net.liter8.sh ↗9 lessons · 7 tasks
  2. [11/19]linux.liter8.sh

    Linux — Read the strace, not the man page

    # The shell is what you type; the kernel is what happens. A pipe at the prompt is two file descriptors here.

    needs
    • Shellthe shell gym leaves you knowing what a pipe does; this one shows what it is
    unlocks
    ContainerDebug
    skip if
    you can say what a file descriptor is without saying "a file"
    Open linux.liter8.sh ↗12 lessons · 5 tasks · 4 audits
  3. [12/19]concurrency.liter8.sh

    Concurrency — The bug that only happens on the fourteenth Tuesday

    # A concurrent bug is an assertion that holds under one interleaving and fails under another. You need to be able to write the assertion first.

    needs
    • Testthe engine searches for the schedule that breaks your assertion; you learned to write assertions that mean something in test
    unlocks
    — a leaf.
    skip if
    you can name the interleaving that breaks a check-then-act

5. Shipping

# How code gets to the machine: a filesystem diff, a plan you should read before applying, and a loop that fights you.

  1. [13/19]container.liter8.sh

    Container — An image is a filesystem diff, not a zip

    # An image is a filesystem diff; a container is namespaces plus cgroups. Both are kernel objects, so the kernel comes first.

    needs
    • Linuxnamespaces, cgroups and SIGTERM delivery are the linux gym's model, copied
    unlocks
    LicenseDeploy
    skip if
    you can predict which layers rebuild when one Dockerfile line changes
    Open container.liter8.sh ↗9 lessons · 9 tasks · 5 drills
  2. [14/19]infra.liter8.sh

    Infra — Read the plan before you apply

    # A plan is a diff between declared state and recorded state. Read it before you apply it, the way you read a diff before you merge it.

    needs
    • Gita plan is read like a diff: what is added, what is destroyed, what is quietly replaced
    unlocks
    — a leaf.
    skip if
    you can read a plan and spot a destroy-and-recreate
    Open infra.liter8.sh ↗9 lessons · 8 tasks · 6 drills · 4 audits
  3. [15/19]license.liter8.sh

    License — A dependency is a legal contract, not an npm import.

    # A release carries grants, notices and source obligations. Read the dependency boundary before shipping it.

    needs
    • Reviewlicensing evidence and release changes need the same careful reading as code
    • Containerthe distributed artifact determines which dependencies and notices ship
    unlocks
    — a leaf.
    skip if
    you can trace a distributed dependency's grant, attribution and source obligations
    Open license.liter8.sh ↗8 tracks · 16 drills · 6 audits
  4. [16/19]deploy.liter8.sh

    Deploy — Declare the state, then watch the loop fight you

    # A rollout is old and new code running side by side against one database, in containers a scheduler placed, behind probes that speak HTTP. Three gyms, all at once.

    needs
    • Containerpods are containers; SIGTERM and the entrypoint are the same story
    • Netreadiness probes, timeouts and the retry loop are network behaviour
    • Schemaold and new application code against one live table is the schema gym's central exercise
    unlocks
    — a leaf.
    skip if
    you know what a failing readiness probe does to a rollout
    Open deploy.liter8.sh ↗10 lessons · 6 tasks · 2 incidents

6. Operating

# The capstones. Build a system and break it, prove the exploit, and get paged. Everything above is what you need to read the trace.

  1. [17/19]system-design.liter8.sh

    System Design — Learn by operating systems

    # Build an architecture, generate traffic, break it. Every box is a database or a network hop; you need both before the diagram means anything.

    needs
    • SQLa cache, a replica and a queue are all answers to what a query costs
    • Netlatency, loss and retries are what the traffic simulator is made of
    unlocks
    Debug
    skip if
    you can say what a cache does to p99 under a thundering herd
    Open system-design.liter8.sh ↗39 lessons · 4 labs · 4 missions
  2. [18/19]secure.liter8.sh

    Secure — Prove the exploit

    # Read a generated handler, prove the exploit with a request, ship the fix. Review gave you the reading, net gave you the request, sql gave you the injection.

    needs
    • Reviewthe same loop: find the defect, prove it with a witness
    • Netthe attacker console speaks HTTP; you need to know what a request is
    • SQLinjection is the canonical class; you need to know what the query would have done
    unlocks
    — a leaf.
    skip if
    you can turn a handler into an exploit request
    Open secure.liter8.sh ↗21 lessons · 41 exercises
  3. [19/19]debug.liter8.sh

    Debug — Find the fault before the clock does

    # The capstone. Get paged, read traces, logs and metrics, prove the diagnosis. Every trace is a request through a system on a machine.

    needs
    • System Designthe incident is in an architecture you must be able to picture
    • Netthe trace is a request; the timeout is a handshake
    • Linuxthe metric is a process; the log line came from a file descriptor
    unlocks
    — a leaf.
    skip if
    don't. This is where all of it gets tested.

Already know where you are? Pick whichever you'd fail today.