Student Guide: Rust Programming Study Path
This guide navigates the Comprehensive Rust Programming Curriculum. Each module lists all related study material from the sources below.
| Source | What it covers | Modules |
|---|---|---|
| 💪 Exercism ⭐ | Start here for practice — 2–6 exercises per module with in-browser code editor and optional human mentor feedback (exercism.org/tracks/rust) | 1–15 |
| 🖥️ Rust Playground | Official online Rust editor — run, share, test any snippet instantly in your browser, no install needed (play.rust-lang.org) | 1–15 |
| 🦀 hightechmind.io/rust/ | 5–12 curated live working programs per module, matched to the specific topics taught in that module (860+ examples) | 1–15 |
| 🏋️ Rustlings | Fix broken programs in your terminal — immediate feedback loop, 94 exercises (github.com/rust-lang/rustlings) | 1–13 |
| 📖 Book chapters | Exact chapter + section links into The Rust Programming Language (free online · paperback/eBook $39.95) | 1–15 |
| 📗 Programming Rust, 2nd ed. (O'Reilly $59.99) | Deeper treatment of every topic — excellent second text alongside the official book | 2–15 |
| 📘 Rust for Rustaceans (NoStarch $39.95) | Advanced ownership, traits, macros, async — Jon Gjengset's book | 8–15 |
| 🌐 Rust by Example | Browser-based: see any concept running instantly, then edit and re-run in-browser (doc.rust-lang.org/rust-by-example) | 1–10 |
| 🎓 Comprehensive Rust (Google) | Google's structured 4-day course — alternative path through Rust foundations (google.github.io/comprehensive-rust) | 1–5 |
| 📺 Jon Gjengset — Crust of Rust | Long-form video deep dives: smart pointers, channels, atomics, proc macros (YouTube playlist) | 11–15 |
| 📙 The Little Book of Rust Macros | The definitive reference for macro_rules! and procedural macros (veykril.github.io/tlborm) | 13 |
| 📊 Polars User Guide | Official documentation for the Polars DataFrame library (docs.pola.rs) | 14 |
| 📰 Serde Documentation | Serialization framework — essential for CSV and data processing (serde.rs) | 14 |
How to use this guide: For each module — do the Exercism exercises first (in-browser, no install). Then study the live hightechmind.io examples. Then read the book chapters. Use Rustlings for extra drilling. For quick experiments, paste any code snippet into play.rust-lang.org instantly. Watch Jon Gjengset for M11–15 when you feel stuck on a concept.
Course: Two-semester · ~36 weeks · designed for working professionals studying part-time.
Timeline: Start June 2026 → finish March 2027 (9 months).
Contents
| Phase | Weeks | Modules | |
|---|---|---|---|
| Phase 1 | The Foundation | 1–12 | Modules 1–5 · Chapters 1–7 |
| Phase 2 | Core Proficiency & Certification | 13–28 | Modules 6–12 · Chapters 8–16 |
| Phase 3 | Advanced Specialization | 29–36 | Modules 13–15 |
Phase 1 — The Foundation (Weeks 1–12)
- Module 1 — Introduction & Environment Setup · rustup · cargo · Hello World
- Module 2 — Common Programming Concepts · types · functions · control flow
- Module 3 — Ownership, Borrowing, and Slices · move · borrow · references
- Module 4 — Structs and Enums · impl · Option · match
- Module 5 — Modules and Project Structure · mod · use · crates
Phase 2 — Core Proficiency & Certification (Weeks 13–28)
- Module 6 — Common Collections · Vec · String · HashMap
- Module 7 — Error Handling · Result · ? · custom errors
- Module 8 — Generic Types, Traits, and Lifetimes · generics · traits · lifetimes
- Module 9 — Automated Tests · unit tests · integration tests
- Module 10 — Functional Features: Iterators and Closures · closures · Iterator · map/filter
- Module 11 — Smart Pointers · Box · Rc · RefCell · Deref
- Module 12 — Concurrency · threads · channels · Mutex · async/await
- 🎯 Certification Milestone — LFRS Exam · Linux Foundation · Week 28 · ~$395 · (Quick Reference at end ↓)
🎯 → Certification Milestone — Linux Foundation LFRS · Week 28 · ~$395 · performance-based · Quick Reference ↓
Phase 3 — Advanced Specialization (Weeks 29–36)
- Module 13 — Advanced Rust (Macros) · macro_rules! · proc macros · syn/quote
- Module 14 — Data Processing with Polars and CSV · csv crate · Polars · DataFrame
- Module 15 — Final Capstone Project · CLI · web server · data pipeline · TUI
📚 Reference Resources Guide — all books, tools, courses, certifications at a glance
Phase 1: The Foundation (Weeks 1–12)
Modules 1–5 · Book Chapters 1–7
Module 1: Introduction & Environment Setup
Goal: Get comfortable with the Rust toolchain and write the first program.
Topics: What is Rust · rustup / rustc / cargo · VS Code + rust-analyzer · cargo new/build/run/check · Hello World anatomy
Exercises: Install Rust and verify version · Create a new project using Cargo · Modify "Hello, World!" to print your name.
📖 Book
| Chapter | Section |
|---|---|
| 📕 The Rust Programming Language, 2nd ed. (NoStarch, $39.95 · ISBN 978-1-7185-0044-0) | Chapters 1–3 · Print/eBook — the primary course text |
| Ch 1 — Getting Started | Full chapter |
| Ch 1.1 — Installation | rustup, rustc, toolchain management |
| Ch 1.2 — Hello, World! | First program, anatomy of main |
| Ch 1.3 — Hello, Cargo! | cargo new, cargo build, cargo run, cargo check |
| Appendix D — Useful Dev Tools | rustfmt, clippy, IDE setup |
🦀 hightechmind.io/rust/
| Example | What it shows |
|---|---|
| 006-palindrome-check | Short readable function — good first "real" program to study |
💪 Exercism
| Exercise | Focus |
|---|---|
| hello-world | The canonical first Rust exercise — run, modify, submit |
🏋️ Rustlings (fix broken programs: rustlings run <name>)
| Exercise | What you fix |
|---|---|
intro1 | Fix a println! call — your first Rust compile-fix cycle |
intro2 | Print with format arguments {} |
clippy1 | Clippy: unnecessary floating-point operation — run cargo clippy for the first time |
clippy2 | Clippy: prefer .is_none() over == None |
clippy3 | Clippy: type cast that clippy warns about |
| 🎓 Also in Curriculum (from Teacher Guide) |
| Resource | URL | What it adds |
|---|---|---|
| Comprehensive Rust | google.github.io/comprehensive-rust | Google's structured course — alternative path through foundations |
| Rust by Example | doc.rust-lang.org/rust-by-example | Browser-based examples — see any concept running instantly |
Module 2: Common Programming Concepts
Goal: Learn the basic building blocks of Rust syntax.
Topics: Variables & mutability (let, mut, const) · Scalar types (integers, floats, booleans, chars) · Compound types (tuples, arrays) · Functions & return values · Control flow (if, loop, while, for) · cargo fmt
Exercises: Temperature converter (F→C) · Generate the n-th Fibonacci number.
📖 Book
| Chapter | Section |
|---|---|
| 📕 The Rust Programming Language, 2nd ed. (NoStarch, $39.95 · ISBN 978-1-7185-0044-0) | Chapter 3 — Variables, Types, Functions, Control Flow |
| 📗 Programming Rust, 2nd ed. (O'Reilly, $59.99 · ISBN 978-1-492-05259-5) | Chapter 3 — Basic Types · Chapter 6 — Expressions |
| Ch 3 — Common Programming Concepts | Full chapter |
| Ch 3.1 — Variables and Mutability | let, mut, const, shadowing |
| Ch 3.2 — Data Types | Integers, floats, booleans, chars, tuples, arrays |
| Ch 3.3 — Functions | Parameters, return values, statements vs. expressions |
| Ch 3.4 — Comments | // and /// doc comments |
| Ch 3.5 — Control Flow | if, loop, while, for, ranges |
| Appendix B — Operators and Symbols | Complete operator reference |
🦀 hightechmind.io/rust/
| Example | What it shows |
|---|---|
| 003-pattern-matching | match — the primary control flow construct |
| 010-run-length-encoding | Loop logic, tuple return values, variable shadowing |
| 022-range | Range expressions and for loops |
| 069-sieve-eratosthenes | Boolean arrays, nested loops, algorithm in Rust |
| 071-collatz-conjecture | while loop, integer arithmetic, mutability |
| 071-gcd-lcm | Functions, recursion, integer types |
| 824-sieve-of-eratosthenes | Full sieve with idiomatic Rust |
| 826-gcd-lcm-euclid | Euclidean algorithm — clean recursive form |
💪 Exercism
| Exercise | Focus |
|---|---|
| lucians-luscious-lasagna | Variables, mutability, functions, const |
| raindrops | if / else if chains, string building |
| grains | Integer types, overflow, Result for invalid input |
| fizzbuzz | for loop + modulo — classic control flow |
| collatz-conjecture | while loop, integer arithmetic, Option result |
| leap | Boolean expressions, multiple conditions |
| gigasecond | Basic arithmetic on types |
| hamming | Loops, comparison, counting — simple algorithm |
🏋️ Rustlings (fix broken programs: rustlings run <name>)
| Exercise | What you fix |
|---|---|
variables1 | Make an immutable variable compile |
variables2 | Add mut to allow reassignment |
variables3 | Declare variable before initializing it |
variables4 | Fix shadowing |
variables5 | Add the correct type annotation |
variables6 | const — name and annotate a constant |
functions1 | Call a function that doesn't exist yet |
functions2 | Fix a missing return type |
functions3 | Fix a function body (expression vs statement) |
functions4 | Make a function return a value implicitly |
functions5 | Return from nested block |
if1 | Simple if/else expression |
if2 | if as an expression with two branches returning values |
if3 | Chained if/else if/else |
primitive_types1 | Boolean operations |
primitive_types2 | Character literals |
primitive_types3 | Array declaration and access |
primitive_types4 | Array slices &[T] |
primitive_types5 | Tuple unpacking |
primitive_types6 | Index into a tuple .0, .1 |
quiz1 | Quiz 1: variables + functions + if — all three together |
| 🎓 Also in Curriculum (from Teacher Guide) |
| Resource | URL | What it adds |
|---|---|---|
| Comprehensive Rust | google.github.io/comprehensive-rust | Day 1 morning content — types, expressions, control flow |
| Rust by Example | doc.rust-lang.org/rust-by-example | primitives, flow_control, functions chapters |
Module 3: Ownership, Borrowing, and Slices
Goal: Understand Rust's unique approach to memory management without a garbage collector.
Topics: Stack and heap · Ownership rules · Variable scope and drop · Move semantics vs. Copy · References and borrowing (&, &mut) · Rules of references · Slice type
Exercises: Fix ownership errors in provided code snippets · Write a function that takes a string and returns the first word.
⚠️ Take your time here. Ownership is the hardest part of the curriculum — and the most important. Everything else builds on it.
📖 Book
| Chapter | Section |
|---|---|
| 📕 The Rust Programming Language, 2nd ed. (NoStarch, $39.95 · ISBN 978-1-7185-0044-0) | Chapter 4 — Ownership, Borrowing, Slices |
| 📗 Programming Rust, 2nd ed. (O'Reilly, $59.99 · ISBN 978-1-492-05259-5) | Chapter 4 — Ownership · Chapter 5 — References |
| Ch 4 — Understanding Ownership | Full chapter — do not skip any section |
| Ch 4.1 — What is Ownership? | Stack, heap, move semantics, drop |
| Ch 4.2 — References and Borrowing | &, &mut, the one-writer rule |
| Ch 4.3 — The Slice Type | String slices, array slices |
🦀 hightechmind.io/rust/
| Example | What it shows |
|---|---|
| 101-move-semantics | Move — values transferred, not copied |
| 102-clone-copy | When .clone() is needed vs. Copy types |
| 103-borrowing-shared | & references — read-only, many at once |
| 104-borrowing-mutable | &mut — exclusive mutable access |
| 113-string-str | String vs &str — the most common beginner confusion |
| 114-slice-patterns | Slices as views into collections |
| 115-vec-patterns | Vec slice patterns — destructuring collections |
| 119-zero-cost-abs | Zero-cost abstractions — the payoff of ownership |
| 112-cow-clone-on-write | Cow<T> — borrow when possible, clone when necessary |
| 369-cow-clone-on-write | Cow in data structure context |
| 471-string-vs-str | Ownership of strings — String vs &str full breakdown |
| 472-string-slices | String slice rules, &str in function signatures |
💪 Exercism
| Exercise | Focus |
|---|---|
| reverse-string | &str vs String — ownership across function boundaries |
| bob | Borrowing strings, .trim(), immutable references |
| run-length-encoding | Both sides: borrowing &str input, building owned String |
| two-fer | Option<&str> — optional borrowed string |
| phone-number | Iterating over &str, returning Option<String> |
| beer-song | Building strings, borrowing vs. owning |
| hamming | Result with borrowed string slices |
🏋️ Rustlings (fix broken programs: rustlings run <name>)
| Exercise | What you fix |
|---|---|
move_semantics1 | Fix a move error — can't use moved value |
move_semantics2 | Pass by reference instead of moving |
move_semantics3 | Mutable reference — only one at a time |
move_semantics4 | Restructure code to avoid double-move |
move_semantics5 | Borrow and reborrow — tricky lifetime situation |
| 🎓 Also in Curriculum (from Teacher Guide) |
| Resource | URL | What it adds |
|---|---|---|
| Comprehensive Rust | google.github.io/comprehensive-rust | Day 1 afternoon — ownership, borrowing, lifetimes |
| Rust by Example | doc.rust-lang.org/rust-by-example | scope, borrowing chapters |
Module 4: Structs and Enums
Goal: Structure related data and define custom types.
Topics: Defining and instantiating structs · Tuple structs and unit-like structs · Methods and associated functions (impl) · Enums · Option<T> · match · if let
Exercises: Rectangle struct with area and perimeter methods · IpAddr enum for V4 and V6 addresses.
📖 Book
| Chapter | Section |
|---|---|
| 📕 The Rust Programming Language, 2nd ed. (NoStarch, $39.95 · ISBN 978-1-7185-0044-0) | Chapters 5–6 — Structs, Enums, Pattern Matching |
| 📗 Programming Rust, 2nd ed. (O'Reilly, $59.99 · ISBN 978-1-492-05259-5) | Chapter 9 — Structs · Chapter 10 — Enums and Patterns |
| Ch 5 — Using Structs | Full chapter |
| Ch 5.1 — Defining and Instantiating Structs | Struct syntax, field init shorthand, update syntax |
| Ch 5.2 — Example Program Using Structs | Worked Rectangle example — mirrors the exercise exactly |
| Ch 5.3 — Method Syntax | impl blocks, methods, associated functions |
| Ch 6 — Enums and Pattern Matching | Full chapter |
| Ch 6.1 — Defining an Enum | Enum variants, data in variants, Option<T> |
| Ch 6.2 — The match Control Flow | Patterns, exhaustiveness, catch-all arms |
| Ch 6.3 — if let | Concise single-pattern matching |
🦀 hightechmind.io/rust/
Option and enums:
| Example | What it shows |
|---|---|
| 004-option-result | Option and Result side by side |
| 041-option-basics | Option<T> — Rust's null-safety mechanism |
| 042-option-map | .map() on Option |
| 043-option-bind | .and_then() — chaining optional operations |
| 044-option-filter | .filter() on Option |
| 058-variants-days | Enum variants — modeling days of the week |
| 060-option-safe-max | Safe maximum with Option return |
| 062-records | Struct with named fields — record-style data |
Pattern matching (full series):
| Example | What it shows |
|---|---|
| 561-pattern-or | ` |
| 562-pattern-guards | if guards in match arms |
| 563-pattern-struct-destructuring | Destructuring struct fields |
| 564-pattern-enum-variants | Matching enum variants with data |
| 565-pattern-tuple-struct | Tuple struct patterns |
| 566-pattern-nested | Nested patterns |
| 567-pattern-binding-modes | ref, ref mut, binding modes |
| 568-pattern-at-bindings | @ bindings — match and capture |
| 569-pattern-range | Range patterns (1..=5) |
| 570-pattern-slice | Slice patterns [head, tail @ ..] |
| 571-pattern-dotdot-wildcard | .. to ignore remaining fields |
| 572-pattern-ref-patterns | Reference patterns in match |
| 573-pattern-let-else | let ... else — diverging on non-match |
| 574-pattern-if-let | if let — concise single-pattern match |
| 575-pattern-let-chains | if let chaining |
| 576-pattern-matches-macro | matches! macro |
| 577-pattern-irrefutable | Irrefutable vs. refutable patterns |
| 578-pattern-exhaustiveness | The compiler's exhaustiveness check |
| 579-pattern-string-matching | Matching on string slices |
| 580-pattern-option-some-none | Some(x) / None patterns |
| 582-pattern-tuple-matching | Matching on tuples |
| 583-pattern-const-patterns | Constants as patterns |
| 586-pattern-multiple-arms | Multiple patterns per arm |
| 587-pattern-visitor-match | Visitor pattern via match |
| 588-pattern-state-automata | State machines with enum + match |
| 589-pattern-command-dispatch | Command dispatch table using match |
💪 Exercism
| Exercise | Focus |
|---|---|
| clock | Struct, impl block, Display trait, arithmetic |
| allergies | Enum + match, bitflag logic in struct |
| triangle | Struct + methods + boolean conditions |
| grade-school | Struct wrapping a HashMap, methods returning references |
| role-playing-game | Struct + Option fields + methods |
| beer-song | Enum + match for lyrics logic |
🏋️ Rustlings (fix broken programs: rustlings run <name>)
| Exercise | What you fix |
|---|---|
structs1 | Classic C-style struct — field access |
structs2 | Struct update syntax ..other |
structs3 | impl block with is_bigger() method |
enums1 | Enum variants — no data |
enums2 | Enum variants with data |
enums3 | match on enum — all arms must be handled |
options1 | Option — unwrap and handle None |
options2 | if let Some(x) — destructure an Option |
options3 | while let Some(x) — loop until None |
quiz2 | Quiz 2: strings + vecs + move semantics + modules + enums — broad combo |
| 🎓 Also in Curriculum (from Teacher Guide) |
| Resource | URL | What it adds |
|---|---|---|
| Comprehensive Rust | google.github.io/comprehensive-rust | Day 2 morning — structs, enums, pattern matching |
| Rust by Example | doc.rust-lang.org/rust-by-example | custom_types, flow_control chapters |
Module 5: Modules and Project Structure
Goal: Organize code into multiple files and modules.
Topics: Packages and crates · Defining modules (mod) · Paths (use, pub, super) · Separating modules into files
Exercises: Refactor a single-file program into a library crate and a binary crate.
📖 Book
| Chapter | Section |
|---|---|
| 📕 The Rust Programming Language, 2nd ed. (NoStarch, $39.95 · ISBN 978-1-7185-0044-0) | Chapter 7 — Packages, Crates, Modules |
| 📗 Programming Rust, 2nd ed. (O'Reilly, $59.99 · ISBN 978-1-492-05259-5) | Chapter 8 — Crates and Modules |
| Ch 7 — Managing Growing Projects | Full chapter |
| Ch 7.1 — Packages and Crates | What a package is, library vs. binary crate |
| Ch 7.2 — Defining Modules | mod, privacy rules, module tree |
| Ch 7.3 — Paths for Referring to Items | Absolute vs. relative paths, super |
| Ch 7.4 — Bringing Paths into Scope | use, as, re-exporting with pub use |
| Ch 7.5 — Separating Modules into Files | File layout for multi-file modules |
🦀 hightechmind.io/rust/
| Example | What it shows |
|---|---|
| 063-stack-module | Complete module: private internals, public API surface |
| 065-association-list | Encapsulated data structure with module boundary |
💪 Exercism
| Exercise | Focus |
|---|---|
| space-age | Clean struct — good project to refactor into lib/bin |
| magazine-cutout | HashMap ownership — natural multi-module candidate |
🏋️ Rustlings (fix broken programs: rustlings run <name>)
| Exercise | What you fix |
|---|---|
modules1 | mod — bring an item into scope with use |
modules2 | pub — make an item visible outside its module |
modules3 | Multi-module: use across sibling modules |
| 🎓 Also in Curriculum (from Teacher Guide) |
| Resource | URL | What it adds |
|---|---|---|
| Comprehensive Rust | google.github.io/comprehensive-rust | Modules and visibility section |
| Rust by Example | doc.rust-lang.org/rust-by-example | modules, crates chapters |
Phase 1 Milestone: Write a CLI tool that accepts user input and processes it using structs and enums without fighting the borrow checker.
Phase 2: Core Proficiency & Certification (Weeks 13–28)
Modules 6–12 · Book Chapters 8–16
Module 6: Common Collections
Goal: Store data on the heap using standard library collections.
Topics: Vec<T> · String vs &str (UTF-8 text) · HashMap<K, V>
Exercises: Text interface to add employees to departments · Convert strings to Pig Latin.
📖 Book
| Chapter | Section |
|---|---|
| 📕 The Rust Programming Language, 2nd ed. (NoStarch, $39.95 · ISBN 978-1-7185-0044-0) | Chapter 8 — Vectors, Strings, Hash Maps |
| 📗 Programming Rust, 2nd ed. (O'Reilly, $59.99 · ISBN 978-1-492-05259-5) | Chapter 3 — Basic Types · Chapter 17 — Strings and Text |
| Ch 8 — Common Collections | Full chapter |
| Ch 8.1 — Storing Lists of Values with Vectors | Vec<T> creation, reading, updating, iteration |
| Ch 8.2 — Storing UTF-8 Encoded Text with Strings | Why you can't index strings — critical to understand |
| Ch 8.3 — Storing Keys with Associated Values in Hash Maps | HashMap, inserting, accessing, updating, entry API |
🦀 hightechmind.io/rust/
Vec / list operations:
| Example | What it shows |
|---|---|
| 002-list-operations | Vec operations — push, pop, iterate |
| 002-last-two | Last two elements — slice indexing |
| 003-kth-element | Indexed access with Option |
| 004-list-length | .len() and counting patterns |
| 005-reverse-list | .rev() / reversing a Vec |
| 007-flatten-nested-list | Vec<Vec<T>> — nested collections |
| 008-eliminate-duplicates | Deduplication with HashSet |
| 009-pack-consecutive | Grouping consecutive equal elements |
| 014-duplicate-elements | Repeating elements in a Vec |
| 015-replicate-n-times | .repeat() equivalent with Vec |
| 016-drop-every-nth | Filtering by position |
| 017-split-list | Splitting a list at a position |
| 018-slice-list | Slicing with ranges |
| 019-rotate-left | .rotate_left() |
| 020-remove-kth | .remove(i) with bounds checking |
| 021-insert-at | .insert(i, val) |
| 115-vec-patterns | Pattern matching on Vec slices |
| 351-btreemap-ordered | BTreeMap — sorted key-value storage |
| 352-btreeset-sorted | BTreeSet — sorted unique values |
| 353-vecdeque-deque | VecDeque — efficient front+back operations |
| 354-binary-heap-priority | BinaryHeap — priority queue |
| 370-small-vec-pattern | Small Vec optimization pattern |
HashMap:
| Example | What it shows |
|---|---|
| 068-frequency-counter | HashMap for counting — the canonical use case |
| 073-word-count | HashMap<String, usize> — string keys |
| 082-nucleotide-count | Counting characters with HashMap |
| 102-frequency-counter | Frequency table — ownership-aware version |
| 356-hashmap-patterns | Common HashMap usage patterns |
| 357-entry-api | The entry() API — insert-or-update idiom |
| 359-multimap-pattern | HashMap<K, Vec<V>> — grouping multiple values per key |
Strings:
| Example | What it shows |
|---|---|
| 113-string-str | push_str, format!, chars() |
| 471-string-vs-str | Owned vs. borrowed — complete breakdown |
| 472-string-slices | String slice rules |
| 473-string-parsing-fromstr | FromStr / .parse() |
| 474-string-formatting | format!, write!, padding, alignment |
| 475-string-building | Building strings incrementally |
| 476-string-splitting | .split(), .splitn(), .split_whitespace() |
| 477-string-trimming | .trim(), .trim_start(), .trim_end() |
| 478-string-searching | .contains(), .find(), .rfind() |
| 479-string-replacing | .replace(), .replacen() |
| 480-string-chars | .chars() — iterating over chars |
| 481-string-bytes | .bytes() — iterating over bytes |
| 482-string-unicode | Unicode awareness in Rust strings |
| 483-string-encoding | Encoding / decoding |
| 484-string-cow-usage | Cow<str> for avoiding unnecessary allocations |
| 485-string-concatenation | + operator vs. format! |
| 486-string-regex-pattern | Pattern-based string matching |
| 487-string-interning | String interning patterns |
| 488-string-owning-ref | Owning references to string data |
| 489-string-arc | Arc<str> — shared string ownership |
| 490-string-fixed-array | Fixed-size string buffers |
| 492-osstr-handling | OsStr / OsString for system paths |
| 494-string-number-conversion | .parse(), .to_string() |
| 495-string-template-pattern | Template substitution patterns |
| 496-string-diff-pattern | String diffing |
| 497-string-case-conversion | .to_lowercase(), .to_uppercase() |
| 498-string-truncation | Safe UTF-8 truncation |
| 499-string-escape | Escape sequences |
| 500-string-compression | Run-length compression on strings |
💪 Exercism
| Exercise | Focus |
|---|---|
| word-count | HashMap — counting word frequencies |
| anagram | HashSet, string comparison, .chars() |
| series | Vec, string slicing, Option for out-of-bounds |
| pangram | HashSet + char iteration |
| nucleotide-count | HashMap counting + error handling |
| custom-set | Building a generic collection type |
| matrix | Vec<Vec<T>> — 2D data access |
| etl | Transforming HashMap data |
| scrabble-score | HashMap lookup + char iteration |
| matching-brackets | Vec as a stack |
| tournament | HashMap aggregation, sorting |
| roman-numerals | Vec of tuples as a lookup table |
| magazine-cutout | HashMap<&str, usize> — borrowed keys |
🏋️ Rustlings (fix broken programs: rustlings run <name>)
| Exercise | What you fix |
|---|---|
vecs1 | Create a Vec and push items |
vecs2 | Iterate over a Vec and map values |
strings1 | &str → String conversion |
strings2 | .contains(), .replace() methods |
strings3 | .from(), .to_string(), .to_owned() |
strings4 | Pass &str vs &String to functions |
hashmaps1 | Insert fruit counts into a HashMap |
hashmaps2 | .entry().or_insert() — avoid overwriting |
hashmaps3 | Build a score table — frequency counting pattern |
| 🎓 Also in Curriculum (from Teacher Guide) |
| Resource | URL | What it adds |
|---|---|---|
| Rust by Example | doc.rust-lang.org/rust-by-example | std/vec, std/str, std/hash chapters |
Module 7: Error Handling
Goal: Handle errors robustly using Rust's type system.
Topics: panic! · Result<T, E> · The ? operator · Custom error types
Exercises: Read a file and handle "file not found" vs "permission denied".
📖 Book
| Chapter | Section |
|---|---|
| 📕 The Rust Programming Language, 2nd ed. (NoStarch, $39.95 · ISBN 978-1-7185-0044-0) | Chapter 9 — Error Handling |
| 📗 Programming Rust, 2nd ed. (O'Reilly, $59.99 · ISBN 978-1-492-05259-5) | Chapter 7 — Error Handling |
| Ch 9 — Error Handling | Full chapter |
| Ch 9.1 — Unrecoverable Errors with panic! | When to panic, backtrace |
| Ch 9.2 — Recoverable Errors with Result | match on Result, ?, chaining |
| Ch 9.3 — To panic! or Not to panic! | Decision guide — when each is appropriate |
🦀 hightechmind.io/rust/
Option combinators:
| Example | What it shows |
|---|---|
| 041-option-basics | Option<T> fundamentals |
| 042-option-map | .map() — transform the inner value |
| 043-option-bind | .and_then() — chaining optional operations |
| 044-option-filter | .filter() — conditionally discard the value |
| 292-option-combinators | Full catalog of Option methods |
| 302-option-transpose | Option<Result<T,E>> → Result<Option<T>,E> |
| 305-unwrap-or-patterns | .unwrap_or(), .unwrap_or_else(), .unwrap_or_default() |
| 306-ok-or-patterns | .ok_or() — converting Option to Result |
Result and error handling:
| Example | What it shows |
|---|---|
| 045-result-basics | Result<T, E> — the foundation |
| 046-result-map | .map() / .map_err() |
| 047-result-bind | .and_then() — chaining fallible operations |
| 048-error-propagation | The ? operator |
| 049-error-conversion | From trait — automatic error conversion |
| 050-custom-error-types | Defining your own error enum |
| 054-applicative-validation | Collecting multiple errors instead of short-circuiting |
| 056-monad-result | Result as a computational context |
| 072-result-railway | Railway-oriented programming — clean chaining |
| 072-error-accumulation | Collecting all errors from a sequence |
| 073-validated-type | Validated type — errors accumulated in parallel |
| 291-result-combinators | Full catalog of Result methods |
| 293-question-mark-operator | ? in depth — what it desugars to |
| 294-custom-error-type | Custom error enum with Display |
| 295-error-trait-impl | Implementing std::error::Error |
| 296-from-trait-errors | From for error conversion — enabling ? across types |
| 297-thiserror-pattern | thiserror derive macro pattern |
| 298-anyhow-pattern | anyhow for application-level errors |
| 299-error-context | Adding context to errors |
| 300-error-chaining | Chained error sources |
| 301-result-transpose | Result<Option<T>,E> → Option<Result<T,E>> |
| 303-collect-results | collect::<Result<Vec<_>, _>>() — fail-fast collection |
| 304-partition-results | Separating Ok and Err values |
| 307-error-propagation-closures | ? inside closures — pitfalls |
| 308-panic-vs-result | Decision table: panic vs. Result |
| 309-never-type-errors | ! (never type) in error contexts |
| 310-infallible-conversions | Infallible error type |
| 311-multiple-error-types | Unifying multiple error types with Box<dyn Error> |
| 312-error-downcasting | .downcast_ref::<T>() on error traits |
| 313-try-trait | The Try trait — what ? uses |
| 314-validated-accumulation | Accumulating errors without short-circuit |
| 315-result-ok-err-methods | .ok(), .err(), .is_ok(), .is_err() |
| 316-io-error-handling | std::io::Error — kind-based matching |
| 317-parse-error-handling | ParseIntError and friends |
| 318-error-display-debug | Display vs Debug for errors |
| 319-error-in-tests | Errors in test functions — -> Result<(), E> |
| 320-fallible-iterator | Iterating with Result items |
| 581-pattern-result-ok-err | Pattern matching on Ok(v) / Err(e) |
| 755-testing-error-paths | Testing that errors are returned correctly |
💪 Exercism
| Exercise | Focus |
|---|---|
| error-handling | Custom error types, Result, From — full workflow |
| nth-prime | Returning Result for invalid input |
| robot-name | Struct + Result, mutable state |
| wordy | Parsing user input — Result for malformed commands |
| custom-set | Generic collection with error-producing operations |
🏋️ Rustlings (fix broken programs: rustlings run <name>)
| Exercise | What you fix |
|---|---|
errors1 | Return a String error instead of panic! |
errors2 | Propagate errors with ? operator |
errors3 | Fix a ? operator in a function returning Option |
errors4 | Custom error type with Box<dyn Error> |
errors5 | Multiple error types — Box<dyn Error> pattern |
errors6 | Implement From to convert between error types |
| 🎓 Also in Curriculum (from Teacher Guide) |
| Resource | URL | What it adds |
|---|---|---|
| Rust by Example | doc.rust-lang.org/rust-by-example | error handling full chapter — Result, ?, multiple error types |
Module 8: Generic Types, Traits, and Lifetimes
Goal: Write flexible, reusable code and handle references correctly.
Topics: Generic functions & structs · Traits & default implementations · Trait bounds & impl Trait · Lifetimes ('a) · Elision rules · 'static
Exercises: Summary trait for NewsArticle and Tweet · longest function returning the longer of two string slices.
📖 Book
| Chapter | Section |
|---|---|
| 📕 The Rust Programming Language, 2nd ed. (NoStarch, $39.95 · ISBN 978-1-7185-0044-0) | Chapter 10 — Generics, Traits, Lifetimes |
| 📗 Programming Rust, 2nd ed. (O'Reilly, $59.99 · ISBN 978-1-492-05259-5) | Chapter 11 — Traits and Generics · Chapter 13 — Utility Traits |
| 📘 Rust for Rustaceans (NoStarch, $39.95 · ISBN 978-1-7185-0185-0) by Jon Gjengset | Chapter 2 — Types · Chapter 3 — Designing Interfaces |
| Ch 10 — Generic Types, Traits, and Lifetimes | Full chapter — core reading |
| Ch 10.1 — Generic Data Types | <T> in functions, structs, enums |
| Ch 10.2 — Traits: Defining Shared Behavior | trait, impl for, default methods, bounds |
| Ch 10.3 — Validating References with Lifetimes | Annotation syntax, elision rules, 'static |
| Ch 17.2 — Using Trait Objects | dyn Trait — runtime dispatch |
| Ch 19.3 — Advanced Traits | Associated types, newtype pattern, operator overloading |
| Ch 19.4 — Advanced Types | Type aliases, ! type, DSTs |
🦀 hightechmind.io/rust/
Core traits:
| Example | What it shows |
|---|---|
| 076-trait-objects | dyn Trait — heterogeneous collections |
| 077-generic-bounds | <T: Trait> — constraining type parameters |
| 078-where-clauses | where — readable complex bounds |
| 079-associated-types | Associated types — cleaner than extra generics |
| 081-newtype-pattern | Newtype — wrapping for type safety |
| 082-type-aliases | type aliases — readable complex signatures |
| 083-display-trait | Display — custom printing |
| 084-from-into-traits | From / Into — type conversion |
| 085-iterator-trait | Iterator — the most important trait to implement |
| 123-impl-trait | impl Trait in argument and return position |
| 124-dyn-trait | dyn Trait — when types vary at runtime |
| 125-send-sync | Send + Sync — the thread safety traits |
Functional trait theory (category-theoretic traits):
| Example | What it shows |
|---|
Advanced trait patterns:
| Example | What it shows |
|---|---|
| 381-blanket-implementations | impl<T: Trait> OtherTrait for T |
| 382-associated-types-advanced | Associated type defaults, multiple impl |
| 384-trait-objects-dyn | dyn Trait — vtable dispatch |
| 385-trait-objects-any | dyn Any — type erasure |
| 386-object-safe-traits | Object safety rules |
| 387-sealed-trait-pattern | Sealed traits — preventing external implementation |
| 388-extension-trait-pattern | Extension traits — adding methods to foreign types |
| 389-newtype-pattern | Newtype for orphan rule workaround |
| 390-type-alias-impl-trait | TAIT — type Foo = impl Trait |
| 391-impl-trait-return | impl Trait in return position |
| 392-impl-trait-argument | impl Trait in argument position |
| 393-trait-bounds-where | Complex where clauses |
| 394-supertrait-pattern | Supertraits — requiring another trait |
| 395-default-methods | Default method implementations |
| 397-marker-traits | Zero-method marker traits |
| 398-auto-traits | Auto-implemented traits |
| 399-coherence-orphan-rules | Orphan rule — why impl has restrictions |
| 400-trait-dispatch | Static vs. dynamic dispatch compared |
| 401-deref-coercion | Deref coercions via the Deref trait |
| 403-display-debug-traits | Display + Debug side by side |
| 404-from-into-as | From, Into, TryFrom, TryInto |
| 405-iterator-trait-deep | Deep dive into Iterator internals |
| 406-hash-eq-ord-traits | Hash, Eq, Ord, PartialOrd |
| 407-default-trait | Default — zero value for your type |
| 408-clone-copy-traits | Clone vs Copy — semantic difference |
| 409-drop-trait | Drop — custom cleanup logic |
| 410-arithmetic-operator-overload | Add, Sub, Mul operator traits |
Const generics:
| Example | What it shows |
|---|---|
| 126-const-generics | <const N: usize> — compile-time constant generics |
| 127-const-functions | const fn — functions evaluated at compile time |
| 774-const-generics-basics | [T; N] generic arrays |
| 775-const-array-size | Fixed-size arrays parameterized by const |
| 776-const-fn-basics | Compile-time computation |
| 777-const-assert-patterns | const_assert! — compile-time guarantees |
| 778-const-fibonacci | Fibonacci at compile time |
| 779-const-lookup-table | Static lookup tables via const eval |
| 780-const-generic-struct | Structs parameterized by constants |
| 781-const-where-bounds | where on const generics |
| 782-const-eval-patterns | Patterns for const evaluation |
| 783-const-type-arithmetic | Type-level arithmetic with const generics |
Lifetimes:
| Example | What it shows |
|---|---|
| 105-lifetime-basics | 'a annotations — why the compiler needs them |
| 106-lifetime-elision | When you do NOT write annotations |
| 107-lifetime-structs | Structs holding references |
| 531-lifetime-basics | Extended: multiple parameters |
| 532-lifetime-multiple | Multiple lifetime parameters |
| 533-lifetime-struct | Lifetime in struct definition |
| 534-lifetime-impl | Lifetime in impl blocks |
| 535-lifetime-enum | Lifetime in enum variants |
| 536-lifetime-static | 'static lifetime |
| 537-lifetime-coercion | Lifetime coercions |
| 538-lifetime-variance | Covariance / contravariance |
| 539-lifetime-nll | Non-lexical lifetimes |
| 540-lifetime-borrow-checker | Borrow checker reasoning |
| 541-lifetime-elision | The three elision rules |
| 542-lifetime-higher-ranked | HRTB — for<'a> |
| 543-lifetime-trait-objects | dyn Trait + 'a |
| 544-lifetime-closures | Lifetimes and closures |
| 545-lifetime-split-borrow | Split borrows — borrowing different fields |
| 546-lifetime-reborrow | Reborrowing &mut |
| 548-lifetime-named-return | Named return lifetimes |
| 549-lifetime-phantom | Phantom data lifetimes |
| 557-lifetime-output-lifetime | Output lifetime annotation |
| 558-lifetime-input-lifetime | Input lifetime annotation |
| 560-lifetime-cheatsheet | All lifetime patterns in one reference |
💪 Exercism
| Exercise | Focus |
|---|---|
| accumulate | Generic function + trait bounds — re-implement map |
| dot-dsl | Builder pattern with generics and traits |
| role-playing-game | Traits + Option — shared behavior |
| space-age | Generic struct + trait implementation |
| clock | Display + Add trait implementation |
🏋️ Rustlings (fix broken programs: rustlings run <name>)
| Exercise | What you fix |
|---|---|
generics1 | Generic function — add type parameter <T> |
generics2 | Generic struct — struct Wrapper<T> |
traits1 | Define and implement a trait |
traits2 | Default method implementation |
traits3 | Trait objects Box<dyn Trait> — dynamic dispatch |
traits4 | Trait bounds where T: Trait |
traits5 | impl Trait in function signatures |
lifetimes1 | Add 'a annotation to a function returning a reference |
lifetimes2 | Struct with a lifetime-annotated reference field |
lifetimes3 | Fix the 'static lifetime annotation |
using_as | as casting — numeric type conversion |
from_into | From and Into traits — type conversion |
from_str | FromStr — parse a string into a custom type |
as_ref_mut | AsRef and AsMut — cheap reference conversion |
try_from_into | TryFrom/TryInto — fallible conversion |
quiz3 | Quiz 3: generics + traits — ReportCard with generic grade type |
| 🎓 Also in Curriculum (from Teacher Guide) |
| Resource | URL | What it adds |
|---|---|---|
| Rust by Example | doc.rust-lang.org/rust-by-example | generics, traits, lifetimes chapters |
Module 9: Automated Tests
Goal: Ensure code correctness.
Topics: #[test] · assert!, assert_eq!, assert_ne! · #[should_panic] · Integration tests (tests/ directory)
Exercises: Comprehensive tests for the Rectangle struct.
📖 Book
| Chapter | Section |
|---|---|
| 📕 The Rust Programming Language, 2nd ed. (NoStarch, $39.95 · ISBN 978-1-7185-0044-0) | Chapter 11 — Automated Tests |
| 📗 Programming Rust, 2nd ed. (O'Reilly, $59.99 · ISBN 978-1-492-05259-5) | Chapter 11 — Testing |
| Ch 11 — Writing Automated Tests | Full chapter |
| Ch 11.1 — How to Write Tests | #[test], assertions, #[should_panic] |
| Ch 11.2 — Controlling How Tests Are Run | Test filters, --nocapture, parallelism |
| Ch 11.3 — Test Organization | Unit vs. integration tests, tests/ directory |
🦀 hightechmind.io/rust/
| Example | What it shows |
|---|---|
| 744-unit-test-patterns | #[test], assert_eq!, test module organization |
| 745-integration-test-setup | tests/ directory structure |
| 746-doc-test-patterns | /// doc-tests — documentation that compiles |
| 747-test-fixtures | Shared setup across multiple tests |
| 748-property-based-testing | Property-based tests — invariants not cases |
| 749-fuzzing-concepts | Fuzzing with cargo-fuzz |
| 750-snapshot-testing | Snapshot / golden file tests |
| 751-mock-trait-pattern | Mocking with traits — testable design |
| 752-test-doubles-taxonomy | Stubs, mocks, fakes, spies |
| 753-bench-harness-pattern | #[bench] — micro-benchmarks |
| 754-testing-async-code | Testing async functions |
| 755-testing-error-paths | Testing error returns |
| 756-tempfile-testing | Temporary files in tests |
| 757-golden-file-tests | Comparing output against golden files |
| 758-test-isolation-patterns | Keeping tests independent |
💪 Exercism
| Exercise | Focus |
|---|---|
| sieve | Tests provided — write code that makes them pass |
| perfect-numbers | #[should_panic], Result returns in tests |
| grade-school | Multiple assertions per test, test organization |
| prime-sieve | Red-green-refactor cycle practice |
🏋️ Rustlings (fix broken programs: rustlings run <name>)
| Exercise | What you fix |
|---|---|
tests1 | Write a test with assert! |
tests2 | assert_eq! and assert_ne! |
tests3 | #[should_panic] — test that code panics |
| 🎓 Also in Curriculum (from Teacher Guide) |
| Resource | URL | What it adds |
|---|---|---|
| Rust by Example | doc.rust-lang.org/rust-by-example | testing chapter |
Module 10: Functional Features: Iterators and Closures
Goal: Use functional programming patterns.
Topics: Closures (anonymous functions, environment capture) · Iterator trait and next · Consuming adapters (sum, collect) · Producing adapters (map, filter)
Exercises: Re-implement the IO Project (grep clone) using iterators and closures.
📖 Book
| Chapter | Section |
|---|---|
| 📕 The Rust Programming Language, 2nd ed. (NoStarch, $39.95 · ISBN 978-1-7185-0044-0) | Chapter 13 — Closures and Iterators |
| 📗 Programming Rust, 2nd ed. (O'Reilly, $59.99 · ISBN 978-1-492-05259-5) | Chapter 14 — Closures · Chapter 15 — Iterators |
| Ch 13 — Functional Language Features | Full chapter |
| Ch 13.1 — Closures: Anonymous Functions | Fn, FnMut, FnOnce, capture by reference/move |
| Ch 13.2 — Processing a Series of Items with Iterators | Iterator trait, adapters, consumers |
| Ch 12 — I/O Project (refactor section) | Applying iterators to the grep clone — the exercise itself |
🦀 hightechmind.io/rust/
Closures — core:
| Example | What it shows |
|---|---|
| 005-currying | Partial application via closures |
| 006-function-composition | Composing f(g(x)) |
| 051-applying-function-twice | Higher-order functions — apply f twice |
| 001-higher-order-functions | Functions as values — the foundation of iterator chains |
| 052-function-composition | Function composition operator |
| 053-pipeline-operator | Pipeline ` |
| 074-currying-partial | Currying and partial application |
| 120-closure-types | Fn, FnMut, FnOnce — the three traits |
| 121-closure-capture | Capture by reference vs. move |
| 122-higher-order-fn | Functions that accept and return functions |
| 518-function-pointers | fn pointer vs closure |
Closure series (501–530):
| Example | What it shows |
|---|---|
| 501-closure-capture-rules | Capture rules with ownership |
| 502-fn-fnmut-fnonce | When to use each closure trait |
| 503-closure-as-argument | Passing closures to functions |
| 504-closure-as-return | Returning closures from functions |
| 505-boxing-closures | Box<dyn Fn(...)> for dynamic closures |
| 506-closure-move-semantics | move closures |
| 507-closure-memoization | Caching closure results |
| 508-closure-partial-application | Building specialized functions |
| 509-closure-composition | Composing closures at runtime |
| 510-closure-currying | Currying via closures |
| 511-closure-recursive | Recursive closures |
| 512-closure-state-machine | State machine using closure state |
| 513-closure-strategy-pattern | Strategy pattern with closures |
| 514-closure-observer-pattern | Observer pattern with closures |
| 515-closure-once-cell | FnOnce + OnceCell lazy init |
| 516-closure-environment | Closures as environments |
| 517-closure-coercion | Closure coercion to fn pointers |
| 519-closure-type-inference | Type inference in closures |
| 520-closure-higher-order | Higher-order closure combinators |
| 521-closure-map-reduce | Map-reduce via closures |
| 522-closure-predicate | Predicate closures |
| 523-closure-event-handler | Event handlers as closures |
| 524-closure-builder-closures | Builder pattern with closures |
| 525-closure-tap-pattern | .tap() — side effects in chains |
| 526-closure-pipe-operator | Pipe operator via closures |
| 527-closure-once-consumer | FnOnce consumer pattern |
| 528-closure-lifetime-capture | Lifetime annotations with captured references |
| 529-closure-async | Async closures |
| 530-closure-benchmark-idioms | Benchmark idioms using closures |
Iterators — core:
| Example | What it shows |
|---|---|
| 054-list-map-from-scratch | Building map from scratch |
| 055-list-filter-from-scratch | Building filter from scratch |
| 056-fold-right | Right fold |
| 057-fold-left | Left fold — the basis of reduce |
| 068-tail-recursive-accumulator | Accumulator pattern — tail-recursive fold |
| 069-unfold | unfold — generate sequences |
| 070-scan-left | .scan() — accumulate and emit each step |
| 085-iterator-trait | Iterator — next() and lazy evaluation |
| 086-custom-iterator | Writing your own iterator type |
| 087-iterator-adapters | .map(), .filter(), .chain() |
| 088-iterator-consumers | .collect(), .sum(), .fold() |
| 089-lazy-sequences | Lazy evaluation — nothing runs until consumed |
| 090-infinite-iterators | Infinite iterators with .take() |
| 091-zip-unzip | .zip() and .unzip() |
| 092-scan-accumulate | .scan() — stateful iteration |
| 093-windows-chunks | .windows(n) and .chunks(n) |
| 094-peekable-iterator | .peekable() — look ahead |
| 095-double-ended | DoubleEndedIterator — .rev() |
| 096-exact-size | ExactSizeIterator — .len() on iterators |
| 097-flatten-iterator | .flatten() / .flat_map() |
| 098-partition-iterator | .partition() — split by predicate |
| 099-group-by-iter | Group consecutive equal elements |
| 100-step-by | .step_by(n) |
| 101-lazy-sequences | Lazy sequence generation |
| 103-unfold | iter::from_fn() |
| 104-scan-left | .scan() left fold variant |
Extended iterator series (256–290):
💪 Exercism
| Exercise | Focus |
|---|---|
| nucleotide-count | .filter().count(), HashMap |
| isbn-verifier | .chars(), .enumerate(), .filter(), .fold() |
| difference-of-squares | .map(), .sum() |
| all-your-base | Iterators + error handling combined |
| accumulate | Implement map without the standard library |
| sublist | .windows() — sliding window search |
| flatten-array | .flatten() / .flat_map() |
| pascals-triangle | .zip() + accumulated builds |
| minesweeper | 2D iteration with closures |
| luhn | .chars(), .rev(), .enumerate(), .fold() |
| scrabble-score | .chars(), .map(), .sum() |
| pangram | .collect::<HashSet<_>>() |
| roman-numerals | Iterator fold over lookup table |
🏋️ Rustlings (fix broken programs: rustlings run <name>)
| Exercise | What you fix |
|---|---|
iterators1 | Create an iterator with .iter() and next() |
iterators2 | .map() — transform each element |
iterators3 | .filter() and .chain() — compose iterators |
iterators4 | .fold() / .sum() — consuming iterators |
iterators5 | Complex iterator chain — .flat_map(), .zip() |
| 🎓 Also in Curriculum (from Teacher Guide) |
| Resource | URL | What it adds |
|---|---|---|
| Rust by Example | doc.rust-lang.org/rust-by-example | closures, iterators chapters |
Module 11: Smart Pointers
Goal: Advanced memory management capabilities.
Topics: Box<T> · Deref trait · Drop trait · Rc<T> (multiple ownership) · RefCell<T> (interior mutability) · Reference cycles
Exercises: Cons list using Box and Rc · Mock object using RefCell.
📖 Book
| Chapter | Section |
|---|---|
| 📕 The Rust Programming Language, 2nd ed. (NoStarch, $39.95 · ISBN 978-1-7185-0044-0) | Chapter 15 — Smart Pointers |
| 📗 Programming Rust, 2nd ed. (O'Reilly, $59.99 · ISBN 978-1-492-05259-5) | Chapter 5 — References · Chapter 22 — Unsafe Code |
| 📘 Rust for Rustaceans (NoStarch, $39.95 · ISBN 978-1-7185-0185-0) by Jon Gjengset | Chapter 1 — Foundations (ownership, Box, Rc, RefCell) |
| Ch 15 — Smart Pointers | Full chapter |
| Ch 15.1 — Box<T> | Heap allocation, recursive types |
| Ch 15.2 — Deref Trait | *, deref coercions |
| Ch 15.3 — Drop Trait | Custom cleanup, std::mem::drop |
| Ch 15.4 — Rc<T> | Shared ownership, reference counting |
| Ch 15.5 — RefCell<T> and Interior Mutability | Runtime borrow checking |
| Ch 15.6 — Reference Cycles and Memory Leaks | Weak<T>, avoiding cycles |
🦀 hightechmind.io/rust/
| Example | What it shows |
|---|---|
| 116-box-heap | Box<T> — heap allocation and indirection |
| 117-recursive-types | Box for recursive data structures |
| 118-deref-coercions | Deref trait — transparent pointer behaviour |
| 108-rc-shared | Rc<T> — shared ownership, single thread |
| 110-cell-interior | Cell<T> — interior mutability for Copy types |
| 111-refcell-runtime | RefCell<T> — borrow checking at runtime |
| 112-cow-clone-on-write | Cow<T> — clone only when needed |
| 369-cow-clone-on-write | Cow in a data structure |
| 355-linked-list-rust | Linked list in Rust — classic pointer challenge |
| 361-rope-data-structure | Rope — Arc<str> chunks |
| 363-arena-allocation | Arena allocator pattern |
| 364-slab-allocator | Slab allocator pattern |
| 368-persistent-data-structures | Immutable persistent structures via Rc |
| 550-lifetime-cell-refcell | Lifetimes + Cell/RefCell interaction |
| 551-lifetime-rc-weak | Rc with Weak to break cycles |
| 552-lifetime-arena-pattern | Arena pattern with lifetimes |
| 553-lifetime-self-referential | Self-referential structs — why they're hard |
💪 Exercism
| Exercise | Focus |
|---|---|
| simple-linked-list | Box<T> for recursive list structure |
| circular-buffer | Interior state — naturally uses RefCell patterns |
| doubly-linked-list | Rc<RefCell<Node<T>>> — the classic double-pointer problem |
| rpn-calculator | Stack using Vec — clean pointer management |
| paasio | Shared state with Rc<RefCell<T>> |
🏋️ Rustlings (fix broken programs: rustlings run <name>)
| Exercise | What you fix |
|---|---|
box1 | Box<T> — recursive enum (cons list) requires boxing |
rc1 | Rc<T> — multiple owners via reference counting |
arc1 | Arc<T> — thread-safe Rc with Mutex |
cow1 | Cow<'a, T> — clone-on-write: borrow or own |
| 🎓 Also in Curriculum (from Teacher Guide) |
| Resource | URL | What it adds |
|---|---|---|
| Jon Gjengset — Crust of Rust | YouTube playlist | Smart Pointers episode — deep dive into Box, Rc, RefCell |
Module 12: Concurrency
Goal: Write safe concurrent code.
Topics: spawn & join · Message passing (mpsc) · Shared state (Mutex<T> & Arc<T>) · Send & Sync traits
Exercises: Build a multi-threaded web server.
📖 Book
| Chapter | Section |
|---|---|
| 📕 The Rust Programming Language, 2nd ed. (NoStarch, $39.95 · ISBN 978-1-7185-0044-0) | Chapters 16 + 20 — Concurrency + Web Server Project |
| 📗 Programming Rust, 2nd ed. (O'Reilly, $59.99 · ISBN 978-1-492-05259-5) | Chapter 19 — Concurrency · Chapter 20 — Asynchronous Programming |
| 📙 Rust Atomics and Locks (O'Reilly, $54.99 · ISBN 978-1-098-11944-7) by Mara Bos — also free online | The definitive book on low-level concurrency in Rust |
| 📘 Rust for Rustaceans (NoStarch, $39.95 · ISBN 978-1-7185-0185-0) by Jon Gjengset | Chapter 8 — Asynchronous Programming · Chapter 9 — Unsafe Code |
| Ch 16 — Fearless Concurrency | Full chapter |
| Ch 16.1 — Using Threads | thread::spawn, join, move closures |
| Ch 16.2 — Message Passing | mpsc channels, send, recv |
| Ch 16.3 — Shared-State Concurrency | Mutex<T>, Arc<T>, the canonical pattern |
| Ch 16.4 — Extensible Concurrency: Sync and Send | Send, Sync — compile-time thread safety |
| Ch 20 — Final Project: Web Server | Full multi-threaded server — the Module 12 exercise |
🦀 hightechmind.io/rust/
Thread basics:
| Example | What it shows |
|---|---|
| 125-send-sync | Send and Sync traits explained |
| 441-thread-basics | thread::spawn, join, move closures |
| 442-thread-scoped | Scoped threads — borrow stack data in threads |
| 443-arc-mutex-pattern | Arc<Mutex<T>> pattern in full |
| 444-arc-rwlock-pattern | Arc<RwLock<T>> — read-many, write-exclusive |
| 445-mpsc-channel | mpsc channel — send/recv |
| 446-thread-pool-pattern | Thread pool — reuse threads |
| 447-work-stealing | Work-stealing scheduler pattern |
| 448-rayon-parallel | rayon — parallel iterators |
| 449-rayon-join | rayon::join() — fork-join parallelism |
| 450-crossbeam-channel | crossbeam channels — multi-producer multi-consumer |
| 451-crossbeam-select | crossbeam::select! — wait on multiple channels |
| 452-atomic-types | AtomicBool, AtomicUsize, AtomicPtr |
| 453-memory-ordering | Relaxed, Acquire, Release, SeqCst |
| 454-compare-exchange | CAS operations |
| 455-lock-free-stack | Lock-free stack using atomics |
| 456-once-cell-sync | OnceCell / OnceLock — lazy global state |
| 457-condvar-pattern | Condvar — condition variables |
| 458-barrier-sync | Barrier — wait for all threads |
| 459-thread-local-storage | thread_local! — per-thread data |
| 460-send-sync-bounds | Send + Sync bound constraints in practice |
| 461-producer-consumer | Producer-consumer with channels |
| 462-pipeline-concurrency | Pipeline stages connected by channels |
| 463-fan-out-fan-in | Fan-out / fan-in work distribution |
| 464-actor-pattern | Actor model with message passing |
| 465-message-passing | Message passing patterns |
| 466-concurrent-hashmap | Concurrent HashMap patterns |
| 467-epoch-gc | Epoch-based garbage collection |
| 468-lock-free-queue | Lock-free queue |
| 469-parallel-reduce | Parallel reduce / fold |
| 470-concurrent-btree | Concurrent B-tree |
Async/await (related to concurrency):
| Example | What it shows |
|---|---|
| 321-async-basics | async fn, .await |
| 322-future-trait | Future trait |
| 323-async-block | async { } blocks |
| 324-join-futures | join! — concurrent futures |
| 325-select-futures | select! — first future wins |
| 326-async-move-closure | async move closures |
| 327-spawn-tasks | tokio::spawn task spawning |
| 328-channel-async | Async channels |
| 329-async-stream | Async streams |
| 330-async-sink | Async sinks |
| 331-timeout-async | Timeout on async operations |
| 332-retry-async | Retry logic |
| 333-async-recursion | Recursive async functions |
| 334-pin-unpin | Pin<T> — why self-referential futures need pinning |
| 335-waker-context | Waker — how executors wake tasks |
| 336-executor-basics | Building a minimal executor |
| 337-async-mutex | Async-aware Mutex |
| 338-async-rwlock | Async RwLock |
| 339-semaphore-async | Async semaphore |
| 340-async-trait-pattern | async-trait crate pattern |
| 341-buffered-stream | Buffered async streams |
| 342-async-io | Async I/O operations |
| 343-cancellation-token | Cancellation tokens |
| 344-structured-concurrency | Structured concurrency pattern |
| 345-async-drop | Cleanup in async contexts |
| 346-runtime-context | Runtime context propagation |
| 347-blocking-in-async | spawn_blocking for CPU-bound work |
| 348-async-generator-pattern | Async generators |
| 349-broadcast-channel | Broadcast channels |
| 350-oneshot-channel | One-shot channels |
💪 Exercism
| Exercise | Focus |
|---|---|
| parallel-letter-frequency | thread::spawn, Arc, joining handles |
| bank-account | Mutex for shared mutable state |
🏋️ Rustlings (fix broken programs: rustlings run <name>)
| Exercise | What you fix |
|---|---|
threads1 | thread::spawn + .join() — basic thread creation |
threads2 | Arc<Mutex<T>> — shared mutable state across threads |
threads3 | mpsc channels — send messages between threads |
| 🎓 Also in Curriculum (from Teacher Guide) |
| Resource | URL | What it adds |
|---|---|---|
| Jon Gjengset — Crust of Rust | YouTube playlist | Channels episode, Atomics episode |
Certification Milestone: LFRS Exam (End of Phase 2, Week 28)
You have completed Modules 1–12. This is the natural exam point.
Linux Foundation Rust Programming Professional Certificate (LFRS)
| Provider | Linux Foundation / edX |
| Exam page | training.linuxfoundation.org/certification/rust-programming-professional-certificate |
| Cost | ~$395 USD (bundles occasionally discounted on edX) |
| Format | Performance-based online exam (write real Rust code in a browser IDE) — no multiple choice |
| Duration | 2 hours |
| Passing score | 66% |
| Validity | 3 years, then renewable |
| Proctored | Yes — via PSI Online; requires webcam + quiet room |
What the exam covers
The exam maps directly to Modules 1–12 of this curriculum:
| Exam domain | Covered in |
|---|---|
| Syntax, types, control flow | Modules 1–2 |
| Ownership, borrowing, lifetimes | Modules 3, 8 |
| Structs, enums, pattern matching | Module 4 |
| Modules and crates | Module 5 |
| Collections, strings | Module 6 |
| Error handling | Module 7 |
| Traits and generics | Module 8 |
| Testing | Module 9 |
| Closures and iterators | Module 10 |
Smart pointers (Box, Rc, RefCell) | Module 11 |
Concurrency (threads, channels, async) | Module 12 |
Modules 13–15 are NOT required for this certification. Macros, Polars/CSV data processing, and the capstone are advanced specializations beyond the LFRS scope — that is why they come after.
How to register
- Go to training.linuxfoundation.org/certification/rust-programming-professional-certificate
- Click "Get Certified" — you can also bundle it with the LFD459 training course for a discount
- You have 12 months from purchase to schedule the exam
- Schedule via the PSI Online portal (link sent by email after purchase)
- You get one free retake if you do not pass on the first attempt
Final prep checklist (Week 27–28)
- Complete all Rustlings exercises through Module 12
- Solve 5+ Exercism exercises at the "hard" difficulty
- Read the official LFRS Exam Prep Guide (linked from the cert page)
- Practice writing code in a plain editor without auto-complete — the exam IDE is minimal
- Time yourself: aim to solve a medium-difficulty exercise in under 15 minutes
- Review
unsafe,Pin,Send/Sync— these appear in Module 11–12 and trip up candidates
Phase 3: Advanced Specialization (Weeks 29–36)
Modules 13–15 — post-certification, not required for LFRS
Module 13: Advanced Rust (Macros)
Goal: Metaprogramming — write code that writes code.
Topics:
- Declarative Macros (
macro_rules!) — syntax, matchers, transcribers, repetition, recursion, hygiene - Procedural Macros — custom derive, attribute-like, function-like ·
synandquote
Exercises: my_vec! macro (like vec!) · Derive macro that implements Hello trait.
📖 Book & References
| Resource | Section |
|---|---|
| 📕 The Rust Programming Language, 2nd ed. (NoStarch, $39.95 · ISBN 978-1-7185-0044-0) | Chapter 19.5 — Macros |
| 📗 Programming Rust, 2nd ed. (O'Reilly, $59.99 · ISBN 978-1-492-05259-5) | Chapter 21 — Macros (declarative + procedural) |
| 📘 Rust for Rustaceans (NoStarch, $39.95 · ISBN 978-1-7185-0185-0) by Jon Gjengset | Chapter 6 — Testing · Chapter 7 — Macros |
| Ch 19.5 — Macros | Declarative and procedural macros |
| The Little Book of Rust Macros | Full book — the definitive macro guide |
| Rust Reference — Macros | Official specification |
| Rust Reference — Procedural Macros | Derive, attribute, function-like proc macros |
🦀 hightechmind.io/rust/
Declarative macros:
| Example | What it shows |
|---|---|
| 411-macro-rules-basics | macro_rules! — syntax and structure |
| 412-macro-repetition | $(...)* — repetition patterns |
| 413-macro-fragment-types | expr, ty, ident, pat, tt fragments |
| 414-macro-recursive | Recursive macro expansion |
| 415-macro-tt-munching | TT munching — consuming token trees |
| 416-macro-builder-pattern | Builder pattern via macros |
| 417-macro-vec-like | vec!-style macro — the exercise itself |
| 418-macro-stringify | stringify! — compile-time to string |
| 419-macro-cfg-attr | #[cfg] conditional compilation |
| 420-macro-env | env! — compile-time environment variables |
| 421-macro-include | include!, include_str!, include_bytes! |
| 428-macro-hygiene | Macro hygiene — variable scoping rules |
| 429-macro-scoping | Macro visibility and scoping |
| 430-macro-debugging | Debugging macro expansion |
| 431-macro-count-pattern | Counting repetitions in macros |
| 432-macro-enum-dispatch | Enum dispatch via macro |
| 433-macro-state-machine | State machine DSL via macros |
| 434-macro-dsl | Domain-specific language in macros |
| 435-macro-lazy-static | lazy_static! pattern |
| 436-macro-newtype-derive | Newtype boilerplate via macro |
| 437-macro-test-helpers | Test helper macros |
| 438-macro-format-args | format_args! internals |
| 439-macro-assert-variants | Custom assert macros |
| 440-macro-log-pattern | Logging macros |
Procedural macros:
| Example | What it shows |
|---|---|
| 422-derive-macro-concept | Derive macro concept |
| 423-proc-macro-intro | Procedural macro basics |
| 424-proc-macro-derive | Custom #[derive(MyTrait)] |
| 425-proc-macro-attribute | Attribute-like macros #[route(...)] |
| 426-proc-macro-function-like | Function-like proc macros sql!(...) |
| 427-syn-quote-basics | syn and quote — parsing and generating tokens |
Type-level patterns (macro-adjacent):
| Example | What it shows |
|---|---|
| 066-phantom-types | Phantom types — compile-time state |
| 128-type-level-bool | Type-level booleans |
| 129-type-level-nat | Type-level natural numbers |
| 130-typestate-pattern | Typestate — state machines in types |
| 131-builder-pattern | Builder pattern — types enforce valid construction |
| 140-type-safe-printf | Type-safe format strings |
| 734-typestate-basics | Typestate fundamentals |
| 735-typestate-builder | Typestate builder — what derive macros enable |
| 736-typestate-connection | Connection state: Open→Authenticated→Closed |
| 737-typestate-file-handle | File handle with typestate safety |
| 738-phantom-type-basics | PhantomData explained |
| 739-phantom-units-of-measure | Units of measure via phantom types |
| 740-phantom-variance-control | Variance control with PhantomData |
| 741-parse-dont-validate | Parse-don't-validate — type-level guarantees |
| 742-type-witnesses | Type witnesses |
| 743-session-types | Session types — protocol enforcement |
💪 Exercism
| Exercise | Focus |
|---|---|
| macros | Direct macro_rules! practice |
🏋️ Rustlings (fix broken programs: rustlings run <name>)
| Exercise | What you fix |
|---|---|
macros1 | Call a macro that doesn't exist — understand the ! call syntax |
macros2 | Write a macro_rules! that takes an argument |
macros3 | Macro with multiple patterns — $(...)* repetition |
macros4 | Macro export — #[macro_export] for crate-wide visibility |
| 🎓 Also in Curriculum (from Teacher Guide) |
| Resource | URL | What it adds |
|---|---|---|
| Jon Gjengset — Crust of Rust | YouTube playlist | Proc Macros episode — live coding a derive macro |
Module 14: Data Processing with Polars and CSV
Goal: Efficiently handle and analyze large datasets using Rust.
Topics: CSV with the csv crate · Polars: Series and DataFrames · Filtering, selecting, sorting · Aggregations and GroupBy · Lazy vs. eager execution
Exercises: Read CSV weather data, calculate average temperature · Polars: load dataset, filter, export summary CSV.
📖 Books (Print / eBook)
| Title | Chapters |
|---|---|
| 📗 Programming Rust, 2nd ed. (O'Reilly, $59.99 · ISBN 978-1-492-05259-5) | Chapter 17 — Strings and Text · Chapter 18 — Input and Output |
| 📙 Zero To Production In Rust (self-published, $39.99 — also ebook) by Luca Palmieri | Chapter 5+ — data ingestion, serialization, production patterns |
📖 Documentation & Guides
| Resource | Section |
|---|---|
| Polars User Guide | Start with "Getting Started" then "Expressions" |
| Polars Rust API | Rust-specific API reference |
| csv crate docs | Reading, writing, serde integration |
| Serde documentation | Serialization framework — used by both csv and Polars |
| Serde JSON | JSON serialization/deserialization |
🦀 hightechmind.io/rust/
Serialization:
| Example | What it shows |
|---|---|
| 759-manual-serialize-trait | Serialize by hand — understanding internals |
| 760-serde-derive-concept | #[derive(Serialize, Deserialize)] — the standard path |
| 761-custom-serialize-logic | Custom serialization for non-standard formats |
| 762-custom-deserialize-logic | Custom deserialization with validation |
| 763-json-format-from-scratch | JSON format implementation from scratch |
| 764-binary-format-encoding | Binary formats — compact and fast |
| 765-csv-parsing-pattern | CSV reading and writing |
| 766-config-file-parsing | TOML/JSON config files |
| 767-versioned-data-format | Handling versioned data schemas |
| 768-zero-copy-deserialize | Zero-copy deserialization — no allocation |
| 769-streaming-parser-pattern | Streaming parsers — files larger than RAM |
| 773-serde-attributes-concept | #[serde(rename)], #[serde(default)], etc. |
Parsers (data ingestion):
| Example | What it shows |
|---|---|
| 151-parser-intro | Parser combinator introduction |
| 171-csv-parser | CSV parser from scratch |
| 172-ini-parser | INI file parser |
| 175-json-parser | JSON parser from scratch |
| 770-recursive-descent-parser | Recursive descent parser |
| 771-pratt-parser | Pratt parser — operator precedence |
| 772-parser-combinator-pattern | Parser combinator composition |
💪 Exercism (prerequisite data-processing skills — Exercism has no dedicated Polars exercises)
| Exercise | Focus |
|---|---|
| saddle-points | 2D data processing — grid filtering |
| largest-series-product | String parsing + numeric processing |
| matrix | Parsing text into 2D data structure |
| dominoes | Graph-style data manipulation |
| tournament | Parsing, aggregating, sorting tabular data — closest to Polars use case |
🎓 Also in Curriculum (from Teacher Guide)
| Resource | URL | What it adds |
|---|---|---|
| Polars User Guide | docs.pola.rs | Primary reference — start here before coding |
| Jon Gjengset — Crust of Rust | YouTube playlist | Serde / data processing episodes |
Module 15: Final Capstone Project
Goal: Apply all learned concepts in a substantial, portfolio-ready application.
Options: CLI Tool (like ripgrep) · Web Server (multi-threaded, from scratch) · Data Pipeline (CSV/JSON → Polars → reports) · TUI Application (ratatui) · Embedded (microcontroller driver)
📖 Book & References
| Resource | What to read |
|---|---|
| 📕 The Rust Programming Language, 2nd ed. (NoStarch, $39.95 · ISBN 978-1-7185-0044-0) | Chapter 12 (grep project) · Chapter 20 (web server) |
| 📗 Programming Rust, 2nd ed. (O'Reilly, $59.99 · ISBN 978-1-492-05259-5) | Full book — production-quality Rust reference |
| 📙 Zero To Production In Rust (self-published, $39.99 — also ebook) by Luca Palmieri | Complete web service in production Rust — ideal Web Server capstone companion |
| 📘 Rust for Rustaceans (NoStarch, $39.95 · ISBN 978-1-7185-0185-0) by Jon Gjengset | All chapters — write Rust like an expert |
| Ch 12 — I/O Project: grep | Full worked CLI tool — direct capstone blueprint |
| Ch 20 — Final Project: Web Server | Full multi-threaded server from scratch |
| ratatui docs | TUI framework for terminal dashboards |
| clap crate | CLI argument parsing — essential for CLI capstone |
| axum crate | Modern async web framework |
| tokio docs | Async runtime — the foundation for network services |
🦀 hightechmind.io/rust/
Data structures for capstone projects:
| Example | What it shows |
|---|---|
| 029-binary-tree | Binary tree — fundamental structure |
| 030-count-leaves | Tree traversal |
| 035-layout-binary-tree | Tree layout algorithms |
| 036-tree-string | Tree serialization to string |
| 037-tree-preorder | Pre-order traversal |
| 038-tree-inorder | In-order traversal |
| 061-binary-tree | Binary tree — functional approach |
| 105-trie | Trie data structure |
| 251-quicksort | Quicksort |
| 252-insertion-sort | Insertion sort |
| 253-graph-bfs | BFS graph traversal |
| 254-graph-dfs | DFS graph traversal |
| 261-binary-search-tree | BST implementation |
| 263-avl-tree | AVL self-balancing tree |
| 362-trie-structure | Trie as a data structure |
| 365-disjoint-set | Union-Find |
| 366-segment-tree | Segment tree — range queries |
| 367-fenwick-tree | Fenwick tree — prefix sums |
| 375-lru-cache | LRU cache — important for real apps |
| 376-bloom-filter | Bloom filter — probabilistic membership |
| 377-graph-adjacency-list | Graph adjacency list |
| 378-graph-adjacency-matrix | Graph adjacency matrix |
Algorithms:
| Example | What it shows |
|---|---|
| 075-merge-sort | Merge sort |
| 784-fibonacci-memo-tab | Dynamic programming: memoization + tabulation |
| 785-knapsack-01 | 0/1 knapsack DP |
| 786-longest-common-subsequence | LCS — string alignment |
| 787-edit-distance-levenshtein | Edit distance |
| 788-coin-change-dp | Coin change |
| 798-kadane-max-subarray | Maximum subarray — Kadane's |
| 799-bellman-ford | Shortest paths |
| 800-floyd-warshall | All-pairs shortest paths |
| 801-prims-mst | Prim's MST |
| 802-kruskals-mst | Kruskal's MST |
| 803-a-star-pathfinding | A* pathfinding |
| 804-tarjan-scc | Tarjan's SCC |
| 808-topological-sort-dfs | Topological sort |
| 809-max-flow-ford-fulkerson | Maximum flow |
| 814-kmp-pattern-matching | KMP string matching |
| 821-trie-autocomplete | Trie autocomplete |
| 834-convex-hull-graham | Convex hull |
| 840-divide-and-conquer-pattern | Divide and conquer framework |
| 841-backtracking-framework | Backtracking template |
| 842-branch-and-bound | Branch and bound |
| 843-memoization-generic | Generic memoization |
| 844-greedy-algorithm-patterns | Greedy algorithm patterns |
| 848-algorithm-complexity-guide | Big-O reference for all algorithms |
Unsafe Rust / FFI / performance (advanced capstone):
| Example | What it shows |
|---|---|
| 699-raw-pointer-basics | Raw pointers |
| 700-unsafe-block | unsafe {} blocks |
| 701-unsafe-function | unsafe fn |
| 710-extern-c-functions | FFI: calling C from Rust |
| 712-ffi-string-conversion | CString / CStr |
| 719-struct-of-arrays | SoA layout for cache performance |
| 720-cache-friendly-iteration | Cache-friendly data access |
| 722-memory-layout-repr | #[repr(C)], #[repr(packed)] |
| 724-zero-copy-parsing | Zero-copy parsing |
| 728-inline-hints | #[inline], #[inline(always)] |
| 729-avoid-allocations | Allocation avoidance patterns |
| 732-benchmarking-harness | Benchmarking — measure before optimizing |
Learning paths — curated sequences:
| Path | Best for |
|---|---|
| path-first-steps | Beginner arc: setup → ownership → types |
| path-backend-engineer | Web server / data pipeline capstone |
| path-systems-mastery | CLI tool / embedded capstone |
| path-functional-purist | Parser / interpreter capstone |
| path-from-ocaml | Coming from OCaml/Haskell background |
💪 Exercism (final-stage challenges)
| Exercise | Focus |
|---|---|
| poker | Complex domain: sorting, comparing, grouping |
| forth | Interpreter — stack machine, language design |
| react | Reactive event graph — dependency tracking, ownership |
| robot-simulator | State machine — structs + enums + methods combined |
| xorcism | Lifetime-heavy streaming XOR cipher |
| decimal | Arithmetic on custom types — operator overloading |
Final Deliverable: A complete, tested, and documented Rust application to showcase in your portfolio.
Reference Resources Guide
Complete at-a-glance overview of every resource used in this curriculum. Use this page as your bookmark hub.
📖 Books
| Title | URL | Cost | Format | Best For |
|---|---|---|---|---|
| The Rust Programming Language | doc.rust-lang.org/book | Free | Web / PDF | Modules 1–12 — the primary text |
| The Rust Programming Language (print) | nostarch.com | ~$39.95 | Paperback | Same content — desk reference |
| Rust by Example | doc.rust-lang.org/rust-by-example | Free | Web | Modules 1–12 — see every concept running in-browser |
| The Little Book of Rust Macros | veykril.github.io/tlborm | Free | Web | Module 13 — definitive macro reference |
| The Rustonomicon (Nomicon) | doc.rust-lang.org/nomicon | Free | Web | Module 15 (Unsafe) — unsafe Rust deep dive |
| The Async Book | rust-lang.github.io/async-book | Free | Web | Module 12 (Async) — async/await in depth |
| The Cargo Book | doc.rust-lang.org/cargo | Free | Web | Module 1 — build system and project management |
| The Rust Reference | doc.rust-lang.org/reference | Free | Web | All modules — language specification |
| Polars User Guide | docs.pola.rs | Free | Web | Module 14 — DataFrame library |
🖥️ Interactive Practice & Online Playgrounds
| Resource | URL | Cost | What You Do | Best For |
|---|---|---|---|---|
| Exercism — Rust Track | exercism.org/tracks/rust | Free (mentored) | Solve 100+ exercises with in-browser editor — no install needed. Optional human mentor feedback. | ⭐ All modules — best hands-on practice |
| Rust Playground | play.rust-lang.org | Free | Official playground — run, share, format, Clippy-check any Rust snippet instantly. Shareable links. | All modules — paste any example, test immediately |
| Rust Explorer | godbolt.org/z/rust | Free | Compiler Explorer — see what your Rust compiles to (assembly, MIR, LLVM IR). Multiple Rust versions. | M3+ — understand what the compiler actually does |
| Rustlings | github.com/rust-lang/rustlings | Free | Fix 94 broken programs in your terminal — immediate red/green feedback loop | Modules 1–13 — fast syntax and concept drilling |
| Codewars — Rust | codewars.com/kata/search/rust | Free | Kata challenges in Rust with in-browser editor — community-rated difficulty | M5+ — algorithm practice beyond Exercism |
| LeetCode — Rust | leetcode.com | Free/Paid | 2000+ algorithm problems — Rust is supported with in-browser editor | M8+ — interview prep in Rust |
| Rust Quiz | dtolnay.github.io/rust-quiz | Free | Tricky language questions with explanations | Modules 3–8 — deepen understanding |
| Replit | replit.com | Free/Paid | Full Rust project in browser — install crates, run cargo commands | M5+ — when you need a full project environment online |
🎓 Courses
| Resource | URL | Cost | Format | Best For |
|---|---|---|---|---|
| Comprehensive Rust (Google) | google.github.io/comprehensive-rust | Free | 4-day course (self-paced) | Modules 1–5 — structured alternative to the book |
| Linux Foundation: Rust Fundamentals | training.linuxfoundation.org | Paid | Online, self-paced | Modules 1–12 — prep for LF certification |
| Zero To Production In Rust | zero2prod.com | Paid book | Book + exercises | Module 15 (Web) — production web server in Rust |
🎥 Video
| Channel / Series | URL | Cost | Topics Covered | Best For |
|---|---|---|---|---|
| Jon Gjengset — Crust of Rust | youtube.com — playlist | Free | Smart pointers, concurrency, atomics, channels, proc macros | Modules 11–13 — deep dives |
| Jon Gjengset — Decrusted | youtube.com/@jonhoo | Free | Exploring popular crates (tokio, serde, axum) | Modules 12–15 |
| Let's Get Rusty | youtube.com/@letsgetrusty | Free | Book chapters, ownership, traits | Modules 1–8 — accessible walkthroughs |
| Ryan Levick — Rust streams | youtube.com/@ryanlevicksoftware | Free | Rust in production, error handling | Modules 7–12 |
🦀 Live Examples Library
| Resource | URL | Cost | Examples | Best For |
|---|---|---|---|---|
| hightechmind.io/rust/ | hightechmind.io/rust | Free | 860+ working programs | All modules — see every concept in working code |
| ↳ path-first-steps | curated path | — | Beginner arc | Modules 1–5 |
| ↳ path-backend-engineer | curated path | — | Web / API / data | Modules 12–15 |
| ↳ path-systems-mastery | curated path | — | Unsafe, FFI, perf | Module 15 |
| ↳ path-functional-purist | curated path | — | Monads, optics, FP | Modules 8–15 |
| ↳ path-from-ocaml | curated path | — | OCaml → Rust | Modules 3–10 |
📜 Official Reference Docs
| Resource | URL | What It Is |
|---|---|---|
| Standard Library Docs | doc.rust-lang.org/std | Full API reference — look up any type, trait, or function |
| Docs.rs | docs.rs | Docs for every crate on crates.io — essential for dependencies |
| Crates.io | crates.io | Package registry — find and choose crates |
| Lib.rs | lib.rs | Better crate search — categorised, ranked by quality |
| Rust API Guidelines | rust-lang.github.io/api-guidelines | How to design idiomatic APIs |
| Rust Forge | forge.rust-lang.org | Rust project processes |
| Are We Web Yet? | arewewebyet.org | Web framework status — which crates to use |
| Are We Async Yet? | areweasyncyet.rs | Async ecosystem status |
🛠️ Tools
| Tool | Install | What It Does |
|---|---|---|
| rustup | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh | Toolchain manager — install Rust, switch versions |
| cargo | included with rustup | Build, test, run, publish |
| rust-analyzer | VS Code extension or rust-analyzer.github.io | IDE support — completions, errors, go-to-def |
| clippy | rustup component add clippy → cargo clippy | Linter — catches common mistakes |
| rustfmt | rustup component add rustfmt → cargo fmt | Formatter — enforces style |
| cargo-watch | cargo install cargo-watch | Auto-recompile on save |
| cargo-expand | cargo install cargo-expand | Expand macros — essential for Module 13 |
| cargo-flamegraph | cargo install flamegraph | Profiling — for Module 15 performance work |
| cargo-criterion | cargo install cargo-criterion | Benchmarking framework |
🏆 Certifications
| Certification | Provider | URL | Cost | When to Take |
|---|---|---|---|---|
| Rust Programming Professional Certificate | Linux Foundation / edX | training.linuxfoundation.org | ~$395 | Week 28 — after completing Modules 1–12 |
| Member Training Offerings | Rust Foundation | foundation.rust-lang.org/resources/education | Varies | Any time — lists approved training providers |
🗺️ Per-Module Resource Map
| Module | Topic | Book Chapters | Curriculum Resources | Live Examples | Exercism |
|---|---|---|---|---|---|
| 1 | Setup | Ch 1, App D | Rustlings · Comprehensive Rust · Rust by Example | 001, 006 | hello-world |
| 2 | Common Concepts | Ch 3, App B | Rustlings · Comprehensive Rust · RBE flow_control | 003, 022, 058, 069–071 | lucians-lasagna · raindrops · grains · fizzbuzz |
| 3 | Ownership | Ch 4 | Rustlings · Comprehensive Rust · RBE scope | 101–104, 113–115 | reverse-string · bob · run-length-encoding |
| 4 | Structs & Enums | Ch 5–6 | Rustlings · Comprehensive Rust · RBE custom_types | 041–044, 058, 061–590 | clock · allergies · triangle |
| 5 | Modules | Ch 7 | Rustlings · RBE modules | 063, 065 | space-age |
| 6 | Collections | Ch 8 | RBE std/vec · RBE std/hash | 002–028, 068, 073, 113, 471–500 | word-count · anagram · pangram |
| 7 | Error Handling | Ch 9 | RBE error | 045–050, 072–073, 291–320 | error-handling · wordy |
| 8 | Traits & Lifetimes | Ch 10, 17.2, 19.3–4 | RBE generics · RBE traits | 077–085, 123–150, 381–410, 531–560 | accumulate · dot-dsl |
| 9 | Testing | Ch 11 | RBE testing | 744–758 | sieve · perfect-numbers |
| 10 | Iterators & Closures | Ch 13 | RBE closures · RBE iterators | 054–057, 085–104, 256–290, 501–530 | nucleotide-count · isbn-verifier · accumulate |
| 11 | Smart Pointers | Ch 15 | Jon Gjengset: Smart Pointers | 108–118, 355–368, 550–553 | simple-linked-list · doubly-linked-list |
| 12 | Concurrency | Ch 16, 20 | Jon Gjengset: Channels · Atomics | 109, 321–350, 441–470 | parallel-letter-frequency · bank-account |
| 13 | Macros | Ch 19.5 + tlborm | Jon Gjengset: Proc Macros | 411–440, 422–427, 734–743 | macros |
| 14 | Data Processing | Polars Guide · csv docs · Serde docs | Jon Gjengset: Serde episodes | 171, 175, 759–773 | saddle-points · tournament |
| 15 | Capstone | Ch 12 + Ch 20 + crate docs | Jon Gjengset: axum/tokio | 251–263, 784–848, 699–732, path-* | poker · forth · react |
Certification Quick Reference
You've completed Modules 1–15. Here is everything you need to get certified.
Linux Foundation Rust Programming Professional Certificate (LFRS)
| Provider | Linux Foundation / edX |
| Exam page | training.linuxfoundation.org/certification/rust-programming-professional-certificate |
| Cost | ~$395 USD (bundles occasionally discounted on edX) |
| Format | Performance-based — write real Rust code in a browser IDE (no multiple choice) |
| Duration | 2 hours |
| Passing score | 66% |
| Validity | 3 years, then renewable |
| Proctored | Yes — via PSI Online; requires webcam + quiet room |
| Free retake | One free retake included if you do not pass first attempt |
Exam domain coverage
| Exam domain | Covered in |
|---|---|
| Syntax, types, control flow | Modules 1–2 |
| Ownership, borrowing, lifetimes | Modules 3, 8 |
| Structs, enums, pattern matching | Module 4 |
| Modules and crates | Module 5 |
| Collections, strings | Module 6 |
| Error handling | Module 7 |
| Traits and generics | Module 8 |
| Testing | Module 9 |
| Closures and iterators | Module 10 |
Smart pointers (Box, Rc, RefCell) | Module 11 |
Concurrency (threads, channels, async) | Module 12 |
Modules 13–15 (Macros, Data Processing, Capstone) are advanced specializations — they go beyond the LFRS exam scope.
How to register
- Go to training.linuxfoundation.org/certification/rust-programming-professional-certificate
- Click "Get Certified" — optionally bundle with LFD459 training course for a discount
- You have 12 months from purchase to schedule the exam
- Schedule via the PSI Online portal (link emailed after purchase)
- One free retake if you do not pass on the first attempt
Final prep checklist
- Complete all Rustlings exercises through Module 12
- Solve 5+ Exercism exercises at the "hard" difficulty
- Read the official LFRS Exam Prep Guide (linked from the cert page)
- Practice writing code in a plain editor without auto-complete — the exam IDE is minimal
- Time yourself: aim to solve a medium-difficulty exercise in under 15 minutes
- Review
unsafe,Pin,Send/Sync— these appear in Modules 11–12 and trip up candidates