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 theoretician 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 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 333 Algorithms in the Real World [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 201 Data Structures and Algorithms [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 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.

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