problem solving for programmers software development methodology literature review