The big problem I see with program synthesis is that specifications will need to be exceedingly complex in order to cover all cases ( http://www.commitstrip.com/en/2016/08/25/a-very-comprehensiv... ). Even then, you’re not going to be able to predict exactly how these black box programs will behave.
Letting the computer the freedom to find those intermediate steps is nothing new (e.g. Koza's Automatically Defined Functions) ; More recently techniques like Open AI Hindsight Experience Replay where the machine is given a strategy to create its own intermediate goals to allow to "learn on his own" to navigate towards the harder objective.
Quite often in the world there is a lot of complexity, but most of the time it either emerges from simple rules (Hi Wolfram :) ), or come bundled from artificial complexity at the boundary (i.e. you need to interface with existing *ware). Artificial complexity will result in complex specifications (2nd principle?), even though you can try either to regularize them (e.g. by putting various constraint on the code size and form), relax them, or approximate them probabilistically by black box where we have the whole literature about searching for neural architecture (AutoML).
Of course, once you wrote it with simple rules, we then call it a game and we already know how to obtain superhuman performance.