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 discrete math, algorithms, and computational theory, 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.


CompSci 330 Design and Analysis of Algorithms [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 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.