Research Vision

Effective programming systems are built upon a solid understanding of both the user needs and how programming affects their work. Programming systems (languages, interfaces, assistants) are ubiquitous, yet the design of most of them is still technology-first, requiring users to adapt their behavior to the affordances of the tool. My first research agenda contributes theories of how people—especially novices and end-users—use programming for their day-to-day work to drive the design of user-centered programming systems. To construct the theories, I apply one of the following HCI and social science approaches: interviews, contextual inquiry, in-lab studies, web-based controlled experiments, workshops, field observations, and grounded theory.

My recent work shows how live programming affects student learning, debugging GUI applications, and validating AI-generated code. Currently, I am conducting a grounded theory study on the use of Jupyter notebooks for day-to-day work across various disciplines.

Code is the low-level representation of one’s higher-level ideas. Programming interfaces should let users not only write code but also stay in sync with their ideas. Existing programming interfaces don’t quite support interacting with programs from different levels of abstractions, let alone showing the correspondence between levels. In other words, programmers could easily get lost in the low-level details of code and lose track of the high-level ideas the code intend to convey. My second research agenda builds programming interfaces as effective medium for communication.

I am currently designing Jupyter notebook interfaces that always make notebook narratives clear while aligning the narratives to the notebook content, including code, output, and textual remarks.

Programming assistants should help users at the right time with the right amount of help, actively. Existing programming assistants are either passive, providing help only upon request, or arbitraryly active, always trying to help and inducing distractions. My third research agenda explores programming assistants that imply user workflow and actively provide appropriate help.

My recent work confirms that different stages of debugging calls for different levels of live programming. My ongoing work aims to derive a model of how users perform different tasks in Jupyter notebooks. I hope to design active notebook assistants based on such a model.