Study all nine subjects below, in roughly the presented order, using either the suggested textbook or video lecture series, but ideally both. Aim for 100-200 hours of study of each topic, then revisit favorites throughout your career 🚀.
Subject | Why study? | Book | Videos |
---|---|---|---|
Programming | Don’t be the person who “never quite understood” something like recursion. | Structure and Interpretation of Computer Programs | Brian Harvey’s Berkeley CS 61A |
Computer Architecture | If you don’t have a solid mental model of how a computer actually works, all of your higher-level abstractions will be brittle. | Computer Systems: A Programmer's Perspective | Berkeley CS 61C |
Algorithms and Data Structures | If you don’t know how to use ubiquitous data structures like stacks, queues, trees, and graphs, you won’t be able to solve challenging problems. | The Algorithm Design Manual | Steven Skiena’s lectures |
Math for CS | CS is basically a runaway branch of applied math, so learning math will give you a competitive advantage. | Mathematics for Computer Science | Tom Leighton’s MIT 6.042J |
Operating Systems | Most of the code you write is run by an operating system, so you should know how those interact. | Operating Systems: Three Easy Pieces | Berkeley CS 162 |
Computer Networking | The Internet turned out to be a big deal: understand how it works to unlock its full potential. | Computer Networking: A Top-Down Approach | Stanford CS 144 |
Databases | Data is at the heart of most significant programs, but few understand how database systems actually work. | Readings in Database Systems | Joe Hellerstein’s Berkeley CS 186 |
Languages and Compilers | If you understand how languages and compilers actually work, you’ll write better code and learn new languages more easily. | Crafting Interpreters | Alex Aiken’s course on edX |
Distributed Systems | These days, most systems are distributed systems. | Designing Data-Intensive Applications by Martin Kleppmann | MIT 6.824 |