For software to consistently deliver promised results, software development must mature into a true profession. Emergent Design points the way. As software continues to evolve and mature, software development processes become more complicated, relying on a variety of methodologies and approaches. This book illuminates the path to building the next generation of software. Author Scott L. Bain integrates the best of today’s most important development disciplines into a unified, streamlined, realistic, and fully actionable approach to developing software. Drawing on patterns, refactoring, and test-driven development, Bain offers a blueprint for moving efficiently through the entire software lifecycle, smoothly managing change, and consistently delivering systems that are robust, reliable, and cost-effective. Reflecting a deep understanding of the natural flow of system development, Emergent Design helps developers work with the flow, instead of against it. Bain introduces the principles and practices of emergent design one step at a time, showing how to promote the natural evolution of software systems over time, making systems work better and provide greater value. To illuminate his approach, Bain presents code examples wherever necessary and concludes with a complete project case study. This book provides developers, project leads, and testers powerful new ways to collaborate, achieve immediate goals, and build systems that improve in quality with each iteration. Coverage includes The book’s companion Web site, www.netobjectives.com/resources, provides updates, links to related materials, and support for discussions of the book’s content.
As I approached the end of this book, I was prepared to give it only two stars. I don't think it's a bad book, but it's a synthesis of ideas detailed more thoroughly in other books--which the author appropriately pointed out in each chapter--that I've mostly already read.
So, if you've already read the following books, you may want to have a look through this one before buying it to make sure it doesn't just repeat what you already know. On the other hand, if you haven't read some or any of the following books, beware that this book can't completely cover everything in them, and you may find yourself wanting more, and buying more books:
* Working Effectively With Legacy Code by Michael Feathers * Refactoring: Improving the Design of Existing Code by Martin Fowler * Head First Design Patterns by Freeman & Freeman, or Design Patterns Explained by Shalloway & Trott, or Design Patterns by Gamma et al * UML Distilled by Martin Fowler * Test-Driven Development: By Example by Kent Beck, or Test-Driven Development in Microsoft .NET by Newkirk & Vorontsov, or other TDD reading, including mock objects in testing * Extreme Programming Explained by Kent Beck, or other readings about agile programming practices * Refactoring to Patterns by Kerievsky
The thing that made me give it an extra star in the end was when I got to the appendix containing the descriptions of patterns. It contains good descriptions of how to test each pattern, including which classes you'll probably want to mock. If you're already familiar with mocking, you'd probably be able to figure out this information for yourself, but it's nice to have the information up front, gathered with the rest of the information for each pattern.
There are not that many books who take a look at the software development profession. This book is one of them, it takes a look on how the profession has developed and is still developing. This professional view is used to look at practices, patterns, and occasionally on software development methods. The biggest benefit of this view that you get a much better understanding on how something works, why you could do it, and when (and also when not). This book therefore contributes to the deployment and adoption of the software engineering technology, a field where we are still learning.
Patterns help professionals to think about problems and solutions. They provide a language to discuss them. They are not a template which can you deploy out of the box, a deeper understanding is needed. That is why this book goes back to design principles like coupling, cohesion, redundancy, coding styles and testability. If you have been a software professional for a longer time, you probably learned about these things, in courses about structural programming, architecture or specific design methods. The concepts are still valid in modern programming methods and languages, and taking a fresh look at them helps you to get a better understanding of patterns, and thus use them more effectively.
This book also explores agile practices like unit testing, refactoring and test driven development. These practices have a long history, and were already used before people started calling them agile. This book describes the concepts and ideas that started the practices, and how they have been developing themselves to become what they are right now. So if you want to know why you should do these practices, and how to do them effectively, this book can help you.
To give an example on how this book is build up, let’s see how it covers the subject change and evolution in one chapter. It starts with the fact that too many projects fail, defining what success would look like. It then goes into the main causes of failure, doings things wrong, and doing the wrong things. Now the fundament is there, change is needed. But that’s not enough; the chapter continuous by describing that change is all around us and is actually something that we experience daily. So in stead of fighting it, let’s accept is, or better, use it to our advantage, and capitalize on it. So to deal effectively with chance, your software will always be evolving, and your development methods should support this to be successful. Most people would agree with this conclusion. But many would have a hard time figuring out how to do it, and in convincing other people why it is so important. This chapter helps them by linking project failure to evolutionary development.
The book takes the reader along on a journey into the profession. This way of exploring takes time, so if you are a person that just want’s to know how to do it, then this book is not for you. But if you want to deepen your understanding of professional software development, then this book can certainly help you with that. This also makes it a good book for managers and consultants that are coaching professionals and teams on their journey to become more effective.
If you know nothing about design patterns, then you probably don't want to pick it up as it doesn't explain them (rather presents them in an appendix).
If you have indeed read a book about patterns (for example Head First design patterns) then this book offers nothing much.
It would be hard to come up with an audience at whom this book is targeted. Pehaps someone who went to sleep in 90's and woke up in 2004 (when it got published) ?
The author spends 25% of the book going on : Patterns are good and helpful, I was stupid and didn't believe it, but I came to see the light.
Almost 60% of material is past, and I am still seeing the phrase "As we will see", when exactly?
While it is true that this book covers existing ground to some extent, it should be noted that the synthesis of numerous techniques into a discipline is, in and of itself, a new idea.
Moreover, the point is not just "hey, here are some neat things you can do to make your job easier." The point is "we need to start holding ourselves to some standards." The individual practices are almost incidental; the principles are the issue.
As one reviewer pointed out, most of the practices in this book are covered elsewhere in more detail. The point of Emergent Design, in my opinion, is to get people /excited/ about the idea of evolutionary software development. It will serve as the seeds of a movement to bring our game up; to stop being the butts of the business world's jokes and start pulling our weight.
This book assembles several software engineering practices into a meaningful whole. Practices includes object-orientation, programming by intention, test-driven development to name a few are a tentative foundation of software development as a profession. To my opinion this is a very interested endeavour. My only regret is the title, which I found misleading. Little time is spent about emergent design. Although I understand it is supposed to result from the disciplined combination of the practices. I found it very difficult in practice, especially on large projects. I wish the book include more pragmatic methodological advices about top-down TDD for instance, test refactoring, or the relationship with planning. Still, I would recommend the book to anyone looking for improving its development skills.
I liked this one cover to cover. Actually, I remember being proud of disagreeing with one point in the book. It was a minor point. The rest was fantastic. Qualities, principles, practices, and disciplines combined with great descriptions of patterns and refactoring to patterns. Did I mention programming by intention? I know it's been said before, but loved Bain's treatment here. Lastly, appendix B, which I have gone back to as a reference often.