# Learn Computer Science

I have a confession to make. I, (and most of us) have been stuck on fad diets for CS. It’s so nice to read easy books, like learn C++ in 21 days, or doing some leetcode problems. You learn a bit, feel that warm glow of getting smarter, and trick yourself into feeling productive.

You’re not really getting any better, without learning the fundamentals.

I decided to cobble up a set of resources to go through, as a fusion of Teach Yourself Computer Science and Steve Yegge’s recommendations.

Teach Yourself CS has a detailed list of good resources for the more practical aspects of CS, whereas Steve Yegge’s recommendations focus more on the mathematical side – the first four courses he recommends are: discrete math, linear algebra, statistics, and theory of computation.

Steve Yegge’s list omits Computer Architecture, which is a glaring omission – an Operating Systems course doesn’t have enough time to cover all the interesting parts of concurrency, parallelism, and optimization that a computer architecture course would.

Teach Yourself CS doesn’t mention Theory of Computation, and is lighter on the math background, giving one resource for math. Theory of Computation is a bit more dated (swallowed up by all the other fields), but is still useful for its applications.

To that end, I’ve fused them both, and skimmed some resources to put on this list.

This list is incomplete and changing all the time, but hey, isn’t that what agile development is all about?

## Programming

### Textbooks

- Structure and Interpretation of Computer Programs

### Courses

### Papers

### Projects

## Discrete Math

### Textbooks

- Discrete Mathematics, an open introduction

## Linear Algebra

### Textbooks

- No bullshit guide to linear Algebra, Savov

## Statistics

### Textbooks

- Statistics fourth ed, Friedman et. al
- Think stats, Downey
- Think Bayes, Downey

## Theory of Computation

### Textbooks

- Theory of Computation, Hefferon
- Computational Complexity, Arora and Barak

## Computer Architecture

### Textbooks

- Computer Architecture, a Programmers Perspective
- Computer Architecture, Patterson and Hennessey

### Resources

- Some Assembly Required

## Algorithms and Data Structures

### Textbooks

- The Algorithm Design Manual, Skiena
- The Art of Multiprocessor programming

## Operating Systems

### Textbooks

- Operating Systems, Three Easy Pieces

## Networking

### Textbooks

- Computer Networks, a Systems approach

### Projects

- Chitcp

## Databases

### Textbooks

- Database Internals

### Projects

- Chidb

## Compilers

### Textbooks

- Crafting Interpreters

### Resources

## Distributed Systems

### Textbooks

- Designing Data Intensive Applications