For the theoretical part of computer science, Introduction to the Theory of Computation by Michael Sipser is the best there is.
It covers three main topics:
- Automata theory
- Computability
- Computational Complexity
What I especially liked about the book was how he approached proofs. When introducing a proof, there is first a short "proof idea" paragraph that emphasizes the main approach behind the proof informally. He then gives out the full, formal proof. For self-study, those proofs can sometimes be intimidating, and not strictly necessary depending on your goals, but understanding the ideas was important to understand the topic.
It covers three main topics: - Automata theory - Computability - Computational Complexity
What I especially liked about the book was how he approached proofs. When introducing a proof, there is first a short "proof idea" paragraph that emphasizes the main approach behind the proof informally. He then gives out the full, formal proof. For self-study, those proofs can sometimes be intimidating, and not strictly necessary depending on your goals, but understanding the ideas was important to understand the topic.