Think Like A Programmer: An Introduction To Creative Problem Solving, by V. Anton Spraul
It should go without saying that this book is most of benefit to someone who is a computer programmer, and especially someone who is skilled enough at C++ to do the exercises in this book. I must admit that I am not the ideal person for this book, not having that sort of programming basis, something that the author repeatedly comments on, such as when he pokes the reader saying: “I’m not kidding about doing the exercises. You’re not just reading the chapters and moving on, are you (109)?” about halfway through the text. No doubt there are many readers of this book like myself who did precisely that, but hopefully there are at least a few readers who can program who take this book to heart because it has a lot to say that is very worthwhile and deserves to be taken as seriously as the author intends it. This is, in fact, the sort of work that should be a part of introductory courses on computer programming that involve teaching C++ as a companion to the work of learning the programming language itself, largely because its approach is solid when it comes to learning how to solve problems and develop the mental discipline and tools of the trade to become a skilled programmer. If I am not such a person myself, at least I seek to appreciate a job well done when I find it .
The contents of this excellent and modestly sized (220 pages or so) book are organized in a thoughtful and disciplined way, as would be expected. After some acknowledgements and an introduction, the author begins by looking at strategies for problem solving that help someone transition from being merely a coder to being a genuine programmer. Then the author looks at pure puzzles, like sudoku, and how they are solved using various strategies that can then be applied to novel phenomena. After this the author discusses ways to solve puzzles with arrays, and then pointers and dynamic memory, and then classes, recursion, and the smart re-use of code by others, before closing with some overall thoughts and comments on how to think like a programmer. Each chapter closes with exercises that the author is very concerned that readers actually try out and work to solve, and the topics get progressively harder as the book goes on, to the point where someone ought to be a fairly expert programmer if he or she has taken the book seriously enough. This is not a book to breeze through, but rather one to take seriously and gradually.
So, having established that this book is most of use to someone who is learning or already at least somewhat skilled in programming in C++, what insights can someone gain from this book if they are not particularly skilled at programming. Fortunately, many of the insights of this book are modular and applicable far outside programming. For one, a great deal of success in life depends on being able to solve problems without getting frustrated or despondent about them. Likewise, a great deal of problems in life are modular in fashion and easier to deal with when appropriately divided and handled in isolation and in a certain sequential order. Also, learning how to solve some problems improves one’s skill set for other problems. The author also makes sound points on knowing one’s personal patterns and tendencies and not seeking to rely on people working against them, but rather working with them in some fashion by prompting conscious thought and reflection. There is a lot to appreciate on this book on every level, and not just as a practical guide to computer programming, but also as someone who thinks about problem solving on wider levels.
 See, for example: