Teach Myself Computer Science
Teach Yourself Computer Science by Oz Nova and Myles Byrne is a guide for self-taught engineers or boot camp grads to learn computer science. The philosophy of the guide is that you don’t need plenty of resources; you just need the best book or video lecture series for each subject. Here is a track of my progress.
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.
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.
- Computer Systems: A Programmer’s Perspective
- The Elements of Computing Systems
- Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course)
- Computer Organization and Design
- Great Ideas in Computer Architecture (Machine Structures). Spring 2015, UC Berkeley
Algorithms and Data Structures
We agree with decades of common wisdom that familiarity with common algorithms and data structures is one of the most empowering aspects of a computer science education. This is also a great place to train one’s general problem-solving abilities, which will pay off in every other area of study.
- The Algorithm Design Manual
- CSE373 - Analysis of Algorithms 2016 SBU
- Tim Roughgarden’s Algorithms Specialization
- How to Solve It
Mathematics for Computer Science
In some ways, computer science is an overgrown branch of applied mathematics. While many software engineers try—and to varying degrees succeed—at ignoring this, we encourage you to embrace it with direct study. Doing so successfully will give you an enormous competitive advantage over those who don’t.
- Operating System Concepts
- Modern Operating Systems
- Operating Systems: Three Easy Pieces
- Lions’ Commentary on Unix
- Design and Implementation of the FreeBSD Operating System
- MAC OS X Internals: A Systems Approach
- Linux Kernel Development
- To read the code of a small kernel and add features, e.g. xv6 and its labs.
Given that so much of software engineering is on web servers and clients, one of the most immediately valuable areas of computer science is computer networking. Our self-taught students who methodically study networking find that they finally understand terms, concepts and protocols they’d been surrounded by for years.
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.
- Architecture of a Database System
- Readings in Database Systems
- Database Management Systems
- Transaction Processing: Concepts and Techniques
- Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World
Languages and Compilers
Most programmers learn languages, whereas most computer scientists learn about languages. This gives the computer scientist a distinct advantage over the programmer, even in the domain of programming! Their knowledge generalizes; they are able to understand the operation of a new language more deeply and quickly than those who have merely learned specific languages.
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.
- Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems
- Distributed Systems by Maarten van Steen and Andrew Tanenbaum
- MIT 6.824 Distributed Systems (Spring 2020)
- Distributed Systems Reading Group