I make a good part of my income tutoring computer science students online. One thing you learn about this is that there are 3,417,612 final exams in computer science coming up and there is at least one panicked student in each one.
As a result, I have a lot of students contacting me to get help with labs, assignments, and to study for the upcoming finals. Which is fine—I love to teach and that’s what I’m there for. But I’m learning something about the way computer science is being taught in university.
Basically, in general, it sucks.
We look at the part of the assignment that says what is to be delivered, which is almost always a program that is to compute some result. Usually, the student submits the program through some online process, and it’s graded in part by a program provided by the professor. Ideally, the process results in a grade, practically untouched by human hands.
In real-world software engineering, we call this an “acceptance test,” and as a test, it’s not a bad thing. Computer programs should more or less deterministically compute the expected result from known inputs, and automating those tests means they’re done more often and more thoroughly.
What I’m seeing, however, is that the way students are being taught along with this “untouched by human hands” approach to grading is not working.
Programming is a funny thing — it’s as much a craft as anything, and like woodworking or knitting it isn’t enough to know the theory, you need to be taught, well, how to do it. Forty years ago, there were several excellent books on how to program — Systematic Programming and Algorithms + Data Structures = Programs by Niklaus Wirth, Techniques of Program Structure and Design by Ed Yourdon, and Software Tools by Kernighan and Plauger are some of my favorites. But the Wirth books used the Pascal language, which is antiquated and unfashionable; Software Tools uses a preprocessor dialect of FORTRAN, which “real” computer scientists mostly don’t even like to remember; and Yourdon’s book was directed toward mainframe programmers with COBOL and PL/I.
Modern introductory computer science classes now seem mostly to use Java or Python, or C++ or even C — all of which are marvelous, useful languages, but all of which presume a good bit of knowledge going in. New students are apparently expected to learn what they need by osmosis. Some of them do—I assume from teaching assistants—and some of them just don’t.
This should probably make me happy. I get tutoring students because of this, and since I’m good at explaining how to look at programs and programming, I can charge a fairly high hourly rate. But my students shouldn’t need to pay me: programming skill is as essential to a computer science student as the ability to write a coherent paragraph is to an English major. In English departments, it’s at least a reasonable assumption that students come in with some practical fluency in the language — computer science students not so much, especially since there are so many programming languages in common use.
What students need is something like a basic composition course for English — a practicum in which they get a detailed critique of small and well-bounded assignments, not just “did this pass my automated test?” But that’s not how the modern university is organized: the priorities for a computer science professor on the tenure track, in general, are “RESEARCH, funding, teaching.” Some places make it “FUNDING, research, and teaching,” and in some schools, it’s “FUNDING, RESEARCH” … and that’s it.
When I was a grad student at Duke, the strong suspicion was that, in fact, if you as untenured faculty were caught being an effective teacher, it was the kiss of death to promotion and tenure — how could you be giving proper attention to your research if you were putting that much effort into teaching?
The university swore it wasn’t true, but I saw a lot of good teachers, including people who won teaching awards, move on to other schools after being denied tenure or getting a negative mid-process review. (In Duke’s defense, they developed a program for people to be faculty “of the practice” so that there were people whose admitted job was to teach. I don’t know of anywhere else that does that.)
The students I’m seeing are often students at prestigious universities — I’ve had students from Harvard, Yale, and from many of the major state schools — and they are a self-selected population as well because they are students who can afford to pay for tutoring. They are paying anywhere from $30,000 to $75,000 a year for college, but they aren’t being taught the most basic skills, at least in computer science, and they’re having to pay an outside tutor to supplement the instruction they aren’t receiving.
We worry — rightly — about the bias and indoctrination that’s included in these vastly expensive college educations. But we really need to start paying more attention to the lack of education in these vastly expensive college educations.