Teach Yourself Computer Science
Teach Yourself Computer Science
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
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
Distributed Systems
These days, most systems are distributed systems.
Designing Data-Intensive Applications by Martin Kleppmann
MIT 6.824
Subject guides
Programming
Most undergraduate CS programs start with an “introduction” to
computer programming. The best versions of these courses cater
not just to novices, but also to those who missed beneficial
concepts and programming models while first learning to code.
Since this guide was first published in 2016, one of the most
commonly asked questions has been whether we’d now
recommend recordings of a more recent iteration of 61A taught by
John DeNero, and/or the corresponding book Composing
Programs, which is “in the tradition of SICP” but uses Python. We
think the DeNero resources are also great, and some students
may end up preferring them, but we still suggest SICP, Scheme,
and Brian Harvey’s lectures as the first set of resources to try.
Computer Architecture
Computer Architecture—sometimes called “computer systems” or
“computer organization”—is an important first look at computing
below the surface of software. In our experience, it’s the most
neglected area among self-taught software engineers.
The first half of the book (and all of its projects), are available for
free from the Nand2Tetris website. It’s also available as a
Coursera course with accompanying videos.
Operating Systems
Operating System Concepts (the “Dinosaur book”) and Modern
Operating Systems are the “classic” books on operating systems.
Both have attracted criticism for their lack of clarity and general
student unfriendliness.
Databases
It takes more work to self-learn about database systems than it
does with most other topics. It’s a relatively new (i.e. post 1970s)
field of study with strong commercial incentives for ideas to stay
behind closed doors. Additionally, many potentially excellent
textbook authors have preferred to join or start companies instead.
If you elect to use the Dragon Book, it’s almost essential that you
cherry-pick the topics, ideally with the help of a mentor. In fact, our
suggested way to utilize the Dragon Book, if you so choose, is as
a supplementary reference for a video lecture series. Our
recommended one is Alex Aiken’s, on edX.
Don’t be a boilerplate programmer. Instead,
build tools for users and other
programmers. Take historical note of
textile and steel industries: do you want to
build machines and tools, or do you want
to operate those machines?
— Ras Bodik at the start of his compilers course
Distributed Systems
As computers have increased in number, they have also spread.
Whereas businesses would previously purchase larger and larger
mainframes, it’s typical now for even very small applications to run
across multiple machines. Distributed systems is the study of how
to reason about the trade-offs involved in doing so.
When this guide was first written in 2016, the OSS guide had too
many subjects, suggested inferior resources for many of them,
and provided no rationale or guidance around why or what
aspects of particular courses are valuable. We strove to limit our
list of courses to those which you really should know as a software
engineer, irrespective of your specialty, and to help you
understand why each course is included. In the subsequent years,
the OSS guide has improved, but we still think that this one
provides a clearer, more cohesive path.
Look, just try it. Some people find SICP mind blowing, a
characteristic shared by very few other books. If you don't like it,
you can always try something else and perhaps return to SICP
later.
The Dragon book is still the most complete single resource for
compilers. It gets a bad rap, typically for overemphasizing certain
topics that are less fashionable to cover in detail these days, such
as parsing. The thing is, the book was never intended to be
studied cover to cover, only to provide enough material for an
instructor to put together a course. Similarly, a self-learner can
choose their own adventure through the book, or better yet follow
the suggestions that lecturers of public courses have made in their
course outlines.