49

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 one

SUBJECTS                                                        DONE

Introduction to Computer Science                                  *
Introduction to Algorithms                                        *
Discrete Mathematics                   
Adv. Discrete Mathematics
Data 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 cse

https://softwareengineering.stackexchange.com/questions/110345/how-can-a-self-taught-programmer-learn-more-about-computer-science - points to MIT OCW

https://softwareengineering.stackexchange.com/questions/49167/studying-computer-science-what-am-i-getting-myself-into

https://softwareengineering.stackexchange.com/questions/19912/overview-of-computer-science-programming

Optimus
  • 617
  • 1
  • 6
  • 10
  • Completely? All the fun theoretical stuff too? –  Jun 10 '12 at 12:03
  • 1
    Yes, I actually like the fun theoretical stuff, I think it will increase my understanding of the subject (though that's a matter of debate in my circle). Also, I feel left alone when my CS friends have discussions about CS stuff or I irritate them by asking too many questions. – Optimus Jun 10 '12 at 12:11
  • 2
    Note that there are some kinds of "islands" in the curriculum where things hang together. You e.g. do rarely need lambda calculus in graph theory. Also consider that it might be nice to have mentors around - do you live close to a suitable educational institution? –  Jun 10 '12 at 12:19
  • As a matter of fact I do, and am friendly with the profs but I cannot bug them all the time. They have contributed to a lot of fragmented knowledge I have in the first place. – Optimus Jun 10 '12 at 12:44
  • 3
    In that case you might be able to take a selected course or two - that allows you to bug the profs all the time. –  Jun 10 '12 at 12:50
  • Cool.. I'll take up a project instead, it's more fun. – Optimus Jun 10 '12 at 12:54
  • Only answer is that you don't – Rig Jun 10 '12 at 15:13
  • @Rig I think I miscommunicated what I meant by a 'complete self study of computer science'. By that I did not mean that 'I want to self study, computer science completely' but rather 'I want to learn computer science(the essential parts) entirely by self studying' – Optimus Jun 11 '12 at 16:43
  • All the links are broken. Please edit your post in order to fix this issue. –  Dec 27 '16 at 00:18
  • @Optimus I was happy to read this post, I am looking for the exact same thing and have all issues you mentioned. I started with html, css, then php, js, python .. but I'm still stuck at the basics of CS, like network. Anyway, I just wanted to ask, if you found something which was the answer to these issues. Since this was asked 5 years ago. Did you find something useful you can share? – samayo Mar 16 '17 at 10:01

4 Answers4

26

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:

  1. OOP- the super basics
  2. Computer Systems- stuff like, binary integer representations.
  3. Basic relational database theory
  4. Mathematics for CS- simple 2D and 3D geometry.
  5. A little bit of HTML/JS- complete beginner's stuff
  6. An equally tiny bit of PHP.
  7. A tad of functional programming

Second year:

  1. Legal issues in computing- stuff like, laws revolving around protection of user data
  2. Programming languages- Chomsky hierarchy and lexing was covered
  3. Operating Systems, Networks, and the Internet- mostly stuff like virtual memory and paging, IP stack
  4. 2D computer graphics- mostly just proving theorems of the underlying mathematics
  5. AI- basic descriptions of neural networks, Bayesian belief systems, etc.
  6. Requirements analysis- brief overview of UML, functional/nonfunctional requirements.
  7. Team project

Third year:

  1. Algorithm analysis- complexity theory, mostly
  2. Implementation of programming languages- LL/LR parsing techniques, CFGs, and such things.
  3. Software Project Management- a look at Waterfall/Agile models
  4. International Computing- Unicode and other localization fun
  5. Advanced AI- don't know, honestly, and I've got an exam on it soon
  6. 3D computer graphics- mostly, again, just proving theorems for rotation matrices and such
  7. Agent-based Systems- mostly about asynchronous agents communicating, reaching group decisions, etc.
  8. Microprocessor Applications- digital signal processing
  9. Robotics- covers stuff like computer vision and robot decision making at a high level

As 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:

  1. OOP- and then some more, and then some more
  2. Functional 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.
  3. The OS part- virtual memory is good to know about, as is kernel mode vs user mode. Skip segmentation and the IP stack.
  4. Requirements analysis- Gotta be useful for any project
  5. Algorithm analysis- knowing what algorithmic complexity is, how to reduce it, and what the complexity is of common operations is important.
  6. Software project management models- many shops do Agile and many older ones still do Waterfall-style models.
  7. International computing- Unicode is essential

The stuff that was worth doing, optionally:

  1. 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.
  2. 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.
  3. Some of the AI stuff is fun- like potential fields and pathfinding.

Stuff that's essential but I didn't cover it anyway:

  1. 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.

DeadMG
  • 36,794
  • 8
  • 70
  • 139
  • Thanks, I'll probably end up going through subjects in this list one by one. – Optimus Jun 10 '12 at 12:35
  • I don't like their videos much either, they had some very old syntax for python in one of their courses. I like reading better than videos anyway, it's faster. – Optimus Jun 10 '12 at 12:38
  • 2
    @DeadMG, you are more into coding than theory? –  Jun 10 '12 at 12:45
  • 3
    @ThorbjørnRavnAndersen: Theory is a tool to write code, nothing more. A theory is worth nothing if you can't use it to make better code. – DeadMG Jun 10 '12 at 12:46
  • @DeadMG that's the primary reason I want to know *all* the theory :) – Optimus Jun 10 '12 at 12:51
  • 3
    @Optimus: The vast majority of all theory cannot help you make better code. – DeadMG Jun 10 '12 at 12:53
  • 3
    Theory is the foundation to know what code can be written, and what not. –  Jun 10 '12 at 12:55
  • @ThorbjørnRavnAndersen: Except any specific piece of code depends on a vast, vast minority of CS or mathematical theory. Most of it is abstracted away, and successfully. The real stuff that underlies the vast majority of code is principles like DRY. The CS or mathematics, you can learn as you need, beyond a few essential pieces. – DeadMG Jun 10 '12 at 12:57
  • the secondary reason is that I want a top-down knowledge in the subject which kind of has no reason behind it other than interest and curiosity. – Optimus Jun 10 '12 at 13:07
  • 17
    There is some very good advice in this post, but you're too dogmatic about declaring some fields a waste of time. There is considerable variety in programming jobs these days, and what's a waste of time for one job may be essential for another job. Rather than simply dismissing something as a waste of time it would be helpful to describe the sorts of development you've been involved in. – Charles E. Grant Jun 10 '12 at 14:00
  • @Charles: It's not for a job. It's for general content- the stuff *everyone* must know. If you have job-specific content, you learn it on, or in preparation for, that specific job. You don't make everyone do it. Obviously if your job is to write Bison, then you need to know LR theory. But to *use* Bison, or to write some other arbitrary piece of software, you don't need it. – DeadMG Jun 10 '12 at 14:32
  • 4
    I've done a lot of interviewing over the past few years, and it seems like the biggest gap these days in colleges is in teaching data structures and algorithms. The second biggest gap is in understanding how tools are implemented internally. In my opinion, classes in using a particular tool are a waste of time. There's not much point in knowing C++ syntax if you can't explain when to use a hash table and when to use a tree. – Gort the Robot Jun 10 '12 at 16:09
  • @StevenBurnap: There's no point knowing when to use a hash table if you can't write any programs that use a hash table- and there's even less point in knowing how to *write* a hash table. People should learn what they need to know. What they don't need to know is, how is `std::sort` or `std::map` implemented. Just complexity guarantees and things like cache performance. – DeadMG Jun 10 '12 at 16:30
  • 2
    If you don't know how to write a hash table, then you will likely lack true knowledge of how it performs. In my experience, if you don't know how `std::map` is usually implemented, you'll probably have troubles remembering the complexity guarantees. When I interview, I don't ask people how to implement hash tables. I ask them a design question best solved with a particular STL container. Far too many people flail about, and pick something that solves the problem poorly. – Gort the Robot Jun 10 '12 at 16:55
  • @StevenBurnap: Why do I care about remembering the complexity guarantees? If I forget, a thousand online resources will compete to be the first to tell me. And the only true knowledge of the performance of a data structure is the profiler result, which is obtainable without implementing it. – DeadMG Jun 10 '12 at 18:32
  • 1
    Spoken like someone who has never had to fix code written by someone who used bubble sort on a singly-linked list. – Gort the Robot Jun 10 '12 at 20:14
  • 1
    @StevenBurnap: That's got nothing to do with it. `std::list::sort()`. Problem solved. Other environments have equivalents. The problem is that that someone had no idea how to use his given environment. – DeadMG Jun 11 '12 at 04:40
  • 1
    @DeadMG: So, you've never had to do anything with a relational database? –  Jun 11 '12 at 14:56
  • 1
    @DeadMG Problem solved unless `std::set` is a better choice. – Gort the Robot Jun 11 '12 at 15:53
  • that awkward moment, you have no idea, what the discussions on your own post mean. :P, I hope I'll be able to make sense of them some day – Optimus Jun 11 '12 at 17:50
  • @MarkBannister: I wrote some SQL queries. Nothing too complex. I'd pick it up when I need it. – DeadMG Jun 11 '12 at 18:36
  • @StevenBurnap: Maybe, I don't know the use in detail. But you don't have to implement `std::set` either. – DeadMG Jun 11 '12 at 18:36
  • No, I mean, you need to know when to use the one or the other. It's a lot easier to do that if you know that `std::set` generally performs like a tree (because it is generally implemented like one.) – Gort the Robot Jun 11 '12 at 19:28
  • Please try to avoid extended discussions in comments. If you would like to continue this conversation then please go to the chat room. – maple_shaft Jun 11 '12 at 19:59
  • You criticize MIT's open courseware without giving any examples of specific courses. Also your answer is obviously biased to your personal tastes since you don't give any citations/references. – sakisk Aug 28 '13 at 12:47
  • 1
    @DeadMG Your quotable aphorism about theory has made it into a talk about Bayesian statistics. :D http://mlg.eng.cam.ac.uk/yarin/PDFs/2015_UCL_Bayesian_Deep_Learning_talk.pdf – Lenar Hoyt Aug 13 '16 at 17:58
5

Open Course ware is just a list of courses that they have made available. If you want to know what a student would have taken, swing by MIT's(non OCW) website and look at the actual program. They have a list of what is required and what is considered a prereq for what. Here is their page.

stonemetal
  • 3,371
  • 16
  • 17
  • I am looking into it, but I found their requirements pretty terse. and where is the long list of courses? – Optimus Jun 10 '12 at 12:34
  • 1
    http://web.mit.edu/catalog/degre.engin.ch6.html Is the big list. CS is refered to as 6.3 – stonemetal Jun 10 '12 at 14:35
  • thanks, this will also be helpful, It is good to know what curriculum big univs are following – Optimus Jun 10 '12 at 16:51
  • 1
    I'm doing EECS at Berkeley right now. If the MIT EECS program is structured anything like Berkeley's, then you won't get much guidance there: we have a short intro sequence and then it's literally do whatever you want in whatever order you want as long as you do a minimum number of advanced courses. I think it's awesome, but it probably won't help you figure out which courses to take: I had to make the same decisions myself. (I had help from my faculty advisor, but in a complete coincidence his advice was to take his graduate seminar :)). – Tikhon Jelvis Jun 11 '12 at 05:43
  • @TikhonJelvis It is easier to make the choices of what you would like to learn and what you would not, once you have an idea of what the scope of the field is and what scope should at least be covered. I, being a Civil Engineering Grad, have little idea as to what goes on in Computer Science and Engg. Field – Optimus Jun 11 '12 at 16:30
5

Try the 2001 Computer Science curriculum recommendations from ACM/IEEE, linked here: http://www.acm.org/education/curricula-recommendations

along with the 2008 CS updates.

Page 17 of the 2001 report has a handy chart which underlines all the "core" knowledge and still lists electives.

An undergraduate program wouldn't have time to cover even the courses considered core by these recommendations, so they will lump some of the categories together and let the students pick amongst them (eg, Operating Systems, Programming Languages, and Software Engineering get lumped into Software, and students pick a track).

You can find the required coursework on the CS department website for pretty much any school, and they should be some version of this.

Ruan Caiman
  • 151
  • 2
  • good, a little out of date, but still a lot of subjects left to choice in a normal curriculum are considered core here, it is nice to have a wider choice of study available if you run out of the things you've got queued up +1. – Optimus Jun 11 '12 at 17:57
  • For the lazy, that list contains: Discrete Structures (DS) Programming Fundamentals (PF) Algorithms and Complexity (AL) Architecture and Organization (AR) Operating Systems (OS) Net-Centric Computing (NC) Programming Languages (PL) Human-Computer Interaction (HC) Graphics and Visual Computing (GV) Intelligent Systems (IS) Information Management (IM) Social and Professional Issues (SP) Software Engineering (SE) Computational Science and Numerical Methods (CN). – Damien Roche Aug 20 '14 at 04:34
-4

If I may, I'd like to suggest joining github.com as part of your learning process.

Then you can search around for code that has some real world application that you're interested in, clone it for yourself, work with it, code on it, and get to know it, and eventually start to submit patches back to the source project, and down the line be working on an open source project that you have a vested interest in.

And, of course, you'll get familiar with git, which is just all the better.

Kzqai
  • 355
  • 2
  • 9
  • 5
    -1: While valuable, that doesn't expose him to the theoretical aspects in computer science that he needs to know. – Ken Bloom Jun 10 '12 at 22:33
  • been there done that, we also have a personal git repo, Hanging around github does make you a better programmer though – Optimus Jun 11 '12 at 06:47