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.
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.
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.