Ask HN: Most Useful Undergraduate CS Courses
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.
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.
[+] [-] nostrademons|16 years ago|reply
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 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
[+] [-] swolchok|16 years ago|reply
[+] [-] emzo|16 years ago|reply
[+] [-] throw_away|16 years ago|reply
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
[+] [-] scott_s|16 years ago|reply
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
[+] [-] emontero1|16 years ago|reply
[+] [-] javanix|16 years ago|reply
[+] [-] scott_s|16 years ago|reply
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
[+] [-] dandelany|16 years ago|reply
[+] [-] sarvesh|16 years ago|reply