Skip to content

Core curriculum

This is the default path for a generalist software engineer. It is ordered by dependency, not by the numbering of the reference chapters. Expect to spend more time building than reading.

1. Programming and debugging

Outcome: Write a small program, inspect its state, handle failures, and use tests to change it safely.

The guided modules use Python. You can adapt them to Rust when systems programming is the goal, but keep the same observable outcomes and evidence.

2. How programs run

Outcome: Explain what happens between starting a process and executing an instruction, and diagnose basic CPU, memory, disk, and process problems.

3. Data structures and algorithms

Outcome: Choose structures from access patterns and constraints instead of habit.

Dynamic programming and greedy algorithms are optional until a real problem requires them.

4. Networks, APIs, and storage

Outcome: Trace a request across name resolution, network transport, HTTP, application code, and a database.

5. Security and correctness

Outcome: Define trust boundaries and defend common application flows without inventing cryptography.

Use current primary guidance—such as OWASP and vendor documentation—for security-sensitive implementation details.

6. Design and delivery

Outcome: Organize a service so that it can be changed, reviewed, built, and deployed predictably.

7. Production and reliability

Outcome: Operate the service, observe its behavior, and respond to failure.

8. Distributed systems

Outcome: Recognize when distribution is necessary and reason about partial failure, consistency, retries, and duplicate work.

Finish with evidence

Complete the production service project. Keep a short decision log containing the problem, options, evidence, choice, and conditions that would cause you to revisit it.