The Rust Learning Program — Complete Guide
A 1-Year Systems Programming Curriculum for Ashwin Hebbar
March 2026
Why Rust, and Why Now
You identified the problem accurately: years of Python-layer work — frameworks, APIs, LLM services — have made you fluent at connecting components but left the layers underneath invisible. Rust is not just another language to add to your resume. It is the specific tool that will force your brain to confront what Python hides:
- Ownership and borrowing → you will understand heap vs. stack, what “passing by reference” actually means in physical memory, and why Python objects carry so much hidden overhead
- No garbage collector → you will understand the cost Python pays on your behalf, and why it makes certain workloads fundamentally slow
- No implicit null → error handling becomes a compile-time, type-level concern instead of a runtime surprise
- Fearless concurrency → you will understand threads, shared mutable state, and data races at the type level before your program even runs
- The compiler as teacher → you cannot get Rust code to compile without understanding what it does. The borrow checker does not respond to prompts.
After a year of serious Rust, you will write better Python, better SQL, and better system designs — because you will understand what is happening underneath.
Time Budget
| Day | Hours | Notes |
|---|---|---|
| Monday–Friday | ~1 hr/day | After work. Focus on reading, exercises, small coding |
| Saturday + Sunday | ~4–5 hrs combined | Main project work, deeper study sessions |
| Weekly Total | ~8–10 hrs | Realistic with full-time work commitments |
| 1-Year Total | ~400–500 hrs | Enough for serious depth if used consistently |
How to split your time each week:
- Weekday evenings (4–5 hrs): Book chapters,
rustlingsexercises, small coding experiments, DSA practice - Weekend blocks (4–5 hrs): Project work, longer study sessions (Crust of Rust videos, etc.), debugging and iteration
Note on pacing: This program was redesigned from 6 months to 1 year to fit around real work commitments. The content and depth are unchanged — the timeline is simply more honest. Consistent 8–10 hrs/week beats sporadic 20-hour weeks every time.
Program Structure — 5 Phases over 52 Weeks
| Phase | Weeks | Focus | Projects |
|---|---|---|---|
| 1 | 1–6 | Language Foundations | csvq |
| 2 | 7–16 | Type System & Patterns | schemaguard + logr |
| 3 | 17–28 | Concurrency & Networking | HTTP Server + airpost |
| 4 | 29–40 | Performance & Finance | riskbook + xlsxfmt |
| 5 | 41–52 | Capstone | docforge OR formulaengine OR ruleforge |
Phase 1 — Language Foundations (Weeks 1–6)
Objective: Get fluent with ownership, types, error handling, and the compiler’s feedback loop.
Weekly Schedule:
- Week 1: Chapters 1–4 of the Book +
rustlingsvariables/functions/if. Weekend: set up your dev environment, write small programs. - Week 2: Revisit and deepen ownership — String vs &str, stack vs heap, Copy vs Move. Complete
rustlingsownership/borrowing sections. Wrestle with borrow checker errors intentionally. - Week 3: Chapters 5–7 (structs, enums, modules) +
rustlingsthrough enums. Weekend: practice pattern matching thoroughly. - Week 4: Revisit modules and visibility rules. Explore Rust by Example alongside. Start
csvqskeleton. - Week 5: Chapters 8–10 (collections, errors, generics) + remaining
rustlings. Weekend: corecsvqimplementation. - Week 6: Finish
csvq. Buffer week — revisit anything from weeks 1–5 that felt shaky. Review the Book chapters once more.
Study Material:
- The Rust Programming Language (official “Book”) — Chapters 1–10
rustlings— complete all exercises (non-negotiable)- Rust by Example — reference alongside the Book
Concepts to Internalize:
- Ownership, borrowing, and moves — understand why this model exists
- Stack vs. heap — concretely, where does data physically live
Result<T, E>andOption<T>— Rust’s replacement for exceptions and null- Structs, enums, pattern matching with
match - The module system and crate organization
Stringvs&str— understand the difference at the memory level- Basic I/O with
std::fsandstd::io
Project: csvq — A Command-Line CSV Query Tool
A fast CLI for ad-hoc CSV analysis. Think “ripgrep for tabular data.”
csvq data.csv --filter "age > 25" --select "name,age,salary" --sort "salary desc" --limit 20
csvq data.csv --group-by "department" --agg "avg(salary),count(*)"
csvq data.csv --stats
Full project details in the Project Specifications document.
End-of-Phase Check: Can you explain to someone what happens in memory when you assign a String vs a &str? Can you explain why the borrow checker rejected a specific piece of your code — not just how you fixed it, but why it was right to reject it?
Phase 2 — The Type System and Real-World Patterns (Weeks 7–16)
Objective: Master traits, generics, lifetimes, iterators, and production-grade error handling and serialization.
Weekly Schedule:
- Week 7: Chapters 10–13 (generics, traits, lifetimes, closures/iterators). Experiment with trait bounds in your own programs.
- Week 8: Deep dive into lifetimes — watch Crust of Rust: Lifetime Annotations. Write code that forces lifetime annotations, then figure out why.
- Week 9: Chapters 14–17 (cargo, smart pointers, trait objects). Understand
Box<T>,Rc<T>,Arc<T>,RefCell<T>. - Week 10: Deep dive smart pointers — watch Crust of Rust: Smart Pointers and Dispatch & Fat Pointers. Understand
dyn Traitvsimpl Traitat the vtable level. - Weeks 11–13: Build
schemaguard. Watch Crust of Rust: Iterators and Error Handling alongside. - Week 14:
thiserrorvsanyhowdeep dive,serde+serde_jsonthorough walkthrough. Read Rust for Rustaceans Chapters 1–3. - Weeks 15–16: Build
logr. Refactor code from previous weeks using new knowledge.
Study Material:
- The Rust Programming Language Chapters 10–17
- Jon Gjengset’s Crust of Rust YouTube series — at minimum: Lifetime Annotations, Iterators, Smart Pointers, Dispatch & Fat Pointers, Error Handling
- Rust for Rustaceans by Jon Gjengset — Chapters 1–5
serdedocumentation — read and work through examples
Concepts to Internalize:
- Generics with trait bounds (
fn process<T: Display + Debug>(item: T)) - Lifetimes — understand they describe relationships between references, not object duration
Box<T>(heap allocation),Rc<T>(shared ownership),Arc<T>(thread-safe shared ownership),RefCell<T>(interior mutability)- Static vs dynamic dispatch (
impl Traitvsdyn Trait) — understand the vtable - Iterator chains and lazy evaluation —
.filter().map().collect()patterns thiserrorfor library errors,anyhowfor application errorsserde+serde_jsonfor serialization/deserialization
Projects:
schemaguard— A streaming data contract validator (real-world, open-source gap)logr— A terminal-native personal activity tracker
Full project details in the Project Specifications document.
End-of-Phase Check: Can you write a generic function with multiple trait bounds? Can you explain to someone why Rust needs lifetimes and what concrete problem they prevent? Can you explain the difference between Box<dyn Trait> and impl Trait?
Phase 3 — Concurrency, Async, and Networking (Weeks 17–28)
Objective: Understand threading, async I/O, TCP networking, and build real networked applications.
Weekly Schedule:
- Week 17: Chapters 16 & 20 (concurrency, multi-threaded server). Experiment with
std::threadandArc<Mutex<T>>. - Week 18: Deep dive threading —
Arc<RwLock<T>>, channels (mpsc), shared state patterns. Write programs that deliberately trigger data race compile errors and understand why. - Week 19: Tokio Tutorial Part 1 (setup, spawning, channels). Watch Crust of Rust: async/await.
- Week 20: Deep dive async — Tokio tutorial Part 2,
tokio::select!,broadcastandoneshotchannels. Read Programming Rust concurrency chapters. - Weeks 21–23: Build the HTTP/1.1 server from scratch (no frameworks). This is a weekend-intensive project spread across 3 weeks. Understand every byte of the HTTP request/response cycle.
- Weeks 24–28: Build
airpost. Learnaxumandsqlx. Integrate database persistence. Deploy locally and test under concurrent load.
Study Material:
- The Rust Programming Language Chapters 16 and 20
- Tokio Tutorial (tokio.rs/tokio/tutorial) — complete fully
- Jon Gjengset’s lectures on async Rust
- Programming Rust (O’Reilly) — Concurrency chapters
axumdocumentation and examplessqlxdocumentation — especially compile-time query checking
Concepts to Internalize:
std::thread::spawn,Arc<Mutex<T>>,Arc<RwLock<T>>— threading primitives- Why async exists: threads are expensive, async tasks are cheap
- The Tokio runtime,
tokio::spawn,tokio::select! - Channels:
mpsc,broadcast,oneshot— inter-task communication - TCP sockets with
std::net::TcpListener— raw network programming axumfor HTTP servers (after building one by hand)sqlxfor async, compile-time-checked PostgreSQL queriesSend + Synctraits — what they mean and why Rust checks them at compile time
Projects:
- HTTP/1.1 Server from scratch (no frameworks — learning exercise)
— ⚠️ Replaced due to conflict of interest with LSEG. See project specs for details.ticknormairpost— A real-time air quality data aggregator (public good, real-world)
Full project details in the Project Specifications document.
End-of-Phase Check: Can you explain the difference between OS threads and async tasks? Can you explain what Send + Sync mean? Can you explain why your raw HTTP server would break under concurrent connections without Arc?
Phase 4 — Performance, Finance, and Python Integration (Weeks 29–40)
Objective: Understand why Rust is fast, build a finance-domain tool with real mathematical depth, and bridge Rust back to Python via PyO3.
Weekly Schedule:
- Week 29: Study unsafe Rust, FFI basics. Profile your previous projects with
cargo flamegraph. Understand what unsafe permits and why it exists. - Week 30: Read Rust for Rustaceans Chapters 6–9 (unsafe, FFI, performance). Deep dive into memory layout:
repr(C), alignment, padding. - Weeks 31–35: Build
riskbook. Implement Black-Scholes math. Learncriterionfor benchmarking. Week 35 is dedicated to profiling, benchmarking, and squeezing performance — use flamegraphs, not guesses. - Week 36: Review PyO3 guide end-to-end. Build a small throwaway PyO3 proof-of-concept before touching
xlsxfmt. Read Rustonomicon Chapter 11 (FFI). - Week 37: Understand the XLSX format before writing code. Open a
.xlsxfile withunzipand read the raw XML. Implement XLSX reading: cell values, shared string table. - Week 38: Implement XLSX writing — create workbooks, write cell values, write basic formatting (bold, font size, fill color) via
styles.xml. - Week 39: Cell range reading, formula string preservation (read → store formula string → write back; do not evaluate), row height and column width.
- Week 40: PyO3 binding, integration tests (read → modify → write → re-read → assert), README that explicitly states what is and is not supported, publish as
0.1.0-alpha.
Note: xlsxfmt is scoped to a reliable basic implementation in Weeks 37–40. Advanced features (merged cells, conditional formatting, charts, full number format string parsing, streaming reader for large files) are documented separately as a post-program extension track for Weeks 53–60+.
Study Material:
| Resource | Chapters | When |
|---|---|---|
| Rust for Rustaceans Chapters 6–9 (unsafe, FFI, performance) | 6–9 | Weeks 29–30 |
| Rustonomicon — Meet Safe and Unsafe, Data Layout, Ownership, References | 1–4 | Week 29 (start of unsafe study) |
| Rustonomicon — Working with Unsafe, Implementing Vec/Arc/MutexGuard | 6–8 | Week 30 (deepening unsafe) |
cargo flamegraph and Linux perf | — | Weeks 29–35 |
Amos’s fasterthanli.me blog — all Rust posts | — | Throughout Phase 4 |
| Rustonomicon — Foreign Function Interface | 11 | Week 36 (before PyO3 work) |
| PyO3 User Guide (pyo3.rs) | — | Weeks 36–40 |
criterion documentation | — | Weeks 31–35 |
quick-xml and zip crate documentation | — | Weeks 37–40 |
The Rustonomicon (doc.rust-lang.org/nomicon) is the official guide to unsafe Rust. It is not telling you to write unsafe code. It is telling you what you are promising the compiler when you do.
Concepts to Internalize:
unsafeRust — what it permits (raw pointer derefs, FFI calls, etc.) and when it’s necessary- Memory layout:
repr(C), alignment, padding - Profiling:
cargo flamegraph, reading flame graphs, identifying hotspots - Benchmarking with
criterion— statistical benchmarking, not wall-clock timing - PyO3 — writing Python modules in Rust, converting types across the FFI boundary
- Floating-point arithmetic: precision, rounding, NaN handling (critical for finance)
- ZIP archive format and XML parsing at the byte level
Projects:
riskbook— A real-time portfolio risk engine (finance, Black-Scholes, VaR)xlsxfmt— A high-fidelity bidirectional Excel processing library (real-world gap)
Full project details in the Project Specifications document.
End-of-Phase Check: Can you profile a Rust program and identify a performance bottleneck? Can you explain what Black-Scholes computes and implement it from the formula? Can you explain what unsafe permits and why it exists?
Phase 5 — Capstone (Weeks 41–52)
Choose one of three projects. All three teach the same advanced Rust concepts: DSL/formula parsing, trait-based architecture, PyO3 bindings, benchmarking, and crates.io publishing. Pick whichever excites you most. Full specifications for all three are in the Project Specifications document.
Option A: docforge — Document Conversion Library
What it is: A Rust library that converts XLSX and DOCX files to PDF — the open-source alternative to LibreOffice headless that actually preserves formatting. Builds on your xlsxfmt project.
Weekly Schedule:
- Weeks 41–44: XLSX → PDF rendering. Build on
xlsxfmt. Render cells, formatting, borders, merged cells. - Weeks 45–48: DOCX → PDF. Parse DOCX (ZIP + XML). Render paragraphs, headings, tables, basic styles.
- Weeks 49–52: Clean API, documentation, benchmarks vs LibreOffice, PyO3 binding, publish to crates.io.
Study Material: OOXML specification, printpdf crate docs, rustdoc conventions, crates.io publishing guide.
Key Rust concepts: Binary I/O (ZIP/PDF), XML processing, trait-based renderer pipeline (DocumentReader, PdfRenderable), font rendering, unsafe for performance-critical paths, PyO3.
End-of-Phase Check: Is the crate published? Do benchmarks show improvement over LibreOffice headless? Can a Python user pip install docforge and convert a file?
Option B: formulaengine — Spreadsheet Formula Computation Engine
What it is: A standalone engine that evaluates spreadsheet formulas (SUM, VLOOKUP, IF, etc.) with a dependency graph and incremental recalculation. The “SQLite of formula evaluation.” Pairs with xlsxfmt to form a Rust spreadsheet toolkit that doesn’t exist in any language.
Weekly Schedule:
- Weeks 41–44: Formula parser (tokenizer, recursive descent parser, AST) and core evaluation engine with 20+ built-in functions.
- Weeks 45–48: Dependency graph, topological sort, circular reference detection, incremental recalculation, 20+ advanced functions (VLOOKUP, SUMIF, etc.).
- Weeks 49–52:
xlsxfmtintegration, CLI, PyO3 binding, benchmarks (100k cells), documentation, publish to crates.io.
Study Material: Crafting Interpreters by Robert Nystrom (chapters 4–8, free online), petgraph crate docs, Excel formula specification, rustdoc conventions, crates.io publishing guide.
Key Rust concepts: Parsing (tokenizer → AST → evaluator), graph algorithms (topological sort, cycle detection), enums with data (Value, Expr), trait-based function registry, generics, lifetimes, incremental computation, PyO3.
End-of-Phase Check: Is the crate published? Can it evaluate 100k cells with dependencies in under 1 second? Does the xlsxfmt integration work? Can a Python user pip install formulaengine and evaluate formulas?
Option C: ruleforge — Embeddable Business Rules Engine
What it is: A lightweight rules engine with its own DSL. Business analysts define rules like when customer.tier == "gold" AND order.total > 5000 then set discount = 0.15, and the engine evaluates them at runtime against JSON data. No redeployment needed for rule changes. The Rust answer to Java’s Drools.
Weekly Schedule:
- Weeks 41–44: Rule DSL design and parser (tokenizer, recursive descent parser, AST). Conditions, actions, priorities, nested field access, AND/OR/NOT.
- Weeks 45–48: Evaluation engine, conflict resolution strategies (priority, first_match, all), rule chaining with loop detection, audit trail.
- Weeks 49–52: CLI (eval, validate, explain modes), PyO3 binding, benchmarks (10k rules), documentation, publish to crates.io.
Study Material: Crafting Interpreters by Robert Nystrom (chapters 4–8, free online), Drools documentation (for conceptual understanding), OPA/Rego design docs, rustdoc conventions, crates.io publishing guide.
Key Rust concepts: Language design (you’re building a DSL), parsing (tokenizer → AST → evaluator), enums with data (Expr, Value, Action), trait-based extensibility (ConflictResolver, Function), generics, lifetimes, serde (advanced), audit logging, PyO3.
End-of-Phase Check: Is the crate published? Can it evaluate 10k rules in under 100ms? Does the explain mode produce human-readable output? Can a Python user pip install ruleforge and evaluate rules?
Parallel Track: DSA Remediation (Throughout All 12 Months)
This runs alongside the Rust program. Dedicate 2–3 hours per week (from your weekday evening hours). Lower weekly target than the 6-month version — it fits the realistic schedule.
Months 1–3: Foundations (Phase 1 of Rust program)
- NeetCode 150: Arrays & Hashing, Two Pointers, Sliding Window, Stack, Binary Search
- Do these in Python first for speed
- Focus: understand the pattern, not just the solution
- Target: 2–3 problems per week
Months 4–7: Intermediate (Phase 2–3 of Rust program)
- NeetCode 150: Linked Lists, Trees, Tries, Backtracking, Heap/Priority Queue, Graphs (BFS/DFS)
- Start redoing selected problems in Rust (combines DSA + Rust practice)
- Target: 2–3 problems per week
Months 8–12: Advanced + Rust (Phase 4–5 of Rust program)
- Dynamic Programming (essential for optimization problems in finance)
- Graph algorithms: Dijkstra, topological sort, cycle detection
- All new problems in Rust
- Target: 1–2 problems per week (harder problems take longer, and Phase 4–5 Rust is demanding)
DSA Goal
By month 12: solve any LeetCode medium confidently within 30 minutes, without AI assistance. In Rust or Python.
Parallel Track: OSS Contributions (Phases 3–5)
This track runs alongside Phases 3, 4, and 5. It does not add weekly hours — it replaces some of the reading/exploration time in those phases. A hiring manager at Cloudflare, Qdrant, or Anduril sees solo portfolios regularly. What is rarer is a GitHub history showing merged PRs to production Rust codebases they recognize.
The target is to demonstrate that you can write Rust at a standard that other experienced Rust engineers will accept after review. That is a different skill than writing Rust that works in isolation.
Recommended Target Projects (in priority order)
| Project | Why |
|---|---|
Qdrant (github.com/qdrant/qdrant) | Prior domain familiarity from your PKM work — you know what Qdrant does. Production Rust, actively maintained, international team. Highest-leverage target. |
Vector by Datadog (github.com/vectordotdev/vector) | High-performance log/metric aggregation in Rust. Architecturally similar to airpost at production scale. Contributing here reinforces Phase 3 work. |
TiKV (github.com/tikv/tikv) | Distributed key-value storage under TiDB. If databases become your long-term focus, the most prestigious Rust database OSS project to have contributions to. |
Phase 3 (Weeks 17–28) — First Contribution
Goal: One merged PR before Phase 3 ends.
Scope deliberately small. A documentation improvement, a missing example, or a clearly-described small bug with a reproduction case. The goal is not impressive code — it is learning how a real production Rust project handles review, CI requirements, and contribution standards.
Before writing a single line: read the project’s CONTRIBUTING.md and issue tracker. Understand what “good first issue” actually means in that codebase.
Phase 4 (Weeks 29–40) — Substantive Contribution
Goal: One PR with real engineering substance.
By Phase 4 you have concurrency, async, and criterion benchmarking. You are capable of touching core logic. Target: a feature built on an existing abstraction, a performance improvement with benchmark comparison, or a meaningful bug fix in concurrent code.
Phase 5 (Weeks 41–52) — Ongoing Engagement
Goal: Additional PR or active issue engagement.
If your capstone is ruleforge: contributing to OPA’s issue tracker or documenting research on Grule’s architecture strengthens both.
If your capstone is formulaengine: engaging with HyperFormula’s GitHub issues (even as a reporter of bugs you discover) is legitimate community presence.
Minimum Bars
| Phase | Goal |
|---|---|
| Phase 3 | 1 merged PR — any size |
| Phase 4 | 1 substantive merged PR |
| Phase 5 | Additional PR or active issue engagement |
Rules on AI During This Program
| Allowed | Not Allowed |
|---|---|
| Explain a compiler error after 15+ minutes of your own effort | Write any Rust code for you |
Explain a concept (what is a vtable? how does dyn Trait work?) | Generate project boilerplate |
| Clarify a section of the Rust Book you’ve already read twice | Solve a DSA problem for you |
| Discuss architectural tradeoffs for your projects | Debug your code without you trying first |
The heuristic: if you haven’t earned the confusion by trying yourself, you haven’t earned the explanation.
Resources
| Resource | Type | When |
|---|---|---|
| The Rust Programming Language (free online) | Book | Phase 1–3 |
rustlings | Interactive exercises | Phase 1 |
| Rust by Example | Reference | Throughout |
| Jon Gjengset — Crust of Rust (YouTube) | Video series | Phase 2–3 |
| Tokio Tutorial (tokio.rs) | Online guide | Phase 3 |
| Rust for Rustaceans — Jon Gjengset | Book | Phase 2–4 |
| Programming Rust (O’Reilly) | Book | Phase 3–4 |
The Rustonomicon (doc.rust-lang.org/nomicon) | Official guide | Phase 4 |
fasterthanli.me blog | Blog | Throughout |
| PyO3 User Guide | Documentation | Phase 4–5 |
1-Year Outcome
If you complete this program honestly:
- You will understand how memory works — concretely, not abstractly
- You will have 3+ tools that solve real problems and could be open-sourced or SaaS’d (
schemaguard,riskbook, and your capstone) - You will have a published crate on crates.io — whether it’s a document converter, a formula engine, or a rules engine — that fills a genuine gap in the Rust ecosystem
- You will have built a parser, evaluator, and trait-based architecture from scratch — the kind of work senior engineers do
- You will write better Python, SQL, and system designs because you understand the layers beneath
- You will be one of very few engineers in your peer cohort who work fluently at both the Python/ML layer and the systems layer
- The AI dependency will be resolved — not because you stopped using AI, but because you will know enough to catch its mistakes
- LeetCode mediums in 30 minutes without assistance
The gap you identified is real. You identified it yourself, before it bit you. Now close it.