You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Star1 (1)You must be signed in to star a repository
About
Practice building the concurrent components that backend systems are made of — worker pools, batchers, retries, leases, circuit breakers — in Go, with race-checked tests on virtual time and an optional AI tutor.
Practice tasks for experienced Go engineers: build the concurrent components
that backend and infrastructure systems are made of, and understand them well
enough to defend every design decision.
Worker pools, batchers, retries, deduplication, leases, circuit breakers,
snapshot publication — each task is one real component with a precise
set of requirements, a starter file, and tests that run under the race detector with
virtual time.
This is not an algorithms site and not interview simulation. Tasks take from
half an hour to a few hours.
Requirements
Go 1.26+
Optional: an AI coding agent (Claude Code, Codex, Cursor, ...) to act as a
tutor and reviewer. Instructions for it are in AGENTS.md.
How to use
Fork the repository and solve tasks in place: your fork keeps your solutions
and your progress.
Pick a task from the list below, read <task>/README.md, answer the
"Before coding" questions for yourself, then implement <task>/starter.go. It
is the only file you need to change. Run the tests with:
go test -race -count=1 -timeout=60s ./001-bounded-map/
To start a task over:
git checkout -- 001-bounded-map/starter.go
With an AI tutor
Open the repository in your agent and say something like "start bounded-map".
The agent will walk you through clarification, invariants, implementation,
tests, and a review against the task's reviewer notes. In Claude Code you can
also use /start <task>, /hint, /review, and /next.
Without an AI tutor
Everything works without an agent. <task>/REVIEW.md contains the
reviewer notes: which failures the tests catch and which they do not, the
choices the statement leaves open, and follow-up questions. It is a spoiler —
read it after your attempt.
Tasks
Each task is a numbered directory in the repository root. Linked tasks are
available; the rest are planned and will appear under the same number.
Numbers group tasks by topic and order them within a topic, from simpler to
harder. You do not have to go through all 100 in sequence:
Start with "Concurrency and lifecycle". At least 001, 005, and 006:
bounded concurrency, shutdown, and the difference between waiting for work
and owning it. Almost everything else builds on these.
Then take topics in any order — by interest, by what your work needs,
or by what you find hardest. Within a topic, follow the numbers.
Leave the capstones for last. Each combines patterns from several
topics.
A few tasks build on specific earlier ones; their statements say so (for
example, 052 builds on 005, 023, and 047).
Limits, retries, circuit breaking, and hedging in one client
hard
097
crawler
Per-host limits, dedup, politeness, cancellation
hard
098
durable-job-worker
Claims, lease renewal, fencing, retries, shutdown
hard
099
workflow-engine-lite
DAG execution with durable resume and retries
hard
100
capability-executor
Bounded, deduplicated, retrying calls to external capabilities
hard
How the tests work
Every test runs with -race.
Concurrency tests run inside testing/synctest
bubbles: time is virtual, so timeouts and delays are tested instantly and
deterministically.
A test fails if your component leaves blocked goroutines behind
(deadlock: main bubble goroutine has exited but blocked goroutines remain).
Tests check the requirements and the failures that are hard to see by reading
code. Passing tests do not mean the design is good — that is what the review
is for.
Practice building the concurrent components that backend systems are made of — worker pools, batchers, retries, leases, circuit breakers — in Go, with race-checked tests on virtual time and an optional AI tutor.