Program synthesis is a promising area of research concerned with automatically producing program implementations from high-level specifications of their behavior. Using synthesizers, programmers can write declarative and natural specifications instead of low-level implementations, and the synthesizer ensures that the resulting program does not contain errors.The promise of synthesis is both elegant and compelling: wouldn't it be great if we didn't need to code and the compiler could magically transform a clearly, obviously correct specification into an executable implementation?While this promise is enticing, alas there is no free lunch. Synthesis is fundamentally a search problem over the unbounded space of possible implementations. As a c...