It is a great reference, but, IMHO, there are some alternatives that I prefer:<p><i>Programming</i>: I would instead prefer the combo <i>"How To Program"</i>, don't be fooled by the name, this course is the business (which will give you a rock solid foundation in systematic program design, TDD, clean coding and recursion, but most importantly, you will understand exactly why you should design your data abstractions first, because they will structure your functions), followed by <i>"Software Construction in Java"</i>, which will give you a rock solid and principled software engineering foundation (writing industrial strength tests, specs, ADTs, mutability, grammars, concurrency, the works). Both are free in edx (also check out the latter's ocw version, 6.005). As a bonus, check out Daniel Jackson's approach to software design in ocw's 6.005 from 2008, and how he explains three approaches to software design (state machines, functional and relational/OO). The best and most systematic explanation that I know of how to properly use the much maligned Design Patterns, and a very useful in practice design technique called JSP (although the course is in Java, all the design techniques are universal, this JSP stands for "Jackson Structured Programming").<p><i>Computer Architecture</i>: the MIT combo <i>"Computation Structures"</i> (on edx) and <i>"Computer System Engineering"</i> (on ocw and youtube) will teach you systems design all the way from atoms to the whole internet. Great instructors.<p><i>Algorithms and Data Structures</i>: again from MIT, on OCW (as <i>6.006</i>, with videos, recitations and assignments in Python), a good balance between theory and practice. The dark horse here is the TA Victor Costan, who won several European level coding competitions as a kid, and will teach you algorithm design in practice. Eric Demain's lectures on Dynamic Programming should become the reference, his "5 steps" approach is amazing.<p><i>Operating Systems</i>: mit's <i>6.828</i>, from 2011 (has videos for all lectures). You will have to read and understand all 10.000 lines of code of an old Unix (with support from the lectures), and write a large portion of you own OS.<p><i>Databases</i>: I would have a look at <i>CMU</i>'s inspiring Andy Pavlo course (on youtube), just watch his intro lecture from 2018 to get a taste. Also have a look MIT's <i>6.813</i> from 2014 (some vids), created by Stonebraker, with substantial assignments based on SimpleDB (in Java, if you prefer it over CMU's C++).<p><i>Distributed Systems</i>: MIT's 2015 <i>6.824</i>, by Morris (of the worm). Great text notes, and many lectures on youtube. Assignments in Go, where you will implement your own Raft and a distributed key-value store.<p>Some extras:<p><i>Cryptography</i>: <i>Paar</i>'s explanations on youtube are crystal clear.<p><i>Data Science</i>: Berkeley's <i>Data8</i> (2016, may seem basic, but the instructor is amazing and you will learn how to look at data), followed by <i>Data100</i> (summer 2019, more technical, with Python tools on Jupyter galore). Will give you good intuition if you don't know much stats, and to really worry about your data samples (bias!) (<i>garbage in, garbage out</i>, not sure if this cliche is ever mentioned in these courses, but you will understand exactly how or why, and how to avoid it, or, at the very least, to tune your BS detector).<p>etc