
Ask HN: Most Useful Undergraduate CS Courses - javanix
Through fortuitous scheduling and some transfer luck, I've managed to take care of all of my course requirements before the end of my fourth year (both gen-ed and CS-specific). This means that I have almost a full semester of credits that I need to take yet (to satisfy the total-credits requirement), with no restrictions on what classes they need to be, other than that they must be applicable towards a Letters and Sciences bachelor's degree (not very restrictive at all).<p>I'm curious as to which (if any) undergraduate CS courses you found most <i>functionally</i> useful (ie, they made you a better programmer in some way) in your programming careers.
======
nostrademons
The big three IMNSHO are OS Design, Compiler Design, and Computer Graphics, in
that order of precedence.

OS Design teaches you about trade-offs. In many academic CS courses, the
answers are cut-and-dried: here's how you write a binary search, here's how
you implement a hashtable, etc. In OS design, every decision has a cost,
because you have to balance time spent in the kernel vs. memory cost vs. speed
of user programs, and the user programs will often have wildly different usage
patterns. Should you copy-on-write pages? Which scheduling algorithm should
you use? There are no right answers to these questions, but there're options,
there are costs, there're benefits, and these depend a lot on how your OS gets
used. Much like real software.

It'll also help you understand how to write performant programs, eg. if you
know that the OS uses spare memory to cache file buffers but will page out
memory (at the cost of millions of CPU cycles) if physical RAM is exceeded,
you might look differently on rolling your own caching layer for file
contents. I'm talking to you, Squid folks. ;-)

Compiler design is essential if you want to learn how to write code that
writes code, which is essential if you don't want your job to be outsourced.
It teaches you about complex data structures and how they're transformed into
other complex data structures, which is useful for a lot more than just
general-purpose programming languages. Chances are, you'll end up writing a
"little language" - even if it's just the configuration system for a large
product - at some point in your career, and you're stuck with a bunch of ad-
hoc hacks if you've never taken compilers.

Computer graphics I included partially because it's cool and partially because
it's one of the most mathematical courses you can take in college. You learn
about fast matrix transformations, computational geometry, derivatives, and
how to implement abstract mathematical operations on a computer. This ends up
being useful in a lot of high-paying subfields (eg. finance, search, data-
mining, operations research) and a few relatively low-paying ones (eg.
computer games).

Honorable mentions: AI, theory of computation, concurrency, crypto. These will
probably not be directly useful in your job (except concurrency, but you can
pick up a lot of the important ideas of that on your own), but they're very
cool and nifty to know.

~~~
sidmitra
I found Digital Image Processing to be the most fun and educational and the
assignments were a major reason. The visual output acts as a pretty good
motivator. The same probably goes for Computer Graphics.

I was never so thrilled looking that the output of a Prolog interpreter that i
made. But maybe that's just me.

------
throw_away
if you happen to be at cal, the single most functionally useful class I took
there was hilfinger's programming for blood:
<http://www.eecs.berkeley.edu/Courses/Data/701.html>

the premise of this class was to build a better team for the ACM programming
contest, but I learned a ton about the actual mechanics of programming, rather
than just the theory--- similar to the ideas vs. execution meme that floats
around here. I think what made it so different from the rest of my courses
were a) we spent lots of time reading code and looking at different solutions
to the same problem and b) the competitive nature of the class.

------
BrentRitterbeck
Do they offer some kind of numerical analysis class cross-listed with the
mathematics department? This is a class I wish I would have picked up. I now
have to teach myself numerical analysis, and there is so much material to
choose from that I don't know what the correct sequence of learning things
should be. My methodology is diving into GSL and picking things apart until I
come to something I don't understand. Then I go and research that. Then I
start picking more apart. I'm sure a lot of my headaches could be prevented if
I were learning things in a "proper" order.

------
scott_s
I endorse everything nostrademons said, but I'd like to add some comparative
programming languages course - which often is complementary to a compilers
course.

My comparative course was my first exposure to functional and logic
programming - it was, in fact, the first time that I was forced to consider
the entire concept of a "programming paradigm." It transformed the way I think
about programming.

------
embeddedradical
Discrete Mathematics courses

~~~
emontero1
I couldn't agree more. Discrete Mathematics is one of those areas I wish I'd
explored further during my undergrad years. Logic, set theory, operations
research, and information theory will all prove to be fundamentally important
in your later years, irrespective of your ultimate concentration.

------
javanix
Thanks for the info guys. I should probably add that our school doesn't offer
any sort of work-study credit in CS, so that's the reason I'm sticking around
campus for the last semester (well, that and no desire to kill myself for my
last "real semester" just to get out a semester early).

~~~
scott_s
Just read in your profile that you're at Wisconsin. Madison, I assume? I took
a look at the schedule for next year, and it looks like the compilers course
is a combo compilers and programming languages - which is excellent. I highly
recommend it. Looking at that list, I also strongly recommend introduction to
computer architecture. Having a solid grasp of what's actually going on in a
processor will make you a better programmer.

Between architecture, programming languages/compilers and operating systems,
you will have all of the concepts necessary to understand the semantics of the
programs you write, what kind of code will actually be generated from those
semantics, and a basic understanding of the entire system stack from your
program, to the operating system, down to the processor.

Madison is an excellent school, take advantage of your time there.

------
mikebo
Databases! It's where theory and data structures meet in practice.

------
dandelany
I really enjoyed taking AI and a Natural Language Processing class my senior
year.

------
sarvesh
If you can find a course that teaches finite automata and formal languages you
should definitely take that in addition to those already mentioned.

