I enjoy teaching, especially in small group situations. I like to focus on reusable principles and concepts rather than specific skills, but I also like to teach those principles in modern contexts, so that students can see how the principles fit into the "real world".

I try to focus on teaching material that will stand the test of time, in the opinion of a wide cross-section of the computer science community. If I think that students would benefit from being exposed to unproven ideas, I will emphasize their tentative nature. In areas such as software engineering where there is little consensus about which ideas are "proven", I prefer to be conservative and focus on basics.

Because computer science grows so rapidly, selecting which material to teach in a class is a challenge. I prefer to select a few topics and study them in depth, rather than to skim over a broader selection of topics. My goal is to teach students to think about these areas in the right way, so that if they later need to understand areas we did not cover, they will have useful mental tools and be able to draw analogies to material they have already learned.

I prefer not to assign large workloads to students. In many cases I think that increased workloads do not necessarily lead to increased learning. Of course, there should still be courses oriented around large projects, in which students learn to build complex systems and work in teams, and these courses will necessarily impose a heavy workload.