Communication is a central aspect in software development. A team can only perform well if the communication between the team members is good. One difficult communication task is to explain reasons for certain decisions.
There are convincing reasons, less convincing ones, misleading ones, ways of persuading people, etc. The following arguments are bad ones:
- “Trust me” – this is no reason
- “My experience tells me” – this does not explain anything
- “Using your reasoning you can excuse bad code” – every single aspect taken to the extreme leads to bad decisions. Just because things can be made too simple, does not mean simplicity is a bad thing, etc.
Principles are proven reasons for judging design solutions. Reasons which do not persuade but point to important aspects of consideration.
By using principles in that way, they become a vocabulary for talking about design decisions–a real principle language.
Sometimes there is a solution which is clearly better than another one. But there are also cases when both solutions simply have advantages and disadvantages without one being clearly superior.
In such a case it is necessary to realize that this is the case and abort the discussion which would not provide any further insights.
Thinking in principles helps recognizing such situations. In such cases the disagreement is not about which principles are relevant or how they are applied. Rather there is disagreement in how to weight the principles. Some developers will find certain principles or aspects more important than others. As long as the weighting is not based on requirements, it is a matter of personal style.
This can also be taken further. Not only developers have their personal styles of design, there are also typical styles of teams or software projects. In one team or project a certain set of principles may be considered the most important while in another team or project a different set of principles is preferred. This connection can be used to explain the style to a new team member.
Lastly principles can also be used for documentation purposes.
Documentation does not mean that there needs to be a heavy-weighted design document. A typical case of documenting or communicating reasons for design decisions are commit messages: