20 reading paths
Codebase Tours
CODEBASE-TOURS, Guided Reading de Repos Canônicos
Ler código de produção de classe mundial é uma das atividades de maior alavancagem em engineering. Mas repos grandes são intimidantes, V8 tem 5M+ linhas; Linux kernel tem 30M+. Sem mapa, abrir GitHub é overwhelming.
Este doc é o mapa: para cada repo canônico, exatamente quais arquivos abrir, em qual ordem, e o que procurar. Cada tour estima 4-12 horas de leitura ativa (não passive scroll).
Como usar: 1 repo por mês ao longo de cada estágio. Não tente ler tudo. Cada tour é satisfatório standalone.
Como ler código de produção
Antes de qualquer tour:
- Não leia linearmente. Comece pelo ponto de entrada (main, server.start), siga o fluxo de uma operação real.
- Tenha pergunta específica: "como esse engine faz X?" Sem pergunta, leitura é entretenimento.
- Anote em journal: pattern visto, surpresa, dúvida. Entries pra Anki + journal de descobertas.
- Compile e rode local quando possível. Quebra mental "código mágico" → "código que roda no meu PC".
- Use IDE com goto-definition, não browser. Navigation matters em codebase grande.
- Assista talks dos autores antes/depois, frequentemente explicam por que decisions, que código não diz.
- Não leia testes em vez de código (tests são specs, não implementation).
- Aceite buracos: você não vai entender 80% do repo. Pega 20% que importa.
Tour 1: V8 (engine JavaScript), para 01-07, 01-13, 01-14
Repo: github.com/v8/v8 Linguagem: C++, alguns assembly. Tamanho: ~5M LOC. Tour estimate: 8-12 horas.
Pergunta orientadora: como V8 transforma function add(a,b){return a+b} em código de máquina e otimiza?
Path:
src/parsing/parser.cc(parser top-level). Skim. Identifique recursive descent. Compare com 01-13.src/parsing/scanner.cc(lexer). Veja state machine de tokens.src/ast/ast.h(AST nodes). Hierarchy.src/interpreter/interpreter.cc+bytecode/bytecode-generator.cc(Ignition, interpretador bytecode). Como AST → bytecode.src/objects/objects.h+map.h(V8 hidden classes ≡ Maps). Where shapes live. Crítico pra 01-14 perf.src/compiler/turbofan.cc(otimizador). Não tente entender; só veja escala. JIT optimizing tier.src/heap/heap.cc+mark-compact.cc(GC). Generational + mark-compact. Connecta com 01-13 §2.10.
What to look for:
- Tipos de IC (Inline Cache) em
src/ic/. - Como
Object.fooacessa hidden class. - O que dispara deopt em TurboFan.
- Generational hypothesis em código.
Talks complementares:
- "Inside V8", Franziska Hinkelmann.
- "V8 internals: Things you do not want to forget", Sigmund Cherem.
Notes pra journal:
- Hidden class transitions tracked como Map → Map links.
- Inline cache hit / miss distinction.
- Bytecode handlers em assembly (template tail call).
Tour 2: PostgreSQL, para 02-09, 03-13, 04-09, 04-14
Repo: github.com/postgres/postgres Linguagem: C. Tamanho: ~2M LOC. Tour estimate: 12-20 horas (Postgres é denso).
Pergunta orientadora: como Postgres executa SELECT * FROM users WHERE email = $1?
Path:
src/backend/tcop/postgres.c(PostgresMain): main loop por backend process. Recebe query, dispatch.src/backend/parser/: parser SQL.gram.yé Bison grammar.src/backend/optimizer/(planner):plan/planmain.cstart. Cost-based.src/backend/executor/execMain.c: volcano-style iterators.src/backend/access/heap/heapam.c: heap access (tuples, MVCC core). xmin/xmax visíveis.src/backend/access/nbtree/: B-Tree implementation. Postgres é referência canônica.src/backend/storage/buffer/bufmgr.c: shared buffer pool.src/backend/access/transam/xlog.c: WAL implementation.src/backend/storage/lmgr/: lock manager.src/backend/utils/mmgr/aset.c: Postgres memory allocator (memory contexts).
What to look for:
- Tuple visibility check:
HeapTupleSatisfiesMVCC. - ANALYZE collecting stats:
src/backend/commands/analyze.c. - Vacuum:
src/backend/commands/vacuum.c. - Logical replication:
src/backend/replication/logical/. - pg_stat_statements:
contrib/pg_stat_statements/.
Talks complementares:
- Bruce Momjian, series sobre Postgres internals.
- Egor Rogov "PostgreSQL 14 Internals" book (gratuito).
Notes pra journal:
- Tuple header layout (xmin, xmax, ctid).
- Plan tree pra simple SELECT.
- Como WAL é flushed em commit.
Tour 3: Redis, para 02-11
Repo: github.com/redis/redis Linguagem: C. Tamanho: ~150k LOC. Compacto. Tour estimate: 4-8 horas. Mais acessível que Postgres.
Pergunta orientadora: como Redis processa ZADD myset 5 hello em < 1ms?
Path:
src/server.c(main,serverCron,processCommand). Single-threaded event loop.src/networking.c: client connection handling.src/dict.c: hash table implementation (incremental rehashing!). Beautiful code.src/t_zset.c: sorted set (skip list + dict). Reference implementation skip list.src/t_hash.c,src/t_string.c,src/t_list.c,src/t_set.c: data types.src/aof.c: AOF persistence.src/rdb.c: snapshot persistence.src/cluster.c: clustering (gossip).src/replication.c: master-replica.
What to look for:
- Como event loop (
ae.c) implementa epoll/kqueue. - Skip list implementation (clássica).
- Incremental rehash: hash table grows sem stop-the-world.
- LRU eviction approximation.
Notes pra journal:
- Single-threaded design e implications.
- Como AOF rewrite acontece sem block.
- Sorted set = skip list + hash side-by-side, why both.
Tour 4: libuv, para 02-07, 01-02
Repo: github.com/libuv/libuv Linguagem: C. Tamanho: ~80k LOC. Tour estimate: 4-6 horas.
Pergunta orientadora: como Node executa fs.readFile(path, callback) sem bloquear?
Path:
docs/src/design.rst: doc oficial design.src/unix/core.c(uv_run): event loop.src/unix/async.c: async handles.src/unix/threadpool.c: thread pool pra fs/DNS/work.src/unix/fs.c: fs operations.src/unix/tcp.c,udp.c: network.src/unix/poll.c: poll handle.src/unix/timer.c: timers (binary heap).
What to look for:
- 7 phases do event loop (timers, pending callbacks, idle/prepare, poll, check, close).
- Como threadpool work é signaled de volta ao loop main.
- Timer heap.
- File watcher.
Talks complementares:
- "What the heck is the event loop anyway?", Philip Roberts.
- "In The Loop", Jake Archibald.
Tour 5: React reconciler (Fiber), para 02-04
Repo: github.com/facebook/react Linguagem: JS (Flow types). Tamanho: ~500k LOC. Tour estimate: 6-10 horas.
Pergunta orientadora: como React decide o que re-render quando state muda?
Path:
packages/react/src/ReactHooks.js: hooks API.packages/react-reconciler/src/ReactFiber.js: fiber node structure.packages/react-reconciler/src/ReactFiberWorkLoop.js: work loop.packages/react-reconciler/src/ReactFiberBeginWork.js: render phase.packages/react-reconciler/src/ReactFiberCommitWork.js: commit phase.packages/react-reconciler/src/ReactFiberHooks.js: hooks state internamente.packages/react-reconciler/src/ReactFiberLane.js: lane prioritization (concurrent).packages/scheduler/src/forks/Scheduler.js: scheduling.
What to look for:
- Fiber as work unit.
- Reconciliation diff algorithm.
- Suspense / lazy in
ReactFiberThrow.js. - Concurrent mode lanes.
- Como hook state é stored (linked list per fiber).
Talks:
- "A Cartoon Intro to Fiber", Lin Clark.
- "React Without Memo", Xuan Huang.
Tour 6: CockroachDB, para 04-01, 04-09, 04-14
Repo: github.com/cockroachdb/cockroach Linguagem: Go. Tamanho: ~3M LOC. Tour estimate: 10-15 horas.
Pergunta orientadora: como Cockroach faz consistent distributed SQL com Raft?
Path:
docs/RFCS/: leia 3-5 RFCs antigos. Stupid important pra ver decisions.pkg/sql/: SQL layer.pkg/kv/: KV layer abstraction.pkg/storage/: Pebble (LSM) storage.pkg/kv/kvserver/replica.go: Raft replica.pkg/raft/: Raft implementation (etcd-io/raft fork).pkg/server/: node lifecycle.pkg/util/timeutil/+ clock: HLC (Hybrid Logical Clock).
What to look for:
- Range = unit of replication. ~512MB.
- Lease holder e proposal flow.
- Distributed transactions com 2PC + parallel commits.
- Schema changes online.
- TPC-C benchmark code.
Talks:
- "Cockroach Labs Engineering YouTube", series.
- Aphyr Jepsen analysis (revealing).
Tour 7: Kubernetes scheduler, para 03-03, 05-01
Repo: github.com/kubernetes/kubernetes Linguagem: Go. Tamanho: ~2M LOC. Tour estimate: 8-12 horas.
Pergunta orientadora: como K8s decide em qual node colocar pod?
Path:
pkg/scheduler/: scheduler main.pkg/scheduler/framework/: scheduling framework (extension points).pkg/scheduler/scheduler.go(scheduleOne): main loop.pkg/scheduler/framework/plugins/: filter + score plugins.pkg/controller/: control loops (deployment, replicaset).pkg/kubelet/: node agent (PLEG, etc.).pkg/apis/core/v1/types.go: schema central.
What to look for:
- Filter (predicate) → Score (priority) flow.
- Preemption logic.
- Volume binding.
- Scheduling profiles.
- PriorityClass.
Notes:
- Scheduler é replaceable. Plugins.
- Custom schedulers em
pkg/scheduler/framework/plugins/.
Tour 8: Linux Kernel (mini-tour), para 01-02
Repo: github.com/torvalds/linux Linguagem: C. Tamanho: ~30M LOC. Não tente ler tudo. Tour estimate: 6-10 horas pra mini-tour.
Pergunta orientadora: como kernel faz process scheduling e syscall dispatch?
Path:
Documentation/scheduler/: docs.kernel/sched/core.c(schedule,__schedule): scheduler entry.kernel/sched/fair.c: CFS (Completely Fair Scheduler).kernel/sched/sched.h: rq struct.fs/read_write.c(ksys_read): syscall implementation.kernel/fork.c(do_fork): process creation.mm/page_alloc.c: page allocator.kernel/futex.c: futex (revisita 01-11).
What to look for:
- CFS rb-tree.
- Context switch (
__switch_to). - Page fault handler em
mm/memory.c. - O_DIRECT path bypassing page cache.
Talks:
- "Linux scheduler internals", Brendan Gregg.
- Linux Foundation talks.
Tour 9: Apache Kafka, para 04-02, 04-13
Repo: github.com/apache/kafka Linguagem: Scala (legacy) + Java (newer). Tamanho: ~700k LOC. Tour estimate: 8-12 horas.
Pergunta orientadora: como Kafka mantém append-only log distribuído com partições?
Path:
docs/: papers e design docs Kafka.core/src/main/scala/kafka/server/: KafkaServer.core/src/main/scala/kafka/log/: log impl (segments).core/src/main/scala/kafka/cluster/: partition + ISR.raft/src/main/java/org/apache/kafka/raft/: KRaft (replacement for ZK).clients/src/main/java/org/apache/kafka/clients/producer/: producer client.clients/src/main/java/org/apache/kafka/clients/consumer/: consumer client.
What to look for:
- Log segment structure.
- Index files (sparse).
- ISR (In-Sync Replicas) manager.
- Group coordinator (consumer group).
- Exactly-once via transactional producer.
Talks:
- "Kafka Internals", Jun Rao + others.
- Confluent blog deep dives.
Tour 10: TigerBeetle (financial DB), para 02-18, 04-14
Repo: github.com/tigerbeetle/tigerbeetle Linguagem: Zig. Tamanho: ~50k LOC. Compacto. Tour estimate: 4-8 horas.
Pergunta orientadora: como TigerBeetle faz double-entry ledger seguro a 1M+ TPS?
Path:
README.md+ design docs.src/state_machine.zig: ledger logic.src/vsr/: Viewstamped Replication.src/tigerbeetle/: client.src/lsm/: LSM storage custom.
What to look for:
- Static memory allocation (zero malloc em hot path).
- Determinism strict.
- Deterministic simulation testing.
- VSR consensus.
Talks:
- TigerBeetle YouTube, Joran Dirk Greef explica devirtualization.
- Will Wilson "Why Are You Lying?" (DST).
Tour 11: Bevy ECS, para 05-10
Repo: github.com/bevyengine/bevy Linguagem: Rust. Tamanho: ~250k LOC. Tour estimate: 6-10 horas.
Pergunta orientadora: como ECS torna game engine cache-friendly + parallel?
Path:
crates/bevy_ecs/src/world/: World struct.crates/bevy_ecs/src/storage/: archetype storage (table-based).crates/bevy_ecs/src/query/: queries.crates/bevy_ecs/src/system/: systems + scheduling.crates/bevy_app/: App lifecycle.crates/bevy_render/: renderer.
What to look for:
- Archetypes (component combinations) optimization.
- Schedule graph (parallel execution).
- Change detection.
- Reflection.
Tour 12: Stripe SDK Node, para 02-18
Repo: github.com/stripe/stripe-node Linguagem: TypeScript. Tamanho: ~30k LOC. Tour estimate: 2-4 horas.
Pergunta orientadora: como SDK lida com idempotency, retries, error mapping?
Path:
src/Stripe.ts: client constructor.src/StripeResource.ts: base resource pra retry, error mapping.src/Webhooks.ts: signature verification.src/resources/: per-resource clients (PaymentIntents, etc.).
What to look for:
- Idempotency-Key auto-injection.
- Exponential backoff retry.
- Stripe-Account header pra Connect.
- Webhook signature verification timing-safe.
Tour 13: TLA+ Examples, para 04-14
Repo: github.com/tlaplus/Examples Linguagem: TLA+, PlusCal. Tamanho: ~50 specs reais. Tour estimate: 6-10 horas.
Path por tema:
specifications/Paxos/: Paxos completo.specifications/Raft/: Raft.specifications/MissionariesAndCannibals/: PlusCal intro.specifications/distributed_systems/: protocolos.specifications/byzantine/: Byzantine fault.specifications/cassandra/: real-world DB spec.
What to look for:
- Como Init e Next são definidos.
- Invariantes safety vs liveness.
- Counter-examples gerados por TLC.
Tour 14: Tokio (Rust async runtime), para 03-11, 01-11
Repo: github.com/tokio-rs/tokio Linguagem: Rust. Tamanho: ~150k LOC. Tour estimate: 6-10 horas.
Path:
tokio/src/runtime/scheduler/: scheduler (work-stealing).tokio/src/sync/: sync primitives.tokio/src/io/: async I/O.tokio/src/task/: task management.
What to look for:
- Work-stealing scheduler.
- Cooperative scheduling.
- IO-driver integration com epoll/kqueue/io_uring.
- Mutex async vs std blocking.
Tour 15: Caddy / nginx, para 02-14, 04-05
Para entender HTTP server e reverse proxy real.
Caddy (github.com/caddyserver/caddy), Go, mais legível. nginx (github.com/nginx/nginx), C, classic.
Pergunta: como reverse proxy multiplexa connections, cache, terminação TLS?
Estimate: 4-6 horas Caddy; 8-12 nginx.
Tour 16: Excalidraw, para 05-02 (CRDT capstone)
Repo: github.com/excalidraw/excalidraw Linguagem: TypeScript. Tour estimate: 4-6 horas.
Path:
src/excalidraw-app/collab/: collaboration logic.src/components/App.tsx: top-level app.src/element/: shape model.src/scene/Scene.ts: rendering loop.
What to look for:
- WS sync flow.
- Conflict resolution simple.
- Pointer-based collaboration.
Tour 17: SQLite (mini-DB), para 05-01, 02-09
Repo: sqlite.org (não GitHub direto; trunk em fossil). Linguagem: C. Tamanho: ~150k LOC. Tour estimate: 8-12 horas.
Path:
src/main.c: API entry.src/btree.c: B-Tree.src/pager.c: page management.src/wal.c: WAL mode.src/vdbe.c: virtual machine bytecode.
SQLite é referência mais legível que Postgres pra entender DB internals. Pra 05-01 build-from-scratch.
Tour 18: io_uring / Linux async, para 03-10, 01-02 advanced
Repo: github.com/axboe/liburing + linux kernel io_uring/.
Linguagem: C.
Tour estimate: 6-10 horas.
Path:
- liburing examples first.
- Kernel
io_uring/io_uring.c, submission queue, completion queue.
io_uring é onde Linux async vai. Vale entender.
Tour 19: Bun runtime, para 02-07, 01-13
Repo: github.com/oven-sh/bun Linguagem: Zig + JS. Tour estimate: 6-10 horas.
Path:
src/bun.js/: JavaScript runtime.src/bundler/: bundler.src/install/: package manager.
Bun mostra alternative architecture pra Node, JavaScriptCore vs V8, Zig vs C++.
Tour 20: Anthropic Cookbook + LangGraph, para 04-10
Repos:
Tour estimate: 4-8 horas combined.
What to look for:
- Tool use patterns.
- RAG implementation real.
- Agent loops.
- Token counting + cost tracking.
Cadência sugerida
- 1 tour por mês: 12 anuais. Após 12, você cobriu maior parte da ecosystem.
- Pair com módulo do framework: tour só faz sentido após módulo conceitual passar.
- Journal entries: 3-5 frases por tour, "o que mais surpreendeu".
Dicas finais
- Forke e clone: faça anotações in-tree.
// NICOLAS: aqui é onde MVCC vive. - Compare versões:
git logvelho mostra evolução. "Como era em 2014?" é educativo. - Issues e PRs antigos são tesouros. Decisions documentadas.
- Tests completam visão.
tests/reveals invariants oficiais. - Não fique frustrado com 80% incompreensível. Pega 20% que importa.
- Leia código bom até virar reflexo. Você reconhece "esse código é production-grade" depois.
Tour é skill. Skill cresce com uso.