I was wondering if someone might be able to give me an outline of the courses/topics that are integral to understanding computer science from the bottom up.
Basically I'm looking for a solid "self-taught" curriculum to supplement a four year BS in Computer Science. I know the topic of Computer Science is vast, so I'll just say that I'm interested in acquiring a deep understanding of the fundamental knowledge required to learn high level topics in CS.
I would assume there is a healthy dose of math in the mix.
Links to content are appreciated.
1. Programming (duh) - choose a dynamic language to begin with. I'd say Python or Ruby, whichever suits your aesthetics. Play with it for a while, and then learn C. With (Ruby|Python)+C, you're ready for anything your learning process might require of you.
2. Discrete Maths - not required if you just want to be a desktop/web programmer, but it helps in understanding more advanced topics. I'm not a mathie, so I don't know where linear algebra fits into all this, but I guess it's a part of discrete maths. Whatever. Learn discrete maths and linear algebra.
3. Data Structures - you might not need this knowledge if you're going to spend most of your time dealing with Python/Ruby, but it helps a lot when you drop down into C or when you want to optimize your code. Some of the more advanced data structures are also helpful when you need to come up with elegant abstractions for managing data in a program.
4. Algorithms - very important. Don't call yourself a computer scientist if you aren't familiar with big-O and some basic algorithms.
5. Object Oriented Programming - OOP principles are very handy when you're working in teams. Throw some design patterns into the mix.
6. At least one purely functional language (Haskell is pretty popular), one purely OO language (Squeak Smalltalk, maybe) and one stack based language (Factor is awesome). This will teach you how to look at problems from different perspectives. Of course, you don't need to master any of these languages unless you're truly interested in them.
7. One "enterprise" language. Java, C#, anything that gets you a job. None of these languages are especially difficult to master, and will act as a backup in case nobody wants to hire a Ruby God.
Besides all that, you might want to dabble in computer graphics, data mining and information retrieval, programming language concepts, compiler design, virtual machines, OS design etc. Your pick.