I’ve always thought that there are several types of programmers, each one showing distinctive features. Now, I think you could do the same with people who want to learn programming. And, one of the most important decisions a novice programmer will ever take is what to learn; the first choice is which programming language to learn first.

The hobbyist

That’s the person who’s just interested in learning programming as a form of entertainment and to take a challenge every now and then. So, instead of collecting stamps, he learns programming. He probably won’t want to get down to the complex stuff, but he might end up liking it and wanting to do it for a living.

Is this you? I suggest you learn Python, which is easy to learn but also powerful.
You should probably read this book. You can find a .pdf version here.

The engineer

That’s the person who wants to learn programming as a discipline, and to get more out of his computer, or perhaps because he likes a challenge (but not the hobbyist‘s kind). He’s more likely to end up wanting to do it for a living, or to make use of the skills he starts to acquire in his current job.

Is this you? I suggest you either learn Python (see above) as an introduction to programming, and perhaps learn C. The latter might be a bit difficult in the beginning, but the effort will be worth it (you will not only be able to program in C — You will have some base knowledge and skills which will let you learn C++ or more advanced object-oriented programming languages more easily).

The computer scientist

Right, we’re starting to deal with the serious folks. That’s the folk who wants to learn programming to earn a living, and perhaps we should make a difference between an “engineer” in my categorizing system, and a “software engineer”, which is what this type of person will eventually become. He does want a challenge, but probably only to improve his skills and add new shiny things to his CV.

Is this you? I suggest you learn C. It will most likely be a prerequisite for you to work as an actual software engineer. Otherwise, it lets you learn C++, Java, or whatever you’re into more easily. Focus on object-oriented programming languages, as that’s the trend nowadays.

The hacker

Now, this is the type I wanted to talk about. That’s the person who loveschallenges, loves programming, and loves to experiment with both old and new stuff. He’ll most likely want to do it for a living, but he’s likely to experience some trouble working for someone else doing things that he doesn’t like, unless he’s got enough free time to do what he likes at home (or in his server-cave). While you may think of programming as either something very complex or as a serious discipline, the hacker (if you’re thinking of movie types who break into computer systems, you’re thinking of a cracker, not a hacker) will think of it as a playful and pleasurable form of entertainment. It will probably even become his lifestyle.

Is this you? Hell, forget about Python unless you don’t know anything about programming yet! Learn C for lower-level tasks and embedded systems, and… Lisp! You can choose between Scheme (the tiny basis for Lisp, with which you can experiment but not really write any serious applications) and Common Lisp (a complex and complete dialect of Lisp, probably uglier than Scheme but excellent for any purpose).

See? It’s not that hard to decide which language to learn first.