Over the years, my research projects have spanned user interfaces, software engineering and type theory, but they all share a common goal: to make it easier to produce usable, reliable software. When you observe the work practice of an experienced professional, like a surgeon or a car mechanic, you see efficient, graceful use of task-appropriate tools. In contrast, if you watch an experienced software developer doing an every-day task, you see fumbling, confusion and frustration. Software developers are every bit as trained and talented, but their tools and processes are often poorly suited for their tasks. My group at Microsoft Research, Human Interactions in Programming (HIP), applies user-centered design to software development: studying developers both in the lab and in the field; understanding what is difficult about their typical tasks; building new tools to make those tasks easier; and evaluating those tools with developers. My recent research studies recommender systems for team newcomers, the use of spatial memory to navigate large code bases, retaining knowledge in long-lived projects, and patterns of communication and interruption in co-located and geographically distributed development teams.