I'm a self taught programmer.
I first learned to program on an 8-bit Acorn Atom in the early 80s. Unlike most people of my age at that time (early teens) I didn't play games on my computer. I learned BASIC and 6502 assembler and wrote stuff. I wrote simple compilers for languages I'd invented. When my Atom broke I borrowed one from the shop I bought it from, and this Atom had a 6522 VIA chip that gave me interrupts. So over the weekend I had it, I wrote a pre-emptive task switcher to multi-task programs that I'd written on my own languages and compiled with my crude compilers. I had no idea this was what I'd written. I just thought it would be cool to have several programs running at the same time like on big mainframes.
Later on I did a physics degree and worked as a software engineer doing industrial serial comms.
Then I did a PhD (Modelling hypervelocity impact crater morphology with orthogonal polynomials), worked as a postdoc for a few years, and wrote modelling and data-processing software.
Now, after a bit of bad health and a change of plan, I work as a motorcycle instructor, study countryside and wildlife management at college, and program for fun.
I've started to get into some new languages - common lisp, scheme, and now haskell. My interest seems to be growing towards implementing languages. I've written a little forth implementation, and I'm starting to think up some new language ideas.
I'll probably end up spending ludicrous amounts of time writing something like an operating system or compiler that's of no practical use whatsoever. But it's fun. Back to the Atom days.