[insert title here]

February 28, 2010

Improving the Introductory CS experience

Filed under: Uncategorized — gdb @ 6:14 pm
Today on Zephyr, someone was pulling quotes out of the Reinventing CS50 paper, a paper written by the Harvard introductory computer science lecturer about how he made the course enrollment triple over three years.  One particular quote was the following:
We hypothesized that CS50 suffered from two problems, one of perception and one of design. Although the course was highly regarded, most everyone on campus seemed to think that it should only be taken with caution, not unlike similar courses elsewhere. Opinions were mixed on whether the cause for concern was the course’s workload or difficulty, but the result was the same. The consensus was to beware.
on which this person commented “Great. Another intro CS class made more basic?”  Although the comment itself was intended somewhat snarkily, I think it perfectly captures my chief complaint about the structure of introductory computer science classes at both Harvard and MIT.  Namely, they all start from a low level, assuming no prior knowledge and no particular ability or motivation from students to thoroughly learn the material without lots of outside help.

First of all, the introductory classes relevant for this post are CS50 at Harvard and 6.01 at MIT.  CS50 is intended to appeal to a students with a broad range of backgrounds.  They provide two levels of problem sets (“standard” and “hacker” editions) and three levels of section (“less comfortable,” “somewhat comfortable,” and “more comfortable”) to allow students to tailor their CS50 experience to the appropriate level.  The instructor states that, in order to make the class possible for people with no prior background, grades are relative to your improvement over the course of the semester rather than a measure of your absolute performance.  There is also an open-ended final project, where students are essentially told to make something interesting.

6.01 in contrast is explicitly intended to be a leveling class.  I’ve been told by the department that because MIT has such a wide variety of freshmen (some who have written parts of the Linux kernel, others who are scared to boot a computer by themselves), there needs to be a course that provides a common foundation for everyone.  The course also addresses a second concern, which is that students used to take a variety of courses in specific aspects of computer science (programming, artificial intelligence, robots, etc..) and not get to see how it all ties together until senior year.  For this reason, 6.01 combines little bits of all parts of computer science as a preview of what comes next and how it all binds together.

In both classes, I’ve made the observation that the course staff tends to baby along the students.  Now of course, I understand why this happens, and I agree with some of the underlying motivation.  Some people do come into college without ever having programmed before.  There needs to be a legitimate class for them to learn to program, and that course needs to provide them with resources and extra help and nurture so that they can succeed.  If I had not taken a gap year and spent about half of it teaching myself programming, I would likely have benefited from this sort of treatment.  Programming really requires a certain mindset that is hard to develop elsewhere.  By having a swarm of TFs/CAs/TAs/LAs (whatever you want to call them) ready to walk individual students through any given part of the problem set, one can ensure that students get the right sort of guidance and don’t simply get frustrated and give up.

That being said, both schools have the wrong model.  There can’t be one introductory course that is appropriate for all students.  Even by targetting the middle, the courses cuts off useful learning from the top few percent of students.  CS50 has a better model than 6.01, but at the end of the day CS50′s hacker edition problem sets are still bounded by the pace of lecture.  6.01 is simply mistaken in thinking that it can level the playing field–after leaving the class, a kernel hacker will still be far better at programming than someone with no prior experience.  It will just be that the kernel hacker spun idly while his or her peers learned computer science.

In contrast, consider mathematics or physics at both schools.  Math at Harvard, for example, has a variety of introductory calculus classes (which we’ll ignore) and then three introductory proof-based courses, Math 23, 25, and 55.  Math 23 is intended for students who like math but have never seen proofs before; Math 25 is intended for students who love math, have a patchy background, but really want to delve into the subject; and Math 55 is intended for students with extensive background and who want to live and breathe math for a year.  Harvard Physics similarly has Physics 15a and Physics 16, the latter of which targets students with background who want an intense first experience.  From what I understand, MIT has similar granularity of introductory classes. This setup allows everyone to truly achieve at their own level.  Now think about how painful it would be to shove all math students into the same introductory course.  Everyone learning the same material at the same pace… and yet that’s exactly what the CS departments do.

I think the solution here is clear–there needs to be a CS55, an introductory course that is explicitly for people with background who want to fry their brains.  I’ve talked to some professors in the Harvard CS department, and they’ve all said that this idea seems reasonable, and is in line with discussions they’ve been having.  It may well be that in a few years, Harvard has exactly that course.  I hope that MIT is considering doing the same.

4 Comments »

  1. I like your ideas here, and I wish I were so optimistic as to think that MIT’s CS faculty are thinking of implementing them. I’ll also note that “aiming at the middle” cuts off learning for the people at the lower end of the preparation spectrum, who need this sort of babying. It’s tough to be learning about some relatively theoretical CS concept and also be worrying about semicolons.

    6.01 aims pretty squarely in the middle, which is problematic because I really think the distribution is closer to bimodal. I don’t have data, but it seems like there’s mostly people who hack on kernels and people who have never coded before. I actually found 6.01 extremely worthwhile because I had coded enough to be comfortable coding, but was not an expert and did not know most of the conceptual stuff they taught. I got the impression that most of the rest of the class was either bored or flailing.

    Comment by Alioth — February 28, 2010 @ 6:50 pm

  2. While I’m sure you feel babied in 6.01, the course still requires too much to be a proper introductory class. They do try to make allocations for n00bs by offsetting due dates for a couple of assignments, but this isn’t enough. If you don’t know programming, you either have to do a ridiculous amount of work for some period or fall being.

    Unless they revamp the course, I personally think they should require taking 6.00. If you want to test out of it or you took whatever AP class is offered in computer science, that’s all good, and people can take classes starting at the appropriate level rather than everyone being forced to leap ahead or be held behind.

    Comment by Piper — February 28, 2010 @ 11:16 pm

  3. Back in my day, in 6.001… *shakes cane*

    Actually, back in my day, despite that 6.001 did cover a lot of stuff that I hadn’t been exposed to before, I still felt it moved too slowly, and I desperately wanted a 6.0012 that I could take analogous to 8.012.

    On the other hand, there’s a perception with 8.012 that if you want to major in physics you have to take 8.012 and not 8.01, so if 8.012 is targeted at people with previous physics experience, that’s sending the message that you have to have previous physics experience to major in physics. (I don’t know whether that’s actually the case or not. Certainly I didn’t have enough previous physics experience coming in to be able to take 8.012.) Course 6 definitely doesn’t want to send the message that you have to have previous CS experience to major in CS at MIT (and you don’t!).

    So much of what you come in with academically is a function of privilege — I look at the kids who went to TJ, or had a huge selection of AP and honors and language courses to choose from, with a huge amount of envy, and I’m hugely lucky to have gotten the 3 AP classes and 7 or so local college classes I got in high school. Even only six years on, it’s now much harder for students at my old high school to get those opportunities, due to a variety of administrative and other changes. A lot of my programming experience comes from having gotten interested in it at a formative age, having parents and grandparents who were willing to guide me as best they could, and just being obsessed with it for a decade or so before coming to MIT. Not everybody gets that. Certainly it would have been much harder for me to do the same thing with physics or math had I wanted to, because even those resources wouldn’t have been available to me.

    On some level CS is a more democratic field than physics or math, mostly in that in CS you’re not nearly so locked into an academic career path, and it’s not expected that the brightest 1% of 1% are necessarily going to go academic. (The brightest 1% of 1% are just as likely to swan off and found a startup or work for a Google or something, and even CS academia has a lot more overlap with industry than physics or math academia.)

    There must be some way to meet the needs of the top 1% of 1%, without sending a message to the remaining 99% of 1% that you must be in the top 1% of 1% to major in the field.

    Comment by Kevin Riggle — February 28, 2010 @ 11:21 pm

  4. So before being accepted to MIT I spent some time looking at CMU and Brown, including visiting both colleges and talking to friends, who were CS majors there. I had a reasonable idea of what MIT’s intro CS program looked, and a rough idea of Harvard’s, so that’s what I was comparing to.

    CMU’s intro course sounded a lot like CS50. It was in Java, it was relatively slow …. basically it was glorified AP CS. (They also have the unrelated issue that they separate “Computer Science” and “Information Science” into two separate schools, with the latter _really_ applied and the former _really_ theoretical (as theoretical as you can get without doing straight TCS).

    Brown, on the other hand, was really surprisingly good. They had almost exactly what you proposed — a number of parallel intro courses of varying difficulty. My friend had actually started one of them (he acted as a TA for it this year) and it was really surprisingly good; taught in Scheme, for one thing, and also going pretty far (further than what I think 6.001 did, certainly). So yeah, if you want to reform intro CS education, go look at Brown.

    Comment by Leonid Grinberg — March 1, 2010 @ 3:33 am

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress