I started programming seriously when I was at school. I became seduced by the idea of writing games and ended up learning 6502 and then ARM assembler. I sort of skipped the typically-british BBC BASIC introduction because I was impatient and had read in my Dad's computer magazines that real games didn't get written in basic. Assembler was the real game-programmers language.

A couple of years later I got an x86 PC and learnt 386 assembler language with all the dirty hardware-hacking tricks that it entailed. My mum characterized the process of me programming as hours of typing occasionally punctuated by a flurry of excitement and a small graphic moving across the screen. (moving very smoothly across the screen I'd always point out).

At university I learnt C and C++, and over the first two year's transitioned slowly from one to the other. The seductive thing about C was that it would interface easily with assembler, and so I started using it as a prototying language. Eventually I wasn't writing any assembler any more.

A similar thing happened a couple of years after I left university. I started using python, mainly because I could use it as a prototyping language, and it supported all the nice OO stuff I'd got used to in C++. Eventually I stopped writing stuff in C/C++.

N.B. During this time I used Java a lot at work (after all, I did end up working for BEA/Weblogic), but I never really fell in love with this language: It wasn't as fast as C/C++, and wasn't as productive to program as python. I estimated that I could turn stuff around in python about 3-4 times faster than I could in Java.

Anyway, I've been writing my stuff almost exclusively in python for the last 6 years or so and am starting to look for the next leap. All the previous moves have been ones that involve a large productivity boost. Assembler->C->python. The main reason I didn't properly switch to Ruby is that (despite the nice block syntax) I didn't seem to get a large productivity gain. The amount of code you write appears to be pretty comparible between python and ruby - certainly not the less-than-half you get between python/ruby and java.

So now I'm left with lisp. The 1950's language that all the others are slowly emulating. Most of the features that lisp introduced have now been integrated into the mainstream dynamic languages - dynamic typing/strong typing, garbage collection, conditionals/loops, first class functions, closures. Even continuations are now getting a look-in in python and ruby. However, lispers keep going on about this macros thing - writing code to write code. Now that sound's like something worth investigating...