Daniel Lemire's blog

, 3 min read

Programming and college CS education

Moving things up on the skill ladder, going to higher level skills and discarding lower level skills where “higher” means “more abstract”, doesn’t necessarily lead to a better education, but to a worse one. You should not discard lower level skills, you should value them: they are our foundation. If you can’t use a broom, don’t use a computer.

Here are a few things you may hear on your campus about CS education:

Since this is not a community college, we should not teach more than one OOP language.

Yes, of course. But even community colleges probably choose either Java or C++ or C# or (gasp!) VB. I have no problem with a school teaching only rudimentary Java as long as the students really know Java. I don’t mean knowing the syntax well or the API well… I mean, being able to do non trivial programming in it. And just generally being fluent with programming: if things go wrong, know how to debug them even when a debugger can’t be used; understand how to do research on newsgroups to help you out; know how to file a proper bug report.

Either we are saying that a student who knows Java can pick up C++ on his own easily, or else there is something fundamental different about C++. You can’t get around it: it is one or the other. So, can the students who graduate from your program learn C++ easily on their own? If not, you failed to teach them about modern class-based OO. Can they recognize the STL data structures and understand their characteristics immediately, or are they stuck trying to reinvent the wheel?

In short, teaching only one language is fine, as long as you do it because picking up other languages will be easy for your students, not because programming in various languages is not important.

Now that we are using Java, there is no obvious excuse why we have tons of students who cannot program well… before, I thought I knew why!

Part of the answer is what you value and what society values. University professors, generally, don’t know how to write industrial-strength software. They don’t know because they never had to do it and were never involved in real projects. So, they cannot teach it. Period. Note to self: I just made a lot ennemies.

They have the same problem in the humanities or in business. Several managers can’t write 10 lines of English or French without filling it up with childish sentences. We don’t know about it because these people never really write anything beyond a note. Why should it matter? All they need to do is sign paperwork and attend meetings.

So, if CS graduates are just supposed to attend meetings and sign papers, then why should they know how to program or how to write in English for that matter?

The next logical step is… why do you need a degree at all? Oh… you need the degree for the resume… but why do you need the education that comes with the degree?

We are back at what society values… If all that matters is to direct and manage, then fine, but I don’t think this is a safe road. It will certainly lead to a commercialization of university degrees.

Of course, the really good students already know programming by the time they get to university, or at least, they can pick it up on their own. Others will never learn programming because it is too hard. But most students won’t learn about data structures and algorithms on their own so a university degree can really take the best students to a higher level. What to do about the students who can’t pick up programming (and in some places, it seems like very sizeable fraction)? Please don’t water down the education for their sake. Help them the best you can and then, let them sink.