||Brian Harvey’s Berkeley CS 61A
||Structure and Interpretation of Computer Programs
||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
||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
||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
||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
||These days, most systems are distributed systems.
||Distributed Systems, 3rd Edition by Maarten van Steen