Emergent Design: The Evolutionary Nature of Professional Software Development
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.
Review By: C. David Moye
10/29/2008Scott L. Bain's "Emergent Design", the newest book in Net Objectives' Product Development Series, is an excellent comprehensive survey of modern software engineering practices and principles. Scott's personable and witty writing style makes it easy (and even fun!) to digest abstract topics, such as open-closed and the use of mock objects. The title of the book is a bit misleading though. The topics covered certainly contribute to the ability to allow designs to emerge by increasing agility and gives a nod to the fact that all requirements change over time; but the only example of how to allow a design to emerge as you go is a brief case study in the next-to-last chapter. Given the value provided by the treatment of the topics in the book however, this misnomer is easily forgiven.
For example, despite its name, Appendix B (Overview of Patterns Used in the Examples) is actually a nice stand-alone treatise on some of the more common and useful patterns available to software engineers. Instead of falling into the common trap of simply rehashing the canonical Gang of Four definitions, it takes a novel approach covering the forces (contextual, implementation, and consequent) involved with selected or using each pattern, and provides excellent analogies to both analog and digital examples.
Overall, I think that the book is topical to the emerging profession of software development. It offers new perspectives and provides greater depth on topics that are considered by some (too many) to be voodoo magic, such as automated unit testing, refactoring, test-driven and test-first development. In addition, it introduces new concepts, such as commonality-variability analysis (inspired in part by James Coplien’s Ph.D. thesis and subsequent book Multi-Paradigm Design) and the notion that software value does not have to decay over time. It would make a worthy addition to the library of mid-to-senior level software developers interested in being a part of transforming their craft into a profession. However, only if they actually read it, put the lessons learned into practice, and transfer them to the next generation, will the author's vision of a true software development profession materialize.
Review By: Dan Luciano
10/29/2008In Emergent Design, author Scott Bain explains in the preface that his purpose is to discuss topics that will elevate the business of software development into a true profession. I believe that he has more than achieved that goal in this book. This is a classic and thought-provoking book for the software development industry, and it will be relevant for a long time.
Bain's presentation is concise, and there is enough information provided to get you thinking about how your code should be structured and written. Bain combines design patterns and some best practices in his book. Some of the best practices discussed are unit testing, refactoring, and test driven development. I've already used Bain’s recommendation to have a clean separation of object use and object creation by encapsulating constructors. To me, this advice is one of the highlights of the book. The author also provides references to other books should the reader want to obtain a greater level of detail about relevant topics.
The book contains a case study that ties together many ideas in the book. The book also has an appendix, which serves as an overview of the patterns used in the book. This book is a great addition to my library, and it kept me from referring to the GOF book.
This book is definitely not for the novice user; it's for those who have been developing software for a few years. Readers should be familiar with the topics prior to reading this book. Regardless, even those who have been developing software for a long time will take away a few pearls of wisdom.
I highly recommend this book to everyone who has made a profession of developing software. This is one book that I am planning to buy for my entire staff. Actually, I'm looking forward to reading it a second time to find some of the things that I may have missed. Emergent Design is an outstanding book. I hope the author will continue to write other books along similar topic lines. Emergent Design should be on everyone’s bookshelf.