While on the train today I noticed someone reading "Design Patterns: Elements of Reusable Object-Oriented Software", a favorite book of mine for studying and referencing Design Patterns. Striking up a conversation with the reader we both agreed that this was a great book worth studying but hard to apply without practical experience. We also agreed that using this book to "know what's out there" is a powerful tool regardless of the implementation challenges (No one said patterns were easy).
This chance encounter made me think about my own essential reference/study list of technical books, so here are the core items:
This list is only the beginning but does represent the core of what I would recommend to others without hesitation. Unfortunately it is not common to find other engineers who even know of these books and therefore I hope this posting can help bring attention to them. Below is more information about each book, I hope you find it useful.
Disclosure: All book links posted on this site are associated with my Amazon associate id and will make me money if your purchase them using these links.
Code Complete
Code Complete (second edition) by Steve McConnell is an excellent and very comprehensive guide on many facets of Software Engineering. This book covers coding techniques, construction practices, software design, and other topics. Many Software Engineers including myself consider this book required reading and reference. Its wide-range of topics also makes it a really ideal starting point for beginners+.
You can hear more about how this book came into existence by listening to .NET Rocks! Show #215 were Steve McConnell is the guest being interviewed.
Design Patterns - Elements of Reusable Object-Oriented Software
Design Patterns is a book by Erich Gamma, Richard Helm, Ralph Johnson, and John M. Vlissides. This book describes 23 patterns in the context of Object Oriented Design, along with some general concepts important to get you started with patterns.
Patterns make software engineering much easier and consistent when the right pattern is applied to the right problem. Getting an insight into a large number of pattern is the best way to get on track towards actually using them and gaining the added coding efficiency.
To put it simply: don't reinvent the wheel. Use patterns correctly and you will leverage proven approaches to common software engineering problems.
As an extra bonus this book starts with a forward by a Software Engineer, Architect and technical book writer Grady Booch. Mr. Booch has done a lot in the field of Design Patterns to help evangelize the concepts this book covers and deserves recognition.
Refactoring - Improving the Design of Existing Code
Refactoring - Improving the Design of Existing Code is a book by Martin Fowler, Kent Beck, John Brant, William Opdyke, and Don Roberts. As with the Design Patterns book it is very beneficial to include multiple authors under one cover. This provides a variety of insights into a complex topic that one person would have a hard time covering comprehensively.
If you consider yourself a true Software Engineer then Refactoring should already be a concept your familiar with. Luckily this is not a new concept and this book provides before and after code demonstrations of over 70 techniques, helping open the readers eyes to much more then one person can achieve starting from scratch.
As Software gets more and more complex I believe the skill of Refactoring will become critical. The likelihood of design-flaws in first-iteration coding and architecture due to the increased complexity of technology and business expectations will mean Refactoring is the primary, if not the only avenue of increasing code quality and even meeting the final business requirements. Getting it right the first time around is simply not an option in most cases.
Commonality - Not just a training book, but also your reference
One common theme stretches across all of the above books: The ability to read them in a fairly disconnected manner, choosing the topics which apply to you and even using them as a reference for an active project. This is perhaps the reusability/easy access factors that makes these books so successful.
Special Thanks to Robert
One of my former bosses named Robert (my former CTO) deserves a lot of credit as he encouraged me to read and provided me the first copies of these books.
Robert strongly believed that we were not programmers but Software Engineers and therefore must have access and study how to develop software at a professionally level. I hope to post more on my time working for him at a later time.
(Last name not used above to protect Robert's privacy)