The Language is NOT the Important Thing

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.

Regarding teaching and "Openness," it's great when students can see how YOU react when YOU don't know something! Hopefully they see that we don't give up or panic; we figure out where to go or whom to talk to for getting the info we need, we struggle a bit but we enjoy the journey and we figure it out. Kids need to see examples of what good learners do when they don't know something. This may be one of the best things our students learn all year, and which obviously applies way beyond CS to everything in their life.

I totally agree that math examples are over-used in the CS classroom. Many kids with great CS minds and potential have already been turned off by math classes, so we need to "trick them" into enjoying algorithmic thinking, algebra, and the other great math-related CS concepts by teaching them in a different and fun way.

Regarding language, I think different language paradigms might make somewhat of a difference for a first course. I'm thinking of recursion-based languages like Lisp / Scheme vs. imperative languages like Basic / C / Java. But the biggest focus needs to be in teaching algorithms, structured thinking, data abstraction and representation etc., which is core to any language. So I agree that language is much less important than curriculum and teacher quality in communicating the most important first concepts of computer science.

Garth

11 Aug 2008 11:28 AM

This thread brings up a whole new topic; teacher training. I have a fairly broad based university in my town, the University of Montana. It prides itself on its Dept of Education. It is possible to get a Doctorate in Ed Tech from UofM. After having looked at the curriculum and talked to the guy in charge of the program (he is an old friend) the program is for business teachers and teachers that have an unlimited budget to buy all the cool technology toys (he is into iPods, blogs and webpages). The curriculum for Ed Tech has no programming, no computer hardware/how to fix the @#$% things (one of my main jobs as a school IT guy), and no networking. The Computer Science dept at UofM has awarded two Computers in Education minors. Another teacher and I wrote our own curriculum and did all the course work independently. Certified teachers qualified to teach high school programming, basic networking, trouble shooting of hardware, computer purchasing and the other basic skills that a high school CS teacher should be able to present to a class of HS students do not appear to coming out of my local University. Is this the same nation wide? During the school year I have a monthly meeting (BS session) with most of the local techs from the other local schools (5 to 10 people), they all learned their skills on-the-job. The programming teachers I know have taken one or two college level programming courses then had to write their own curriculum for their kids. The way programming is taught at the University has nothing to do with the way it is taught at the high school. University education departments (at least UofM) do not seem to be looking at what is being taught in the high schools and junior highs today. Is this typical for state Universities? I would like to improve my ability to teach programming and the other basic HS CS curriculum elements but without traveling around the nation it does not seem possible.