To a certain extent I agree with Joel Spolsky's old article on Java schools[1]. The one gripe I would have to make is that I believe that there are many useful tasks which are hard more than for the sake of being hard. My compiler's course was quite difficult but at the same time very informative. One thing we didn't do is write a parser. When I asked my professor (now advisor) why not, he responded that writing a parser is more of a character-building exercise. I tend to agree. While very tricky, I find that in the context of university classes so much time is spent writing a parser that more interesting topics in compilers are completely omitted. There's always benefit in deeper understanding, but one must try to identify the richest areas for learning.
[1] http://www.joelonsoftware.com/articles/ThePerilsofJavaSchool...
It doesn't really matter what universities do or don't teach. If a subject is of interest you should learn it. I thought everything you and the linked article listed made sense.
Algorithms/Data Structures
Computational Complexity
Discrete Math
Programming Languages (both application and the concepts behind them)
System Architecture
Networks
Compilers
Operating Systems
Databases
Parallel Programming
Artificial Intelligence
Graphics
As for what to learn, here is THE BEST link: http://matt.might.net/articles/what-cs-majors-should-know/. It covers all the topics I mentioned, and then some, and provides links to books/resources about everything. If you're serious about self studying Comp sci, that page has all the links and info you need to start.