By Gene Hughson
Technical skills are important for a software architect; I think few would argue with that. However, technical skill alone is far from sufficient. Soft skills, particularly those necessary for crafting compromises that reconcile competing viewpoints, are critical.
Jef Claes is a Belgian software engineer who typically blogs about coding and Domain Driven Design. His post, “Solomon, the architect,” captures a vital lesson for architects (and anyone else involved in software development): decisions should not be personal. He illustrates this in the form of a fable about an architect resolving a design dispute between two developers:
“He told them that he liked both of their solutions, but that he couldn’t decide which was the better one. Instead, he would take random parts of each solution and throw them together, to come up with a hybrid solution. This way, nobody loses. Junior number one seemed relieved. He nodded and glanced at his partner. To his surprise, his partner didn’t look very happy. Junior number two blurted out that he’d rather see his own solution in the bin, than to give up conceptual integrity, just because two people can’t agree.”
Part of knowing how to craft a compromise is knowing where you can compromise and where you cannot. Designing collaboratively can yield far more robust designs if the decisions are made on the basis of technical or business merit and not personal relationships. Risking cohesion to soothe feelings is a poor trade-off, even if the feelings to be soothed are your own.
This does not mean, however, that conflict should be avoided. Brindusa Axon, in her post, “The power of Productive Conflict,” points out: “Ironically, teams that avoid conflict, often do so to avoid hurting peoples feeling, often ending up encouraging dangerous tensions. When team members do not openly debate and disagree on important ideas, they often turn to back channel personal attacks, resulting with far more serious damage.”
Any non-trivial application will involve conflicting interests. Scalability and performance concerns tend to complicate designs while simplicity enhances correctness and maintainability. Security both introduces a certain amount of complexity and suffers when there is too much complexity. Addressing these tensions in a coherent manner is a major part of architectural design. Having the maturity to keep your ego out of it makes it more likely to succeed.