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 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.
"Enter a-ha moment #1. As a poet, this explanation of systems design made perfect sense. A layer that rationalizes concrete details in an abstract way–that’s metaphor, my friend. Effective metaphors build a relationship between the abstract and the concrete (i.e. “love is an island”). Like equations, metaphors also capture patterns in our lives–they “abstract out” the concrete details.
In a delectable moment, I realized it was entirely possible for a poet to think this way–and that the connections between the different disciplines enriched them both. For me, a discovery process happened when I could relate the new concepts to my framework for the world. Bring on the code."
I had that revelation too years ago, when I realized that the process of abstraction in programming was the same or similar to that of abstract art. I had never appreciated abstract art, and had been studying up on it to better understand it, when I finally grokked (what was obvious in hindsight) that abstract art is an attempt to extract the abstract essence of something and re-represent it in a concrete medium. Very much an a-ha moment.
I can totally relate the author's experience here.
As a poet first and a programmer second, it was good to see how the worlds correlate so closely. Without having the words to talk about concepts, it hurts your agency. By learning what an array is, or what a slant rhyme is, it gives you the ability to appreciate a whole new level of subtly.
5 comments
[ 4.3 ms ] story [ 26.2 ms ] threadI think this is a key point of learning. When someone feels ownership, it makes them have more motivation to complete a project.
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.
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.
In a delectable moment, I realized it was entirely possible for a poet to think this way–and that the connections between the different disciplines enriched them both. For me, a discovery process happened when I could relate the new concepts to my framework for the world. Bring on the code."
I had that revelation too years ago, when I realized that the process of abstraction in programming was the same or similar to that of abstract art. I had never appreciated abstract art, and had been studying up on it to better understand it, when I finally grokked (what was obvious in hindsight) that abstract art is an attempt to extract the abstract essence of something and re-represent it in a concrete medium. Very much an a-ha moment.
I can totally relate the author's experience here.