3 min read

Computer Science Curricula

Those of you who know me and also know that I am a Computer Scientist often ask me, "What programming languages do you use?" I usually tell them that I'll use whatever is the right one for the job, and then qualify that by saying that for over 99% of my work I use either Scheme or C, with most of it being Scheme. To fellow Graduate Computer Scientists or Professors who have done a lot of work with various programming language, this comes as no surprise. To people who are young, self-taught programmers, or who spend most of their time in enterprise or business focused programming positions, this usually surprises them a great deal.

When they ask the inevitable follow-up question, "Why," I can tell them: I find both languages to be the most relatively elegant languages which give me the most productivity when working on the widest range of problems. However, it appears that someone else agrees with me for an entirely different reason.

Joel Spolsky wrote an article some time ago warning against the dangers of using in vogue programming languages to teach Computer Science. He describes two important concepts that make a big difference between mediocre programmers, and good programmers: Recursion and Pointers. He focuses on Java as the danger, but from my own experience, I would have to add languages like Python, which are gaining more popularity in the modern C.S. curricula throughout the United States.

I disagree with Joel when he says that recursion and pointers are hard, giving them merit to weed out the good from the bad programmers. They aren't really hard, but they do require that you wrap your brain around them. However, young kids can pick these ideas up, and it certainly should be possible for College C.S. students to do so.

Interestingly, Joel brings up two languages to highlight recursion and pointers. He points to the classic MIT 6.001 Scheme course which used to be required for all MIT Computer Science undergraduates. He also talks about the structures courses that used to be taught in C throughout the United States. Unfortunately, sometimes these course are now taught in Java, more often than not. I also see system architecture courses being taught in Python. While I don't have anything against these languages for practical use, usually, Joel brings up some really good points about why they aren't necessarily good for teaching these courses.

At the curriculum at IU, I am disappointed with some of the choices to use things like Python and Java in various courses, but I can happily report that many courses still take advantage of C and Scheme. I have a great deal of respect for many of the Professors who care about trying to improve Computer Science, but they often have their hands tied with respect to making these sorts of changes to the curriculum.

So, maybe languages like Scheme and C have something else that I enjoy? Maybe they represent powerful but simple implementations of a core programming methodology that appeals to me. Indeed, I use Scheme for most of my everyday programming because it allows me to express process in the most natural way for any specific purpose, and C is my language of choice when I need to interface with, and control the boundaries between Scheme and the system libraries of my machine.

I should point out that you actually can teach important concepts like these in other languages, but it is much harder to do so. I think the primary point of importance is to focus Computer Science curricula on the foundations and principles of Computer Science, and not on the trendy paradigm of the year. The foundations of computer science transcend the various programming languages and the paradigms that have been built around them. A computer scientist goes beyond the programmer because the computer scientist is able to diverge and adapt through a core knowledge, rather than just having a skill-set which looks good on paper to the latest manager. Better programmers are those who focus on the ideas and the principles of Computer Science, rather than on the language and the frameworks.

Of course, there are many people out there who disagree with me. I call it the difference between raising hackers (in the traditional sense) and raising code monkies.