problem solving books for programmers