Initial commit: Go SRE interview exercises
Includes solved 02-worker-pool and 09-safe-counter (mutex, atomic, sharded). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GbnJj9ZqEx9nUvzkjdwfMq
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
# Go SRE Interview Gym
|
||||
|
||||
A monorepo of hands-on exercises covering what actually gets asked in Go
|
||||
live-coding rounds for SRE roles. Each numbered folder is self-contained:
|
||||
|
||||
- `main.go` — the assignment (in comments) + a scaffold with TODOs and a small
|
||||
runnable demo
|
||||
- `main_test.go` — the interviewer: tests that define "correct", including the
|
||||
traps (goroutine leaks, races, boundary conditions)
|
||||
- `README.md` — the deep dive: why the idiom exists, what breaks in production,
|
||||
and the follow-up questions interviewers reach for
|
||||
|
||||
## Setup
|
||||
|
||||
Go ≥ 1.22 required (loop-variable semantics), any recent toolchain is fine —
|
||||
built and verified against **go 1.27**. Pure stdlib, zero dependencies.
|
||||
|
||||
## Workflow
|
||||
|
||||
```bash
|
||||
# pick an exercise, read the assignment in main.go, implement the TODOs
|
||||
go test -race ./01-url-health-checker/ # -race ALWAYS. non-negotiable.
|
||||
|
||||
# run everything you've solved so far
|
||||
go test -race ./...
|
||||
|
||||
# some exercises have benchmarks worth exploring
|
||||
go test -bench=. -cpu=1,4,8 ./09-safe-counter/
|
||||
```
|
||||
|
||||
Interview-realistic rules: timer set to 30 min, no autocomplete, no LSP if
|
||||
you're brave, and **narrate your reasoning out loud** — the talking is graded
|
||||
as much as the code.
|
||||
|
||||
## The ladder
|
||||
|
||||
| # | Exercise | Core skill | Freq in interviews |
|
||||
|---|----------|-----------|--------------------|
|
||||
| 01 | url-health-checker | bounded concurrency, ctx, HTTP hygiene | ★★★★★ |
|
||||
| 02 | worker-pool | channel closing protocol, WaitGroup | ★★★★★ |
|
||||
| 03 | rate-limiter | lazy state, mutex, monotonic time | ★★★★☆ |
|
||||
| 04 | log-topn | streaming, Scanner limits, map→sort | ★★★★☆ |
|
||||
| 05 | lru-cache | map+list composite, O(1) design | ★★★★☆ |
|
||||
| 06 | retry-backoff | jitter, ctx-aware sleep, error classes | ★★★☆☆ |
|
||||
| 07 | fan-in | leak-free cancellation, nil-channel trick | ★★★☆☆ |
|
||||
| 08 | graceful-shutdown | signals, Shutdown ctx inversion, k8s | ★★★☆☆ |
|
||||
| 09 | safe-counter | mutex vs atomic vs sharding, -race | ★★★★☆ (as warm-up) |
|
||||
| 10 | gotchas | "what does this print" trivia round | ★★★★★ |
|
||||
|
||||
Suggested order: 09 → 02 → 01 → 03 → 05 → 04 → 06 → 07 → 08, with gotchas (10)
|
||||
sprinkled daily. 09 first because it calibrates you on `-race`; 01/02 are the
|
||||
highest-yield; 08 is the best *conversation* generator in on-sites.
|
||||
|
||||
## Ground rules baked into the tests
|
||||
|
||||
- Tests use timeouts to catch deadlocks and missing `close()` — a hanging test
|
||||
is a failing test with extra steps.
|
||||
- Several tests count goroutines or track peak concurrency with atomics —
|
||||
read them after solving; test-writing techniques are interview material too.
|
||||
- Everything must pass under `-race`. A green test that fails `-race` is red.
|
||||
|
||||
## Note on the gotchas folder
|
||||
|
||||
`10-gotchas/*` are predict-then-run programs: ex02 deadlocks on purpose, ex11
|
||||
doesn't compile on purpose. Run them individually (`go run ./10-gotchas/ex01-loopvar/`),
|
||||
not as part of `go build ./...`. Answers are collapsed in `10-gotchas/README.md`.
|
||||
Reference in New Issue
Block a user