Why are so many online courses bad?
As I advocate for programming as a vital life skill, I am often asked “what’s a good place to learn to program?” The answer, unfortunately, is basically “school (if it’s a good school)”. There are plenty of online sources out there, and they are often well-organized and effective in their own way. But as I work through each trying to think like a novice, I invariably decided “this isn’t very good.” Why not?
I have pondered this question at length. There are many very good sources to learn a new programming language once you know some programming language. There are many people who spend a lot of their professional life teaching programming to novices, many with much success. Many of the online material is provided by the successful instructors. So why aren’t the programming tutorials of better quality?
A partial solution to this question came from a question asked me by a high school computer science teacher in Duluth Minnesota last week. “Some people advocate teaching Java objects-first and others procedurally-first. Which is better?” That question is one I don’t wish to get into here, but it points to another question that is interesting.
Should we teach top-down or bottom-up?
Practically, most skills must be learned bottom-up. You learn to add before you learn calculus; you probably could teach it the other way around, but it wouldn’t make much sense. Similarly, most tutorials on programming start with the low-level stuff and work their way up bit by bit.
As I see it, there are two problems with bottom-up instruction.
The first is it lacks purpose. “But why should I memorize the times tables?” “Because it will be useful later. Trust me.” This kind of thing can work when the instructor’s personal charisma is strong enough to make the trust thing actually be successful, or when external forces require the student to do what the instructor says, like it or not. But with online tutorials, even videos, that doesn’t usually work. Charisma doesn’t record well.
The second is that it lacks structure. People naturally want to fit information into a structure in their minds. But the structure they find for the low-level pieces is rarely a structure that will admit the things to come later. Thus by teaching bottom-up either you go so quickly that none of the earlier ideas have time to settle or you repeatedly upset the structure they’ve built around what they’ve learned so far to admit a new concept. In theory you could present ideas so that the natural structure of the earlier ones lets the later ones fall into place without major mental renovations, but I’ve very rarely seen that done.
What would a good online programming tutorial look like? I don’t know, but I have a guess. It’d start with a high-level discussion, an overview of the conceptual breakdown of programs in the paradigm in question. This couldn’t be very complete up front, but it might work to give an analogy or image that suggests that structure. Then it would proceed with some kind of bottom-up instruction, but with each concept tied back into the original big picture.
I suppose, to test this hypothesis, I ought to try creating such a tutorial. I wonder when I’ll have the time.