Being a completely self taught programmer, I would like it if I could better myself by self-learning the computer science course taught to a typical CS grad.Finding different resources on internet has been easy, there is of course MIT open course ware, and there are Coursera courses from Stanford and other universities. There are numerous other open resources scattered around the Internet and some good books that are repeatedly recommended.I have been learning a lot, but my study is heavily fragmented, which really bugs me. I would love If somewhere, I could find a path I should follow and a stack I should limit myself to, so that I can be sure about what essential parts of computer science I have studied, and then systematically approach those I haven't.The problem with Wikipedia is it doesn't tell you what's essential but insists on being a complete reference.MIT open course ware for Computer science and Electrical Engg. has a huge list of courses also not telling you what courses are essential and what optional as per person's interest/requirement. I found no mention of an order in which one should study different subjects.What I would love is to create a list that I can follow, like this dummy oneSUBJECTS                                                        DONEIntroduction to Computer Science                                  *Introduction to Algorithms                                        *Discrete Mathematics                   Adv. Discrete MathematicsData structures                                                   *Adv. Algorithms...As you can clearly see, I have little idea of what specific subjects computer science consists of.It would be hugely helpful, even if someone pointed out essential courses from MIT Course ware ( + essential subjects not present at MIT OCW) in a recommended order of study. I'll list the Posts I already went through (and I didn't get what I was looking for there)https://softwareengineering.stackexchange.com/questions/49557/computer-science-curriculum-for-non-cs-major - top answer says it isn't worth studying csehttps://softwareengineering.stackexchange.com/questions/110345/how-can-a-self-taught-programmer-learn-more-about-computer-science - points to MIT OCWhttps://softwareengineering.stackexchange.com/questions/49167/studying-computer-science-what-am-i-getting-myself-intohttps://softwareengineering.stackexchange.com/questions/19912/overview-of-computer-science-programming
How do I completely-self-study Computer Science?
self improvement;computer science
I've seen some course material from MIT, and it was shockingly bad. They had teaching materials which required VC5, bunches of implicit global variables, passing colours as Blue instead of 32bit ARGB, let alone 4x [0,1] floats, that sort of thing. I wouldn't trust a curriculum or code just because it comes from a big-name university.My CS degree (from a university which is top 10 in the UK for CS) consisted of:First year:OOP- the super basicsComputer Systems- stuff like, binary integer representations.    Basic relational database theoryMathematics for CS- simple 2D and 3D geometry. A little bit of HTML/JS- complete beginner's stuff An equally tiny bit of PHP.A tad of functional programmingSecond year:Legal issues in computing- stuff like, laws revolving aroundprotection of user dataProgramming languages- Chomsky hierarchy and lexing was coveredOperating Systems, Networks, and the Internet- mostly stuff likevirtual memory and paging, IP stack2D computer graphics- mostly just proving theorems of the underlyingmathematicsAI- basic descriptions of neural networks, Bayesian belief systems,etc.Requirements analysis- brief overview of UML,functional/nonfunctional requirements.Team projectThird year:Algorithm analysis- complexity theory, mostlyImplementation of programming languages- LL/LR parsing techniques,CFGs, and such things.Software Project Management- a look at Waterfall/Agile modelsInternational Computing- Unicode and other localization funAdvanced AI- don't know, honestly, and I've got an exam on it soon3D computer graphics- mostly, again, just proving theorems forrotation matrices and suchAgent-based Systems- mostly about asynchronous agents communicating,reaching group decisions, etc.Microprocessor Applications- digital signal processingRobotics- covers stuff like computer vision and robot decisionmaking at a high levelAs you'll notice, pretty much everything is the basics of something and almost nothing is covered to a useful depth.The stuff that was actually worth doing, essential:OOP- and then some more, and then some moreFunctional programming- also some more. Try to pick a language like C++ or C# where you don't have to re-learn the syntax and tools, etc, to cover both styles.The OS part- virtual memory is good to know about, as is kernel mode vs user mode. Skip segmentation and the IP stack.Requirements analysis- Gotta be useful for any projectAlgorithm analysis- knowing what algorithmic complexity is, how to reduce it, and what the complexity is of common operations is important.Software project management models- many shops do Agile and many older ones still do Waterfall-style models.International computing- Unicode is essentialThe stuff that was worth doing, optionally:Programming languages- Chomsky hierarchy, the tools of lexing and parsing. Skip the theory behind LL or LR parsers- an LR parser can accept virtually any realistic unambiguous CFG, and when it can't, your parser generator's documentation will tell you about it.3D Graphics. I don't mean Prove this is a rotation matrix formula wastes of time, I mean actual This is a vertex shader stuff, or GPGPU. That's fun, interesting, and different.Some of the AI stuff is fun- like potential fields and pathfinding.Stuff that's essential but I didn't cover it anyway:Concurrency- a must-know, at least the basics, for anyone in 2012.The rest were a complete waste of time. Unfortunately, most of these nine points I either already knew, or picked up the useful parts elsewhere. If you read about things like the FizzBuzz problem it rapidly becomes apparent that you don't actually need to know all that much to be on top of the pack- which is fortunate, since my degree and many of the materials I've seen online for other degrees really do not teach much at all.