The first programs I wrote were complex BASH scripts that solved specific problems I needed solving. I had a friend that was there to help me a long the way. But the main reasons I continued learning were because I had the immediate benefit of having my problems solved and also because I had tangible evidence of my progress. The rest snowballed from there.
I understand where Joel is coming from with his advice, but I don't think I agree with it. I had read quite a few programming books in the past (C & Java), muddled through the exercises, and thought I understood the concepts, but until I dived into solving real problems, I didn't "get it".
Exactly - that's how I learned programming, too. It didn't matter so much about the syntax, but what problem you could solve. For me it was a Perl CGI script for letter writing and earlier a Hypercard registration system that got me into programming, despite my father and teachers repeatedly trying to teach me BASIC. Today it might be adding javascript to a page, or customizing/coding a game using tools like Scratch or Gamemaker.
And there is decades worth of research backing this up (problem-based learning, situated cognition), but CS education has been slow to adapt.
I understand where Joel is coming from with his advice, but I don't think I agree with it. I had read quite a few programming books in the past (C & Java), muddled through the exercises, and thought I understood the concepts, but until I dived into solving real problems, I didn't "get it".