How should I go about learning CS?
gcv: I'm impressed that you chose to approach learning from a theoretical point of view. It will serve you well; you will understand algorithmic approaches which stump a lot of people who lack a theoretical background. (Please, no "I never got a CS degree, but I know what I'm doing" replies --- the HN audience is more competent than the average in the working world. I'm sick and tired of working with people with trade-school degrees in programming or "computer engineering" who do not understand binary search.)To start, you should read SICP (http://mitpress.mit.edu/sicp/) and watch the lectures (http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussma...). You should probably do this before diving deeper into discrete math, algorithms, or theory of computation. SICP is almost completely unique in that it touches on all these topics, and puts them in the context of actual programming. It also happens to include solving fun problems along the way.After that, you'll be well-prepared to have a ball in all aspects of CS. You can get more into pure hacking by learning languages (after Scheme, I recommend C, Python, Common Lisp, Haskell, and Prolog before jumping into more unexplored directions like Scala and Clojure), and following up by studying compilers and operating systems. You can get into a more job-oriented path by learning Java and C#. You can get into more algorithms by reading Cormen et al. and, of course, Knuth. You can get into pure theory by reading Sipser (wonderful, wonderful book).