2 Learning to program : syntax , problem domain semantics , and cliché semantics