Mark Guzdial recently posted another thought-provoking piece on computing education that has some direct implications for a project here in Toronto called Ladies Learning Code (and for other projects Software Carpentry). In his post, Mark summarizes a 1996 paper by Greeno, Collins, and Resnick that summarizes three views of education:
- Behaviorist: education is a matter of stimulus and response.
- Cognitive: education is about building and applying knowledge structures.
- Situated: education is about making people more successful members of a community of practice.
All three views are valid: they all provoke useful questions, make testable predictions, and so on. #2 (which is associated with people like Piaget) is probably the dominant paradigm today, but Mark’s point is that #3 is equally important. Real-world problems are rarely solved by hermits working in complete isolation; instead, we go through apprenticeships, share sub-problems with colleagues, and hang out on Stack Overflow.
So what’s this got to do with LLC? Well, if you’re going to teach people to program, you have to pick a programming language. As a computer scientist, I’m drawn to elegant little languages like Scheme—but that’s paradigm #2 talking. “We must use language X, so that we can focus on fundamental principles that students will use for the rest of their lives” isn’t useful if those students are going to be interacting with people who speak a different language, just as teaching the fundamental principles of grammar and composition in Latin isn’t useful if people are going to work in English or Mandarin.
Mark knows better than anyone that Java is a bad language to use with novice programmers—he and his group have been studying the broader question for years. Despite that, he accepts that computer science students have to learn Java at some point in order to take part in the community of practice that is professional programming. It’s an echo of Joel Spolsky’s argument that every serious programmer has to learn C: other than examples in class, I haven’t written any C (or C++) in almost ten years, but I simply couldn’t take part in some discussions with my peers without knowing what structs and pointers are.
This still leaves a lot of questions, of course. Should it be taught language-first, or should libraries like jQuery be introduced right from the start? What about things like Processing.js: after all, Guzdial’s research shows that a media-first approach attracts and retains a wider range of people. I think trial and error is the only solution, but even the “errors” will be useful and fun, and how often can you say that with a straight face?