This professor takes some pretty good notes for his CS courses: <a href="http://www.cs.yale.edu/homes/aspnes/#classes" rel="nofollow noreferrer">http://www.cs.yale.edu/homes/aspnes/#classes</a><p>I might add that if you like the feeling of understanding a subject from top to bottom, if you haven't taken higher mathematics already, be careful... if you start studying math you might fall in love and have other subjects ruined for you. Colleges do us extreme disservices telling us basic calculus/linear algebra/diffeq are "math". Mathematics is like going from XOR (ZFC and basic set theory/logic) all the way up to the wildest things you can imagine.<p>I highly recommend anybody who enjoys the sense of complete mastery and "extremely nitpicky but capable of doing anything I can imagine" that computer programming tickles to try learning propositional logic, abstract algebra, and real analysis. Then graph theory, theory of computation, and actual algorithms research (ie whats in algorithms journals, though TBH stuff from a few decades ago is way more approachable and applicable). The guy I linked above has a great survey: <a href="http://www.cs.yale.edu/homes/aspnes/classes/202/notes.pdf" rel="nofollow noreferrer">http://www.cs.yale.edu/homes/aspnes/classes/202/notes.pdf</a>.<p>It honestly took years after I finished grad school for it all to fully click to the extent it has with me now, but not only does higher math teach you to think in an entirely different way, it unironically teaches you the underlying structure of <i>everything</i>. Well, maybe it's not great at solving super fuzzy human problems but especially when working with computers, knowing about things like chaos theory in distributed systems, invariants, graph algorithms, structural isomorphisms, cryptography, analyzing your shit in a way that's actually statistically useful... it's everywhere.