views:

767

answers:

10

As a fairly novice programmer who has acquired a reasonable level of competence in C++, what should I do next to advance in general programming ability?

Obviously, both learning new programming languages and studying algorithms are important, but what should take highest priority?

More generally, how in-depth should my eventual study of algorithms be in order to become a great, well-rounded programmer, but without wasting time in a particular category of computer science that isn't necessarily the most intriguing to me?

+9  A: 

Basic algorithms are useful, but advancing too far in that field will prove to be purely academic fairly quickly. Once you have a decent understanding of some basic algorithms, you would be better off studying patterns which have more practical application to regular programming.

In terms of which would be better, a new language or algorithms/patterns, I would recommend spending most of your time on algorithms and patterns, but learning about them in a new language so that you get to do both. If you have a good understanding of the theory behind programming, learning a new language should be fairly straightforward.

Elie
+3  A: 

This is a tough call, and it depends on where you want to take your programming career. Learning algorithms is an awesome idea if you plan to research computer science, however the benefit is diminished somewhat if you want to become a web developer.

Don't get me wrong, algorithms and how they are derived is very important, but you might want to answer the question "What sort of programming do I want to do?" before planning your skill set.

For instance if you want work as an enterprise applications developer, you might want to familiarize yourself with a framework (.NET, CSLA, RoR, J2EE) and a new language instead. Then spend time learning about patterns, rather than algorithms, since most of the hard algorithmic work is taken care of by the framework.

You might be enamoured with cryptographics, so a skillset involving mathematics, crypto theory and the like is obviously going to matter more.

A budding games developer might want to spend time learning about matrix transformations, game engine design and performance optimization.

I guess if you have infinite time and resources, the ideal scenario is to learn as much as you can about all aspects of programming. The fact is all of these things are important to know. The reality is often that we dont have the time, so having some direction first will really help you prioritize which skills are most important to you.

Jim Burger
+1  A: 

As important as I think algorithms are, my advice would be to get away from C++ immediately. Where you go is up to you - if you don't mind learning precise details, you may want to go to C and perhaps even look into assembly language. You'll get a nice paradigm shift by trying a functional language (like say Scheme). If you want to easily make cool/fun stuff, try Python or Ruby.

Basic algorithm study involves two main things: developing judgement about the performance of a program, particularly when its input gets large, and learning about smart algorithms so you can apply them when you need them. You can probably put that off for a while, though it is important.

Artelius
+1  A: 

If you still consider yourself a novice and have no formal CS training, check out Code Complete. The foundation it builds will make you a better programmer in any language.

Cory House
+2  A: 

My suggestion would be to get as comfortable with algorithms as possible. In my (fairly limited) experience it's much easier to figure out the syntax for doing what you want even in a language you're unfamiliar with than to have to figure out how the logic is going to work.

Case in point: We had to write a small currency converter at work for a web page. At the time I was really really unfamiliar with C#, but that's what I decided to write it in because it needed to be .NET and the syntax of VB annoys me personally. Having a background in CS it was fairly simple for me to put one together as I knew what it needed to do and was able to Google the syntax issues I needed to get around.

dhulk
+1  A: 

Learning languages such as Java or C#, although marketable, won't change the way you think about programming much (assuming you already know about object oriented design, etc).

Learning languages such as LISP, Haskell, Scheme, Prolog, etc will give you some insights into functional and logical programming and extend your thinking a little bit, but don't expect to get a job programming in any of these langauges.

If you aren't particularly interested in algorithms, I would suggest picking up one textbook on the subject of your choice and work through it. Make sure you learn the terminology (like big-O notation) and the different classes of algorithms (graph algorithms, sorting, searching, greedy, dynamic programming). Specifics can be found later, but you need to know where to start looking.

If you haven't, learn about databases. Most if not all enterprise and web-based software use a database for back-end storage.

jakber
+3  A: 

before moving on to other languages....

  • Have you written a reasonably complex app?
  • have you explored boost in C++?
  • Have you read more effective C++? or C++ Coding Standards: 101 Rules, Guidelines, and Best Practices
  • Have you tried unit testing?
  • Have you tried refactoring "by the book"?
  • Have you explored Design Patterns?
Keith Nicholas
+1  A: 

Just write code.. code .. code.. code

I think it is most most important to write real working code, design your own app, write a small application, put it open source and look how other people will use it. re-release, cahnge it, fix bugs..

As others had already mentioned, both options are important, but most important is experience.

There is no other way to get knowledge into your head. Books are providing information

Peter Parker
A: 

Here's a different perspective. Get a broad review of architectures, especially the historical perspective. That will let you see advances in register usage, memory designs, single versus parallel execution models, and a bunch more things.

You call yourself a beginner, and that suggests to me that you have working understanding of data types and some data structures. A view behind the curtain will show how those abstract entities are realized in silicon.

For instance, the x86 architecture started off as a 'complex instruction set' machine, and for compatibility it still is. But a long time ago the 'reduced instruction set', aka RISC, showed itself easier to scale, easier to make parallel under the covers, blah blah blah.

Why?

And how is architecture relevant to the programs you will write as you become a senior programmer? The only way to find out is to study it and see.

+1  A: 

Read SICP. I'll get you into a new language, and expose you to lots of fundamental algorithms.

ja