In language learning, there's a slightly obscure but useful concept of "extensive reading" vs. "intensive reading". Basically, if you are reading easy stuff quickly with very few unknown words, you are reading extensively. If you are reading difficult stuff slowly and having to either skip or look up many words, you are reading intensively. Extensive reading in a foreign language might be 20-40 pages per hour, with easy grammar and under 2% unfamiliar words, whereas intensive reading might just be 1-2 pages per hour because of all the new grammar and vocabulary.
Almost all learning materials tend towards intensive reading, whereas extensive reading is more effective and fun. It's very difficult to get large amounts of foreign language text using words the learner knows that just happen to have very few unknown words, especially in the beginning when the learner doesn't know many words, hence the dreaded textbook. Eventually you can read a translation of Harry Potter, but most students don't get there. Especially in languages like Chinese, where reading is extremely difficult and slow and one can't rely much on cognates for unfamiliar words, learners really only get intensive reading, and their reading speeds stay very slow forever–if they don't give up entirely in frustration. When we developed Skritter to help people learn to write Chinese characters, some of the most useful vocabulary lists were the vocabulary for books in "graded reader" series. A graded reader promises, "Just learn these 400 characters and you'll be able to read these books!", similar to Green Eggs and Ham, where you get a whole book out of 50 unique words, but more interesting, being written for adults instead of children.
We can broaden this concept of "extensive reading" beyond reading into "extensive learning". For math, it would be very quickly doing a lot of problems, almost all of which are trivial, like one might do in a brain training game. (In school, math assignments tend to be focusing only on new techniques which are difficult, with problems that take a while to learn and do, and not many review problems.) For history, it would be reading stories about events you already know well, so that the new details are few and easily hung on the tree of your existing history knowledge. (Traditionally, "studying history" is usually about trying to absorb a ton of facts about an entirely new historical scenario, and it's hard to remember afterwards.) So on, so forth–the pattern is that properly paced extensive learning is actually kind of fun, but schools typically have to rely on intensive learning, to the detriment of retention and engagement. Meanwhile, those students who happen to immerse themselves in the subject outside of school can build up a lot more knowledge and skill. Most of the native Chinese speakers I know who learned English with good pronunciation did it by watching a lot of English-language movies and television.
What does extensive learning look like for programming? Writing lots of code you know well many times, with only a few new things here and there, not slowing you down much. CodeCombat was designed to do this as much as possible. One of the keys is to keep the player writing familiar code, so the pacing isn't difficult, but to keep it from being boring using gameplay. The other is to never stop long to make learners do something other than coding (like reading instructions or watching a lesson).
If we think of learning programming like learning a foreign language, it's clear that you want to have a lot of extensive conversations with the computer. I think many programmers take a long time to become fluent, and a big reason for that is that they're almost always in intensive mode–writing some code that's difficult and halting, spending more time reading documentation and debugging than actually expressing themselves. But if you use the right tools so that you're having those conversations extensively, you can build that fluency–you can be a native speaker of code.
Give it a try the next time you're learning something. Find learning material just easy enough to go quickly–and make it interesting, so that you'll be happy to spend hours learning it.
By Nick Winter
Learn to code through gaming at Code Combat