I recently discovered Felienne Hermans’ blog. In her latest post, she talks about the research around direct instruction and how it relates to programming. The research evidence is growing that students learn better through direct instruction rather than through a discovery-based method, where we expect students to figure things out for themselves.
Direct instruction is hot! Whereas in the 1990s we heard a lot about discovering learning, we are now slowly seeing a renewed interest in the ‘direct instruction model’ in the Netherlands. Both in language and in mathematics there is a new interest in rote practice of knowledge ("stampen"). As that is not a surprise, since research keeps showing that direct instruction—explanation followed by a lot of focused practice—works well. It not only works well, it also equalizes: it does not matter what knowledge children already have (received at home), everyone has equal chances to acquire the basic knowledge. That is why research also shows that direct instruction works especially well for weaker pupils.
Her point resonates strongly with me. I argued here in Blog@CACM last year that we should reduce the amount that we tell students to just "figure out" in CS classes. We should teach students directly (Felienne’s point), and reduce (at least in the first classes) the amount of design and problem-solving that we ask students to do.
But what should we be teaching directly? The obvious answer is "the programming language." But there’s a good bit of evidence that students don’t learn the syntax and semantics of programming directly. Kelly Rivers had a paper at ICER 2016 that I found fascinating. She studied how students learned programming structures, and found that they didn’t. They actually made more errors with FOR loops over the course of the semester. Of course, the students were learning. But you can’t measure their learning in terms of syntax and semantics of programming. They’re learning something else.
Elliot Soloway and Jim Spohrer argued back in the 1980s that students don’t learn programming in terms of syntax and semantics (see this CHI 1986 paper). Rather, students were learning plans, useful chunks of code. Within those chunks were programming statements, but students were learning that set of statements, not the individual statements. Maybe we should be teaching those plans?
John Sweller argues that we should be teaching programming with lots of worked examples. He argues that too much emphasis on problem-solving leads to increased cognitive load which interferes with learning. Worked examples are completely worked out programs that students study, typically including questions that students answer about the program. The worked-example effect describes how worked examples lead to better learning than more problem-solving. For Sweller, worked examples are part of effective direct instruction for programming.
I’m a follower of the research Felienne is citing in her blog post, and agree that direct instruction is better than discovery learning for introductory courses. We’re still figuring out what direct instruction means in learning to program. I don’t think it’s about programming languages. I expect that it’s more about plans, and that the methods should involve worked examples.