views:

606

answers:

12

I was a math major and I took OOP and Algorithms & Data Structures from the CS department while in school, but didn't continue to any upper-division courses.

What were the most valuable courses to your programming career (Operating systems, Compiler Design, Computer architecture, etc) in your CS degree? Alternatively, if you're like me and don't have one, are there any courses you wish you had taken?

What would be the best way to fill in the gaps in my knowledge outside of school?

+10  A: 

Well, Data Structures, Abstract Programming and Assembler (Part of Computer Organization) have been the helpfuls for me.

  • Data Structures - A little obvious, but learning how to design and use the different structures as well as seeing how people came to figure out how to make structures more efficient was not only beneficial, but extremely interesting.
  • Abstract Programming - simply due to my exposure design patterns and why they are necessary.
  • Assembler (Part of Computer Organization) - being that "close to the metal" so to speak, gives a lot gratitude for the languages I use on a daily basis.

If we were to however to view the entire coursework I would have to say that everything is valuable. I'm not speaking in a sense of the material itself, but rather how it changes the way you think about problems. Since I have learnt at university, the way I view and tackle problems has changed completely. I am more analytical, more precise and don't view the problem as "black or white", so to speak.

I feel that simply completing the qualification can make you a much better developer, as long as you put in effort to understand.

Kyle Rozendo
+1: As soon as I saw this question, Data Structures was the first course that came to mind.
R. Bemrose
Is Abstract Programming Design patterns and practices?
@daniel - Most of it, yes. It also involved best practices in general in regards to things such as multithreading and the like, but mostly everything revolved around design patterns.
Kyle Rozendo
A: 

I'd say they are all valueable... algorithms and datastructures are great, but if you don't know a programming language in which to apply them, well... and if you do know a programming language, but don't have any algorithmic knowledge, you are also in trouble. It's really the combination of all of them that are important.

In terms of filling in your knowledge gaps, the best way is to read things online, try implementing things, and let curiosity both in the reading and the implementation lead to new readings and implementation efforts. It's important to get a good mix of both the theoretical concepts and practical elements of implementation.

When it comes to actual implementation, specifically in C++, I found A Beginner's C++ (now outdated, but has lots of useful information nevertheless) and C++ FAQ Lite, to be incredibly helpful. For a wider range of subject areas,Google Code University and the Google Techtalks are a good way to gain additional knowledge, although they currently do not have enough to provide a full CS degree's worth. Really, just reading up on things you find interesting, googling any terms or materials that aren't fully explained or that seem interesting, and repeating this over and over are probably the best way to go about it.

Michael Aaron Safyan
+2  A: 

A course of Operating Systems was a real eye-opener for me. After that one I started to feel like a real programmer.

pajton
Yea, I was under the impression on the upper-division OS course being the meat and potatoes of the CS degree.
+3  A: 

The single most valuable and inspirational course that I have taken was Specification and Verification of programs, and the one that I am missing the most is Compiler Design.

But from my experience it comes down to the professor, the learning material available and personal preference. The best way to fill the gaps is to realize what exactly you want to do and therefore what the gaps are ;)

Thomas Wanner
Did Specification and Verification lean towards theory or programming compared to your other courses?
I would say it was somewhere in the middle and that's what made it so unique for me. I learned a couple of interesting programming techniques (mostly in functional style), and saw how the theory of verification is built, after all what we have used as a platform is not a business-ready solution yet. You can have a look at http://ii.fmph.uniba.sk/cl/view.php/ if you're interested ;)
Thomas Wanner
A: 

Most valuable:

  • Software Engineering - made me realize that developing software is much more than just hacking in code
  • Technical Foundations of Computer Science - learning about CPU designs and microprogramming filled the gap between logic circuits and assembler and finally gave me the feeling that I really understand how a computer works, at all levels.

Most missed: Compiler design.

Michael Borgwardt
+1  A: 
  • Software Re-engineering (basically refactoring and best practices)
  • OOP
  • Data Structures, Advanced Algorithms (although in the former, the professor was not so great)
  • Software Architecture

Embedded Real-Time Systems was valuable for me because I realized that I don't want to do that anymore.

Victor Hurdugaci
I love embedded and it seems to be the market with the greatest growth today ... since the userbase is huge.
whatnick
+1  A: 

I think for myself, my most valuable CS course would be "Algorithm Design & Analysis" which was a 4th year course that had a lot of good ideas for how to solve various problems as well as how to break down complexities. There was another more theoretical course I took that was also quite useful that was called, "Computational Complexity Theory," which was mostly proofs one way or another so justifying an answer was another key skill that was worked on from those.

As for non-CS courses, I'd like to think that my courses in "Combinatorial Optimization" and "Asymptotic Enumeration" did help me refine my problem solving skills in some ways. The latter had an awesome textbook, Concrete Mathematics.

Just for the sake of disclosure, my degree is a "Double Honor's Bachelor of Mathematics with majors in Computer Science and Combinatorics & Optimization" and I did finish the requirements of a Pure Math minor too as I can be a bit of a Math enthusiast.

JB King
A: 

I took a course called Computer Architecture in which we went over the basics of processor design and ended up implementing a custom instruction set on an FPGA. Maybe it is because I've tended to work on lower level/high performance stuff, but most of the really nasty bugs that no one can figure out are the places where the language abstraction breaks around some of the hardware features. Knowledge of how the compiler stack makes code and how that code executes is essential for writing fast/efficient code as well.

Operating Systems was kinda cool too, but the only useful thing I learned was how to write multithreaded code with pthreads.

Adam Shiemke
A: 

I have an Electronics Degree but these days apart from pure RF and High Power stuff most things electronic are programmable - FPGA's, Software Radios and Phones.

Programming was big part fo the course. The most valuable stuff was:

  1. Data Structures and Algorithms - Every single day I have to live with it
  2. Operating Systems - Hey Windows and Unix/Linux all have Kernel and HAL
  3. Networks - You will be unable to ask and answer questions like this without TCP/IP
whatnick
A: 

Easy.

Data structures & algorithms. Without these as a solid foundation, you can't design pattern your way out of not knowing.

Rev316
+1  A: 
  • Operating Systems (undergrad and grad)
  • Data Structures and Algorithms (undergrad and grad)
  • Theory of Automata (undergrad and grad)
  • Discrete Mathematics
  • Software Engineering (grad)
  • Databases (undergrad, specially if it substantially covers relational database theory)
  • Anything with substantial work in C, C++ and any type of assembly (and I'm not referring to mickey mouse courses that combine all three in one semester)
  • Technical Writing

Courses focusing on specific technology (.ie. Windows Programming, Oracle PLSQ, Java Web Development), those are useful if you are taking them just before graduation. Not so if you are two years from graduating (they'll be obsolete by then.)

luis.espinal
A: 

The one where you make a significant contribution to an open source project. I'm not sure if such a course exists at most or any institutions (I think Steve Yegge blogged about it at one point, but he might have been just waxing philosophical), but it would be a very valuable experience. It gives you a lot of practical knowledge:

  • how to blend with the direction of others
  • how to communicate your ideas
  • how to integrate with source control systems
  • how to design
  • how other people design and code: since you're working with an existing body of code you have to learn how it's organized and work with their best practices and coding style

And some other stuff I forgot. It won't necessarily give you the deep knowledge that you need to be a major contributor, but it will definitely boost your skills and give you an idea of how things work.

intuited