## The best-researched CS textbook ever

When I visited Carnegie Mellon University a few weeks ago, I got to spend some time talking with Ken Koedinger and Albert Corbett about the early cognitive tutors research on Lisp, Pascal, and Prolog.  Albert told me that, at one point, they tried to teach Lisp, Pascal, and Prolog, all in one class.  At first, they taught it for maximal transfer, i.e., teach the same/similar production rules close to one another.  So they’d teach assignment in Lisp, Pascal, and Prolog; then conditionals in Lisp, Pascal, then Prolog, then…you get the idea.  It was, as you might imagine, a disaster.  Then they taught the three languages in sequence, and it really worked!  Albert said that that’s when he realized how much programming novices bind their knowledge to surface-level features.

Ken told me that the way that they taught Lisp (which mirrored the order of material when taught Pascal and Prolog, to get the most possible transfer) was then put in the book Essential Lisp by John R. Anderson, Albert T. Corbett, and Brian J. Reiser.  I had to get myself a copy (less than \$6 used, including shipping).

The introduction includes references to the six, now famous and often-cited, journal articles that describe the research that informs this book.  I realized that I was holding probably the best-researched CS textbook ever — not in the sense of evaluating it afterward, but in the sense of having a lot of really good evidence at the design stage that this was a good way to teach computer science.

Some of my immediate observations from flipping through the book.

Start out slow, and progress slowly.  Here is the first exercise in the book, from page 5. “Write a LISP function call that adds the numbers 3 and 2. You should call a particular LISP function with the arguments 3 and 2.” Second exercise: “Write a function call that will divide 6 by 2. Do this just as you did in the previous problem, but use the function that divides numbers.”  If you can’t do this, please re-read the first five pages of the book, which contains all these answers.

Mutable variables are no big deal.  I know that people worry a lot about mutable variables in functional languages these days.  I am told that that’s why Structure and Interpretation of Computer Programs avoids them for so long.  I know of no evidence that shows that mutable variables really are a problem for anyone. Setq is introduced on page 13 of Essential Lisp.  Parameters to functions are introduced on page 23.  That may be an accident — I don’t see any references to studies that show that that’s the best way to do it.

Iteration before Recursion.  Essential Lisp teaches iteration (with loop) on page 94. Recursion starts in the next chapter.  This is very purposeful.  The introduction references a 1986 paper by Kessler and Anderson (“Learning flow of control: Recursive and iterative procedures” from Human-Computer Interaction) where they explored recursion first, then iteration first.  I looked up and read that paper, then the follow-up paper by Susan Wiedenbeck (1989, International Journal of Man-Machine Studies).  Bottomline: If you are going to teach both, always start with iteration.   The explanation from the Kessler and Anderson was supported in Wiedenbeck’s studies.  It’s not that recursion is harder, it’s that iteration syntax is so complicated.  If you learn iteration well, the pieces of that syntax that you use in recursion are pretty obvious.  If you learn recursion first, it doesn’t really help in dealing with the more complex syntax of iteration structures, and knowing one way to repeat seems to conflict with learning a new way to repeat.

I’m having fun reading through the book, and then using that as a guide into the research literature.  I don’t believe that this is the best and only way to teach computer science.  But here’s a great example of using research to inform the design of education.

Entry filed under: Uncategorized. Tags: , , , , .