At CMU, I used to teach a junior-level computer architecture course that was required of all CS majors. I really liked showing how to construct a 5-stage pipeline to implement a processor that could execute MIPS code, as well as nuances of cache design, virtual memory, and data storage. Unfortunately, the students did not share my enthusiasm. They were much more oriented toward software, and, in their minds, this course formed a not-very-useful, dead-end branch in our curriculum.
Every semester, students fill out evaluations of our teaching. One outcome of these “Faculty Course Evaluations” (FCEs) is that each of us gets scored on “instructor effectiveness” on a scale between 0.0 and 5.0. Here’s what the FCEs looked like for my teaching of computer architecture:
Over time, I tried adapting the course for a much CS-oriented audience. I started going over code examples, showing how C code got transformed by the compiler into machine code, and how this determined how fast a program would run (it was much easier to predict execution time with those early, in-order pipelines), and how by tweaking the code it was often possible to make programs run much faster. Still, the low FCE ratings persisted. Somehow, there was a fundamental mismatch between the focus of the course and what students felt would really matter to them as computer scientists.