I can’t say whether the only course I’ve taken in programming was taught well. This is partially the case because it was so long ago and looking back on it it’s doubtful that anyone had an idea about how to teach such a new subject. It seems in retrospect that the professors and graduate students of that era were trying to figure out how to program themselves, let alone teach programming to undergraduates. To give you an idea, the language I learned in class was something called FORTRAN.
Since then I have had to learn (to some degree) about a dozen programming and scripting languages. Some were for application development, some were for web development, others were for database systems, but all were a hard-fought climb up a learning curve of an unnatural new literacy. Since I am not a real “computer person” I have had to learn to program for practical reasons such as building new tools or to complete a project. This is to say, I have had to start learning new languages from the position of a neophyte – someone without much formal knowledge or skill – who nonetheless had a practical goal or objective in mind.
Often when working around computer scientists and engineers who program for a living, I would ask how to best go about learning programming. Invariably I was told that the best (and only) way to learn to program was to program. I think this was the result of my colleagues early experience and education. They read books on the syntax and rudiments of the language in question and started in on cobbling together simple lines of code that eventually grew to more and complex routines until they achieved a modest proficiency in the language and it quirks. And so did I.
As things progressed, and I added more computer languages to my list of things to learn, I started to suspect that I could climb the learning curve a little faster if I read lots of programming examples to get a good sense of the everyday grammar of the language and learn some of the colloquial shortcuts employed by experienced users. In a sense I began to suspect that learning a programming language was much like any other foreign language.
It seems professionals in the field of computer science are having some of the same concerns. Professor Mark Guzdial, of the Georgia Institute of Technology, writing in the blog of the Communications of the ACM, lays it on the line in the title of his post:
“How We Teach Introductory Computer Science Is Wrong.”
Basing this conclusion not only on his own experience but also on results from several researchers, Guzdial questions whether extensive use of programming exercises are the best path to teaching programming to introductory learners. That is, is it best to teach problem solving by problem solving?
Guzdial starts his critique of computer science instruction by citing research in mathematics education by Sweller and Cooper (1985). In it, Sweller and Cooper compare two groups of students both of which are shown two worked examples in algebra. An experimental group is given eight more completely worked out examples in algebra. The control group gets the same eight problems to work out themselves. Not surprisingly the control group takes five times longer to complete their assignment. Next, both groups get a new set of problems to solve. Ready for the ta-da? Drum roll please….
“The experimental group solves the problems in half the time and with fewer errors than the control group.” – Guzdial, 2009
In other words, the work-it-out-for-yourself problem solving approach was less effective by a long shot. And, as an aside, it should be said that this approach to instruction is common not only in computer science courses but also in subjects like mathematics, physics, chemistry and engineering.
Other work by researchers Kirschner, Sweller and Clark (2006) and Kalyuga, Chandler, Tuovinen and Sweller (2001) comment on this effect and help explain where and when problem solving is superior to worked examples. Guzdial quotes Kirschner (1992) in summarizing the state of the problem:
“After a half-century of advocacy associated with instruction using minimal guidance, it appears that there is no body of research supporting the technique. In so far as there is any evidence from controlled studies, it almost uniformly supports direct, strong instructional guidance rather than constructivist-based minimal guidance during the instruction of novice to intermediate learners.”
Does this mean, as Marshall McLuhan was fond of saying, that “the whole fallacy is wrong?” Have we been sold down the river educationally where training in computer science, physical sciences, mathematics and engineering are concerned? Perhaps not. What the studies do suggest is that relying primarily on learn-programming-by-programming, work-it-out-for-yourself, minimal guidance methods are not well suited to introductory learners. These methods are, however, better suited to learners who have already acquired some background knowledge and are therefore a better fit to intermediate and advanced courses.
“What’s striking is that no one challenges [Kirschner, Sweller and Clark] on the basic premise, that putting introductory students in the position of discovering information for themselves is a bad idea!” – Guzdial, 2009
That is not to say “never” of course. What the data are saying is that it’s not the best principal approach for beginners.
In hindsight the findings make perfect sense. My original intuition that learning a computer language is like learning a foreign language was not far off the mark.
The data suggest that for a beginner, learning to read before learning to write is a more effective approach.
Kalyuga, S., Chandler, P., Tuovinen, J., Sweller, J. (2001), “When Problem Solving Is Superior to Studying Worked Examples,” Journal of Educational Psychology, 93(3), 579-588.
Kirschner, P. A. (1992), “Epistemology, practical work and academic skills in science education.” Science and Education, 1, 273-299.
Kirschner, P. A., Sweller, J., Clark, R. E. (2006), “Why Minimal Guidance During Instruction Does Not Work: An Analysis of the Failure of Constructivist, Discovery, Problem-based, Experiential, and Inquiry-based Teaching,” Educational Psychologist, 41(2), 75-86.
Sweller, J., Cooper, G. A., (1985). “The use of worked examples as a substitute for problem solving in learning algebra.” Cognition and Instruction, 2, 59-89.