views:

236

answers:

6

Hi,

I have a M.Sc. degree in physics and am working on enhancing my computer and programming skills, and I need your help deciding my next steps.

As an undergraduate I took one introduction to computer science course (we used Java) and dozen of scientific computing courses (computational physics, numerical analysis, computational fluid dynamics e.t.c.) where I learned the basics of languages such as Fortran, C++, tcl, matlab and python. I also have few years experience on linux and unix.

In the last one year I have done plenty of self studying, and have finished the following online courses (where I have watched every lecture, read all the course material and done every assignment):

  • Programming Abstractions CS106, Stanford

  • Programming Paradigms CS107, Stanford

  • Introduction to Algorithms, MIT

  • At my local University I did a second year computer science course on C++ programming where we studied the whole Lippmans C++ primer .

My focus in more on studying general computer science rather than learning specific languages or API's (which get obsolete in few years anyways). Right now I have few options on what to study next

  • Compilers, using the dragon book (do you know about any good lectures on this subject)
  • Object oriented design, UML and software engineering (anyone know about good lectures?)
  • Machine structures
  • Parallel programming ( Programming Massively Parallel Processors Stanford or multicore-programming-primer MIT)
  • Operating Systems and System Programming (http://academicearth.org/courses/operating-systems-and-system-programming)
  • Computer graphics and user interfaces

What would in you opinion be the most logical next step considering my background? Is there something else you can think of?

I am most likely to pursue a career in optimization applications, scientific modeling or game programming (at least as a hobby).

+1  A: 

Parallel programming, essential to all 3 of your suggested career paths (which might, in fact, be only 1 career path I suppose).

High Performance Mark
A: 

If you're looking for compiler optimizations, you might want to read about auto-parallelization of programs too. Allen and Kennedy might help you. You'll find slides on the internet.

+1  A: 

Object oriented design, UML and software engineering.

Good understanding of the underlying principles of what makes a good design and architecture can make you a significantly better programmer. Anyone can program a system, but not everyone can engineer a high quality system.

Codemwnci
+1  A: 

Object Orientation is essential research (it is used everywhere). You can learn this by studying C# or PHP5. (1st year stuff)

Model View Controller architecture is a good start to understand ways to organise programs. (3rd year stuff)

Other programming language paradigms such as scripting languags (php,bash,perl,python,ruby), functional languages (scheme), and prototype languages (ecmascript) would also help. The more knowledge you have about different ways you can do things the better you'll be able to make the right decision about what to use. (2-3rd year stuff)

UML is useful but overrated, unless you are required to do it you won't... Especially if you are a freelancer.

Great fun books to get started:

balupton
Thanks for your answer.Sorry if I wasn't clear. I have studied and used basic OOP. What I had in mind when I talked about "Object oriented design" was more advanced things such as design patterns (e.g. Model View Controller).
Siggi
+2  A: 

I would suggest operating systems as the next step, and definitely before studying compilers. Understanding the environment in which your programs execute is necessary to have a chance of explaining their behaviour.

The internals of the system (threads, schedulers, caches etc) are also not the sort of thing you pick up just by programming. Object Orientated design, in contrast, can be learnt in the day to day of programming; indeed that is probably were it should be learnt, guided by some outside study. For the Operating system you are just going to have to go and look up how it works. I am always glad of the Operating Systems course I did at Uni. I am sure it has made me a better programmer, and equally sure it would never have occurred to me to take it if it wasn't required.

Can I also suggest MIT's Structure and Interpretation of Computer Programs (SICP) course.

It is an excellent guide to the essence of Computer Science, would add Scheme to the list of languages you have encountered, and the lectures on building Scheme interpreters would be a great first step towards more detailed study of compilers.

The SICP video lectures are excellent and available from OpenCourseWare here. It would also allow you to get the Wizard book to go along with the Dragon book, thus filling out the medieval pantheon on your bookshelf.

John Kane
A: 

Just to add to the "something else": Artificial inteligense or on-line algorithms. Becouse they are fun! No API's involved either. Especially AI can be used in both application and game programming.

IronMonkey

related questions