If you had the opportunity to take one computer science course now, and as a result significantly increase your knowledge in a subject area, what would it be? Undergraduate or graduate level.

Compilers? Distributed algorithms? Concurrency theory? Advanced operating systems?

Let me know why.

(Note that I appreciate this isn't a far fetched scenario - but time and inertia might be preventing people from taking the course or reading the book or whatever)

+2  A: 

Networking. (Not social networking.... although that might be a fun class to take anyway.)

+16  A: 

Data structures and algorithms - This course teaches you how to build more efficient code and also teaches you common approaches how to solve complex problems. I'm not the best in it but I believe the way this type of course teaches you how to think about complex problems can help you in many many other fields.

The course was great, but try having it taught to you by a Czech professor and a book that was written before you were born. Its painful.
This type of class is so critical that I don't know how people could be good computer programmers without having taken this type of class, and done tolerably well in it.
I agree with Beska. Both of those courses are required at my university and for good reason.

Any modern age algorithm class that uses up to date languages to teach you not just the algorithms but the languages too!

Algorithms != programming. A good algorithms course would be taught more like a mathematics course - explaining methods of designing, analyzing, and proving algorithms and giving a good introduction to characteristics of different kinds of problems (e.g., P vs NP). This is very language independent.
Well right, they are very different. What I meant is implementing various algorithms with popular programming languages so that you can learn both. I had an algorithms class taught in PASCAL and pseudocode, and I found that painful and a bit useless because it didn't teach me new languages at all!
There was no programming in my algorithms class, yet it was definitely one of the more valuable classes I took. Granted, I don't directly use that knowledge at work, but that isn't the point of a degree anyway. That class was essential to a better/deeper understanding of software for me.
+32  A: 


Just like learning a foreign language forces you to consider your native language more closely than you ever have before, I believe that writing compilers would give you great insight to all of the code you write normally.

Having taken a compiler course I can attest to this, it made me a better programmer because I now have a greater understanding of one of the tools I use most.
Kevin Loney
I've taken all the previous ones listed besides this.. so I guess this wins my vote.
Joe Philllips
Definitely not for everyone though; compilers was the most boring class that I've ever taken!
Philip Morton
Heh, it bored the hell out of me when I took the class. (I loved the CPU architecture and OS classes). But in the couple of years since then, it started looking a lot more interesting. Anyway, boring or no, it's definitely useful stuff.
+2  A: 

Genetic programming?

Spencer Ruport
+4  A: 

I'd take a course that covers material I know I'd have trouble learning on my own. I'm completely fascinated with quantum computing, for example, and I'd love to know more about it even if it may not help me professionally.

Zach Conn
+4  A: 

Privacy and Anonymity (actually, I just audited this one so it really doesn't fit the question exactly). Once you figure out how easily you can be uniquely identified on the web using minimal amounts of information you'll be a lot more careful with the information you hand out (as a user) and with the information you collect/display (as a developer).

+6  A: 

Neural Networks
AI in practice
An introduction to Natural Language or Semantic processing.

Any of those...heck I'd love to do any of those now if I had time.

However if you extended the scope to cover any course, I would have to go with an accounting course. That would be useful in all sorts of ways.

Unfortunately in my (minimal) experience they are not as interesting as they sound...
@UncleZeiv could you share you experiences if you haven't already.
Tim Matthews
+2  A: 

Either Computer Networks or Compiler Construction - both were electives at my school which I never quite had the opportunity to take due to schedule conflicts.

(Technically, several of my classes taught various elements of compiler construction - parsing, managing symbol tables, activation records - but they were more about machine/language theory than about how to actually build a compiler).

+14  A: 

Operating Systems. Knowing how that box you're developing on ticks at a lower level helps you grasp all of the higher level concepts later, especially when something goes wrong.

Great class to take; surprisingly dense.
+15  A: 

I would love to take a hardcore (as in John Carmack hardcore) graphics programming course. Something that covers everything from the hardware level up through rasterization and rendering algorithms and finishing at manipulation of data in 3-dimensions and data storage techniques. The one that was offered when I was in university was pretty mediocre.

Kevin Loney
What you're asking for could require several courses. Hard-core graphics work would indeed be fun.
Or one really really long course, but either way I'd jump at the opportunity to take it.
Kevin Loney
+1  A: 

This is a course I can recommend (it's a remote learning course).

You learn about Logic, Recursion, Binary Trees/BSTs, Truth tables, Efficiency, formal definitions of functions. It doesn't need any background in mathematics beyond school level. The basic topics about bit manipulation, counting in binary and so on are covered in the year 1 modules.

You don't use haskell though which I've heard a lot of Universities use - it's a java-interpreted functional language.

Chris S

Information Technology Regulation

Things like SOX, PCI, HIPAA and other legal requirements from various jurisdictions as well as what privacy laws may apply working in the IT field. Hacking may also be covered to some extent here as it is kind of a cross between a law course and Information Technology that isn't necessarily Computer Science to some.

JB King
+4  A: 

I'd be interested in taking a course on machine learning. I work in statistics, and there's a lot of overlap with machine learning. I'd enjoy seeing a different perspective for solving some of the same problems.

John D. Cook

Since I have already taken compilers, algorithms and all the other standard CS stuff, I would probably take something more interesting and "trendy" like IPhone development

Mo Flanagan
Wow. If you could only choose a single CS class to learn, you would forgo Algorithms, Compilers, OS... and take iPhone dev?
There's nothing wrong with taking a class in something specific, especially if you've already done everything else.
Brendan Long
+15  A: 

User Interface Design, in a heartbeat.

I learned a lot about how to program well in college, but never once was user experience even mentioned. After having been out in the workforce for over a decade, I look at that omission as flat-out criminal.

+1 for that. It only more people shared your opinion... BTW I took such a course while at university, out of interest, it wasn't part of the curriculum. Guess what, the course had only a few attendees.
+1 very often overlooked.
Kirk Broadhurst

I wish I'd taken a paper that taught a bit of Assembly. All the papers I did were in higher level languages.

I also wish I'd hit databases alot sooner, I only started taking those papers in second year. So I never was able to take the advanced papers concerning Hibernate, JDBC etc.

+2  A: 

I have not yet finished my master's thesis, so I could still take any CS courses which I like. But I think that I can learn the same things easier by reading books and doing some exercises, without going to the courses (and getting stress from the exercises and exams). Another option would be to just listen to the lectures, but without officially taking part in the course (at least here in the University of Helsinki the lectures are public for anyone to listen).

Here are the things that I would like to learn next: functional programming, distributed systems. Compilers would also be an interesting topic, but I don't need that knowledge right now.

My university would have courses about all of those, but now I prefer learning them by myself. I'll download the course material and exercises from the lambda calculus and the Haskell courses, and read a book or two about distributed systems and algorithms.

Esko Luontola
+2  A: 

Algorithms (again). Sadly I don't think I picked up as much as I should have the first time around. My 2nd choice would be Compilers.

Kevin Tighe
+2  A: 

Also compilers because they require efficiency in so many areas, parsing, pattern matching, semantic analysis, code generation, etc.


Rob Wells
+1  A: 

My first two (OS and Compilers) are already taken. My next pick would be a good course on Database design. Databases are a huge part of any web project. Understanding how they work internally will make it a lot easier to work with them later.

Steve Rowe

Extreme programming. Problems from programming competitions. To code a lot. To code fast. To code efficiently. Use of version control included :)

Łukasz Lew
+1  A: 

"Software licensing and related copyright laws" will be a hit in next years

+2  A: 

Parallel Programing. I don't really think it needs to be just functional programming. I'm just as interested in grokking the topic with non-functional languages.

Daniel Auger
+1  A: 

Security or cryptography

+1  A: 

parallel/distributed programming since cpu's aren't going to go that much faster soon; and multi-cores and the internet are going to be around for a while. an undergrad course as i have no prior knowledge.

Ray Tayek
+2  A: 

Computational geometry. I get by with what I pick up from books but I wish I'd gotten a real deep understanding when I had the chance.

+2  A: 

I am surprised that I don't see any one going for theory of computation. It is the most geeky subject I learned at uni. Surely someone here share the same appetite with me. :-)

CS -> 1. Theory of Computation, 2. Computational Modeling, 3. Programming Language

  1. It gives me a much more abstract perspective on problem solving overall. My experience tells me the more abstract I go, the better solution I can craft for a problem. :-)

  2. Modeling is so powerful that most problem solving relies on. With it, we solve problems usually in a low level way. It usually is not the best solution.

  3. It is the interface of the computer to a programmer. And I am interested to make programming easier for all. So if the interface can be improved, all will benefit.

Timothy Chung
+11  A: 

Algorithms class, hands down.

"If you want to be a world-class programmer, you can program every day for ten years, or you can program every day for two years and take an algorithms class." - Prof. Erik Demaine (MIT)

Learning algorithmic complexity, sorting, merging and searching algorithms is extremely important.

Here is a link to the video that quote is from, MIT's OpenCourseware algorithms class videos.


Semantic Web

+1  A: 

Operating systems. Anyone with operating systems knowledge has a huge advantage when it comes to piecing together the components / services in a software system, planning for performance, and diagnosing / resolving performance bottlenecks.

+2  A: 

Typography. Followed by user interface design.

These are the areas where my skills need greatest improvement, I think.

Tomas Sedovic

i'm still bummed Neural Networks was full when I wanted to take it at college


Compilers, and Operating Systems


Computer Architecture. To have a better understanding of how your software actually runs at the end.