

Ask HN: Supplement for a CS degree? - devin

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.<p>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.<p>I would assume there is a healthy dose of math in the mix.<p>Links to content are appreciated.
======
GeneralMaximus
Here's a very brief overview of a few fundamental CS topics. It's by no means
complete, but this is what I'm going to focus my energy on in college:

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.

~~~
HalcyonMuse
This is all great advice that I, as a CS undergrad, am going to take to heart.

Something along a similar vein that bubbled up on HN a long while ago is the
Programmer Competency Matrix: [http://www.indiangeek.net/wp-
content/uploads/Programmer%20co...](http://www.indiangeek.net/wp-
content/uploads/Programmer%20competency%20matrix.htm)

For my own part, this was a golden find, as it describes components of five
spheres of competency (Computer Science, Software Engineering, Programming,
Experience and Knowledge) as well as - and this is the important part - the
steps it takes to obtain mastery in the components of those spheres.

While this may partially be an oversimplification, it does put things into
terms my game-conditioned brain can easily understand, and I suspect that I'll
likely discover anything it has missed in my pursuit of mastery.

Your college curriculum may or may not involve going through the SICP, but
it's something I recommend. It's available online...

...in HTML

<http://mitpress.mit.edu/sicp/full-text/book/book.html>

...in PDF

<http://web.mit.edu/alexmv/6.001/sicp.pdf>

...with an accompaniment

[http://eli.thegreenplace.net/2007/06/19/introducing-the-
sicp...](http://eli.thegreenplace.net/2007/06/19/introducing-the-sicp-reading-
notes/)

...and there are several archived video lectures on the topic

[http://groups.csail.mit.edu/mac/classes/6.001/abelson-
sussma...](http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-
lectures/)

------
jlees
If you're looking for what a CS degree would involve, why not check out a
curriculum/lecture course list? (e.g.
<http://www.cl.cam.ac.uk/teaching/0809/CST/> \- the one I did, a fairly
theoretical high-level approach).

I'm not quite sure on your meaning though, it sounds like you're doing a BS in
CS and want more..?

~~~
HalcyonMuse
It sounds to me like he's less interested in what a CS degree involves and
more interested in what a good understanding of Computer Science involves,
regardless of what one college decides is good for a curriculum, and so he
wants to go beyond simply what the course is teaching. For reference, the
definition of "supplement" in this instance is most likely "Something added,
especially to make up for a deficiency."

