What is a software architect? This can be a confusing question, for plenty of reasons. One complication is that architects often operate in environments where they do not have the proper authority. Architects in these environments will then understandably tend to focus on the problems over which they have some direct control. As they continue to do this, the commonplace definition of an architect changes, such that you will find architects who begin to believe their role is entirely isolated to the abstract.
The truth however is that while an architect must produce an abstract system design, they must also have a role in the events that occur both before and after this design. Before the design, an architect needs to be involved in requirements selection. I rarely see this occur, but it is incredibly important.
Since an architect’s primary role is to develop the abstract system design, they are in the best position to quickly assess the feasibility of any requirement. Even more importantly, the architect is in the best position to observe the synergistic or conflicting technical nature of multiple requirements. If two requirements both require building the same underlying subsystem, then the cost of developing both is less than the sum of the cost of developing both separately.
After, production of the abstract system design, an architect needs to be directly involved in the realization of those designs through several means. The most basic is through continued guidance in technical implementation and refinement of the abstract system design. An architect should be prepared to field questions from developers, and assist in decision-making, when asked to do so.
An architect also in my opinion should be involved in the development of the architecture. To me, the architecture is not the abstract system design, but the expression of that design. It is not as big as the entire system, but it is an integral and inseparable part of it. Much as all buildings have an architecture, so does every application even if not formally designed. It is however ordinary to call the architecture design, “the architecture”.
Therefore, when I say the architect should be involved in the development of the architecture, I mean he should actually create some of the code for it. Unlike every other activity of an architect, the purpose of coding, as an architect, is not to support the developers, but to support the design. Interacting with your design by implementing and utilizing it will always provide useful feedback.
I often see the argument that building architects do not build buildings used to refute this statement. I have three issues with this argument. One is that while a skyscraper architect may not ever build even part of a skyscraper, I think you would find almost all architects have physically built things of a smaller scale. The process of building, even at a smaller scale gives the architect an insight into the actual process of building.
The second issue is that a building architect will usually inspect a building as it is being constructed, and again afterwards. This process provides valuable feedback which when combined with experience with building smaller objects, comes close to the experience of actual participation.
The third issue is the demands and principles of building architecture are far more stable than software architecture. Thus for a building architect, experience with other projects is more lasting, and feedback from the current project while critical, is less so.
So yes, in the software world it is possible for an architect to get similar experience by coding outside the scope of the project, and by inspecting the system. There are however complications to this approach.
Because the underlying demands and principles change more often, it is necessary to insure that coding endeavors are relevant to the current project. Proofs of concept projects are one method to do this outside of a project, but working within the project will do an even better job of ensuring relevance, so long as the architect focuses on architecturally significant parts of the project, and not minutiae.
In addition, while it is possible to inspect the system code, this is a large part of the overall investment in coding, leaving little gain from not participating.
Another role of an architect is the resolution of technical conflicts that arise between two developers, between developers and requirements, and between developers and design. This is where the issue of authority comes into play, and is an area I have found to be lacking. Except for the area of conflicts between development and requirements, the architect is the individual in the best position to weigh all the trade-offs. When requirements are involved, architects still have a key role, in assessing overall technical impacts.
For conflicts between two developers or a developer and design, the architect ought to have authority. Roles in the best position to weigh trade-offs and choose the best option should be the roles with authority in any given situation. Authority naturally leads to responsibility. Responsibility could be defined as the person you blame, but it really should be the person who exercised authority. It is also important to note the difference between having authority and exercising authority. Choosing not to act is itself exercising authority, by denying it to others, but it is fully possible to be denied the opportunity to exercise authority, while legitimately having a right to.
Somewhat related is the difference of governance and authority. While partially synonymous, governance and authority have different connotations. Governance can be the act of exercising control, and generally implies this, whereas authority is the right to. Since control is such an important topic, these small differences can have surprisingly large impacts. Governance efforts usually attempt to uniformly and consistently exercise control, even when unnecessary. It is much more common to find that individuals or organizations granted authority, exercise that authority much more judiciously.
Architects should strive for this. With a good initial design and a good development team, conflicts that require an architect to exercise authority, should be uncommon. Over application of authority will devalue the efforts of others without positive effect.
As well, application of authority based upon insufficiently complete information will lead to poor decisions. However, when conflicts occur decisions are required, preferably quickly. When data is less complete, the data should be a guide, or tool, rather than the deciding factor. Strict governance based upon strict rules will rarely exceed the performance of heuristic evaluation unless a very complete and descriptive set of data and rules exist. Attempting to lock-in the result of rule-based analysis prematurely is a formula for disaster. The results of rule-based analysis however can provide great benefit in the form of suggestions, if lock-in is avoided, even when data is of low quality. Since as a general rule we are very far from complete measurement, I prefer to avoid strict governance.
So to sum up, for me an architect is an individual who creates and maintains the abstract system design. An architect also must provide guidance based upon that design, both before fully detailing it, and after. Lastly, when conflicts arise that are subjective only to the constraints of the system design, it should be the architect who has the authority to give resolution.
Saturday, May 27, 2006
What is a software architect?
Labels:
general programming
Subscribe to:
Post Comments (Atom)
4 comments:
Consider looking at Alan Kay's "The computer revolution hasn't happened yet" video for an interesting take on what constitutes architecture.
Thanks, I liked the video, but I'm not sure it really answered the question of question of what a software architect is/does. Or maybe I missed it.
I really liked the end though where he stresses not locking yourself into a process, and always reinvent.
I also saw a similarity between what he suggested at using a system to rebuild itself with what is occuring in the .NET space today.
It's somewhat fringe, but very important that many different languages are being built to build to the CLR. Java is picking up on this now and starting similar efforts. Beyond the fringe benefits, I think this has a great deal to do with the evolutionary scale of C# these days, by being able to benefit from things like C Omega, Nemerle, Boo. Many of these were inspired by thinkgs like LISP, ML and Python, but they dabbled in the area of mixing concepts, not previously mixed.
I think before we understand what is architect we have to understand the difference between "design" and "architecture". These words have been used for each other sometimes to mean slightly different things. It is not wrong to say "a building architecture designs a building" but it would be more appropriate to say "a building architect architects a building" and "Office/space designers designs a space/office/part of build". Where building architecture and office designers overlap is on structural requirements, which are coming from office designer and other sources.
Taking this analogy in software development, it almost occurs that between architect and developer there is a gap of "designers". This gray area is partly filled by architects and partly by developers. Generally senior developers come and take the role of creating design artifacts.
Thus the "design", more appropriately in a Java world, constitute object models, database models, framework, artifacts for concurrency, logging etc. Where as "architecture" strictly constitutes node diagrams etc, choice of technologies (based on so many factors that includes (IT) organizations long term technology vision), servers and their hardware configurations etc to support the throughput etc.
By attempting to distinguish between these two words I am essentially putting forth my argument that an architect needs not do coding and for that matter even designing classes etc or even framework classes but must review these artifacts to make sure they do not deviate from his architecture. For example if an office designer would need a window, which is not, there he/she should get it approved from its architect.
You make a good case for why the roles are separate, but what you miss is that writing code is the equivalent to walking through a building.
It might seem natural to equate looking at code to looking at a building, but they are quite different. It is quite difficult to grasp a system without some purpose in mind.
It is likewise difficult to gauge the strength of a system's design by simply reading about it. A building architect has the ability when inspecting a building to feel the strength, or lack of, in the floors he walks on.
But a software architect must not only know the strength of a system, but its flexibility. The best way to determine this is to attempt to change it. There are other ways, but all are more laborious.
The reason an architect should do all of this is not because his code is essential to the engineering of the project. It is because his participation is essential to his understanding of it, which is essential to his ability to guide the project.
Curiously, I would agree with you far more on the points of design. An architect should be careful not to dictate design. Ideally, it is a collaborative process. Reviewing however is too weak. It is not possible to guide a project to create a desirable architecture, merely by snipping at the edges. If the fundamental design is not inspired, then no amount of editing will do.
An architect should do as much design as necessary to create a picture that conveys this inspiration, and work with developers as they inevitably reshape these designs, to insure that the architecture produced is still desirable.
Almost always the most desirable architecture is not the one the architect originally envisioned. Therefore, the architect should be malleable to change. But without guidance, a system will develop an architecture that is not cohesive or strong, and so an architect must be vigilant as well. Without understanding the reality of what is being developed, it is impossible to make these decisions well.
Post a Comment