Programming |
Brian Harvey’s Berkeley CS 61A |
Structure and Interpretation of Computer Programs |
|
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 Organization and Design |
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 hard 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. |
Compilers: Principles, Techniques and Tools |
Alex Aiken’s course on Lagunita |
Distributed Systems |
These days, most systems are distributed systems. |
Distributed Systems, 3rd Edition by Maarten van Steen |
🤷 |