I enjoy teaching both practicing programmers and students here at Case Western Reserve University. My approach whether teaching in an industry setting or in the classroom is the same: a focus on clear exposition with worked examples of key concepts. Lecturing is a form of performance and I try to avoid reliance on highly structured visual aids. It is important to establish a rapport with your audience and I find when I rely on a slide deck to convey my material the connection is lost.
I have lectured on a variety of subjects including: programming basics, software craftsmanship, operating systems, databases, compilers, and program analysis. My lecturing opportunities have come through a number of avenues including: instructing EECS 337 Compilers Design, guest lecturing, departmental colloquia, recitations as a teaching assistant, ACM and Hacker Society meetings, conferences, and internal company training sessions.
When teaching complex concepts such as automatons or grammars, I make heavy utilization of hand drawn diagrams to explain concepts. By drawing, or completing a partially drawn diagram, in front of the class I give the student time to process how the diagram works. They can also see how it is constructed and in what order different components connect. This provides them an intuitive understanding of the concepts involved. When I was a student, the best professors I had utilized the blackboard or document camera and I shamelessly emulate them in my lectures.
I have a learning disability myself so I understand the importance of teaching a concept in a variety of ways. I also understand the importance of accommodating to the best of my abilities the needs of each student in the classroom. When a student is having trouble grasping a concept I try and step back and analyze why they are having difficultly. Is it because they lack background material? Is my explanation difficult for them to understand? Am I employing cultural idioms the student is unfamiliar with? Do they simply need more practice? Whatever a student's difficulty I try my best to support them in overcoming it.
Assignments, projects and homework are an important part of the learning process. Many things in computer programming can only be learned by doing. In the past I designed both written homeworks and programming projects. My written homework focuses on concepts and attempts to re-enforce key theoretical concepts.
The programming projects have a variety of purposes depending on the context. In a software craftsmanship class, the focus is on the construction and formulation of the program itself. Its design and the details like loop construction, the appropriate use of control flow structures, and prop er decomposition into procedures. However, in an upper level class, such as compiler design, I expect the basics to be correct from the beginning and focus on the algorithmic concerns and the challenges of the problem itself. I also begin to emphasize software engineer concerns such as testing, team work, proper use of version control, and planning.
My grading philosophy reflects my philosophy on the design of the assignments. I seek to provide an honest assessment of the student's grasp of the key learning points of the assignment. The purpose of the grade is not to judge how good the student is but how well they understand particular concepts and ideas. I do not believe in force ranking students or using grades to compare the students to each other. Grades are for the benefit of the student for them to assess their progress in mastering the subject.