I do agree with this. However, I think most online tutorials and books are skewed towards being not intellectually stimulating. Very much, "This is a loop. This is how you print." Barf.
The Stanford 106a track for CS freshmen is excellent. The curriculum is more bite-size than doing a project from top to bottom, so they introduce elements slowly (arrays only come up 3/4 into the class for example). However they design problems that really poke your problem-solving brain and challenge you to solve it with the limited tools you've learned.
Here's the first assignment. A former TA says that problem (3) from this book is the most intellectually challenging of the whole course, and it's from before you've learned anything about any language: http://see.stanford.edu/materials/icspmcs106a/07-assignment-...
I think a (good) class teaches depth while a project gets you up and teaches breadth. If you do a web project, you'll learn about frameworks, hosting, using different libraries, etc but the actual code you write will be rudimentary. Both are important of course.
Completely agree. I've been trying to help some non-programmer friends learn, and I've recommended all the beginner-friendly things I know of, from langauges like Scheme, Python, Ruby, Javascript, to online tutorials like CodeAcademy and other similar sites, etc. But nothing seems to stick, until they get excited about something, usually coming up with their own idea and deciding they want to build it.
Hence, I more and more believe that a strong emotional investment is necessary to plow through the initial learning curve and constant-debugging-induced frustration of learning programming. Everything else - OO, functional, recursion, pointers, and all the other key learning concepts - is secondary. And odds are you won't get that emotional investment from working through online tutorials, no matter how nice the UI, or even from reading books, no matter how well written.
It's the realization that with hard work and perseverence you can turn your own ideas into reality, and the feeling of empowerment that comes from that, that I think is crucial to learning programming, especially for those who may not be naturals at it. Then, from that passion, one can develop craftsmanship, and learn the aforementioned concepts that take you from a beginner to a professional, engineer, or perhaps even computer scientist.
I think this is a key point of learning. When someone feels ownership, it makes them have more motivation to complete a project.