Some time ago I read the book “The Art of Agile Development” by James Shore & Shane Warden and I found a statement that really caught my attention:
A good software design minimizes the time required to create, modify, and maintain the software while achieving acceptable runtime performance.
It seems pretty obvious but despite of that it shocked me. This definition leads to some interesting implications:
Design quality is people-sensitive: a design that assumes some language specific knowledge maybe incomprehensible for a programmer not familiar with that language. So, a good design should take this into account.
Design quality is change-specific: software is designed to be easily changed in some specific ways and naturally it will be harder to change it in a different way. One size does not fit all. So a good design should anticipates what changes will be required.
Modification and maintenance time is are more important than creation time: in most cases the life of a software is much more longer than the time you spend in the creating the software. Because of this you write code once, but it will be read/modified many times. So, a good design priories minimizing maintenance time over minimizing creation time.
Based on the previous three points we could say that the design quality is unpredictable, because you donâ€™t know who is going to maintain the software, you donâ€™t know what changes will be required and you donâ€™t know how much maintenance time will be required. Of course you can have some ideas about these three concerns and the more idea you have, the better your design could be.
I really like this vision. The debate is open.