Started off self-taught. Got some college learnin' in me eventually.

2) Wrote my first code at 8.

3) Got my first programming job at 16 at the US Air Force Research Laboratory in Rome, NY. I'm pushing 30 now and still going strong.

1) How did I first learn to code? Caveat: I think how I learned is a lot different from how most people learn today. I didn't have the Internet, or even a modem. I lived in a tiny, tiny town (~500 people) in Northern NY (closer to Canada than NYC).

But to answer the question, I picked up a book - the Commodore 64 BASIC Manual if I remember the title correctly. Some friends and I wanted to make a game. I remember my friend's dad telling me that I'd need to learn to Program a computer. I didn't know what that was, but I wanted that game, dammit. He didn't teach me to program (he didn't know how, either), but he did let me rifle around in a box of books he had.

A bit later I switched to coding various nefarious tools for AOL (punters, phishers, crackers, mass mailers, etc) on the Mac (Macfilez/zelifcam, anyone?). Everything was done in this tool called OneClick that forced everything to be fairly open and modifiable, so I learned that by example. Incidentally I stumbled into A/B testing by writing automated 'phishers' on AOL (Anyone got any <M>< ?? Press 666 or IM me to trade <>< !!). Turns out that telling people they won something (like a free month of AOL) is far, far more effective at getting them to pony up their password than telling them AOL was hacked. I know better now, I didn't then. I was 12.

A bit later I switched to a PC running windows 98, and I picked up a pirated copy of VB 3.0. I learned that from a For Dummies book, I believe. I eventually shifted to 5.0, then 6.0, and started learning ASP and web stuff. I did a bit of work here and there for myself and for my school.

Eventually I got lucky and one of the Project Managers at the AFRL offered me a job. The AFRL is really slow to do anything, let alone hiring teenagers to build chem/bio weapons detection systems, so he dumped a bit of extra money into one of his contractors and they hired me. He even worked with my high school so that I could juggle my classes around and get out after a half day. Department of Defense letterhead goes a long way. Eventually the bureaucracy came around and the AFRL offices in Rome modified their internship program to include local high school students. I believe the program is still quite active, and it's been hugely useful for both the kids in the nearby po-dunk towns as well as the AFRL. From my end, it was an amazing experience. I had access to tons of awesome equipment, lots of very enthusiastic and very good mentors, and I got to do real work on a real project that had real users (hard to find in DoD work sometimes, especially when it falls under the 'research' umbrella).

I started formal schooling a year and a half later. My university thankfully placed a lot of emphasis on cross disciplinary collaboration. It is a technical university, and CS was a popular program there. For non-computing degrees (engineering, sciences) CS students were often seen as useful, and quite often other programs required that their students pair up with one of us to be successful on larger projects. As a result I spent a ton of time in my university's marine sciences/engineering department. I ended up working for a professor there building in situ oceanographic sensors. It was there that I really learned the "power" of having a domain, and that computing extends far, far beyond computers.

Today I'm still learning, but it's really just your run-of-the mill on the job type stuff. Occasionally I geek out on a side project when I get excited about some new technology which isn't applicable to my day job. This keeps me sane, and often teaches me things that I can bring back to my day job. It's kind of like an individual-scale space program, and the new tricks I learn are velcro, styrofoam, etc.

The question not asked: How do I think a newcomer should learn? Two big, big things that nobody really mentions: find motivation, and completely ditch the 'this is hard' fear.

On motivation, just give yourself a goal which writing some software will help you attain. For most people who aren't already implicitly motivated by the 'compters are neato!' vibe, this must be a goal which is related to something you already care about.

On fear, I've seen the 'this is hard' assumption/mentality cause sooo many people to quit long before they ever gave it a shot. If it's hard, find something that makes it easy. The best resource is a mentor if you can get one.

Also regarding the 'this is hard' fear/mentality, take up rock climbing if you can. I can't think of an activity more analogous to building and debugging software than trying to figure out a climbing problem. It's hard? Then you're not attacking it from the right angle. In bouldering especially sometimes the difference between hard and stupid easy is whether or not you're stepping on the inside or the outside of your foot.

Don't bother with finding good 'learn to code' resources until you've found motivation and ditched the fear (if you ever had it).

Hope this helps. Contact info is in my profile if you want to get in touch!