jeff

thoughts on teachyourselfcs.com

I think any programmer who sees their craft as something more than just simply a paycheck should have a solid foundation of cs. Here are some reasons if you need. Out of all the free resources out there, I belive teachyourselfcs.com to be the best one. Feel free to read more on the website's FAQ on how it compares to Open Source Society or freeCodeCamp curricula.

Although there are some great ones, I believe there could be some modifications, as well as project-based learning ideas. Here they are.

Algorithms and Data Structures

Algorithm Design Manual is a great read. In addition, I highly suggest checking out all the references listed out on one of my personal open source projects. I should probably link them here, but I'm too lazy. But seriously, go check them out. They are amazing resources.

Project

Hands down, implement all data structures. Simply studying their APIs, in my opinion, doesn't give you true intution. Feel free to checkout my personal project iruka if you need any help!

Also, leetcode. Always, leetcode.

Operating Systems

The guide recommends Operating Systems: Three Easy Pieces (OSTEP). I also suggest reading the dinosaur book, Operating System Concepts tenth edition. The guide links to the ninth edition and says the book has attracted criticism for lack of clarity and general student unfriendliness. I disagree with the criticism, at least for the tenth edition. It was very useful in filling practical gaps that I didn't get from the theory-heavy OSTEP.

Project

I also suggest you build a toy kernel to really have an understanding for what a kernel is. Simply another piece of software with no stdlib that manages messy hardware stuff for applications. I followed this amazing guide in Rust written by Phillip Oppermann. If Rust is not your thing, try to find a similar guide that walks you through it like Phillip does. Can't recommend this resource enough. The guide is in progress though and currently stops after cooperative multitasking implemented with async await. It's missing preemptive multitasking implemented with threads, and the fs abstraction. I didn't care enough to finish my kernel, as I already learnt what I was looking to learn.

Networking

The textbook the guide recommends is great. Computer Networking, A Top-Down Approach. I also suggest watching the University of Washinton's Networking lectures.. David Wetherall does a great job explaining networks bottom up. Also check out Beej's Guide (Handbook) To Network Programming.

Project

For your project, go through The UChicago X-Projects. Create toy implementations of IP, TCP, and the IRC protocols. Stanford's CS 144 Labs are also great. You implement the entire network stack from the ground up.

Databases

The primary resource suggested, Berkely's CS 186 is great. In addition, check out Use the index, Luke! for a great guide on database indexes. As application programmers, I think the most important takeaway from a databases course is indexes, and not hardcore datbase implementation.

Project (Haven't done)

For the project, I suggest doing the chidb project from The UChicago-X projects. You'll be implementing a SQLite clone!

Distributed Systems

Nothing much to say here. Designing Data Intensive Applications is a great read.

Project

Follow the guide's course sugestion, which is MIT's 6.824. It's a lab-based course, in which you'll implement map reduce, raft, KV raft, and a sharded KV store. Just make sure to use the 2020 offering. The GOAT and legend himself, Robbert Morris (Morris worm), is the lecturer. Also definitely read all the papers, and try to find a few friends to create a dicussion group.

Language and Compilers

In addition to Crafting Interpreters, two other great resources are Writing an Interpreter in Go and Writing a Compiler In Go. I haven't gotten to reading these two books yet but in my mind, they look like great alternatives that use a practical language like golang. Also, if you need motivation on why you should about compilers, check out Steve Yegge's classic Rich Programmer Food.

The guide has no mention of any Programming Language (PL) theory resources, which arguably is more important than knowing how to write an interpreter/compiler. Some resources that people seem to recommend are Essentials of Programming Languages, Theory of Computation and Dan Grossman's PL course on coursera.

Project

Implement a toy compiler with two languages you want to learn better! For example, I love Rust and Typescript, and so plan on writing a Typescript compiler in Rust.