Invariably when anyone posts about “the right” programming language to use in a first course a lot of discussion ensues. People are notoriously opinionated about this topic. I am not exempt from this and I admit that I have fallen into this trap in the past. But as I talk to people, read peoples thoughts in blogs and papers, and think more seriously about the first computer science or programming course the more I am coming to the conclusion that the programming language is not the biggest factor in success. Not in success in that first course and definitely not success in a career (academic or commercial) in computer science, Information Technology or just plain programming.
I’m starting to conclude that the real important things are the instructor and the curriculum – especially the contexts that are used to introduce the concepts. Let’s start with the instructor.
Teachers are always an easy target but most of the time they are unfairly criticized and I don’t mean to beat up on people. There are a lot of really amazing teachers out there and I’ve been privileged to meet and work with a good number of them. I do think though that there are a number of things that get in the way of great teaching in computer science. And there are a number of things that I think are required to teach computer science well. Most of these things are probably in teaching any subject though.
- Enthusiasm – Students learn (by example) the enthusiasm for the subject from their teacher. A teacher who would really rather be teaching Calc BC but who feels stuck teaching introduction to programming is going to turn students right off. You cannot easily hide that sort of thing. Likewise if you really hate COBOL you are going to transmit that dislike to students. I had a wonderful talented teacher who didn’t like COBOL. I learned but not as much as I did in other courses the same teacher taught. Had he not been such a superior teacher I might not have learned at all. It takes a lot to overcome a lack of enthusiasm.
- Knowledge – Somehow I don’t think it is possible to teach more then a fraction of what we know. If a teacher knows twice what they need to teach they are probably golden. But staying a chapter ahead of the students is not going to be good for either the students or the teacher. I’ve been there and it was tough. In the case I did it only the language was new to me so I like to think the students got some good out of it but it would have been much better if I’d been more expert in the language. We’ve got a lot of high school computer science teachers who have only a shallow knowledge of the subject. They took a programming course 15 years ago in FORTRAN and now they are trying to teach Java. It’s just painful for everyone involved.
- Openness – By this I mean a couple of things. They need to be open to trying new things. They need to be open to saying to their students “ok we are going beyond what I know so we’re going to learn together.” They need to be open to seeing students as partners in learning. Now some of you are going to say “wait! weren’t you just talking about needing knowledge?” Yes, but no one can know everything. Plus in computer science things are constantly changing. We expect teachers to know where to go for answers, to know how to learn and to have a background that enables them to know what questions to ask and to recognize the right answer when it bites them. If a teacher has proved to a student that they have a great base of knowledge they will continue to respect a teacher who is willing to admit they don’t know everything. Not only that but a teacher who encourages students to go beyond the course syllabus and even what the teacher knows teaches a student to be fearless in learning. To me that is a powerful lesson.
Now to talk about context a little. Converted math teachers love to teach the math side of programming. Not every student is a fan of math though. OH sure a serious computer science student needs math but why turn students off in the beginning by hiding the other contexts where computer science is used? I’ve become a big fan of the way they are doing things at Georgia Tech. I’ve heard Mark Guzdial talk about their program a number of times now (Visit this blog post of his to find a link to the slides he used at the recent Microsoft Research faculty Summit) and I must say that the results they are getting are impressive. In short they have several different first programming/computer science courses. It’s different for CS majors, non-majors and engineering majors.
Now not every school can have several different first level courses. There is no way that will work in the average high school for example. But I do think there are lessons there that high school computer science teachers can use. I think that finding a context that works for students, one that they can get as excited about as the teacher can, will work great things for many schools. Maybe it is robotics or media manipulation (which Georgia Tech is having great results with) or genetics (which is working at a couple of colleges including Wheaton College in MA), or even game development which is working at high schools and universities around the world. Or maybe something else. In some cases it may be possible to mix contexts, especially in full year courses, to allow students to find the context that is meaningful and motivating for them. that one will probably take a big dose of openness and fearlessness. 🙂
Does the language have a lot to do with which context on chooses? Probably not that much. There isn’t much one can do in one language that one can’t do in many others – at least not in a first course. You want an IDE that students can use. You want a language that allows one to teach/learn the concepts of a first course. But really a first course is not about preparing a student for a career. A language that might get them a job at one company might be useless at another. Quality of instructor and contexts that inspire, interest and motivate students are going to have a lot more value in the long run than what language is used.
Let’s also not confuse the first course with a whole curriculum or as the be all and end all of a computer science education. Just because a first course uses one language and one context doesn’t mean that’s all one needs or uses. Along those lines, Mark A. Graybill has a great post on the value of Learn[ing] Another Language that I highly recommend. I really believe that people really need to learn more than one programming language and that ideally they should learn them early in their education. I just discovered Mark’s blog (An Infinite Number of Cats on Keyboards) and there are a lot of interesting posts there.