I stumbled upon this paper, recently presented at SIGCSE 2008, authored by Stuart Reges. It deals with trying to determine what exactly it is that causes you to “get” computer science. This quote from the introductory session of the paper I thought was pretty good:

Computer Science educators have for years complained that introductory courses seem to be divided between a group of students who “get it” and a group of students who do not. Donald Knuth has written about this phenomenon:

“Educators of computer science have repeatedly observed that only about 2 out of every 100 students enrolling in introductory programming classes really resonate with the subject and seem to be natural-born computer scientists…I conclude that roughly 2% of all people ‘think algorithmically,’ in the sense that they can reason rapidly about algorithmic processes.” [5]

Many computer science education researchers have been exploring the question of what factors predict success in CS1 and CS2 [2, 7]. In fact, Knuth was motivated by just such a study. It was an unpublished study conducted by Gerrit DeYoung in which he found that a measure of quantitative reasoning was not a predictor of success in a course for CS majors but was a reasonable predictor of success in a course for nonmajors. Knuth’s tentative conclusion was that there is some kind of CS aptitude that is not measured by standard tests of quantitative reasoning and that students who lacked that ability were instead relying on general quantitative aptitude.

This certainly sounds about right, and I find it interesting that people are using statistical analysis to figure this out. Anyway it’s really a brilliant paper. I wish I could quote it all, but that would rather defeat the purpose of quoting it.

It looks at aptitude tests for advanced placement in computer science. The punchline is that there were five “powerhouse” questions on the test which predicted success on the test fantastically well.

The most powerful “powerhouse” question was: given a boolean variable b, what does the statement b := (b = false) accomplish? (Side note: the aptitude test was given in Pascal. The equivalent C statement would have been b = b == 0;.)

It seems simple at first, but the more I thought about it, the more it astonished me. Despite the broad range of topics covered by the test—recursion, iterating, manipulating lists and other ADTs, arrays, et cetera—it seems that a huge part of core computer science comes down to whether you “get” that b := (b = false) is just a not operation.

Of course the way I’ve presented it, I’m exaggerating the effect of one question. According to the paper, 60% of students got that question right. Even if we account for the fact that the people writing the test are far from representative, that’s still a long ways from the 2% figure that Donald Knuth gave us.

Since the majority of my teaching career thus far has been with first year students, it’s pretty interesting to read about why some students “get it” and some don’t, and what might be done about it. There’s a well-known phenomenon here, at least, of people who have done extremely well in the typical sciences—math, physics, biology, chemistry, etc.—and then get absolutely destroyed by first year computer science. And, of course, the converse is true as well. Despite the superficial similarities in skill sets between computer science and other scientific pursuits, there seems to be an extra quality at work.

The other side of the coin is that many of the students who “get it” are disinterested in it. Sigh.