I love helping other people learn. Whether I am relating the traveling salesperson problem to students, presenting research at a conference, or explaining the rules of a new board game to friends, it is inspiring to watching their faces light up when they see how a new concept works. I enjoy distilling complex concepts into their salient points and finding just the right analogy to connect for each student.
I find I am most effective as a teacher when sharing my enthusiasm for computer science. Computer science brings the principles of critical thinking and ingenuity to the forefront, as there is rarely one best solution to a given problem. It allows for the direct exploration of many other fields, such as cellular processes in biology, friendship and interaction in social networks, or even logical frameworks for metaphysics in philosophy. By teaching computer science at a liberal arts institution, I have the opportunity to inspire the next generation of scholars and teachers.
The crux of my teaching philosophy is that students must personally experience and embody the material in order to master the subject. First, I use of analogies to make connections between computer science algorithms and everyday knowledge. By relating stacks and vectors to a deck of cards, databases to phonebooks, and search algorithms to navigating through a maze, I try to bring home the sometimes esoteric concepts involved in storing and manipulating information. I also explain the derivation of terms such as concatenation or sentinel, so students can see these words in contexts other than computer science. This is approach is complemented by memorizing language constructs and working through examples, so students have the necessary tools to begin making their own analogies. Students should see that the logic and reasoning involved in computer science is something they do and experience every day, even without using a computer.
Another way for students to personalize the material is through understanding mobile and tangible computing devices. I have begun to incorporate programming for Android devices into many of my courses, and I see that students are engaged and motivated to learn about the principles running these ubiquitous pieces of our modern lives. By personalizing and anthropomorphizing computer in our classroom discussions, and encouraging them to think in terms of behavior motivations and systems of communications, my students can more quickly understand and remedy errors in their code.
I believe the classroom should have a collaborative atmosphere between instructors and students, and thus create a shared sense of community and understanding. When teaching, I prefer to write on the whiteboard, and reserve PowerPoint slides for more intricate demonstrations. This creates a dynamic atmosphere where the students become actively involved in the lecture, as their questions and participation will influence the direction of my examples and focus. I also encourage students to take their own notes, so as to engage them in learning through personally visualizing, discussing and recording each concept. In class, I have students work in groups with their peers on small practice problems. This builds on the collaborative atmosphere and tests students understanding of the material through explaining it to each other. Student feedback should be incorporated as much as possible into daily lecture, so I make a point of starting each semester with a survey of my students' interests and background, and I following up on this feedback with midterm evaluations to make adjustments as needed.
Each course I teach requires substantial background research to be current in the field, since there is almost always a new version of a particular programming language or software package. Because of this rapid evolution in content, my course structure has shifted recently from a purely scientific application of algorithms and programming, toward an infusion of event-driven programming and mobile software development. A typical homework for my courses will include a section on working through a concept by hand, useful for understand the mechanics of an algorithm, followed by a programming section to put the algorithm into practice. For advanced classes, I always incorporate an independent project, which allows students to delve into related topics of their interest and then present their findings to the rest of the class. Many students have found these final projects to be the most valuable part of their education and expand their work into either research independent studies or portfolio pieces geared toward employment. I feel exams should rely less on memorization and more on application of the concepts to new problem settings to test their ability to transfer and abstract the course material. I have also begun conducting oral exams of students in smaller classes, and found that this leads to a greater understanding of the student's mastery of the material.