The next installment of the blogging about teaching miniseries is about the mid-tier courses. I define mid-tier courses to be courses that are taken predominantly by majors and that form the "meat" of our major: the classes that introduce our majors to the large topical areas of computer science. These are courses like computer architecture, algorithms, some of the upper-level programming courses, etc.
The goals I have for students in these courses are obviously different from the goals I have for students in the intro courses. The key difference, obviously, is that these students have already committed to the major, so I don't have to do as much "selling"--they already know that computer science is the coolest major. :) What I need to do in these courses is to provide the students with a solid foundation, both deep and broad, in computer science; to get them thinking about the common questions that are threaded throughout all the subfields of computer science; and to prepare them for the upper-level elective courses.
One term that gets thrown around a lot by my colleagues and me when we talk about these courses is "coding maturity". And that's a good way to sum up one of the main goals of these courses: to get the students to a point where they are more "mature" programmers. These courses are all designed to get the students thinking more carefully about how they write programs: how they choose to store and represent data, how they structure their algorithms, how efficiently the programs run under a variety of inputs, how well the program solves the given problem. So the assignments should require the students to write longer, more complex programs to solve longer, more complex problems, to provide them with the practice that they need to develop "coding maturity". Ideally, these assignments should also present the students with compelling problems to solve. These are a bit easier to identify at this stage, since I can assume a baseline level of programming competence from these students.
Even though I don't have to "sell" CS, I still feel compelled to make CS relevant to the students--to remind them, in a way, that computer science does not exist in a bubble, that it touches almost all areas of our modern lives. And this colors my selection of problems, both to assign as homework and to frame discussion and lecture in class. Hurricane Katrina, sequencing the human genome, the design of the Xbox, web site accessibility, security breaches in the school's computer network--these have all formed the basis of recent examples in my classes. It takes a little effort to come up with relevant examples and problems, but the payoff is huge: the students remember the concepts better, because they are tied to something with which they are familiar; and it gets some of them to start thinking about how they can use computer science to make a difference in the world.
One challenge that I have at this level that I don't have (as much) at the intro level is dealing with students who are not really interested in the subject matter. After all, these courses are the required courses for our major, so of course not all students will be equally enthralled by all of them. The best I can do is to make the subject as compelling as possible to the largest number of students (by using interesting problems, for instance). Failing that, I can still make sure that they leave my course with the general skills they need to succeed in the other mid-tier courses and the electives: coding maturity and the ability to reason about computer science problems.
Next up: The final installment in the series--the upper-level electives.
technorati tag: teaching-carnival