Problem solving and the evolution of programming languages