I have met many people over the years who claim to be able to program and when you dig a bit deeper they have never looked beyond VB or VBA. As has been commented here by others, the language itself is actually rather less important than an ability to think in terms of data structures and the algorithms that manipulate them. Just for laughs, try writing something just a bit beyond the "hello world" level in a variety of languages; say a simple implementation of a factorial function. It'll look completely different in most languages, but there is a core idea in there which should be pretty much the same in most cases - that core idea is what is important. Learn the benefits of different styles of programming (try writing in a straight imperative style in Prolog, or writing in a functional programming style in C, for example).
These are just tools that we use to implement our own and other peoples' ideas. People who get hung up on the perceived benefits of one language over another are just missing the bigger picture.
A programmer first makes the effort required to understand the problem. He then mentally prepares a roadmap to the solution, be it through decomposition into functions, subroutines, classes, objects, etc. (take your pick here).
Once a solution is laid out, he chooses the appropriate language to express his chosen solution. Since most programming languages differ mainly in syntactic sugar (proponents of C++, C#, Java: don't flame me over this) the final code should be trivial to write and debug.
My first programming language was a macro programming language for Ultima Online
It had a very interesting feature. You could use "." to concatenate variable names (not variable contents). So you could have a variable named a, another named b, and obtain another another named ab concatenating the two.
If memory still serves me well, you could write something like
a = 1
b = 2
a . b = 3
and the last line would be the interpreted the same as
ab = 3
This was useful to simulate arrays in the language, since you could for example concatenate a base variable name with a number and assign a value to it! Something like
for i = 0; i < count; i++
arr . i = 5
Now I realize this could be accomplished with a giant hashtable or basically using in any dynamic language, but back then I wasn't even sure what a programming language was.
My First was Machine Code on an RCA 1802 microprocessor.
Same here, but I still have my old computer and have replaced all damaged parts and undone all (not always wise) 'improvements'. It's now in good shape again and that's how it's supposed to stay.
Sometimes I still write some code for it, but now I have become lazy. I use a cross-assembler on the PC and then transfer the binary. As a WAV file I simply connect the PC's audio output to the old computer's cassette input, play the WAV and load it. 10 years ago I wrote a program that can load WAV samples from the old cassette tapes and reconstruct the binary files on the PC. This way many old programs could be rescued and made available to other users over the internet. Creating a new WAV sample from a binary file to play to the old computers was not so hard after that.
Ooops, that reminds me again to keep my promise to finish a new version of that program, which supports the tape formats of the Netronics Elf II, Quest Super Elf and now also the RCA VIP.