I've been at the programming game now for 25 years - and I'm only 36 for krysake! In that time I've had to flow with so many different kinds of programming that it makes my head spin. But during that time I've gained an appreciation for programming at the lowest and highest levels. But when it comes to advising new programmers I can only relate my experience and give them some sense of the fascinating realm they're heading into.
I began programming in BASIC guided by a book from Radio Shack that was geared to the TRS-80. Since I had no computer I had to put my programs down on paper and follow the logic in my head. I probably kept this up for 6 months or more before I got hold of a computer to test them out on. Needless to say they were full of bugs and misunderstandings.
But I learned about: variables, flow control, decision logic, loops, etc.
I programmed BASIC for a long time - first on a Sinclair ZX-80, then on Apple II computers at a local radio shop, then on the (amazingly powerful) Atari 400. What kinds of programs did I write? Well, games of course! I wrote the kinds of programs I was interested in having at the end of the long - often tedious -process.
This is what I recommend first to all new programmers. Write the programs you really want to write. Your attention won't flag and you'll enjoy the process so much more.
One thing about writing games in BASIC is that as your ideas become more ambitious the language starts to show its limitations. I was fortunate that there weren't a lot of choices back in 1979. It was BASIC and Assembly Language and little else. There was this strange thing called 'C' I heard about back then but I had no clue what it was about. So when my games needed more speed I went on to 6502 Assembler using the awesome Atari Macro Assembler.
Through Assembly Language I learned about registers, stacks, storage, condition flags, test-and-branch, and memory-mapped devices. PEEK() and POKE() had hardly prepared me for the joy of controlling the processor and hardware directly.
I kept on with Assembly Language for a long while, and when I moved up to the Amiga computer I was well-prepared to start writing programs in 68000 Assembly Language. I kept on with the Amiga and 68000 Assembly for another good long time - until about 1990 or so.
Yes, I completely eschewed the horrid little gray-screened Mac because my wondrous Amiga had such powerful graphics and sound hardware.
I abandoned programming altogether for a few years - from 1990 to 1996 - and focused my attention on more essential aspects of life: music, poetry, and girls.
Then I got the itch to get back to programming again. I bought a cheap PC and wrote silly programs in QBASIC for awhile. When I finally had enough money I bought my first Macintosh, an 8500/150. My intention was to continue with 68000 Assembly and then move up to PowerPC Assembly. But when I started reading about the PowerPC it became clear that I needed to learn C. The reason for this is simple. Modern processors are just too complex for ordinary humans to program them efficiently in their native language!
Now I'm about to break my own rule and make a radical assertion, but bear with me:
C is the mother of all modern programming languages, and every serious programmer must learn it.
C was created with a very specific purpose in mind: To provide the most bare semantics for the things that CPUs do. C encapsulates - very elegantly - the standard operations of a "theoretical" processor. It deals directly with essential concepts of memory, conditions, and program flow. It gives the new programmer a foundation to understand what higher-level languages are doing "under the hood" at the most fundamental level. In my experience, knowing what's going on behind the scenes provides a kind of intuition that proves invaluable in many circumstances. And that kind of intuition "scales well" because the same fundamentals appear throughout the programming universe.
So I began programming my first Mac program in C, learning as I went along.
And that's another thing! Never, ever, in my 25 years of programming have I had the remotest clue what I was doing at the beginning. I had a basic idea of what I wanted to realize. I had enough knowledge to be dangerous. Every new project has been a leap of faith. You have to know ahead of time that you're going to get stuck, you're going to get lost, you're going to go a thousand lines in the wrong direction, you're going to have to scrap tons of work and start over. But you're going to get unstuck, you're going to find your way through, and you're going to write better stuff the next time around. Most of all you're going to discover something new at evey turn. Ah, how fondly I recall that shining day in my geeky youth when binary finally made sense....
So yeah, I eventually got the hang of C. I tried to do some things in C++ but OOP was so new and different that I kept getting stuck in self-doubt. Was I implementing my classes in the right way? Was I properly isolating my Model from my View from my Controller? Ach, the struggle of learning OOP was almost more than I could bear. I tried using frameworks like MacZOOP and MacApp but it was hard for me to use Someone Else's Code. I had never done that before! So I just stuck with C, kept revising my application - which had grown good enough to release as shareware - and occasionally toyed with REALbasic for quick prototyping.
Now, I had done programming as a job back in the early 90's, but it was very informal. Just a bunch of friends in a rented house making silly games. But in 1999 I got my first Real Programming Job making websites with Embedded Perl.
In my job interview I explained that I didn't know perl, but my interviewer knew about the aforementioned reality that programmers are used to being beginners and knew I'd pick it up quickly enough.
And I did. Perl is semantically identical to C. (For that matter, so is PHP, Javascript, and to a large degree Java.) The hardest thing to learn in perl was Regular Expressions. Anyhow, because I had learned C it was much easier to learn perl. I mastered the basics in less than a day. So my first Real Job as a programmer turned out okay.
I'm now on my second Real Job, still making websites, but now I code in PHP. It was another quick learning curve, except that my employer had already built an OOP framework for e-commerce websites.
Uh-oh! OOP was back and it wasn't going to go away this time. Fortunately I was surrounded by a dozen experienced programmers who could answer any of my newbie questions. And most of them didn't even know PHP, they just understood OOP. It also helped that the authors of the framework were at my disposal.
Now, when I was learning C the Internet was brand new. There weren't any web forums like this one. But there was UseNet, and I posted my questions there often. And there was the MOST mailing list. Still, you young whippersnappers don't know how good you've got it!
While I think you really ought to learn C and write some programs in it, those who say you should choose the right tool for the job are absolutely correct. I make websites using a wide range of programming languages now: Javascript for inline form validation, PHP for building pages and interacting with the database, SQL for database operations, Perl for server-centric periodic tasks, shell scripts for file management.... the list goes on. At home I'm using C++ with Simple DirectMedia Library (SDL) and OpenGL to write an action game that will be deployed on Windows, Mac, and Linux.
Did I mention I do all my work with Macs? My employers are total Mac-heads (unlike my last job where I brought in my own Mac to work on).
I believe you can learn to program - and program well - using any language. Each one has its strengths and shortcomings. You'll do best just to choose your project and jump right in. If you're going to make a real-time action game you'll get your best performance writing it in C or C++, but you can get acceptable performance using Objective-C, REALbasic, or even Java. You'll need to learn the appropriate APIs (Application Programming Interfaces) to do graphics and sound, and each language does it differently (but similarly). Again, knowing the C interfaces will give you the most direct view of what's "really" happening. I chose SDL because it makes it easy to write programs that can be written once and run on many platforms. I chose OpenGL over Quartz or QuickDraw for the same reason. If I'm going to spend a year or more on something I want the knowledge I gain to be broadly useful.
You're embarking on a real adventure, and I wish you the best. You're fortunate to have so many choices and to have access to such advanced hardware as we have these days. Sometimes I wonder just how it was that I could work on an Atari with 48K of RAM and a 56KHz processor. Someday you'll probably wonder the same thing about today's Multi-GHz processors!