Master Emergent Software Design Through Books
Develop naturally emerging software
Whenever we impose design in software, we prepare ourselves for inevitable failure and slowly produce legacy software. In contrast, when we let our software entities emerge on their own, we achieve much better software design.
Emergent design is the process of evolving systems in response to changing requirements, better understanding of existing requirements, and in response to new opportunities that arise from new technology, better ideas, and a changing world. [1]
While the advantages of the emergent design are numerous, it is not as common as the other software design techniques as it generally requires technical knowledge in different aspects of the software profession.
Natural emergent design can only be achieved once we master the fundamentals of the software engineering practices, principles, patterns among the others as the Test-Driven Development and Domain Driven Design methodologies.
Here in this article, I have listed the great books that will help us construct software by using the emergent, evolutionary design. As the book prefaces describe their intention quite clearly, I let the books describe themselves.
Emergent Design
Developing software, by its nature, is an evolutionary process. What we eventually build is almost always different than what we believe we will build when we start. If this is so, there is great value to the developer to establish principles, practices, and disciplines that will enhance his ability to capitalize on what is known, at any point, and to benefit from the ability to change when new truths emerge over time. [2]
Emergent design is all about code evolution, how to achieve strong and appropriate designs by refactoring code as requirements change, as new requirements are added, and as I come to understand the problem domain more thoroughly. But such evolution is tricky and dangerous if I do not have some way to confirm that each change I make has done nothing to harm the rest of the system. So, I should test frequently, after each individual change… [3]
Building Evolutionary Architectures
An evolutionary architecture consists of three primary aspects: incremental change, fitness functions, and appropriate coupling. In this book, we discuss each of these factors separately, then combine them to address what it takes to build and maintain architectures that support constant change.[4]
Growing Object-Oriented Software, Guided by Tests
Test-Driven Development (TDD) is now an established technique for delivering better software faster. TDD is based on a simple idea: Write tests for your code before you write the code itself. However, this “simple” idea takes skill and judgment to do well. Now there’s a practical guide to TDD that takes you beyond the basic concepts. [5]
Domain-Driven Design Distilled
The purpose of Domain Driven Design(DDD) is to: Provide principles & patterns to solve difficult problems. Base complex designs on a model of the domain. Initiate a creative collaboration between technical and domain experts to iteratively refine a conceptual model that addresses domain problems. [6]
Domain Driven Design teaches a way of thinking to help you and your team refine knowledge as you learn about your business’s core competencies. This learning process is a matter of discovery through group conversation and experimentation.
By questioning the status quo and challenging your assumptions about your software model, you will learn much, and this all-important knowledge acquisition will spread across the whole team. This is a critical investment in your business and team. The goal should be not only to learn and refine, but to learn and refine as quickly as possible. [7]
Related
References
[1] Emergent Design: The Evolutionary Nature of Professional Software Development: Chapter 6
[2] Emergent Design: The Evolutionary Nature of Professional Software Development: Chapter 14. Emergent Design: A Case Study — Introduction
[3] Emergent Design: The Evolutionary Nature of Professional Software Development : Chapter 10. Paying Attention to Disciplines: Unit Testing
[4] Building Evolutionary Architectures : Chapter 1
[5] Growing Object-Oriented Software, Guided by Tests: Preface
[6] The Importance of Domain Driven Design By Raymond Bryant Jr. — Web Article — January 2022
[7] Domain-Driven Design Distilled : Chapter 1