Program synthesis is an appealing notion: I give you a pretty good (but incomplete) description of a program, and you give me a working program back out. What do successful program synthesis tools have in common? When is program synthesis worthwhile?