I keep hearing talk about how “dead-tree books” are going away and have been replaced by the wealth of immediately available information on the internet. Just to make my position clear, that’s a bunch of crap. I do agree that the internet is the best tool for finding quick reference information, however, that river may be wide, but it doesn’t run deep. When you’re in the early stages of your career, and you’re trying to figure out the right code syntax or how to use some API, the internet is your best option. But, when you’re further along, you know how to program, and now you’re looking for in-depth information on how to architect applications, bring a legacy code base under test, or even just a good solid coverage of design patterns, it’s time to dig into those “dead-tree books”.
I read about 40 technical books a year, most of them through inter-library loan with the local universities. Below are a few books that I consider must reads for any .Net programmer whose serious about crafting software.
Agile Principles, Patterns, and Practices in C# by Robert C. Martin and Micah Martin
This is probably the single most important programming book that I’ve ever read. It is a must must must read for any programmer who cares about crafting code and is ready to move their professional skills to the next level. Through stories, pictures, and some well written instructional text, Robert Martin covers architecture, design patterns, TDD, and most importantly, he demonstrates the process that highly skilled software developers use to design code.
Domain Driven Design by Eric Evans
This is the book that really started it all. If you’ve ever heard the terms POCO (POJO), DTO, Repository, Aggregate, or Ubiquitous Language and wondered what the heck those people were talking about, this is the book with the answers. Eric Evans really lays out a road map for where I think we’re going with software development. The examples are in Java, but if that’s a problem then you’re probably not ready for this book anyway.
Applying Domain Driven Design and Patterns by Jimmy Nilsson
Another fantastic DDD book. Jimmy Nilsson builds on top of the foundation laid by Eric Evans and provides a more hands-on, example driven treatment of how to design and build an application using DDD. Even if you never plan to use DDD, this book is full of architecture and software development examples that will make you a better developer. Plus, all of the code examples in this one are written in C#.
Working Effectively with Legacy Code by Michael Feathers
There are a lot of books out there that tell you how to write unit tests, and even how to write code that is testable. We need to know that stuff, but it doesn’t have much practical application for most of us unless we’re on a green field project. Michael Feathers book is the only one I’ve seen that is written for the rest of us. His book assumes that you’re starting with a sprawling, tangled mass of legacy code that you really don’t quite understand, and which you inherited from 10 other programmers who no longer work for the company. He then takes you through a catalog of hands-on techniques that you can use to safely refactor pieces of that codebase, nail down the functionality of those pieces with high level tests, and then bit by bit, safely bring that monster codebase under unit testing.
Four books is probably enough for now. There are a lot more (like John Skeet’s C# book) but these are the ones that I think are most important and relevant to the direction that .Net development is going. So if you haven’t had a chance to read any of these, dust off your library card or your Amazon account and give them a look. See if you agree that these books provide something that you just can’t find in a Google search.