I am in the process of creating a section on Object Oriented design on my web based learning website, and this led me to ask some very basic questions of myself:
What are the goals of good software design?
Here are some points that come to mind:
1. Flexibility: We may have to change the way in which certain things work. The design must be able to accomodate these changes with minimum effort.
2. Extensibility: The software will need new features. The design must be able to accomodate them easily. Ideally we must be able to add new stuff by adding code and not by modifying existing code, because modifying existing code may break stuff that was already working.
3. Maintainability: maintainability = Flexibility + Extensibility ? Perhaps, but also important for maintainability is being able to understand the code. Which can be achieved by assigning appropriate responsibilities to classes, and not abusing inheritance.
These are common, but are there oher goals?
I came accross an article on the net that suggests that the design should be appropriate to the skill level of the team. That is, we should avoid using complex language features if the team in inexperienced, because they may not be able to maintain the code easily. I think this is slightly controversial. Would it not be better to use the complex features (I am assuming that their usage will bring significant benefit), and educate the team on how to use them?
How about Robustness. Can design influence robustness, or is it something that is attributed more to the process (like having a suite of unit tests, etc)?
Where does "Time to deliver" figure? Should it influence design decisions?
Is there anything else that I am missing?
Will appreciate thoughts from other community members.
I am convinced that there is a overall design-goal, leading to most of the other goals: It´s readability. You are writing your Code for other readers. If those readers easily can read and understand, they can maintain and change as well.