If you want to truly learn programming, read SICP and do all the exercises in scheme. Scheme will certainly never be the language you'll use to program software. But for learning it is a good choice as you can pretty much use every kind of programming paradigm with it (procedural, functional, oo, macros, closures, tail recursion, first-order functions...)
Then learn C (not C++) to create programs for non-classic architectures like, for example, for fun projects on the nintendo DS (2 ARM CPU (ARM7 and ARM9), different memory banks, volatile i/o registers, many input methods, adhoc wifi, touch screen, scarce resources) Through this kind of exercises, you can learn details of the compilation process with programs running on real machines, not virtual ones (gcc specs files, linking process, ABI) and debug in difficult situations. It forces to understand the machine logic, buses, memories, malloc, freeing of memory, etc in real environments.
After that you have lots of subjects to learn that are not directly dependent on the language (networking, gui programming, databases, web programming...).
Read the article Teach Yourself Programming in Ten Years for more ideas on mastering the art of programming : on appendix, you'll have criterias for choosing a programming language :
Here is what Peter Norvig have said :
Several people have asked what
programming language they should learn
first. There is no one answer, but
consider these points:
- Use your friends. When asked "what operating system should I use,
Windows, Unix, or Mac?", my answer is
usually: "use whatever your friends
use." The advantage you get from
learning from your friends will offset
any intrinsic difference between OS,
or between programming languages. Also
consider your future friends: the
community of programmers that you will
be a part of if you continue. Does
your chosen language have a large
growing community or a small dying
one? Are there books, web sites, and
online forums to get answers from? Do
you like the people in those forums?
- Keep it simple. Programming languages such as C++ and Java are
designed for professional development
by large teams of experienced
programmers who are concerned about
the run-time efficiency of their code.
As a result, these languages have
complicated parts designed for these
circumstances. You're concerned with
learning to program. You don't need
that complication. You want a language
that was designed to be easy to learn
and remember by a single new
programmer.
- Play. Which way would you rather learn to play the piano: the normal,
interactive way, in which you hear
each note as soon as you hit a key, or
"batch" mode, in which you only hear
the notes after you finish a whole
song? Clearly, interactive mode makes
learning easier for the piano, and
also for programming. Insist on a
language with an interactive mode and
use it.
Given these criteria, my
recommendations for a first
programming language would be Python
or Scheme. But your circumstances may
vary, and there are other good
choices. If your age is a
single-digit, you might prefer Alice
or Squeak (older learners might also
enjoy these). The important thing is
that you choose and get started.