I was dumb and didn't study CS in school, even though now I realize that I really like programming and everything that comes along with it. What's the best way to correct my mistake and get to a point where I can start coding for a living?
Is it books? MIT and Stanford online classes? Code School and Codecademy? Some combination of all of those?
Got it? Good. Now, for actual advice.
Contrary to the prevailing sentiment, there actually is a career path in engineering that starts at the bottom and takes you to the top, all classical-like.
It goes something like this: Customer Support/QA -> QA Engineer -> Support Engineer -> Junior Developer
QA is very easy to get into. If you play your cards right, you can get into QA at a place that encourages automation and whitebox testing, which will expose you to a lot of the fundamental skills.
From there, it's a short hop to QA Engineer, which is exactly the same as what I just said, except they expect you to be more than a warm body clicking on things till they break. You'll be required to write code here.
A support engineer is someone who's midway between dev, QA, and customer support. Here, your customers are developers, so the discourse is a little bit more elevated than a normal customer support role. Support engineers are often asked to produce sample code for customers learning to use the product. Take this opportunity to write it yourself rather than sending canned samples.
(Optional) Dev Evangelist: This is much like the previous role, except you spend all your time at hackathons being cool and showing off how cool your API is.
Do well at these, and it'll be a little more straightforward landing that junior dev job. Congratulations, you're a programmer.