In junior high, I got involved in modeming and wrote a BBS for my Atari 130XE in Turbo Basic XL. When I got an Atari ST, I released my first public domain program, a VT52 "animation" editor, compiled from GFA Basic.
Afraid of the social stigma of being too involved with computers, I gave up programming for the rest of my teens, only picking it up again in my last years at college, when my curiosity about the expanding Internet led me to explore MUSHes, MOOs and HTML.
I found a job building static intranet pages from technical documentation and learned the basics of JavaScript, although at the time, it wasn't useful for much beyond client-side form validation.
Then I got a customer service job at a rising e-commerce site and began hitting the books in earnest, learning UNIX shell programming, regular expressions, Perl and SQL. I started writing command-line tools and CGI scripts and moved over from customer technical support to working on the customer service toolkit.
I hit a kind of plateau, though I didn't realize it at the time. Though I continued to crank out scripts, my efforts to become effective in compiled languages such as C and Java stalled repeatedly.
Eventually, largely through exposure to the work of experienced developers, I began to understand principles of computer science as well as practices of large-scale software design. As I became comfortable with a greater degree of abstraction, I branched out from reading books on specific programming languages to reading up on broadly applicable concepts and practices. I've been working in software for over 15 years, and I continue to read avidly.