My research interests span programming languages, human factors, learning sciences, and personal computing. I’m interested in programming languages as user interfaces: in short, how language design affects the way people think about and write programs. For instance, I ask questions about the usability of static type systems, the role of functional programming within computing education, and how provable guarantees might alleviate cognitive load while writing software.
Previously I helped build tools for personal computing and collaboration at Notion; worked in the Early Product Development group at Khan Academy; and interned with the Human Experience and Design group at Microsoft Research Cambridge.
I received my BA in Computer Science from Northwestern University, concentrating in human-computer interaction and theoretical computer science. My studies were supported by scholarships from Google, Microsoft, Palantir, Box, Quip, and others, for which I am grateful, though these companies do not necessarily represent my views. During school I was affiliated with the following research groups:
- Design, Technology, and Research, where I researched CSS inspection with my co-advisors Haoqi Zhang and Nell O’Rourke.
- CS Theory Group, where I researched peer grading algorithms with Jason Hartline.
- Center for Connected Learning, where I worked on NetLogo Web with Jason Bertsche.
I am a classically-trained flutist, currently studying with Evan Pengra Sult. I spend the rest of my time enjoying browser engines, type systems, text editors, Amtrak long-distance routes, WebAssembly, Rust, Haskell, crossword puzzles, jazz, policy debate, document preparation, the Nintendo Switch, backpacking, and critical theory.
Here are a few of my 99 theses:
- Stop using “uni-typed” pejoratively to dunk on dynamically-typed languages
- I wish we understood why programmers have such poor intuitions about performance
- Block vs. inline is a leaky and unintuitive abstraction for document editors
- “Listening and learning” is the new “thoughts and prayers”
- Code review should use a directed graph, not a linked list
- Articulating injustice is more important than, but not mutually exclusive with, preserving your intellectual brand
- Type errors are our friends and teachers (and corollary: Better error messages help users conceptualize compilers as friendly guides rather than angry jerks)
I started my PhD at Berkeley and transitioned to a contracting role at Notion.
I received an NSF Graduate Research Fellowship to support my forthcoming PhD.
I’ve finally implemented inline mathematics in Notion! (See the release notes.) This was a very personally satisfying project, given my longstanding interests in mathematics and document preparation. We’re using the wonderful KaTeX library created by my alma mater, Khan Academy.
Notion 2.7 is released, featuring search that actually works. Previously, Notion search was a major pain point: it was slow, inaccurate, and the interface was clunky. I spent the past several months rethinking and rewriting this feature from head to toe, and I’m really proud of what we came up with!
Firefox 70 is released with Inactive CSS, a new inspection feature which highlights ineffective CSS properties arising from unsatisfied implicit dependencies. This work was directly inspired by Ply. Give it a try!
Attending OPLSS in Eugene. Say hi if you’re around!
Attending UIST in Berlin, where our paper Ply: A Visual Web Inspector for Learning from Professional Webpages received Best Paper Honorable Mention. I presented this work (recording; slides).
Attending Curry On! in Amsterdam.
Started an internship at MSR Cambridge.
I graduated! I was honored to be named Outstanding Senior in Computer Science.
Spoke at the Northwestern Big Ideas Forum, “How We Learn About Learning,” with professors Nell O’Rourke and David Uttal, and fellow undergrad Gabby Ashenafi.
Received a Microsoft Tuition Scholarship for 2017-18.
Ply: Visual Regression Pruning for Web Design Source Inspection is accepted to the CHI 2017 SRC.
Escapades in research and development, ranging from serious research projects to one-off diversions.
RNG mechanics in Pokémon Sword and Shield
I wrote a tool for RNG manipulation in Pokémon Sword and Shield, written using wasm-bindgen. Users enter a seed for an active raid den and the tool calculates the corresponding stats for each possible encounter. Raid generation is implemented in Rust, which is much faster than other Web-based seed searching tools.
Ply: Visual Web Inspection
CSS is syntactically straightforward, but has a steep learning curve and complicated semantics. Inspecting the source of existing webpages can help illustrate concepts, but such webpages are typically too complex to serve as useful learning materials. Drawing inspiration from prior research in both software engineering and the learning sciences, we present a novel web inspection tool and set of techniques for analyzing relevant CSS. We introduce the concept of implicit dependencies between CSS properties, which represent a major source of confusion for programmers. As a result of this work, Mozilla Firefox 70 ships with Inactive CSS to help identify and surface implicit dependencies within the Firefox Developer Tools. Supervised by Haoqi Zhang and Nell O’Rourke. Honorable Mention Paper at UIST 2018, Berlin.
Tracing WebAssembly function calls
Spelling correction with prefix tries
A more performant implementation of Peter Norvig's statistical spelling corrector, written in Go using prefix tries.
Theorems in Markdown
Pandoc is my single favorite piece of software. I use it to compile Markdown documents into slideshows, academic papers, course notes, blog posts, and more. Pandoc already handles LaTeX very well, but I wanted to typeset my notes with proper definition, theorem, and lemma environments using Markdown. This filter compiles definition lists into amsthm environments. It's written in Haskell.
Evaluating peer graders
Existing models for peer grading borrow from the literature on crowdsourcing and forecasting, using a random variable to represent the score reported by a peer reviewer on a given submission. Most models attribute error in reporting solely to the skill of the peer reviewer, which unfairly penalizes peers who report noisy scores on unclear submissions. Building on the
vancouveralgorithm by de Alfaro and Shavlovsky, we use low-rank approximations to factor out reviewer skill and submission clarity. Supervised by Jason Hartline; paper in progress.
Visual regression pruning
We introduce a visual significance heuristic for removing irrelevant CSS source code during web design reverse-engineering tasks. CHI 2017 Student Research Competition Winner, Denver, Colorado.
Guiding Web Inspection with Tutorial Keyword Frequency
In order to bridge the gap between web design tutorials and real-world examples, we extend a web inspector to highlight CSS properties frequently mentioned across a given set of tutorials. Google Scholars’ Retreat 2016, Mountain View, California.
I was a teaching assistant every quarter beginning my sophomore year, sometimes for two courses at once. Terms marked with an asterisk (*) denote a head or sole teaching assistant role.
EECS 396: Software Construction
EECS 474: Probabilistic Graphical Models
Graduate-level Bayesian and Markov network representation, inference, and learning. With Doug Downey.
EECS 111: Fundamentals of Computer Programming I
Fall 2015, Winter 2016, Fall 2016*, Winter 2017*, Fall 2017*, Winter 2018*
EECS 214: Data Structures and Data Management
Spring 2016, Spring 2017, Spring 2018
Data structures and algorithms in C#. With Ian Horswill.