Firstly they love it. The game mechanics and the reward cycle is a great motivation for them. I think nobody can argue that you've found a great way to get TONS of people to enjoy "learning to program".
The second part is a bit tricky... are they really learning to program?
IMO the problem with all pragmatic approach is the lack of the need to understand. I know you didn't intend it, but codecademy suffers from the same tired "tutorial" approach. Users follow instructions to win the prize.
I will say codecademy is better than the tutorial approach, but it's still a tutorial.
The fundamental problem is my two friends need me to teach them how to think in code, how to conceptualize the problem, how to understand that "i am taking this problem, i am working out a solution in my brain, in english, and then i will write this solution in code" They simply do not have the capacity to do that. And they are 5 months in through codecademy.
Just yesterday my friend had the idea that when using a for loop, the loop passed all values at the same time to the nested switch statement, upon which the switch statement would evaluate ALL the variables at the same time, using whatever the hell case was the best match.
He couldn't pass the level because he did not visualize in his head that the for loop passes each value, one at time. Then it procedurely flows down, line-by-line into the switch statement... and so on.
My friends do not have pictures in their head about how code works, why it works that way, and how to use those pictures to draw their own.
They don't know how to code.
EDIT: sorry one more thing. The only lifeline they have when they get stuck (aside from asking me) is to look at the QA. I have never once seen an answer that explained the answer, nope, it was "here put this magic code in it and that way it will PASS! YAY!" And I mean answer in the sense of "why", not why does javascript require a return here instead of there, or why the "right" answer is to put this code before that code, or the strange reason you need this bracket here instead of there -- I mean why! why? really...why?
While it is true that they don't know how to code, the more specific status is that they are presently learning to code. That's not the worst thing in the world -- so am I, and I get paid for it fairly regularly.
I wholeheartedly agree.
As a person whose purpose in life is more and more "Free information in order to Free Education", all I'm saying is I think we can do better; a lot better.
Rote memorization certainly works. But I don't think anyone anywhere, has ever proved that it's an efficient or even particular good way to learn something. And yet modern civilization takes this for granted.
p.s. I never went to college so this is all outside-in.
On the one hand, as apsurd points out, programming is probably not something that can be done without understanding what you're doing. It's one thing to program HTML, CSS, simple Javascript where you're getting instant visual feedback [1], another to write C, Python, Java, etc. where the feedback is not so instant or visual and requires you to keep a constantly updating mental model of what's going on.
On the other hand, learning something new involves doing it enough that your neural pathways rewire to become more proficient at it. As you pass the stages of constantly thinking about what you're doing to how and why, leaps or breakthroughs in understanding become more likely and frequent - jumping from plateau to plateau so to speak.
Question is, what's the best way, and can it be abstracted to web-based tutorials? I don't know what current state of the art Cogsci research says about this, though it's on the todo list [2].
1. http://news.ycombinator.com/item?id=3948737
2. http://www.reddit.com/r/cogsci/search?q=education&restri...
I am a programmer-in-learning too, and when I first signed up for CodeYear, I really enjoyed going through the first few sections and was amazed I was going that fast. Then I stopped for a few weeks because things got busy, and when I returned I found that nothing had stuck. So I had to go skim through the beginning tutorials again and got a little bit farther. Now it's been a couple of weeks, and I remember nothing. So, I conclude, it's not really working as well as I thought it was.
I am coming at this with knowledge of VBA, so I am guessing the helpful thing would be to find the comparable code in Java, then attempt to fill in the missing blanks and begin building up to the more difficult concepts from there. But I have no clue how to do that.
Our tool is a new way to present information, and the course creator community is figuring out how best to take advantage of the format. You wouldn't write documentation in the same way that you present to a crowd of 2,000 people, and you won't write a Codecademy lesson the same way you write a textbook. It will take some time to use the platform to its full advantage.
I'm excited to see what innovative courses the community comes up with, and I would love to hear your suggestions about the product or curriculum. Feel free to reach out directly at sasha at codecademy dot com.
1) It would be great to highlight on the site some success stories as these develop. I'm learning a lot but my concern is how translatable my learnings will ultimately be to developing real products. It would be great to see the outputs created by people that have worked their way through the courses.
2) How about a demo day for 'grads' who produce companies / products (a la incubator programs)? Seems like this would be a great opportunity for exposure and publicity (Just keep me in mind please so that I can get in on this once I turn my learning into a tangible product :))
Zed Shaw, on the other hand, does a marvelous job of not covering concepts until the prerequisite knowledge is already in place.
In my experience the best people to educate the newbies are the people who were newbies a year ago. They know what the roadblocks were for them, and the don't know 'too much' as to complicate things.
One thing that makes coding a little harder is that many of the analogies we make for non-coders aren't especially clean: A hash is like an set of cubby holes, each can be named and filled, and the set can be infinitely expanded. Packet routing is like trying to find your way from New York to California, only stopping at major cities to ask for a general direction. Memory is like a big sheet of paper, and x = 5 is like writing 5 somewhere on the paper, and x somewhere else, and then drawing an arrow between them.
I'm not saying these are the best analogies (or even any good), but I have yet to hear ones that aren't riddled with holes. The average non-coder doesn't have the context to back-fill these holes. As an instructor, you need to realize this and take the time to lay more of a foundation than you think.
I am also worried about the analogies and how they're all slightly wrong. I usually resort to trying to explain exactly what the computer does in completely reductionist terms on the bit level when you write an assignment, print, etc, but it's a bit of a rabbit hole and finding the right balance is hard.
"I can't explain that attraction in terms of anything else that's familiar to you. For example, if we said the magnets attract like rubber bands, I would be cheating you. Because they're not connected by rubber bands. I'd soon be in trouble. And secondly, if you were curious enough, you'd ask me why rubber bands tend to pull back together again, and I would end up explaining that in terms of electrical forces, which are the very things that I'm trying to use the rubber bands to explain. So I have cheated very badly, you see. So I am not going to be able to give you an answer to why magnets attract each other except to tell you that they do."
This is the point of user acceptance tests - it doesn't matter if the code does 100% what it was designed to do. If the users can't make it work, it's no good.
Nice analysis from Codecademy.
At this point, after having many mediocre teachers and very few good ones, I've come to the conclusion that only a small percentage of "teachers" are actually worth learning from.
The only good teachers I've had were meticulous about their knowledge AND really loved teaching. Not one or the other.
It basically requires a full-time teacher. Anyone besides that is actually worse for me than no teacher because they are apt to ruin my interest in the subject. Maybe I'm spoiled, but most classes aren't much better than a textbook and a chat with a good friend.
Who does that leave as worthwhile teachers? Rare people like Feynman, a couple of instructors on Lynda.com, one or two from my undergraduate classes, and a couple from the new array of online classes. Again, you can be a grad student and be a great teacher, but you have to know your domain inside and out, and love teaching it. That means fielding questions with ease and, probably, being able to teach without notes if needed.
One of the reasons I like open online courses is that you get to experiment until you find an experienced professor who had enough initiative to start an online course in the first place. I really do mourn the downfall of the in-person class setting, but at least in my experience, a vast majority of them aren't what they're cracked up to be. Maybe at top 10 schools the situation changes?
Even with these issues codecademy has been a fantastic resource for me. I have learned a ton and have gone on to start teaching myself more advanced topics and have been learning different libraries such as backbone.js, node.js and d3.js. Without codecademy I would not have been able to get through the documentation on these libraries. One of the most valuable things that codecademy has taught me is to not be intimidated by technology. From the outside the programming world can seem like a pretty intimidating place. Codecademy makes that first step a little easier...
Right now I'm working through the classes nightly. 15 badges down...no clue how many to go.
This reminded me of how I always have to clearly explain to my beginner piano students that the higher the note on the staff, the further right on the piano it goes. It's very non-intuitive that up/down on the staff = right/left on the piano.
I went through Stanford's Programming Methodologies on iTunes U (free!), and they go over a lot more of the why, as well as decomposition and other stuff.
What if Codecademy had short video/audio lectures after each section that would show more of a recap of how/why it works?