Design Patterns: Elements of Reusable Object-Oriented Software
If you're into collecting classic books across multiple genres, then this would have to be the book you collect to put in your Software Development section without a doubt.
For most developers this would be the book, that they would refer to most, especially if those developers are working with any of the popular Object-Oriented Programming language (OOP) such as;
In fact, even if you're into Functional Programming languages you could probably do with at least giving this book a skim read.
It is worth keeping in mind when reading this book, is that it was originally published in 1994, and may of the concepts and patterns discussed in the book have already been incorporated in various frameworks and libraries which you may find you're actually using many of the patterns and practices without even knowing about it. You may find that potentially you may never need to necessarily implement many of the patterns, however in my opinion it still a great idea to make yourself familiar with them as it will broaden your horizons.
Why I read this book?
I suppose like many developers from my generation, my entry into software development was not a classical academic route. I never studied Computer Science or even a classic engineering based subject at University. Although I had been tinkering and learning about computers throughout my teenage years.
I had initially learned how to start programming computers back when i was 12 years old, when my parents bought me a Commodore 64 computer. Back in those days you had to learn the basics of booting a computer and even some rudimentary commands even to get a game running or installed.
It was background such as this, that has developed a life-long tradition of self learning and education in computer programming. Which I would be the first to admit is not as structured, governed and regulated as a conventional Comp-Sci degree, but on the whole I have never felt out of place in the workplace because of it.
A degree in a particular subject, does not necessarily dictate expertise in any particular subject, all that it verifies is that you can research, assimilate and implement the information. Throughout my career, I have often worked with people who also don't necessarily have degrees in IT or Comp-Sci but are experts in the field. Often it was while studying for degrees in other fields that they stumbled across Software Development and it ignited the passion.
I often do regret not obtaining a degree in Comp-Sci primarily because I also realize what an immensely interesting and absorbing field it it is. Therefore, I often find myself learning or being drawn to related aspects.
Over the years, I had often come across references to Software Design Patterns and have also regularly implemented them, but I never really had a firm grasp of the subject. So I decided to change that, back in 2008 and started studying and learning as much as I could.
I bought this book as part of a whole series of books on the subject, including:
- Patterns of Enterprise Application Architecture,
- Clean Code: A Handbook of Agile Software Craftsmanship
- Domain-Driven Design: Tackling Complexity in the Heart of Software
Essential reading and desktop reference for all enterprise software developers
What I liked about this book
I found the pace and progression of the book to be excellent. The introduction prior to discussing the patterns really helps to help the reader assimilate the information that helps put the entire book in context and prepares you for the challenge to come.
Each pattern is unique in subtle ways that the authors explain masterfully and provides a great discussion and insights on developing software systems.
This book, provides the foundation to start building your knowledge and experience on. In my experience most books on Software Development Design Patterns reference this book. Therefore, you'll probably find yourself continually back to it.
What I didn't like about this book
Most of the code samples in this book are all C++ and based in example projects of early and mid 90's. I personally would prefer to see a revised edition of this book with code samples implemented using updated version of object oriented languages like C# or Java. The Head First Design Patterns book provides Code samples in Java
It was relatively difficult transposing the patterns to either of these languages, however this actually also helped to better understand the patterns, because the book does actually cover quite a lot of detail about the patterns and stopping to think about how to implement them in C#, really helped in comprehending the.
The book, can be a little dense, but that just may be my opinion. I initially found this book to be a little intimidating and probably a little too academic but eventually after a few months of referring back to it started to appreciate it.
patterns that matter, when to use them and why, how to apply them to your own designs, and the object-oriented design principles on which they're based.
Why I recommend this book
This book is not necessarily one you will read cover to cover in a few sittings, rather it will be a constant desktop companion you'll keep referring too.
If my experience is anything to go by, you'll be constantly dipping in and out of the book for years to come. The content is very dry and in some instances could easily cure anyone's insomnia, but if you persevere and break done the consumption of this book to manageable chunks it will undoubtedly benefit your career and understanding of software development.
If you are serious about understanding computer science or software engineering you will eventually be introduced to software architecture. Software Design Patterns can be considered a sub-class of software architecture. Therefore when designing software the same "patterns" tend to occur. This book identifies and explains the well known patterns which the reader can expand upon in their own projects.
Agile coding with design patterns and SOLID principles
Applying principles from this book, will help you create code that accommodates new requirements and unforeseen scenarios without significant rewrites.