I think the practically useful parts of computer science could easily be taught via a book (or similar).
General considerations:
- I think I only every really learned abstract concepts when I could play with them via a programming language. For example:
- Logic via Prolog
- Rewrite rules via Maude
Topics I find useful:
- Grammars and recursive-descent parsing. N. Wirth teaches this in a tiny book that’s relatively easy to understand.
- Graph theory (graphs, trees, transitive closures, etc.)
- A little bit of logic. Especially the difference between syntax and semantics is practically relevant. How Prolog handles logic and search (backtracking) is interesting, too.
- Tuple calculus. Helps with understanding relational databases.
- Rewrite rules. They expand your horizon and your implementation tool belt.
- Finite automata. Really useful as a visualization if you want to make sure you have handled all important cases.
Topics I personally don’t find useful:
- Graphics-related math. This is a huge topic and relevant for many people. It just doesn’t personally interest me. Alas, here, you need quite a bit of math. Even more so if you are doing animations.
- Turing machines are theoretically interesting, but didn’t personally give me much useful insight for programming.
- Similarly: lambda calculus. There is some clever stuff here (church numerals etc.), but it never helped me with programming.
Additional topics:
- I haven’t read this book yet, but it sounds interesting (I taught TLA as a T.A.): https://www.hillelwayne.com/post/practical-tla/