Teaching Philosophy

Over the past two decades, I have witnessed the expanse of Computer Science as a discipline, from its mathematical foundations to computer architecture to software development. Increasingly, Computer Science has also become a foundation for many other concentrations–a trend I have experienced at the University of Virginia while working with humanities scholars turning toward Computer Science techniques, such as social network analysis, text mining, and machine learning to aid their research efforts. By connecting with and engaging students from diverse backgrounds who have an interest in Computer Science in particular, or its application to another field more generally, I believe we can foster a more well-rounded computing society. Therefore, my goals in student learning are to invest, extend, and engage: I am committed to investing in and mentoring my students of all backgrounds so that they will invest in learning, extend their knowledge, and engage this new knowledge by applying it to their interests and passions. Over the past six years as a faculty member in the Computer Science department, I have grown to see a fourth dimension to teaching: expanding this investment in students to scale in larger class environments.

In order to invest in students, I believe that the best way to fully engage them is to consider the learning process as a mentor-ship, both inside and outside the classroom. In the classroom, this entails being real and honest in connecting with students, getting to know students, taking the time to thoughtfully answer questions, and working their interests into the lecture material. In class and office hours, I use real-life examples and share some of my personal stories and struggles, in order to build a rapport with the students so that they feel comfortable talking about larger life questions as well as the course assignments. My students have thanked me for sharing and showing them that even professors are human. This promotes a more holistic approach to learning and a fostering of intellectual curiosities in the field.

A core part of student growth, and my second goal for student learning, is extending their current knowledge of the subject. I want my students to leave any course with a core knowledge about the topics covered that can be built upon for further work in CS or that gives them useful and relevant tools to apply to their primary or future fields of study. In a typical Algorithms course such as CS4102 or CS3100, this includes the theoretical background, implementation skills, and use of common data structures. In addition, by structuring the course around a collaborative problem-solving environment, it also includes practical life skills such as teamwork and time management.

To assess acquisition of this knowledge, I believe that the best method is through the use of a constant feedback loop. In the classroom this can take the form of a thumbs-up or thumbs-down quick check after introducing a new topic, or a short recap of the material covered the previous day followed by a few moments for questions in small- to moderate-sized classes. In larger classes a brief, potentially anonymous, interactive poll is helpful. By gaining quick real-time feedback, I can tailor both the lecture and upcoming homework assignments to the needs of the students. While this more immediate feedback is useful in determining the aggregate progress of the course, regular homework and tests are still used to measure individual student progress.

Finally, my major goal in student learning is to encourage students to engage their passions within the field. Since I believe that students themselves play the largest role in their learning process, their interests and backgrounds should shape the direction of course examples. To achieve this goal, I intentionally include flexibility into courses, encouraging students to incorporate their own interests, disciplines, and concentration choice into their work. This process celebrates the diversity of the students in the classroom by connecting the material directly to their backgrounds and interests. For example, when designing my Web Development course at ECPI College of Technology, instead of following the course’s traditional “example company”-based material, I encouraged students to choose their own topics. Throughout the course, grounded in their choice, they learned HTML and best practices in web design, ultimately building a larger class project website. One veteran, engrossed in his project because of his topic (guitars), put in extra effort on his website and ultimately incorporated more than the project itself required. In UVA’s Programming Languages for Web Applications course, I followed the same model of flexibility, encouraging students to pick their own project topics, leading to a diverse and interesting set of web applications that students are passionate about: pixel art creators, pixel pet games, map-based social apps, and many more. Students best learn when they are connecting with their passions at the same time they are conquering a new task.

By engaging students from a wide variety of backgrounds, connecting their passions to the course material, and mentoring them beyond the classroom, I believe students bring more of themselves to the subject and through that process succeed, not only as Computer Scientists, but also as Engineers, Mathematicians, and Digital Humanists. They will experience the vastness of the Computer Science field as well as its ever-increasing application domains, embodying the philosophy that “computer science is no more about computers than astronomy is about telescopes.”1

This tailored engagement becomes more difficult as we scale our courses to meet an increasing enrollment in Computer Science courses. I have worked to facilitate and maintain a high level of student engagement even as the number of students in my courses increases, a practice that has directed my research efforts in CS Education. Throughout that work, I studied how students interact on discussion boards (Thinnyun et al, 2021; Lenfant et al, 2023) and collaborate on homework in larger courses with flexible policies (Lin et al, 2021), using those results to continue refining my teaching methodologies. Likewise, I regularly produce and update tools to support a more engaging classroom. For example, an integral part of CS 2110 Software Development Methods is in-class activities, where students worked with their peers to better understand the material discussed during class. During my first semester teaching the course, I realized both the importance of the activities and also the burden on the graders, and created a series of scripts that completely automated the grading process. This allowed the TAs to spend more time with the students while also verifying student effort in the daily activities. These scripts later transitioned to Gradescope autograders and finally into a framework that has helped faculty and teaching assistants in multiple courses quickly produce autograders for their courses. I also helped transition the course to online exams; writing a web-based testing platform to provide students with a familiar syntax-highlighted environment outside of their IDE. In the following semesters, the platform was expanded to include additional programming languages and auto-graded multiple choice questions. The overall process shortened our exam grading time dramatically, providing quicker response time to students and allowing TAs and instructors more time to engage with the students. I believe that we must continue investing in scalable measures that continue to support and encourage student engagement with instructors and course staff.

  1. Commonly attributed to Edsger Dijkstra, but origins unknown.