In this course, you will learn the essentials of human-computer interaction (HCI). Over the course of a semester, you will learn how to design interactive systems that satisfy and delight users by undertaking the human-centered design process, from ideation to prototyping, implementation, and assessment with human users. You will learn key tools in the HCI toolkit, including need-finding, user studies, visual design, cognitive models, demo’ing, ethical considerations, and writing about your designs. This course also provides a primer on several areas of emerging technology in HCI, such as human-AI interaction and education technology. We will also cover ethics in HCI, including topics like inclusive design and dark patterns. To hone your craft as an HCI practitioner, during this course you will undertake a group project to design an innovative user interface. The final submission will include a working interactive prototype, demonstrations of the interface at a public departmental design showcase, and a written reflection on your design findings. Prerequisite: prior programming experience.
In this graduate seminar, we will explore a growing body of work at the intersection of technology and social justice. A range of areas are included under this umbrella including tech ethics, design justice, algorithmic fairness, as well as work on equity, bias, diversity, and representation in computer science and other related disciplines. In this course, students will read and discuss a wide range of this work, through both critical and generative lenses.
In this course, we explore the design of beautiful programs, and tools that can help people construct them. We study tools and guidelines for making programs literate—where code is interleaved with thoughtful explanations—and live—where the behavior of code is exposed. The foundation of the course is a history of live and literate programs, from visionary beginnings to contemporary, beautiful programs and tools for constructing them. We discuss what is known about the design of readable programs based on empirical evidence. We then critique the elements of live and literate programming tools, including: incrementality, reactivity, support for branching, program organization, collaboration, code generation, and the design of programming environments that edit themselves. As case studies, we consider the design of mathematical proofs in proof assistants, computational narratives in notebooks, interactive tutorials, and visionary program editors like Lightable and Eve.