In my absence, some evil person has re-arrange my library. Apparently having the books strewn on the floor is not cool, although it make them very accessible.
Since I can actually see all the books now, I thought it would be interesting to list some of the good technical books that I have read. As usual, it is without any particular order, with the only qualification is that reading this book literally changed the way I think about software development.
- Domain Driven Design - Evans:
This is a very dry book, but it contains a lot of valuable information. I am not sure if I am at the point where I can really make effective use of DDD, but it certainly change the way I am approaching software.
- The C++ Programing Language - Stroustrup:
If you know C++, you are more or less required to read it, and if you don't, learn C++ and then read it. This book is full of concepts that was very new to me when I read them. It is less useful for me now, but I still believe that you need to have some C++ background to be a good programmer. Until you haven't wrote your own string class you wouldn't understand what the whole fuss it about.
- Patterns of Enterprise Applications - Fowler:
I read this one at about the same time I was digging into NHibernate. It made a lot of sense of NHibernate's code, and at the same time, convinced me that there is no real reason to reimplement those patterns. (One of the reasons that I am a bit scared when someone mention design patterns).
- Working Effectively with Legacy Code - Feathers:
If you have not read it, go and do so. This book is directly responsible for the creation of Rhino Mocks, and it has affected my thinking very deeply. I am applying the same techniques for all code. I have found that it significantly increase my ability to work with complex software.
- Operating Systems Concepts - The dinosaur book:
Again, you really need to read this to be able to do effective in this field. Even if you and the metals are so far away that you need a satellite link to talk to it, you have to understand what is going on. Understanding thread scheduling, interrupts, memory management and its association to the file system, paging and reclamation policies are critical to our ability to figure out how to approach a problem.
- Modern Operating Systems - Tanenbaum:
Similar to the previous book, but give a lower level at some points. I read it about the same time I read Operating System Concepts, and it was very helpful to have two point of view on some things.
- Operating Systems - Design and Implementation - Tanenbaum:
The Minix book, I think of it. Similar to the last two, but with a greater focus of actual code, rather than abstract concepts.
- Practical file system design - Giampaolo (available as PDF):
This is a really interesting book. It focus on a relatively narrow subject, but it is full of interesting tidbits, history, education, constraints and fun. Highly recommended.
- In Search of Stupidity - Chapman:
This is not a technical book per-se, but it is a great book to understand failures in the industry. It is hilarious as well.
- Programming Erlang - Armstrong:
Go and read this book. The language itself is interesting, but it is the concepts that you will be exposed during this book that makes this really fascinating.
- Virtual Machine Design and Implementation - Blunder:
This is not such a good book, but it did ensure that I will get an appreciation for the complexities involved in some tasks. This is a book that shows how easy it is to create a virtual machine. And it very easy indeed. (well, until you have to make guarantees about threading models and memory, need to provide hooks for JITing, debugging and profiling, etc. But the basic stuff is very simple.
- Release It - Nygard:
I talked about this book extensively lately. You really want to read it to get an appreciation about how much better you can take your application's production readiness.
I have a lot more books that I have read, but non of them has really changed the way that I think about software.
Looking at this list, a couple of interesting things come up:
- No specific technology books. Stroustrup is arguably about C++, but I consider this a foundation book.
- No agile books - most of my thinking in agile related topics was from blogs / conversations / experience, rather than from books.
- A lot of low level topics.
I'll leave the interpretation to the reader.