The last 6 months I've been in a kind of reading frenzy. The goal has been to improve OOD skills and extend the knowledge of Design Patterns.
The first task was to determine which books to read. I wanted to re-read a few books that I have read previously and I was looking for a few new books as well. After a few refinements the list was as following:
|Title||Author||My Rating (Ok,Good,Excellent)and Comments|
|Agile Principles, Patterns and Practices in C#||Robert C. Martin||Excellent|
|Test Driven Programming by Example||Kent Beck||Good|
|Head First Design Patterns||Eric Freeman||Excellent (I actually finished the book because I liked the style, but it was too basic)|
|Object Oriented Analysis and Design with Applications||Grady Booch||Good, but a little dry.|
|Framework Design Guidelines||Brad Abrams+||Excellent|
|Object Oriented Design Heuristics||Riel||OK|
|Composite UI Application Block||David Platt||Not worth reading unless you are a totally newbie to CAB and SCSF.|
Re-read the following books:
|Title||Author||My Rating (Ok,Good,Excellent)
|Design Patterns Explained||Shalloway||Ok – Skim read.|
|Pragmatic Programmer||Andrew Hunt||Excellent – Skim read.|
|Code Complete 2nd Edition||Steve McConnel||Excellent – Skim read.|
|Design Patterns (GOF)||GOF||Good – Read patterns I don't know or don't often use.|
Though outside the scope of the study goal stated above, I also want to read the following books again. They have been gaining significant amounts of dust since last read.
- Peopleware – DeMarco
- Mythical Man Month (Anniversary Edition) – Yourdon
I'm pretty much a book worm. I love to read books and I love to have books. Lots of them. Only the software shelf at home has a total of 114 software related books. (I just counted for this post) That's after tossing out a bunch of books on ATL, C and old versions of SQL Server. It was tough, but even Petzold has left the Shelf. No, don't worry I would never actually throw them out. They just had to leave the shelf.
My reading process
I always take notes as I read. I'm happy to underline and sketch in my books. Most of the notes I don't take are not actually taken when I read. Here's how it goes. I read a chapter underlining and marking up what I think is important. After I'm done with a chapter I take a few minutes and write down the most important headlines that I remember from that chapter. These notes are done in a separate reading notebook and are most often a few keywords or very short sentences. I then go back to the beginning of that chapter and take another 2-3 minutes running through the chapter and see if I missed anything. If I did, I jot down whatever I missed in the notebook. At this point I spend 5-10 minutes (Less if it's really trivial) digesting what I just read before starting the next chapter. At certain intervals, usually when I finish a book, I'll review the comments. I found that these reviews tremendously enhances the amount of information I remember.
I get bored easily. It's a fact and I have stopped trying to fight it. I'm not forcing myself to continue to read a certain book when I get bored and I find most of them are boring at times. Instead I read two or three books simultaneously.
As stated above, the first task was to decide which books to read. The main problem here isn't to decide which books are good or not, but which books are good for you. Here's a few characteristics that I use.
- The objective quality of the content. If it's not good, I don't want to waste time reading the book.
- The Author. I tend to go back to authors I know write books I like.
- Writing style of the author. Many times I find books that are hard to comprehend because the author's style doesn't fit what I catch easily. This is hard to know before you actually start reading the book.
- Relevance of topics included in the book. Too many times otherwise excellent books are littered with topics not relevant to the target audience of the book. I get the feeling that most of the time this is because the author/publisher couldn't/wouldn't target a more specific audience. The end result is a book that is often longer than it should be and less concise.
- Amazon rating. Yes I use that. I have fallen victim of false reviews a few times, but I use the following heuristic to assess the reviews. The number of reviews should be above 10 and there should be a substantial number of votes for the reviews. (I know, substantial is a little vague) But if a book has 25 written reviews and 200 votes where more than 90% of the votes are for the given reviews I tend to trust it. It has served me pretty well.
As I stated above, it's not enough that a book is good, it must be good for you. For this reason it's hard to provide a general guide for what books I would recommend you should read. But I'll try to categorize by level of experience and give it a shot.
No matter what your level of knowledge and experience you have, Code Complete and Pragmatic Programmer are required reading.
If you are new to programming, you should look for reading recommendations elsewhere. IMHO, you will only gain substantially from the above books if you have some programming background. Otherwise they are just overwhelming.
If you're only getting your feet wet with OOD and Design patterns I would suggest the following books in the prescribed order.
- Head First Design Patterns. An excellent book on OOD and Design patterns. The samples are in Java, but that didn't interfere with the reading experience at all. (I don't do much Java)
- Agile Principles, Patterns and Practices in C#. Also an excellent read.
- Take enough time (That would be measured in months) to practice what you just read and come back and review the recommended reading list. 🙂
If you have basic knowledge of OOD and Design Patterns I would suggest the following. I would actually skim the GOF book and then do #1 and #2 and then study the GOF book.
- Agile Principles, Patterns and Practices in C#.
- Design Patterns (GOF)
If you're experienced in OOD and Design Patterns and you have read the books above, you know yourself that reading only gets you that far. Reading more general books probably won't take you to the next level. Find the best developer available to you and spend as much time developing with that person as possible.
Can you recommend any books for me?