This is a post about CS education. It is prompted by a series of posts by Mark Guzdial in which he criticizes the pervasive belief among CS educators that when it comes to programming, there’s not much an instructor can do: some students get it, others don’t; it’s all in genetics or other external factors that CS educators can’t influence (aka the Geek Gene Hypothesis). I am with Mark on this, but I feel a bit stronger about it than he does. I think that attitude is bullshit, and the studies supporting it are unsound by means of making conjectures ignoring an enormous number of confounding factors.

Throughout history, and even today in certain parts of the world, attitudes like this have been the basis for keeping entire segments of the population uneducated (“teaching women to read and write?! seriously, they can’t do it, look how much longer it takes for them to learn” or “blacks in Universities?! seriously, they can’t do it, look how their grades are so much lower”). This is basically the attitude of a class of educators who live so much inside the box of convention and intellectual lazyness that they are uncapable of seeing the big picture. I know this, because of two things. First, after the first few years of being a professor, my conclusion was the same: there’s nothing I can do, some students get it others don’t. I’ve learned a few things since then, and I know I was completely wrong. I was being a “Null Professor” at the time. Now I know better. Second, looking back at my own experience as a college student I was one of those students who “didn’t get it” at first. In fact, I had no idea what I wanted to do when I grew up, and in my Electrical and Computer Engineering program, programming was one of many topics that came my way; understanding and learning to love programming was a slow process that came only in my 3rd year of college.

Let me expand on these two points.

The Null Professor

In his essay How to Start a Startup, Paul Graham says something that grabbed my attention ever since I read it:

It’s no coincidence that startups start around universities, because that’s where smart people meet. It’s not what people learn in classes at MIT and Stanford that has made technology companies spring up around them. They could sing campfire songs in the classes so long as admissions worked the same.

Graham is absolutely right. Admissions at the very top Universities, more than any of their education programs, are the key to these Universities’ claims to successful education. Because these Universities get so many applicants, they can afford to admit only “the best” students, where “the best” means that they are all very smart and — more importantly — very self-driven. As Graham says, you could just bring these students in, get rid of all formal instruction, let the students define their own learning agendas, and 4 years later they would come out as well prepared as they do now. Really, in those Universities, formal instruction seems like a waste of resources. Because the students are so self-driven, Professors there can afford to become Null Professors.

So what is a Null Professor?

A Null Professor is someone who never has to think about pedagogy. The Null Professor is not necessarily a bad professor, although that may happen too; it’s just that he/she doesn’t think about pedagogy, teaching comes as whatever natural teaching skill he/she has. The Null Professor can go to class, lecture however he/she feels like that day — usually appealing to the top students in class — keep giving the same kinds of tests that have been given in that course for the past N years, and expect that the students will learn. In those very top Universities, many times the students learn the material not because of the instructors, but in spite of them. Because, you know, they are self-driven and they don’t want to fail the courses.

But what happens when the students aren’t those “failure-is-not-an-option” people that flock to MIT and Stanford? Here at UC Irvine, for example, we get a mixed bag of students. Some are very self-driven and would do as well in places such as MIT and Stanford; others, for a number of different reasons, aren’t entirely self-driven. They need guidance; they need attention; they accept failure as a possible outcome; they need… gasp!… to be taught!

What’s a Null Professor to do with these students?!?

Well, one approach is to come to the conclusion that some students just “don’t get it,” and continue to lecture to the ones who do. After all, if some students “get it” with the Null Professor’s lectures, then all students should “get it,” right? The baseline is the students who get it. It’s the slackers’ fault for not trying hard enough: if they were more like the students who get it, then they would get it too.

I confess I was a Null Professor in the beginning of my teaching career, simply because I had no idea of how to teach. I was perfectly happy if 10% of the class would “get it.” For everyone else, “work harder” — that seemed to work in many institutions. Then at some point, I was forced to teach an upper division programming-intensive course that had a very strange composition of students: there were CS students there but there were also students from the Business Information Management major who had taken one programming course 2 years before and had no intention of becoming professional programmers. Predictably, the final grades reflected this divide: the BIM students got, on average, lower grades than the CS students. That bothered me. A lot. Unfortunately for me, in this case I could not invoke the slacker argument: the BIM students were at least as self-driven as the CS students, if not more. They tended to be very smart, and they asked really good questions in class. They just didn’t know how to program as well as the CS students, hence the lower grades, because the course assumed the students knew how to program to some level of sophistication.

This was the first time I came face to face with the issue of pedagogy. If these smart, self-driven BIM students were getting lower grades than the CS students, then maybe what I was teaching and the projects I gave them to do were simply not the right thing for them. That was clearly the case. And this was the beginning of my acquaintance with pedagogy. Maybe — just maybe — those other students who I thought “didn’t get it and never will” in previous courses, maybe, they, too, needed to be taught in a different way. Maybe I hadn’t been teaching people at all! I went back to read Paul Graham’s passage. Maybe the students who “got it” would have gotten it without me. And if that was true, then what was the point of being a Professor? That was a scary realization!

Additional data came in the following years, also related to that course. Every year, I also teach the same course at the graduate level. The lectures were exactly the same; the instructional support was exactly the same; the projects were slightly harder at the grad level than the undergrad level; and the grad students had to read papers additionally to the projects. The age difference between undergraduates and graduates was very small: the undergraduate course got mostly seniors in their next-to-last quarter. Here are the grade distributions, even when counting only CS undergraduates:

OK, so all pedagogy parameters being the same, the drastically different outcomes can only be explained by differences in the student populations. Graduate students are ALL highly motivated, self-driven people; undergraduates… there’s a lot more variation. They have stuff going on in their lives — interviews, financial problems, emotional problems… Again, my presence at the graduate level seems irrelevant: those students “get” the material irrespective of me. I can be a Null Professor in that course, and they’ll be just fine. But what about the undergraduates? If I tune my teaching for the self-driven students, and play Null, I’m not really teaching…

How do we teach non self-driven students? Let me play Null Professor here for a minute and suggest that maybe we shouldn’t. Life is tough. When they go out for jobs, no one is going to do their work for them or spend a lot of time coaching them. They need to learn that they need to be self-driven if they are going to get ahead. That’s the “tough love” philosophy. But what’s really going on in their heads? Should we really be this tough or is this just our rationalization of the problem so that we can be lazy?

This leads me to the second point.

Why Students Don’t Get it

As I said earlier on, I was one of the students who first didn’t get programming — at least when compared to some of my classmates. It wasn’t until my 3rd year in college when I finally started to do some real programming projects, that I started to fall in love with it. In my case, the reasons why I first didn’t get it are very clear: I can never appreciate things in abstract. Call me pedestrian. Call me pragmatic. Call me an engineer. That first introductory programming course, where we were taught Pascal — variables, procedures, pointers, etc. — didn’t do anything for me. The examples were so irrelevant and artificial that the whole thing seemed irrelevant and artificial. Give me a real problem, and I’ll likely find a solution for it, paying close attention to anything that might help me solve it; give me a fake problem, and I don’t think it’s worth my time; my brain shuts off. I suspect a lot of people (especially women) are like me.

I’m sure there are many more reasons why people don’t get programming. Here are some possible ones of the top of my head: they get turned off by the know-it-alls in class; they fail to grasp the confusing terminology that Computer Scientists have adopted; the instructor fails to answer their questions appropriately because he/she is also confused.

So I completely second Mark Guzdial’s call for better methods for teaching this material. First of all, teaching should be directed at the average student who doesn’t know much about programming, not at the students who already have considerable experience. In fact, excusing those latter students from introductory programming courses should be the norm. Then, methods that are problem-driven and hands-on rather than abstraction-driven will likely yield better learning outcomes for certain populations (that’s my suspicion). More importantly, we all need to snap out of stereotypes and refuse to accept the pseudo-scientific studies that show one thing or another while ignoring an enormity of confounding factors.

Genetics

A final word on genetics. There is increasing evidence that there are substantial differences in the way that various segments of the population learn. For example, studies have shown that men’s and women’s brains are wired differently. So maybe we need to use pedagogies that work better for each group, instead of uniformly using the white male-dominated learning paradigms that have been forced on us for centuries, only to discover that they tend to turn women off. I am a big fan of the changes that Harvey Mudd introduced in their CS curriculum.