A Personal History Of The CS 135/136 Proposal

I bought a copy of the first edition of SICP with one of the first professional allowances I was given as a new faculty member in the late '80's, and read through it at about the point when I was asked to teach and then to coordinate our existing 1A course under the breadth-first model. SICP was an inspiration when I sought to change that course and approach, and using Scheme in some fashion was brought up in a wishful fashion several times by various faculty members during subsequent redesign of our first and second year courses.

I have not taught a first-year course since 1995. After my sabbatical in 1997-8 (during which the decision was made to move from Pascal to Java as first language), I served for four years as Associate Chair for Curricula. During that time, the major changes to first year involved the creation of first a "prequel" to the 1A course, and then the two-course alternative (now CS 131/132 as an alternative to CS 133).

Just after I left the Associate Chair post, the president of UW announced an initiative to use C# as the teaching language in first year, coupled with a donation from Microsoft. This was controversial not only because of the involvement of Microsoft, but because the initiative had not gone through normal curricular challenges. I was asked by Mark Giesbrecht, the new Associate Director for Undergraduate Studies (himself acting on the request of the Director) to chair a small committee evaluating C#. I opened a public forum for this purpose.

The committee was shut down after a short time by a vote of the School of Computer Science, but not before I had received letters advocating the use of Scheme, including one from Matthias Felleisen. (To be honest, he confined his initial remarks to a comparison of C# and Java, disqualifying himself from further comment as a "competitor"; I solicited a followup from him on the nature of this "competition".) His letter made me aware of a viable alternative to SICP, and I investigated his approach further, for my own interest. I bought a copy of HtDP in fall 2002, and read through it. At the same time, in CS 341 (Algorithms), I was having difficulties with students who appeared to have weak analytical skills, in contrast to the last time I taught the course. They had problems both developing pseudocode to solve problems and converting such pseudocode to programs.

I tried out some of the early material in HtDP with my ten-year-old daughter, who was interested in learning about programming. Though we didn't get very far due to time constraints, the appeal of the approach was made clear to me. In fall 2003, I was teaching CS 251 (Computer Organization and Design). There is no real programming in this course, but students at one point have to add a new instruction to a multicycle datapath, which basically means adding a new series of register transfers that implement the instruction. At another point, they must do the same on a microprogrammable datapath, which involves writing a short microprogram (less than a dozen microinstructions). A large number of students simply copied the examples done in class and tried to modify them slightly, instead of thinking about what needed to be done and writing new code. They lacked the analytical skills to decompose the task and to verify that their solution was correct in the absence of a real machine on which to test it. Combined with my CS 341 experiences, this convinced me that I had to understand what students were learning in first year in order to more effectively teach them in followup courses.

At a family dinner with Mark Giesbrecht in the fall of 2003, we were discussing alternate course choices such as CS 365 (an alternative to CS 360) and CS 371 (an alternative to CS 370). Mark asked if we'd ever considered advanced sections as with the Math courses, and I said we had not seriously considered it, but that something like SICP would be quite attractive to good students and research faculty both. The next day, Mark sent me e-mail saying that the idea was intriguing, and asking if I could provide some more details.

I bought a copy of the second edition of SICP and read through it, but it quickly became clear that the core audience would be fairly small. The advanced math sections sometimes suffer from the phenomenon of students not recognizing that they do not belong in those sections, and I thought this would be a much bigger problem for us. Then it occurred to me that Felleisen's book might serve as a more reasonable challenge, perhaps coupled with a more gentle treatment of some of the topics from SICP. I read through HtDP carefully, taking notes this time, and at the end I was convinced that, apart from its possible use in an advanced section, it could have a much broader appeal, and serve as an alternative to a Java-only treatment that might address some of the difficulties I had noticed with my upper-year students.

I was familiar with Computing Curricula 2001 from my work on the B.CS degree, though we did not consider changing or augmenting introductory models in that process. To verify that we were actually using an objects-first approach, I read through the current CS 133 course notes and textbook; I also read through the CS 134 course notes (quite familiar, since much of what I had developed had survived the transition to Java) and skimmed the textbook (also familiar, since it is a Java rewrite of a book we used while I was 134 course coordinator).

The elements of this proposal came together with some Web and library research to locate the additional books, journal papers, and conference presentations referenced here. I appreciate the efforts of those who took time to send me e-mail messages (collected at the link visible at the top of this page) and those who engaged me in discussion in my office, the hallways, or the lounge.