I was recently asked which professional skills were most important for a software architect, and the answers I came up with, I believe, apply to professionals in general. Some of the following descriptions are slanted toward the software architect, but can be applied quite easily to other professions.
Customer advocacy. First and foremost, we have an ethical obligation to our clients to discover and represent their best interests. There are unscrupulous consultants who will milk contracts for as long as they can for their own financial survival, and this is a serious problem because it creates mistrust in our industry and problems for those who are honest. As this problem may be outside of our immediate sphere of influence, I would also point out that even with the best intentions, those who are honest may not be serving the customer’s real needs due to hyperfocus on the detail and technology, and unfamiliarity with the requirements or lack of focus on business needs. Some of this can only come with experience, but I believe we can all learn what our limitations are and to admit when we aren’t seeing enough of the big picture to make a confident recommendation. This is an important focus of systems architecture organizations such as IASA and WWISA. Dan Appleman in a recent Hanselminutes podcast episode covers this responsibility of the Software Architect very well. I had the opportunity to meet Dan briefly at DevConnections, and consider him to be a great role model.
Articulate and organized written and verbal communication skills. Communication skills are the glue that hold teams together and allow a single coherent vision of a project or product to be shared. The most important of these skills is listening, or observation in general, as decisions can only be as good as the information they’re based on. Communication skills can be further broken down for more intense self-examination and improvement: the ability to compose meaningful and relevant messages; delivery of those messages via writing, impromptu speaking, and prepared presentations all require different skills; and observance of social protocol to appear responsive, considerate, etc. When I hear people saying that someone has “poor communication skills”, they are most often referring to a failure to observe social protocol, not that the person isn’t capable of composing and articulating their thoughts well.
Negotiation and conflict resolution. Everything that involves communication contains the potential for conflict. Knowing how to negotiate can prevent daily micro-conflcits from escalating out of control. When we understand that conflict is normal and comes from the interaction of different perspectives, requiring a dynamic, shifting dance of give and take, we can embrace and work with it, using that energy and the diverse perspectives involved to our advantage, fueling our creative processes instead of letting them degenerate into unhealthy ego battles.
Problem-space modeling and creative problem solving. The effectiveness of the solutions we put in place depend primarily on the way we view the problem. Modeling a problem (seeing) is a very creative process, and the ability to be flexible and think outside the box when looking at a situation can lead to much simpler and more effective solutions. Too often, designers assume the first model they imagine “is” the problem, instead of one of many ways to view it, and build their systems with this limiting and often dangerous assumption. A willingness to play and refactor ideas, coming up with alternatives through brainstorming, and synthesizing conflicting approaches, all add to one’s repertoire of visualization techniques, and therefore problem-solving skills.
Risk identification and management. Software development (as with business in general) involves a great deal of risk, with pitfalls around every corner. Incorporating new tools, processes, and team members, solving problems in unfamiliar domains, company acquisitions, etc., can make a project miss schedule and budget targets. Identifying the risks involved requires project experience and good observation skills. Managing them requires organization and a proactive, prioritized approach, as well as planning for several alternatives and mitigations. We start with awareness, then we identify, and finally we can manage and plan around them.
Critical thinking and analysis. Complex software systems are designed and developed too frequently with a casual, shoot-from-the-hip mentality that endangers projects. By thinking through issues with a critical and analytical approach, we can reduce risk substantially and ensure success. The greatest barrier to proper critical thinking is impatience, the urge to jump to conclusions to avoid thought. As David Allen says in Getting Things Done, “You have to think about your things more than you realize, but not as much as you’re afraid you might.”
Strategic (long-term) and tactical (short-term) project planning. Short-sighted design and development, and lack of planning, leads to systems that are incapable of growing with or adapting to changing business needs. Keeping long-term goals in mind ensures longevity and relevance. This depends, of course, upon the resources and leadership of the company you’re working for. You may be working on a project with a short lifetime, or your boss may not be persuaded to invest in strategic moves now to save time and money later. But for most projects, development costs are too great to be wasted on short-sighted expediency. In any case, long-term and short-term priorities and forces must be balanced against one another along the way. Every decision and trade-off will have consequences down the line.
Continuous research on trends and technologies. Long-term strategic planning can’t be effective without knowing the future state of the industry or its many technologies. This is all about “knowing the territory” as Sun-Tzu has described in The Art of War. We must often plan the future state of our software systems to take advantage of technologies that aren’t yet available. This requires keeping ourselves in the loop and on top of our game at all times. This is difficult in a world that is expanding exponentially, and often requires that we find a niche specialization both to differentiate ourselves and to provide more focused value.
Whereas a developer is concerned with doing things right and being efficient, an architect must focus on doing the right thing from a larger point of view. As Peter Drucker writes, “Efficiency is doing things right; effectiveness is doing the right things.” An architect must be effective.
Or as paraphrased by the VisualSVN tag line (quite brilliantly): “Right thing. Done right.”
Couldn’t have said it better myself.