Most programming books and tutorials show you code and explain it. What they should be doing is describing code they want you to write.
Here are some examples:
- Project Euler presents one numerical programming problem at a time. You must provide the correct answer (a number) before you can see the next one.
- Apple’s Swift playground books on iPad also make you write code. Your programs move a robot around a board, and it knows if you achieved the goal they specified.
- The Unwrap app by Paul Hudson. It combines video and written lessons with challenges of various types including writing Swift code. Each lesson is very small.
- freeCodeCamp breaks down learning web development into tiny coding challenges that are auto-checked by the site.
- Cryptopals teaches you how to write cryptography and code that attacks it with lessons you check against the expected output.
The big advantage of this style is each level can be very focussed on using just one new skill. In this talk by Kathy Sierra (and in her book Badass) she covers the research behind skill acquisition. One big idea is that you need to break skills down into tiny sub-skills. The reason is so you can master part of a skill, rather than half-master a full skill, which is hard to improve later.
She also says that learners need feedback, which these systems do by verifying your work automatically (or by having an expected output you can check).
In contrast, most programming tutorials are quite long and don’t make you create your own programs (so can’t really provide feedback).
If all you do is read or type in the code in the tutorial, you aren’t practicing a core skill of programming, which is to write code on your own to match a specification.