Teaching
This page contains a growing variety of information about my teaching. Including information on:
Courses
Below are brief descriptions of some courses I have taught, or will be teaching.
CSSE 404 – Compiler Construction
This course is heavily project oriented. Students implement, in teams of two, a complete compiler for a small, non-trivial language. It is not unusual for such projects to run into thousands of lines of code. As such, students makie a significant commitment in taking this course. But few programming projects allow one to explore the breadth of challenges like writing a compiler, and completing a working compiler is immensely satisfying.
CSSE 490 – Aspect-Oriented Programming
Aspect-Oriented Programming is a new programming paradigm that focuses on “cross-cutting concerns”. Cross-cutting concerns are features of a software system that do not fit the dominant decomposition of the system into modules. For example, in traditional object-oriented programming we decompose the software system into a hierarchy of classes. A cross-cutting concern is one which appears in a large number of classes across this hierarchy. It has been hypothesized that for any sufficiently large software system, no matter what dominant decomposition is chosen, some concerns will cut across this decomposition. Aspect-Oriented Programming languages seek to separate these concerns into modules called “aspects” which are orthogonal to the dominant decomposition.
In this course students will study the AspectJ programming language, the most widely used Aspect-Oriented Programming language. They will learn the language and tools, implement some programs in the language, and read some papers on the development of the language and the paradigm in general. With this background, students will then work in teams to analyze some mid-sized, open-source, object-oriented programs for cross-cutting concerns. The teams will then refactor these programs using an aspect-oriented language.
Students should have completed CSSE 230 and be able to demonstrate a strong understanding of object-oriented concepts.
Statement of Teaching Philosophy
Below is my statement of teaching philosophy. I share it to publicly affirm how important teaching is to me. Unfortunately, our department has recently discovered that some applicants for faculty positions have plagiarized portions of their statements of teaching philosophy. Besides being reprehensibly unethical, this is a certain way to have your application rejected. If you are a teacher, or aspire to be one, please feel free to reflect on my ideas and put any that resonate with you into your own words. But please don’t steal my words.
My Teaching Philosophy
I love to learn. I love the thrill of grasping a new idea, and seeing a student experience that same rush. The opportunity to nurture a love of learning, both in myself and in my students, is one of the main reasons I went to graduate school after spending several years in industry.
But to be a successful teacher, it is not enough to just love learning. One also needs a sound fundamental approach to the mechanics of teaching. In this essay I hope to convey my approach to teaching, and some of the motivation for it. I discuss my approach in the areas of course policies, understanding individual students, and lifelong learning. I conclude by describing the ideal toward which I strive in my development as a teacher.
My approach to teaching Computer Science begins with...
Course Policies for the Teaching of Skills
Much of what we teach in Computer Science is related to the acquisition of skills. These range from very specific skills, like programming in a particular language and environment, to very general skills, like abstractly modeling a particular problem domain. Teaching skills requires different course policies than those needed for content-based materials. My course policies emphasize practice, feedback, assessment, and mechanisms for helping students keep up with their peers.
Acquiring a skill takes practice and my grading policies reflect this. I treat homework assignments as practice opportunities. To avoid penalizing students for their practice work, I do not weight assignments heavily in final grades. Ideally homework would not count toward final grades at all, but the reality is that most students need some concrete incentive to do the homework. I find that basing about 15–20% of the final grade on homework is sufficient to motivate students to do the practice work.
Studies have shown that prompt feedback to students enhances their learning. So it is my policy that the graders and I return assignments and exams to students promptly. For programming problems, my policy is to give the students the input against which their program will be tested. This test input gives students immediate feedback on their answers and allows them refine their answers to be correct.
The grading policy in a skills-based course should result in grades that reflect how well each student has mastered the required skills. Grades are not a tool for ranking the students, so I do not use curve grading. I base grades primarily on group projects and exams, with their contrasting strengths and weaknesses. On the one hand, group projects allow students to demonstrate their skills while working on ideas of personal interest and without the time pressure of exams. Group projects also involve communication skills, both written and spoken, and can help students develop group interaction skills. On the other hand, exams are important in understanding an individual student's grasp of the skills being taught.
The skills that we teach tend to be cumulative. If students have not achieved proficiency on one set of skills, then they will not be able to learn the next set. So, if students do poorly on an exam, it would be a disservice to not take corrective action. My course policies embody this belief. If a small number of students are doing poorly, then I give those students the opportunity to work with me to master the skills and retake an alternative exam. However, if a large number of students are doing poorly, then this is a sign to me that I need to reassess my performance and make adjustments in the course.
I find these policies effective in helping my students learn the skills required in the courses I teach. However, general policies alone are not sufficient to be a successful teacher. I believe that it is also vital to...
Understand the Individual Student
Understanding the individual student entails understanding the student's learning styles, background, and prior knowledge in the subject. To achieve this degree of individual understanding, I strive for a high level of interaction with my students, in an atmosphere of friendly cooperation. Through this interaction I come to better understand their individual needs.
To promote a cooperative atmosphere, I think it is vital that students see me as a collaborator rather than an authority figure—I must listen carefully, validate students' opinions (without necessarily agreeing with them), and be willing to admit my mistakes. When the occasion arises where I must assume more authority, I think carefully through the situation and try to handle it with professionalism and forthrightness.
One way to help students view me as a collaborator is through varying the classroom experience. Techniques I have used include group problem solving and brainstorming sessions, think-pair-share, in-class writing exercises, and other collaborative learning techniques. I am also interested in investigating kinetic techniques. For example, we can model parameter passing in programming languages by having students represent objects and using kite string to represent pointers. Then we can simulate a program by moving students and string around the room.
I promote an atmosphere of friendly cooperation so that students are more comfortable and honest in their interactions with me. These personal interactions are how I come to understand them as individuals. I think regular office hours are essential to promoting personal interaction. I also encourage students to stop by outside of office hours. If I am busy with other things when they stop, I at least take a moment to schedule a time when we can meet. I find it especially gratifying that my former students continue to stop by for advice, or just to say “hello”.
Technology also helps increase my interaction with students. To encourage students to communicate by email, I try to respond to students' messages immediately, even if only to say that I received them and will provide a more detailed answer at a specific later time. (I think simply ignoring messages until I “get around to it” is akin to having students stand at my office door while I pretend they are not there.) A well-structured web site also increases my interaction with students. I have had success including an anonymous feedback form on my course web site. Students have used this form to voice legitimate complaints about homework assignments, suggest alternative grading schemes, and to praise effective teaching assistants.
Adapting to new technology like email and the web is one example of the need for...
Lifelong Learning
The rate of change in knowledge today is extraordinary. Teaching my students to be lifelong learners is vital. This is especially true in Computer Science, where our incredible rate of innovation helps accelerate the rate of change in every other field of study. But as in any discipline, there are core ideas in Computer Science that a student must grasp in order to effectively analyze new ideas. For example, in teaching principles of programming languages, I try to emphasize how learning key ideas like functional versus imperative programming will help them adapt to new programming languages that they will meet during their careers.
For me as a teacher, improving my teaching skills is an important part of my lifelong learning. In this spirit, I like to periodically ask my students for feedback during a course. Typically, this feedback takes the form of a short questionnaire on what is working well and what changes might be helpful. I capture the results from these questionnaires on slides to share with the class at our next meeting. I find the ensuing discussion helpful in responding to their concerns. Sometimes these discussions provide an opportunity for self-deprecating humor that can also improve the classroom environment. But most importantly, I learn to be a better teacher through this feedback.
This effort at self-improvement is a continual process as I strive toward...
An Ideal of Teaching
I view teaching as a calling, and I feel compelled to devote considerable effort to my students and to improving my teaching. My course policies are designed to help students learn via frequent feedback opportunities. I work hard to foster a learning environment and interactions that help me understand the needs of individual students. Gathering regular feedback from my students helps me to continually improve my teaching.
As I endeavor to improve my teaching, I am guided by the belief that all people have an innate love of learning. My overarching goal as a teacher is to help my students recognize their own love of learning. Until I can can do that for every one of my students, I still have room to grow as a teacher. I am eager to continue the journey toward this ideal.