Programing for Problem Solving