Learning software engineering
Resources I've bookmarked for learning software engineering. Some I've actually used.
I haven't used all of these resources. Some are listed based on recommendations I've received, for my own future reference.
Books
Fundamentals
- Structure and Interpretation of Computer Programs - computational thinking
- Code: The Hidden Language of Computer Hardware and Software - computers from first principles
- Algorithms - algorithms and data structures
- Types and Programming Languages - type systems and formal semantics
- The Linux Command Line - shell scripting
Systems
- Operating Systems: Three Easy Pieces - OS fundamentals
- Computer Systems: A Programmer's Perspective - how architecture affects your code
- Computer Architecture: A Quantitative Approach - Hennessy & Patterson
- What Every Programmer Should Know About Memory - memory hierarchies
- Data-Oriented Design - cache-aware programming
- Algorithms for Modern Hardware - cache-aware algorithms, free online
- Database Internals - storage engines and distributed databases
- RISC-V ISA Specification
Languages
- The Rust Programming Language - systems programming with memory safety
- The Rustonomicon - unsafe Rust
- Modern C - Jens Gustedt, free online, covers C23
- Ziglearn - Zig tutorial
- Jai Primer - community guide to Jai
- Execute Program TypeScript: Basics, Everyday, Advanced - interactive
Concurrency
- Rust Atomics and Locks - concurrency primitives, free online
- The Art of Multiprocessor Programming - concurrent data structures
Architecture & design
- Designing Data-Intensive Applications - distributed systems
- Software Engineering at Google - engineering at scale
- A Philosophy of Software Design - managing complexity
- Game Engine Architecture
Language implementation
- Compilers: Principles, Techniques, and Tools - the Dragon Book
- Crafting Interpreters - building languages from scratch
Courses
Degree programs
- Georgia Tech OMSCS - online MS in CS (~$7k total), strong systems track
- CU Boulder MS-CS on Coursera - flexible online MS
Self-paced
- MIT 6.172 Performance Engineering - the MIT course on making code fast
- Computer, Enhance! - performance-aware programming (Casey Muratori)
- Linux Kernel Internals and Development (LFD420) - Linux Foundation
- Embedded Linux Kernel and Driver Development - kernel and driver development, free training materials
- CS Primer - CS fundamentals with a systems focus
- From Blinky to Bootloader - bare metal STM32, from blinking an LED to signed firmware updates
Hands-on
Build-your-own
- CodeCrafters - build Redis, Git, SQLite from scratch
- Writing an OS in Rust - the classic
- Operating System in 1000 Lines
- OS/161 - teaching operating system
- Writing a JPEG Decoder in Rust - surprisingly fun format to reverse-engineer
- What's in a Linux Executable? - ELF deep dive (fasterthanlime)
- Writing a Wayland Compositor - Drew DeVault
- FFmpeg Assembly Lessons - x86 assembly, from the FFmpeg project
- Build a Database in 3000 Lines
- NES Emulator in Rust
- Ray Tracing In One Weekend
- Linux in a Pixel Shader - a RISC-V emulator that runs Linux inside VRChat, which is a sentence
- Designing a Physics Engine in 5 minutes
Exercises
- Rustlings - small exercises to learn Rust
- 8086 Assembler Tutorial - x86 assembly basics
- git-katas - deliberate practice for git
- SQLBolt - interactive SQL exercises
Videos & talks
Performance
- CPU Caches and Why You Care - Scott Meyers
- What Every Programmer Should Know about How CPUs Work - Matt Godbolt
- A Practical Guide to Applying Data Oriented Design - Andrew Kelley
- Practical Optimizations - Arseny Kapoulkine
- The Big OOPs: Anatomy of a Thirty-five-year Mistake - Casey Muratori
- Spinlocks - CoffeeBeforeArch
Compilers
- What Has My Compiler Done for Me Lately? - Matt Godbolt
- The Bits Between the Bits: How We Get to main() - Matt Godbolt
- Advent of Compiler Optimisations 2025 - Matt Godbolt
Articles
Memory & performance
- Gallery of Processor Cache Effects
- Myths Programmers Believe about CPU Caches
- The Lost Art of Structure Packing
- Handles vs Pointers
- Memory access is O(N^[1/3])
- Untangling Lifetimes: The Arena Allocator
- Static Search Trees - cache-aware data structures
- Pointers Are Complicated - Ralf Jung on pointer semantics
- The RAM Myth - memory is not what you think it is
- abseil / Performance Hints - practical optimization tips from Google
Concurrency
- Optimizing a Ring Buffer for Throughput - lock-free SPSC queue
- 1024cores - Dmitry Vyukov's lock-free algorithms
- Basics of Futexes - Eli Bendersky
- Futexes Are Tricky - Ulrich Drepper
- Acquire-Release Semantics - memory ordering explained clearly
- Linux-Kernel Memory Model - the formal model
- The Scoped Task Trilemma - structured concurrency vs. borrowing vs. async cancellation
Other
- How Programs Get Run - from fork to exec
- Linux IP Networking - Linux protocol stack
- Compiler Engineering in Practice
- C++ Design Patterns for Low-Latency Applications - patterns from trading systems
- Parse, Don't Validate - type-driven design
- Three Ways Formally Verified Code Can Go Wrong - Hillel Wayne
- Borrow checking, RC, GC, and the Eleven Other Memory Safety Approaches
- Four Limitations of Rust's Borrow Checker
- Why Is Rust Difficult?
- Rust Embedded Development - getting started with embedded Rust
- HVM - massively parallel functional runtime in Rust
- A Defect-Tolerant Computer Architecture - reconfigurable computing (Heath, 1998)
- The Google File System - the GFS paper (Ghemawat et al., 2003)
- yarchive.net/comp - archived Usenet posts from Linus Torvalds, Mitch Alsup, Terje Mathisen
Tools
- Compiler Explorer - see what your code compiles to
- Bootlin Elixir - Linux kernel source browser
- CREATOR - RISC-V and MIPS assembly simulator
- Vim Hero - interactive Vim lessons
- awesome-shell - curated list of CLI tools
- gdb - the GNU debugger
- perf - Linux profiling
- valgrind - memory debugging and profiling
Blogs & channels
Blogs
- Julia Evans - systems explainers
- Dan Luu - performance and systems deep dives
- Fabian Giesen - graphics and performance
- Brendan Gregg - performance engineering
- Easyperf - CPU performance analysis
- Travis Downs - microarchitecture
- null program - systems programming in C
- Nelson Elhage - systems and debugging
- fasterthanlime - Rust and systems
- Random ASCII - debugging and performance
- The Old New Thing - Windows internals
- purplesyringa - systems programming
YouTube
- Ben Eater - hardware from first principles
- Low Byte Productions - embedded and low-level
- stacksmashing - hardware hacking and reverse engineering
- CoffeeBeforeArch - computer architecture
- Jon Gjengset - Rust deep dives
- Jonathan Blow - game dev and language design
- javidx9 - game development
- Bisqwit - retro programming
- Tsoding - low-level programming
- Nir Lichtman - low-level programming
- Sheafification of G - math and CS theory