Robert G. Rittenhouse
My teaching philosophy is pragmatic. I believe in doing what works. This varies by class and by student.
In planning and teaching a course, class or a curriculum I pose a series of questions:
In a programming class I am typically helping students learn to solve particular types of problems using a particular tool (programming language). Beyond that I am helping students learn general methods of problem solving usable in other programming domains and give insight on picking the appropriate tools for the job at hand. While programming in a particular language and solving particular problems is a useful skill to acquire, in the long term general problem solving abilities are more important.
For some classes, such as Systems Analysis, the majority of textbooks are too sanitized and take too much of a cookbook approach. Students need to understand that computing is situated within real organizations and that real organizations are not as neat as textbooks make them out to be. Working on real projects, rather than textbook cases, is essential.
Classes frequently have multiple goals. It is important to consider each of these, to decide how best to teach it, and how to fit all the goals together. In designing and reviewing curriculum it is important to understand how the courses fit together.
In programming I firmly believe that students need to learn by doing. They need guidance more than instruction.
In Systems Analysis and related classes there is simply no substitute for the real world group project. Students are more motivated to learn if they believe the problems are realistic. I base assignments on real problems and real data, where possible.
Some topics, such as the importance of good design and documentation practices, may be difficult to convey due to the limitations of the academic setting. One way around this is to have students review and work with a sizable body of someone else's code. This is also more similar to the tasks they will face professionally than the standard programming assignments.
Students need to learn to plan their work. Large projects, in particular, need to have frequent and clear milestones.
Tests and examinations serve multiple roles. They provide motivation to students to study areas that may not be directly addressed by their assignments. They point out weaknesses that the student, or I, need to readdress. They also help keep students honest which is, unfortunately, an important factor in today's teaching environment.
Our field is still developing. Students can explore truly new areas. Students react positively when they see themselves engaged in a mutual exploration of new territory rather than simply following a beaten path.
Computer Science remains a dynamic field. It is a continuing struggle to stay up to date. Students need to understand that to be successful in this field they need to engage in a genuine program of life long learning.
Our technologies are far from perfect. It is frustrating to students when our systems are unreliable.
I spend a great deal of time and effort acquiring quality tools for students to work with. My successes in this area include CS1 (cs1.mcm.edu), IBM's DB2 Database, the BSCW cooperative work system, Moodle, and several others. Selecting tools requires striking a balance between capabilities and complexity. The goal of the class is usually not to teach the tool but rather to employ the tool in other areas. Since most students have their own computers it is useful to be able to give them copies of the software in use.
We need to adapt our teaching styles to the new technologies available. As computer scientists we need to be pioneers in experimenting with different methods of teaching. I have been experimenting with the use of cooperative work support systems in project based classes and course management systems in general.
Internships are valuable. They help students connect their studies to their future work. They also help the program stay in touch with the real world.