I loosely consider myself a self-taught programmer:

1)
a)My middle school (~2000) used to have a computer co-curricular course. I learned some BASIC, some HTML, and made websites/applets that trolled the user (the cancel button that runs away, icons and buttons that didn't do what they said, hidden buttons and urls via formatting, etc). Turns out I studied UX anti-patterns via trolling.

b) When I was 13 (~2002), my brother was studying Computer Science for his Indian CBSE 11th grade concentration. I bugged him incessantly about what he was writing, helped him debug, tried to come up with better ideas and algorithms for what he was writing. He was torn between enjoying teaching me stuff and getting my help, and feeling inferior if I actually came up with a better idea than him. Regardless, he was vital to me becoming as much of a hacker as I am today, because he was an excellent teacher, constantly challenging me and giving me interesting things to think about without making me do mindnumbingly boring tasks. While being taught is not really self-taught, that I seeked to learn it without any external motivating factors and purely out of interest, and I just capitalized on the nearest and most effective resource available to me I think makes it close enough. This is probably the answer to (2), by the way.

c) I followed in my brother's footsteps (2005), but I already knew the material, having been progressing through it on my own in my spare time in the interim. Taking the course just meant I could dedicate that much of my "not free time" to doing something I intended to learn! I skipped most of the homework, got mediocre grades, didn't know the algorithms asked on the exams, but enjoyed being vindicated in sitting in front of the monitor staring at code, making my first Tank game, a hangman game, a file encryption/decryption system, etc, all in C++.

d) I started pursuing a degree in Electrical and Computer Engineering at the hands-on school Olin College in Greater Boston, where I was encouraged to learn to do, and less about theory. This is where I really stopped learning computer science, and really started teaching myself programming. I hated CompSci more with every class, and at some point found myself writing way more code the semesters I had no CompSci credits, because I was enjoying it so much more programming controllers for electromechanical projects to do cool things, than learning how Turing Machines and Regular Expressions flip things on and off.

3) I had no real opportunities to work internships in the Middle East where I grew up, the industry was very young and elitist where it existed there. And I'm glad I didn't get numbed to professional programming work there. I worked as a tools developer for an electrical engineering lab where I also did research for a couple summers. I then went on to work at IBM for an internship (2010) and discovered it was a pit of doom for someone like me who could see it "being pretty alright," but never feel fulfilled being a cog in someone else's machine that I didn't care about. There was nothing wrong with the work, but I'm glad it was just an internship. I made something I was proud of, some bigwigs clapped when I presented it, they shook my hand, asked me questions like they were interested, genuinely made it sound like they would use it in a product at some point (I stopped checking a year ago), and I was on a tiny high in my first professional dev job.
I fled from corporate software dev, and now live poverty stricken in the Bay Area making (about 50% of) something really exciting, with people I'm excited to see everyday to work with.

I think at some level anyone who pursues programming to fulfill their dreams is self-taught. School does not teach you how to make the things you really care about making, but it can help you a bit.