Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
Developer, never formally studied CS past high school -- what don't I know?
15 points by MBlume on Nov 12, 2011 | hide | past | favorite | 5 comments
By this time next year I'd like to be able to say I have a solid grasp of the material one would customarily learn by going to grad school for computer science.

I work in OO Python professionally.

I know some basic automata theory and can sketch proofs of simple results like the pumping lemma.

I can understand and/or construct a simple grammar.

I know what a linked list, a binary tree, and a hashtable are, I know their big-O characteristics, and I'd be able to implement them in C if asked.

I've read SICP, and can easily manipulate recursion, closures, etc. I know how to adjust a function to ensure it takes advantage of tail-call optimization. I know how to "fake" OO using closures.

I can comfortably implement simple functions in Scheme or Haskell.

I've never played with macros or continuations. I know what a monad is, and have had cause to use them a couple times, but I'm not sure I know what the big deal is yet.

What don't I know?



> What don't I know?

It sounds to me like you have a very good grasp of a good percentage of the topics covered in an undergraduate CS program. You didn't mention anything about electronic circuits, computer architecture, assembly language, or principles of operating systems. We cover those in our program (I'm a CS prof). You also didn't mention anything about software engineering standards & practices, although as a professional developer I would imagine you have a fair amount of experience in those areas.

As for graduate school, there is no standard set of things one learns there. Rather, graduate school is where you specialize. To get a Ph.D., you would be required to make some original research contribution to the field. So it's less about learning some particular curricular material, and more about getting to the point where you can advance the field, and then doing so.


Agreed - hit up OS principles and architecture (addressing, endianess, floating point, assembler). Might also want to have a look at some basic networking stuff (TCP/IP principles, more broadly the OSI model) and/or some basic database stuff.


There's no real "standard" CS curriculum, so it's hard to say for sure. Schools range from more math-heavy to more engineering-heavy, often still correlated with where the department originated (was CS broken off from EE, or was it broken off from math?). You sound like you've covered a decent portion of the common core. At a more engineering-heavy school, you'd probably be missing a few lower-level courses (circuits, operating systems, architecture, etc.). At a more math-heavy school, you'd probably be missing a few more mathy courses (discrete math, dynamical systems, formal logic, advanced complexity/computability theory, etc.).

What I'd probably do next is pick one or two specialty areas and learn a solid amount in it/them, equivalent perhaps to a two-course sequence, so you could say that you have a solid grounding in its fundamentals and some advanced aspects. A few possibilities include: graphics, operating systems, artificial intelligence, robotics, human-computer interaction, computer architecture, compilers, formal methods, numerical algorithms / scientific simulation, software engineering, distributed/concurrent computing, security, etc.


I'd suggest learning, minimally, algorithms and complexity (for instance, at the level of Dasgupta, Papadimitriou, and Vazirani).


architecture is very important. Knowing how L1 and L2 cache work, instruction pipelining, branch prediction etc... can really change the way you program.

Also if you have done a lot of OO maybe its time to pick up a functional language on the side? F# is kind of fantastic...




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: