

Developer, never formally studied CS past high school -- what don't I know? - MBlume

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.<p>I work in OO Python professionally.<p>I know some basic automata theory and can sketch proofs of simple results like the pumping lemma.<p>I can understand and/or construct a simple grammar.<p>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.<p>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.<p>I can comfortably implement simple functions in Scheme or Haskell.<p>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.<p>What don't I know?
======
ggchappell
> 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.

~~~
alexholehouse
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.

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

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

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

