views:

1285

answers:

33

What is the most influential CS class that you've taken? This could mean the one which made you a better programmer, the one which changed the way you think about CS... maybe even the one that made you decide not to major in CS, although I doubt we'll see many of those around here.

I have two candidates: One was Computer Systems, where we learned how computers work starting from logic gates leading into designing and simulating our own RISC computer, then creating a compiler for a simple language to compile to that assembly code.

Another is this course about Programming Languages I'm taking. It's teaching me a lot of new concepts like continuations, what mutation really is, etc...

+21  A: 

Compilers. It really opened my eyes to the intricacies of how programs are made.

jodonnell
+2  A: 

The Computer Organization and Architecture class at the community college I went to: understanding how the actual bits flow around made massive improvements in my higher-level coding.

warren
in my experience, these classes tend to fail unless they are well structured, because otherwise it is just a course in random concepts. For me, learning basic electronics, C, digital circuits, and assembly/microprocessors covered said course in spades, and gave direct context for each application of the features.
Ape-inago
I concur - the course I took was on x86 assembly, digital logic, and circuit design, culminating in how it relates to C
warren
+6  A: 

Comparative programming languages, where we wrote the same programs in Lisp, COBOL, Fortran, Prolog, C, and Java.

JosephStyons
Interesting, but please explain what the benefit was
finnw
It made me appreciate how the same thing can be easy to express in one language, and hard in another. Just another way to drive home the "use the right tool for the job" prinicple.
JosephStyons
Yay prolog. nasty stuff tbh.
Ape-inago
A: 

Computer architecture involving assembly programming and mathematics for computer graphics. These both provided the fundamental understanding needed for many problems in computer science.

cdv
+3  A: 

the best CS course I had was actually a Philosophy elective: Predicate Calculus. This led to a better understanding of boolean expressions (in particular the ability to reduce complex ones to essential cases, which is very useful when refactoring highly modified legacy code) and a greater appreciation for the extreme difficulty of proving program correctness.

Steven A. Lowe
+2  A: 

Building my own OS in a RTOS class taught me a lot. Compilers taught me a lot, and computer organization and architecture taught me a lot.

Paul Nathan
+1  A: 

Interestingly I think CS 101 was the most influential for me. Before then I thought I liked Computer Science, but after that I absolutely knew that it was what I wanted to do. My professor “Rocky Ross” as an absolute pleasure to have around, he was one of the more established professors at my university, yet loved teaching 101 and inspiring his students. I think the difference between an average and a great 101 class can be life changing for a lot of younger students.

After that, I had Rocky for my compilers class, which was the first time I had to develop a large application over an extended period of time with a team. It also brought together all the little pieces of computer science that I had learned until then.

Joe Basirico
+3  A: 

Operating Systems I & II

ceretullis
+16  A: 

Analysis of algorithms, for time and space. It is by far the most commonly used technique, and essential to keep in mind before attempting to optimize anything.

If self-taught programmers need to learn one thing that they might not otherwise automatically pick up, it is this. It's an essential tool for the toolbox.

Barry Kelly
+1  A: 

I've only taken one, a C class. When I asked how strings were copied (I'd been using Turbo Pascal, where a string is allocated on the stack and assigning one string to another involves a memcpy) and the professor couldn't tell me -- more importantly, couldn't tell me that I wasn't asking the right question -- I realized I was in the wrong place.

I wish I'd taken a compilers class and an algorithm class, which teach (I think) the kind of stuff that it takes a while to realize you don't know.

The best on-the-job training -- in conceptual stuff, and taking a step back from the daily "fix bugs! make it work!" grind -- has been being involved in interviewing & hiring. It's forced me to put words to things I only knew conceptually. (ADG, heap, Trie, etc) And the best candidates always teach me something.

Moishe
+3  A: 

Without a doubt Compiler Design. I took this course as a sophomore in college. The classic "dragon" book by Aho accompanied the course. Developing a tokenizer, a recursive descent parser, and a stack-machine emulator to execute the code was some of the most rewarding code I've ever written.

Decker
+1  A: 

A bit of a duplicate of this one

KevDog
+3  A: 

"Data Structures and Algorithm Analysis", defiantly - learned Stacks, queues, linked list, sorting searching, recursion – all the good stuff.

Booji Boy
But no hash tables?
finnw
hash tables too. I forgot ;)
Booji Boy
+1  A: 

I have a few:

  • Compiler Design, where we implemented a Pascal- to C- (C-minus and Pascal-minus, subsets of their respective languages) over the course of the semester
  • Software Architecture & Component-Based Design: this introduced me to Domain-Driven Design and transformed the way I think about software in general
  • Operating Systems, where we implemented a very very simple file system
  • TCP/IP Networking, where we implemented a very simple simulation of the TCP/IP stack
  • Programming Languages, where we implemented a very simple Lisp interpreter in Lisp
  • Theory of Computation, which is the core Science of Computer Science
moffdub
+1  A: 

4th year : Translator construction/Compiler Design - how to build the language you were fascinated by in the prevous year 3rd year : Comparitive Languages showed what problems different languages were solving 2nd year : systems programming - built a linker/loader/assembler 1st year : intro algorithms analisys

these were the undergrad courses that I mosted enjoyed - these were early 90's so they may be dated.

graduate level : debugging systems - wrote a debugger and instrumentation system . that was fascinating but not much money in it so I hack web systems to pay the bills ...

MikeJ
+3  A: 

I had a "Programming Languages" class where we had to write a program in a new language each week (C++, awk, Perl, etc...).

It taught me that each language is a tool. Some are better than others for different tasks -- don't be afraid to branch out into new areas. And if something is really painful (like text processing in C) you're probably using the wrong tool. A few quick Google searches should find it.

kurious
+18  A: 

Theory of Computation taught me that CS had deep, profound roots in formal mathematics: P versus NP is mind-blowing. To quote our prof: with this, who needs drugs?

Design & Analysis of Algorithms taught me that CS was cooler than mathematics: in math, we can debate the elegance of a proof, but that is subjective. In algorithms, the proofs can be elegant, but also have a sense of speed (the big-O notation etc). That was thrilling, because I realized comp sci is like putting my mathematics skills in a drag race.

Michael Easter
I like it... Computer Science: Extreme Mathematics
Mark Reid
Who was your CS prof, BTW?
ShreevatsaR
I took both classes at the University of Waterloo. (Now Dr) Naji Mouawad for Theory Of Comp and Dr Jeffrey Shallit for Algorithms.
Michael Easter
+2  A: 

Computer Graphics: it combines math, data structures, and performance with pretty images. Plus you realize what that linear algebra junk was all about.

DancesWithBamboo
A: 

Computer Graphics.
First time I ever designed a GUI, first time I actually built a big application from scratch. First time I knew what I want to do for the rest of my academic career :)

shoosh
+3  A: 

I would have to say the class that really opened my eyes to some deep results in computer science was the Theory of Computation class I took in my final year of my undergraduate. For a taste of the type of result we worked up to, have a look at Rice's Theorem. The course was both very difficult and very enjoyable.

There's not any single result from that class that I now rely on in my day-to-day research or programming. Rather, it felt like tearing away all of the arbitrary conventions of programming until the raw logic of computing was exposed. In a good course you should learn about the difference between fully and partially computable functions, complexity classes, the limits of recursion, and have a strong appreciation for the Halting Theorem and its implications.

If you want a accessible introduction to the theory of computation, I can strongly recommend the relevant chapter in Feynman's Lectures on Computation. The rest of the book is excellent too, and very readable.

Mark Reid
A: 

Compilers Dessing and Design & Analysis of Algorithms Just opened my mind!

juanduke
A: 

My final project class, which we were required to use a horribly, nightmarishly complex and shitty Java IDE (the maker made a deal with the school). I have blocked the name of the IDE out of my brain, fortunately; if I had to guess I'd say Visual Cafe. It was some meta IDE where you let it generate shittons of awful java code which you were supposed to "clean up". Of course, it was geared towards professionals; we all had no idea what the hell was going on, and consequently nobody completed their project. A disaster.

That class taught me that there is nothing better for efficiently writing good, bug free code than a well designed and fleshed out IDE.

Will
I had a class like that, except we could choose our own tools. Usually, such courses are supposed to "shock" you into the realities surrounding most software projects.
moffdub
+2  A: 

The class was called "principles of programming" but it was really a serious functional programming class. It did more for my raw programming ability than any other class I ever took. Years later, I would find myself amazed when I was talking with somebody who had been doing software professionally for thirty years but had no idea what a closure is.

Jim Puls
I feel the same way now in this programming languages course I'm taking.
Claudiu
I'm curious, what do you mean by "closure"? does that have something to do with recursive functions ending?
Ape-inago
Wikipedia can explain it as well as anyone can: http://en.wikipedia.org/wiki/Closure_(computer_science)
Jim Puls
A: 

The most influential class I took as part of my degree would have been Project Management. It taught me that it's one thing to have smart people hacking out 1000s of lines of quality code day after day, but it's something completely different to ship a working product that people can actually use, and that having the former doesn't guarantee the latter.

rjohnston
A: 

My first OOP class, which was a Java class. It really demystified a lot for me. I guess you could say I was hooked from the onset.

A: 

6.001 (how to think like a computer scientist)
6.170 (how to think like a software engineer)

Brandon DuRette
A: 

Mines was my C class in undergrad. The class was hard (all projects due time were extented) and time consuming. Exercises that can take me 15 minutes now took me two week then. However, that class serves as the basis for my C# knowledge that I use professionally as a Software Engineer.

+1  A: 

Discrete Math. (UNT MATH 2770). It doesn't fall under the CS curriculum, but it was required for all CS majors. Basically "how to think like a programmer."

Nicolas Webb
+1  A: 

The following in the mentioned order:- 1. Compiler Design. 2. Theory Of Computation. 3. Algorithms and Data Structures. 4. Operating System.

Happy Coder
A: 

Software Engineering.

This, followed by a student project where we actually got to implement a nontrivial program as a group in an organized fashion over the course of several months, showed me that programming was much more complex and less boring than I had though, prompting me to start a career as a programmer rather than as a sysadmin (which I had previously planned).

Michael Borgwardt
+1  A: 

Richard Bird's "Functional Programming" course. The first course in the first year. Up to that point I'd mostly been programming in QBasic and this totally destroyed most of my preconceptions about programming and the structure and power of computer programs.

The succinctness and power of functional languages (in our case Haskell) seemed almost like magic at the time and have influenced my programming style through another three years of undergrad and three years of professional development too.

Martin McNulty
<3 haskell !
Claudiu
A: 

Computer architecture, despite that i`m a software developer.

Arnis L.