2024 Public Training Schedule
December 9 – 12, 2024 – Agile Analysis and Design Patterns
Half-Day Sessions
(c) 2024 To Be Agile
I believe in the Agile Manifesto. I know most of the original authors and they know that I think they’re pretty cool. They got so much right in such a short amount of space and that’s very admirable.
But there’s one thing that I think they kind of missed the mark on, so I’m going to rant about it. It’s the ninth principal of the Agile Manifesto that says, “Continuous attention to technical excellence and good design enhances agility.”
Enhances? I would like to propose that the Agile technical practices of Extreme Programming and doing emergent design requires, yes requires, continuous attention to technical excellence and good design!
If there’s anything you should take away from this blog series on emergent design, it’s that we have to focus on good design principles and practices and have high code quality in order to be successful with emergent design. There are dozens of good books on software development and software design. Understanding what code quality is and how to achieve it in software is an important set of skills.
Practice 5, Create CLEAN Code, calls out five key qualities that I see in code and recognize as virtuous. All good software development principles and practices in object-oriented programming improve these five code qualities. I describe them in detail elsewhere so here I’ll just mention what they are: cohesive, loosely coupled, encapsulated, assertive, and nonredundant. Each of these terms means something specific in code. They largely apply to object-oriented programs but other programming models and paradigms also support these qualities.
I find that when I only have a short time to spend with software developers, one of the most productive places to start is with these five code qualities because we can easily recognize them in code and when we improve these code qualities, it helps make the code more understandable and testable.
When developers tell me that they’ve tried doing emergent design but failed at it or call it undisciplined then I know that they really don’t understand how to build CLEAN code, which I believe is a prerequisite for doing emergent design.
One of the benefits of emergent design over the idea of upfront design is that in my experience all initial designs are inadequate and as we learn more it often pushes us away from our initial designs. Therefore, we must be willing to change and adapt our design as new requirements demand. This is what emergent design is all about.
If all of this sounds painful when you think about doing it in your code then clearly you have some code quality issues. CLEAN code is a prerequisite for doing emergent design and when code quality is high then emergent design is feasible.
Note: This blog post is based on one of the “Seven Strategies…” sections in my book, Beyond Legacy Code: Nine Practices to Extend the Life (and Value) of Your Software.
Previous Post: « Understand Refactoring
Next Post: Be Merciless »