In my experience, the best way to learn to code is to find someone who needs a website built and offer to do it for really cheap, though not free.
I'd highly disagree on this. The minute someone offers some sort of compensation for work, the dynamic of the relationship changes -- from helper to employee (and in some cases servant) -- especially at the low-ball prices. From what I've found, the people thinking a website can be built for $100 are the type of people who will bug you as to why it's not done, demand extra features, wonder why it doesn't look like {{insert_dynamic_million_dollar_website_here}}, etc. And if you are just starting out, you probably don't have much contracting experience to have contracts ready with expectations of work/time to commit/deadlines/etc.The best solution I found when I wanted to learn to code was that I had something I wanted to create that I couldn't -- not anything huge, just something small. Once I got it up and working, I had so many questions -- "why did it do that?", "why didn't it work?", "what if I wanted to do X?", and that fueled me to find out more information so I could answer those questions.
I also disagree that "we have to create a context where we have no choice but to learn." What people need, instead, is to bring back our child sense of curiosity. When I was reading up on the fiscal cliff, I was confused -- why were we in this mess? Why couldn't we do X, Y, Z? If you are overwhelmed with questions, many will just quit, feeling the answers are too insurmountable. The trick is to ask just enough questions so that you can understand a slightly larger view of the puzzle, which will help you answer the next set of questions.