Program design as a winnowing process