I have been programming for last 15 years with non-CS degree. Main reason I got into programming was that I liked to learn new things and apply them to my work. And I was able to find and fix programming errors and their causes faster than others. But I never find myself a a guru or an expert, maybe due to my non-CS major. And when I saw great programmers, I observed they are very good, much better than me of course, at solving problems.

One skill I found good in my mid-career is thinking of requirements and tasks in a reverse order and in abstract. In that way, I can see what is really required for me to do without detail and can quickly find parts of solution that already exist.

So I wonder if there are other thinking skills to be a good programmer. I've followed Q&As below and actually read some of books recommended there. But I couldn't really pickup good methods directly applicable for my programming work.

What non-programming books should a programmer read to help develop programming/thinking skills?


6 Answers 6


Thanks for the pointers to the existing questions. The answers to those are rather different to what I understand you want though. I'll give you some suggestions from my own experience. My own degree is in physics, do I came to the field with gaps around formality, correctness/verification, algorithm analysis, dynamic programming, database systems, and to a large extent in the beginning, selection of data structures and algorithms. The most obvious gaps (e.g. data structures and algorithms) I closed early but I still read books in that area, to deepen my understanding, see alternative presentations, and refresh my memory. (I'm around 40, so books work for me :)

Here's a reading list (in no particular order other than it's the order they came to mind).

  1. Programming Pearls (Jon Bentley)
  2. More Programming Pearls (Jon Bentley)
  3. The Art of Computer Programming (Donald Knuth)
  4. Algorithms In C++ (Robert Sedgewick)
  5. The Algorithm Design Manual (Steven Skiena)
  6. The Practice of Programming (Kernighan and Pike)
  7. Elements of Programming (Stepanov)
  8. How to Solve It (Polya)
  9. Structure and Interpretation of Computer Programs (Abelson and Sussman)

I also got a lot out of Writing Solid Code when I read it in the mid-90s. But it's not in the list since it doesn't really relate strongly to thinking skills as such (it deals more with designing APIs to minimise the chance of accidental incorrect use - or at least that was my main take-away from it).

I also got a lot out of Gödel, Escher, Bach (Hofstadter) as a teenager, but it's already mentioned in the answers to the questions you already pointed to. It's a book to read for pleasure, rather than directly to develop one's computer science skills.

I work with a pretty large number of talented programmers, and almost universally they are fans of Programming Pearls. Certainly I wish more of the candidates I interview had read chapter 4 of that book.


First; for any given discipline, there is always going to be someone much better at it in some way. Don't worry about that part.

Then; a CS degree is nice and all that, and the theoretical knowledge it gives you is certainly useful, but it is by no means an indication that someone is a good programmer. Some of the best programmers are self-taught, and believe me, the world is full of CS graduates who couldn't program their way out of a wet paper bag. So don't worry about that part either.

As to what it takes to become a good programmer: I think two things are essential. One is that you need to be able to approach problems in a strictly formal way, and to think at a certain level of abstraction. If you understand pointers and recursion, you are most likely good on this front. The other one is dedication and persistence. Just like any other craft, programming takes tens of thousands of hours of dedicated, focused practice to master, it doesn't happen over night. It takes at least ten years to achieve mastery, one way or the other. If you are passionate, putting in the hours, focusing, and finding ever new challenges is going to be easy; if you're not, I guess it's still possible, but it won't be a pleasant ride.


Remeber whenever you start learning the Programming language First learn the Concept and at once test it means do it practically once you do this exercise you will not forget the concepts and its use.

Next the well known "practice make perfect" and it also applies here in programming. The more you play with the code , run the code, read the existing code to correct it, you would become not good but gr8 programmer.


There are two non-programming books that I think are crucial.

The first is "Lady or the Tiger", by Raymond Smullyan. This is a great set of logic puzzles that sneakily includes a sort of tour of automata theory. Nifty stuff.

The second is "Godel, Escher, Bach: An Eternal Golden Braid" by Douglas Hofstadter, which gets you thinking about recursion and language theory.

If you want good habits for a newbie, read "Apprenticeship Patterns" by Hoover and "The New Programmers Survival Manual" by Carter. Both of these books talk about how to expand your skills and how to expand your career. They take different approaches, but they work well together.


I'm interested in how you evaluate the skill of other programmers.

I think that specific, applicable knowledge creates much more impressive results than general skills do. If you already have a lot of context, and maybe have seen similar problems before, you may be able to find the cause of an issue very quickly. If you already know how to use a set of applicable tools, you may be able to build solutions very quickly. If you don't already have that knowledge, but you do have the necessary skills, it will take you more time to acquire the knowledge you need. If that's the case, you're taking longer to cover more distance, which doesn't necessarily mean you're slower.

Of course, if you can build up knowledge and learn to use tools that will help you later, this will give you an advantage. I find that learning a little bit about a wide variety of topics helps here, as they end up overlapping more than I would expect, and just knowing where to look for the information you need can save a lot of time. But maybe that's just me.


You like to learn new things and can fix errors rapidly. It means you have the two key elements to become a guru: enthusiasm and ability. But you think you never find yourself an expert, maybe you need two things more: focus and time. For example, when Linus Torvalds first released Linux in 1991, no one regarded him as a guru. He is still working on Linux everyday and you can see his merging log from Linux kernel Git repository nowadays. His focus makes him the most famous guru in Linux field. Time is an abstract concept, it means keeping yourself up to date, gaining experience through constant practice, sharing your knowledge to other people and improving with retrospect.

I have the same situation with you. I have been programming for 15 years with non-CS degree (EE degree), and I am always confused by my huge gap with the guru in my field. But I have the dream to become a guru and started to attend an open source project. Thinking skills come from practice and experience. Some books may be helpful, but their significance are mainly instructional. The thinking skills belonging to yourself are from your own experience. Let's start from now on!

Not the answer you're looking for? Browse other questions tagged or ask your own question.