Thesis (Ph.D.)--University of Washington, 2015Program synthesis is a family of techniques that generate programs from a description of what the program should do but not how it should do it. By designing a program synthesis algorithm together with the user interaction model we show that by accepting small increases in user effort, it is easier to write the synthesizer and the need for specialization of the synthesizer to a given domain is reduced without losing performance. In this work, we target three tasks to show the breadth of our methodology: code completion, end-user programming-by-example for data transformations, and feedback for introductory programming assignments. For each of these tasks, we develop an interaction model and prog...