Programming for Problem Solving