Teaching

I teach computer science with a perspective that attempts to combine formal mathematical reasoning, applied programming skills, and a broad perspective on the purpose and role of a computer scientist in the world. I am a theorist by training, and I enjoy teaching theory of algorithms, artificial intelligence, and machine learning, but one of my great joys as a teacher is connecting these classes and the unique beauties of mathematical thinking with the practical and professional interests of students, in the broader context of our shared society. For better or for worse, algorithmic systems have changed the world, and I want to help students thrive as creators, researchers, and thoughtful citizens in that world.

Pedagogically I emphasize conceptual intuition, formal theory and analysis, practical application with modern software and empirical study, and reflective consideration and articulation of societal implications. I believe all students are capable of substantial growth, and I provide opportunities for demonstrating increased proficiency. To the best of my ability, I seek to attend to the balance of kindness and humane empathy, the learner-as-whole-person, narrow disciplinary techniques, the hard work of learning, and serious intellectual rigor. I want to help all students to feel included, to feel affirmed as human beings with value, and to realize their potential.

Courses

CompSci 330 Design and Analysis of Algorithms [Spring 2025 co-taught with Debmalya Panigrahi, Spring 2024, Fall 2023Spring 2023 co-taught with Pankaj K. Agarwal, Summer 2018]

Algorithms are the mathematical formalizations of computer programs, and computer programs are the implementations in software of algorithms. Students will develop this dual view by considering classic problems in computer science, including sorting, searching, graph problems, multiplication, etc., from a mathematical perspective. Specifically, students will apply classic algorithmic design techniques, including greedy, divide and conquer, dynamic programming, randomized, and approximation algorithms in order to solve variants on these problems. Students will also conduct rigorous analysis using proofs of correctness and asymptotic analysis of efficiency.

CompSci 290-02 Introduction to Applied Machine Learning [Spring 2025, Fall 2024]

Machine Learning (ML) studies techniques to automatically learn patterns from data rather than explicitly programing a behavior. This course explores applications of machine learning in tabular data, computer vision, human language, and reinforcement learning. Linear, logistic, and deep artificial neural networks of different architectures including perceptrons, convolutional neural networks, and transformers, will be utilized. Students will apply all techniques on real data using modern software. Societal and ethical considerations of ML will be examined.

Ethics/CompSci 247s Human Flourishing in a Digital Age [Fall 2024]

The digital age has enhanced human life in many ways: communication is faster, medicine is better, and our knowledge of the world is deeper and broader.  Yet it has also raised fundamental questions about the meaning and purpose of human life: How do digital technologies encourage us to view one another, the world, even ourselves?  How have they changed the nature of work, society, and our own sense of well-being? In light of these and other challenges, this course asks what it means for humans to flourish in a digital age.  As one framework for answering this question, we will consider ways in which technological advances through the centuries have impacted human flourishing.  How have previously new technologies made certain aspects of flourishing easier and other aspects harder?  How have they perhaps even altered our conceptions of what flourishing looks like?  Together, we will ponder a range of aspects of human flourishing, some timeless and others that change over time in response to advances in technology.  In all of this, our ultimate goal is to ponder together how we should practically live in today’s digital age.

CompSci 201 Data Structures and Algorithms [Spring 2023, Fall 2022, Spring 2022, Spring 2021 co-taught with Kristin Stephens-MartinezFall 2020 co-taught with Owen Astrachan]

In this course, you will learn how to analyze, use, and design data structures and algorithms in an object-oriented language (Java) to solve computational problems. Emphasis on abstraction including interfaces and abstract data types for lists, trees, sets, tables/maps, and graphs. Implementation and evaluation of programming techniques including recursion. Intuitive and rigorous analysis of algorithms.


CompSci 216 Everything Data [Spring 2021 co-taught with Kristin Stephens-Martinez, Spring 2020]

Data is the new currency. In every walk of life, people leave digital traces, which are stored and analyzed at both individual and population levels, by businesses for improving products and services, by governments for policy-making and national security, and by scientists for advancing the frontiers of human knowledge. This course serves as an introduction to various aspects of working with data–acquisition, integration, querying, analysis, and visualization–and data of different types–from unstructured text to structured databases. Through lectures and hands-on labs, the course covers both fundamental concepts and computational tools for working with data and applies them to real datasets in a capstone team project.


CompSci 210 Introduction to Computer Systems [Spring 2022 co-taught with Alvy Lebeck and Lisa Wu Wills]

Compsci 210 provides a programmer’s view of how computer systems execute programs and store information. It examines key computational abstraction levels below modern high-level languages; introduction to C, number and data representations, computer memory, assembly language, memory management, the operating-system process model, high-level machine architecture including the memory hierarchy, and introduction to concurrency. Compsci 210 introduces concepts that are broadly applicable across the many subfields of computer systems (big ideas in systems), with specific instances demonstrated through labs and assignments in the class.


CompSci 333 Algorithms in the Real World [Fall 2023, Fall 2021, Fall 2020Fall 2019]

This is a course on the design and implementation of modern algorithms that deal with hard problems and big data. The course stresses application and project based development of algorithmic techniques. Emphasis is placed on algorithmic ideas that have had substantial impact in the real world, including approximation, randomization, hashing, streaming, spectral techniques, optimization, and search. The course is project-driven: students will complete several homework assignments as well as a larger student-driven course project researching, designing, and implementing algorithms for a substantive problem with real world applications.


CompSci 590 Privacy and Fairness in Data Science [Fall 2018 co-taught with Ashwin Machanavajjhala and Xi He]

This course focuses on the design of data science algorithms and characterizing properties of privacy and fairness. Our daily lives are actively being monitoring on web browsers, social networks, wearable devices and even robots. These data are routinely analyzed by statistical and machine learning tools to infer aggregate patterns of our behavior (with applications to science, medicine, advertising, IoT, etc). However, these data also contain private information about us that we would not like revealed to others (e.g., medical history, sexual orientation, locations visited, etc.). Disclosure of such data leads to our privacy being breached. Moreover, acting on data with such sensitive information could result in physical or financial harm, and discrimination, leading to issues in fairness.


Awards