views:

374

answers:

12

What is most important at this time? I know that I can acquire programming experience later. Which of the following should I study to become a good programmer or analyst after I graduate?

  • data structures
  • algorithms
  • software engineering
  • low-level aspects
  • design patterns and OO analysis

[Edit]

Thanks for the answers. I would like to include other important topics to serve as reference for other students:

  • councurrent programming
  • operating systems

[/Edit]

Note: I think the first item of the list shold be learn English

+14  A: 

All of them. Everything in your list is important.

Alan
A: 

Let's see..

You will need to understand complexity and data structures and algorithms, so that you can make the important choices. Unfortunately, you will need to REALLY understand these topics and solve complex brainteasers because they play a much greater role in job interviews than they do in your actual work later. Hence, these are the most important things to focus on for practical reasons.

Software engineering, design patterns and analysis are very important (though I'm biased). Unfortunately, with the exception of design patterns, you can't really learn these topics without actively practicing on major project. Focus on understanding the notions of object oriented programming and the notion of virtual functions/dynamic binding, since they are very important and many people don't understand them properly. Do your best to get a good internship.

Uri
A: 

All of those are very good but algorithms are a good place to start. Perhaps you should even look into a discreet math course first for the theory.

Andrew Hare
+5  A: 

I personally would study the following:

  • One C like language (C/C/C++/C#/Java)
  • One scripting language
  • One functional programming language
    • Especially since we are moving to a multiple core world, this will come in handy since it allows parallelisation beyond what other language can currently do. Entire telecomm infrastructures are run on Erlang for example.
  • data structures
    • You will use these everywhere. They are programming language agnostic, you will need them throughout your career
  • Algorithms
    • These most likely will go with the above mentioned item. Certain data structures have certain algorithms to access them.
  • Design patterns
    • Yes, off course learn the various design patterns, but do know at the same time that they are not the end all be all in software engineering.

Everything else on your list is very important as well, so while I suggest the above items, they are not more important than the others you have listed. These are the items that I wish I got out of my schooling and I am sad to say that I did not get them offered as classes, but had to learn them myself along side all my other course work.

X-Istence
+2  A: 

It seems appropriate to plug Joel here ;-)

http://www.joelonsoftware.com/articles/CollegeAdvice.html

NoahD
A: 

All on your list is important, but you also need the right attitude. You need to dig into enough details about how each thing you study works and why it was done this way, not just do the class assignment. This is what will really give you an edge as a future specialist.

sharptooth
+2  A: 

All of them are mandatory!!

What are you thinking? I expected you to be choosing between concentration (for example, game design vs security and cryptography).

You can't choose between "algorithms, oop, datastructures, software engineering, etc". These are the BASICS! You've got to learn them all.

hasen j
+2  A: 

I would start with data structs and algorithms, no contest there. OO design is useful. Little bit of low-level, yes. S/W engineering could be skipped (is ok with grain of salt).

Additionally, here are some ideas:

  • relational db basics (not just "how to use oracle", but actual relational algebra)
  • operating systems
  • compilers + interpreters
  • something in IR (/ genetic algorithms / neural nets)

Yes, I am biased towards "hard core" CS stuff. Busy work, extra-heavy processes and other PM crap you get to learn in industry soon enough, no need to waste your educational resources on them. :-)

StaxMan
A: 
  1. Multi threading and distributed systems.
  2. How to build user friendly applications with a nice GUI.
tuinstoel
+1  A: 

Secure code from design, not as an afterthought.

Xyc0
good advice but not really related to the question
hasen j
+2  A: 

I think that you're already on the right track given that you haven't mentioned any specific languages in your list. I think that's the number one mistake made by CS students - focusing on a language or a paradigm.

Your entire list is very important; the only thing I'd add is a fairly in-depth study of multithreading. It'll become more and more important in the future: (Ars-Technica article)

Damovisa
A: 

All of the things you listed are basic components of a decent Computer Science education, although you really should add the following:

  • Operating Systems
  • Networking
  • Mathematics (Intro courses to Discrete, Calculus, Algebra, Proofs, Stats)
  • Databases
  • Foundations (Finite Automata, Regular Expressions, Turing machines, etc.)

Those two lists together will give you a good core understanding of Computer Science, after which you should pick some more specialty topics (the ones you are most interested in).

  • Artificial Intelligence
  • Crypto/Security
  • Image/Signal processing/recognition
  • Compilers
  • Graphics
  • Game Design
  • etc.

You will find that once you start to get deep into a topic, all those core courses, including math, will all start to come into play! For example, I'm currently studying image recognition and have had to use and understand stuff from stats, AI, calculus, proofs, algebra, algorithms, data structures, OOP, etc.

MahlerFive