Learning Program Design