top | item 698220

Ask HN: Most Useful Undergraduate CS Courses

13 points| javanix | 16 years ago | reply

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

I'm curious as to which (if any) undergraduate CS courses you found most functionally useful (ie, they made you a better programmer in some way) in your programming careers.

15 comments

order
[+] nostrademons|16 years ago|reply
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|16 years ago|reply
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.

[+] scott_s|16 years ago|reply
For OS, I'd like to add that it's probably the first time you'll have to consider concurrency. It's easier to handle parallel programming after you've dealt with concurrency at the operating system level.
[+] throw_away|16 years ago|reply
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|16 years ago|reply
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|16 years ago|reply
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|16 years ago|reply
Discrete Mathematics courses
[+] emontero1|16 years ago|reply
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|16 years ago|reply
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|16 years ago|reply
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|16 years ago|reply
Databases! It's where theory and data structures meet in practice.
[+] dandelany|16 years ago|reply
I really enjoyed taking AI and a Natural Language Processing class my senior year.
[+] sarvesh|16 years ago|reply
If you can find a course that teaches finite automata and formal languages you should definitely take that in addition to those already mentioned.