This course teaches the foundation of constructing user interfaces for computer systems. This problem is likely harder than you might think: computer programs very often perform complex tasks, yet users demand and need simple interfaces. Producing such interfaces requires an understanding of both the user—e.g., what are they trying to accomplish? what do they know already?—and the technology—e.g., how can we implement a in a given UI framework the interactions that we want to present the user with, how do we interact with a backend API? In this course, students will develop both their design knowledge, but also their technical skills.