In middle and high school, I kind of self taught myself electronics by reading a lot of Radio Shack books and doing project kits, so in high school I wanted to learn how to program. Outside of some basic LOGO and BASIC stuff, I never really had exposure to programming. I took my Pascal text book from the first day of CS in high school, and read it cover to cover in about 2 days, doing all the exercises in Turbo Pascal. Next weekend I picked up a book on C/C++, took a few months to get through since it was more than a syntax difference between the two, but read that cover to cover as well. That pretty much solidified my basic understanding of modular and procedural development, and introduced me to OO. A few times in between I would code in the examples from Debug that were in PC Magazine, and that sparked an interest in Assembly that I would later go back to. Spent the next few years reading books on algorithms, program logic and design, and OO design patterns. I was pretty far ahead of the curve by the time I stepped foot into college level CS course. I spent those years honing in C++ and Java, and learned assembly and circuit design as part of engineering courses. The rest was being in the right place at the right time.
Truth be told, it took a lot of interest. I had to really want to do it. It is a passion that I pursue, and it takes more than just learning "syntax" that are taught in schools. Not everybody can do it, just like not everyone can solve complex math programs, paint a masterpiece, or break through a defensive line and run a 50 yard touchdown. But introducing it to populations of kids that wouldn't normally have access to it through schools is a good idea. But that kicks up a whole other discussion about education that is outside the scope of one post.