* Brookshear and Brylow - Computer Science - An Overview
* Forta - Teach yourself SQL in 10 minutes
* Stallings - Computer Organization and Architecture
* Stallings - Operating Systems - Internals and Design Principles
* CLRS
* Kurose, Ross - Computer Networking - A Top Down Approach
* Sipser - Introduction to The Theory of Computation
* Stallings, Brown - Computer Security - Principles and Practice
* Aumasson - Serious Cryptography
* Russell, Norvig - Artificial Intelligence - A Modern Approach
And even this fails to cover programming languages. Python is the lingua franca of the field. Most past recommended books are getting outdated, but perhaps Matthes' Python Crash Course 3rd edition.
Over TCP/IP Illustrated?
Kurose's book really does take the top-down approach from high level networking concepts through the application layer to the transport layer and downward. It provides just enough of the necessary details (here's a datagram with fields A and B) over a comprehensive list of all the details (here's every field, every field size, and a list of every field option).
See if this blog post helps out with sorting through the various CS subjects: https://tolerablecoder.blogspot.com/2022/03/a-short-list-of-...
I also love Concrete Mathematics.
I prefer the Tanenbaum OS books over Stallings. In particular the design and implementation book, although it is more than a decade old now.
I will take a look at Python Crash Course.
See the "still too much section". If you want the top two books they recommend if you don't have time for the rest.
I have an M.Sc. in Comp.Sci. Flicking through books like these, all the chapter titles resonate with courses, exams, and problems we solved. It also makes me realise I have probably forgotten more than I like to think.
On the other hand, bashing my head against graph theory and logic, has made me a much better programmer. Similarly, the hours spent in Van Roy and Haridi's fairly abstract and technically language-agnostic "Concepts, Techniques and Models of Computer Programming" made me primed to learn a lot of languages fast - because I had the primitives mastered.
Building a bunch of software projects probably isn’t a very efficient way of learning computer science. You might figure out things like big-O or A* on your own, but a more academic approach is going to take you further, faster.
I can understand this is not the approach preferred by academic types which is a strong community on hackernews.
Most people are more motivated to understand the theory because it helps them solve a practical problem, rather than theory for the sake of theory.
Even something like game theory was only developed and earned nobel prizes because of its applications to making money in finance.
Computer scientists often program but not all programmers are computer scientists.
My advice to learners has been "try to learn as much about a topic as someone who has taken the subject in college and forgotten about it".
For example consider calculus: Someone who took calc 20 years ago and hasn't used it since will probably forget exactly how to compute most derivatives and integrals. But if someone mentions an optimization problem "we need to know when this curve peaks" or asks something involving finding the area under a curve, alarm bells should start ringing. They'll know this can be done, and likely go grab a calc book to refresh.
Another example I run across all the time, which is the opposite scenario: Survival analysis. I have been on countless teams where somebody needs to understand something like churn or the impact of a offering a discount that hasn't expired yet, etc. These are all classic survival analysis problems, yet most people are ignorant that this field of study even exists! Because of this I've seen so many times where people complain that "we'll have to wait months or years to see if these changes impact customer lifetime!" (note: if anyone out there is doing Churn or LTV analysis and aren't familiar with survival analysis, you are most certainly approaching it incorrectly).
I've seen a lot of people get frustrated with self study because they try to learn the material too well. If you aren't going to be using survival analysis soon, it's not really worth remembering all the details of how to implement a Kaplan Meier curve. But if you even have a vague sense of what problem this solves, when you encounter that problem in a project, you know where to go back to. Then you typically walk away with a much stronger sense of the subject then if you had studied it harder in the first place.