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 - Classic introduction to computational thinking
- Code: The Hidden Language of Computer Hardware and Software - Understanding computers from first principles
- Algorithms - Core algorithms and data structures
- Types and Programming Languages - Type systems and formal semantics
Systems & Architecture
Low-level Systems
- Operating Systems: Three Easy Pieces - OS fundamentals
- What Every Programmer Should Know About Memory - Memory hierarchies and performance
- Data-Oriented Design - Cache locality and memory optimization
- Database Internals - How databases work under the hood
- Programming in C
- The Rust Programming Language - Modern systems programming with memory safety
- RISC-V ISA Specification
Distributed Systems & Design
- Designing Data-Intensive Applications - Distributed systems and data architecture
- Game Engine Architecture
- Software Engineering at Google - Engineering practices at scale
- A Philosophy of Software Design - Principles for managing complexity
Language Implementation
- Compilers: Principles, Techniques, and Tools - The Dragon Book
- Crafting Interpreters - Building programming languages from scratch
Operations
- The Linux Command Line - Shell scripting and command-line usage
Videos & Talks
- From Blinky to Bootloader: Bare Metal Programming Series - ARM Cortex-M embedded development
- Data-Oriented Design and C++ - Mike Acton (CppCon 2014)
- CPU Caches and Why You Care - Scott Meyers (code::dive 2014)
- 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 (BSC 2025)
- Designing a Physics Engine in 5 minutes
Articles & Papers
Performance & Memory
- Borrow checking, RC, GC, and the Eleven (!) Other Memory Safety Approaches
- Gallery of Processor Cache Effects
- The Lost Art of Structure Packing - Memory layout optimization
- Handles vs Pointers - Memory indirection strategies
- Memory access is O(N^[1/3]) - Real-world memory performance
- Untangling Lifetimes: The Arena Allocator - Performant dynamic manual memory management in C
- C++ Design Patterns for Low-latency Applications - Performance-critical patterns
Networking
- Linux IP Networking - Guide to the Linux protocol stack implementation
Courses & Practice
- Computer, Enhance! - Performance-aware programming course
- Ray Tracing In One Weekend Series - Build a ray tracer from scratch
- Rustlings - Small exercises to learn Rust
Tools
- Compiler Explorer - See what your code compiles to
- gdb - The GNU debugger
- valgrind - Memory debugging and profiling
- clang-tidy - Static analysis
- clang-format - Code formatting
Blogs & Channels
Blogs
- Random ASCII - Debugging and performance deep dives
- The Old New Thing - Windows internals and backwards compatibility
- purplesyringa - Systems programming and low-level optimization
YouTube Channels
- Bisqwit - Retro programming and algorithms
- CoffeeBeforeArch - Computer architecture and performance
- javidx9 - One Lone Coder - Game development and graphics programming
- mCoding - Programming concepts across languages
- Tsoding - Low-level programming and language implementation