James Governor, in a post recently on MonkChips, raised the issue about code architecture and complexity, (IBM architects catch lesscode virus? maybe not) that started me thinking about the specific role of architects themselves. The term (or title, depending upon how its used) has a comparatively recent currency, and I suspect really started gaining vogue only about the time that Bill Gates decided to leave the position of CEO for the somewhat nebulous title of Chief Architect. All of a sudden, it seemed, the architecture position in a company become one of the most coveted spots possible, leading to a rather dramatic inflation in the number of “architects” in the field.
When I was a kid in Boy Scouts (lo those many years ago) the troop went on a field trip to a company (likely to someone’s dad, though which of us had such a cool dad I never did find out) that created scale models of prospective office buildings for architectural firms. At the age of twelve, it was perhaps understandable that I immediately equated architects with model builders, even though that wasn’t completely accurate in this particular case. However, the analogy is not a bad one from a programming standpoint.
The models in this case were made of resin and epoxy, replete with little toy figures placed at strategic places to show plastic marketing people entering into these perfect buildings (that analogy is also curiously appropriate, come to think of it…) but it was the idea of being able to get at least a basic sense of how very preliminary blueprints would become real buildings that I found especially intriguing. Now, of course, the resin and epoxy have given way to elaborate computer simulations, superimposed over the existing landscape, with the walls catching the light in scintillating fashion that somehow never quite seems to translate into the real world, but even here what you are dealing with is perfection. A model is fundamentally perfect - it hasn’t yet been eroded by the imperfections inherent in being in the real world, and a good architect understands this (even if they don’t replicate the graffitti, the winos in the back alleys and the effects of corrosive rains when the client comes around).
A few years later, at the University of Illinois, I also saw the model of the architect, and its reality. LIke most schools, the U of I has dorms, almost barracks-like in their design, and the dorms are generally positioned such that students in any given discipline would be parked farthest from where there classes would be, for some truly bizarre reason. For this reason, the dorm I was in happened to overlook the dorms where most of the architecture students were encamped. Thus, I was privileged to witness an annual rite of late spring there - the firing of the models. Competition in the architecture school was tight, and washing out was always a very real possibility. Thus, a not uncommon spectacle at the end of term was the sight of a crazed architect student tossing out his (always his) enamel, resin and epoxy model from the highest point available in the dorms, usually well doused with lighter fluid, along with the subsequent toss of a match to set the whole thing ablaze. After a while, the police and the fire department would show up along with the obligatory psychiatrist, and next time you saw the ex-architect he was usually asking “Do you want fries with that?”. It’s tough being an architect.
An architect must be a polymath. While its not strictly required that an architect be an artist, he or she does need to have the ability to visualize complex systems — buildings, computer applications, and what’s more, communicate those visualizations to others. However, this artistic striving also needs to be tempered with engineering precision, knowledge of human psychology and a fairly deep understanding of business. They should of course know the characteristics of the materials they work with - an architect of buildings must understand materials science and the nature of forces, an architect of code must know how both software and hardware work at a fairly intricate level.
This does not, however, mean that they need to be materials engineers or hot shot programmers, and indeed, too indepth a knowledge of a given domain of programming can often blind people who would strive to be architects from the advantages of taking different approaches. This means that architects must also be generalists, knowing enough in any given area to both assess the technologies in question and to know who to approach to get the detailed answers. I’ve seen too many software projects over the years derailed because an architect/programmer chose what he or she knew to solve a problem rather than what was the best solution overall, especially when that architect was just as likely NOT going to be the one living with actually writing the code.
An architect must also be a systems theorist, something which I believe to be an increasingly critical requirement. Systems theory is the analysis of how agents work across networks, whether those networks are physical (the interplay of forces within a building or a bridge) or metaphysical (the interaction of code components across a distributed environment). Indeed, a systems architect’s primary responsibility is to ensure that all of the components being developed in a given application can work in conjunction with one another. This in turn necessitates developing a head for working with abstraction, typically at a level above (sometimes considerably above) those writing the code segments themselves.
I bring this last point up because it is very much germane to a discussion I’ve had in previous columns — that you cannot eliminate complexity from an application, you can only shift it from place to place. The role of the architect in that regard includes determining where that complexity will emerge, and to insure that the complexity is in general passed on to those programmers (or systems or frameworks or whatever) that are most capable of handling them, reducing the complexity elsewhere in the application as a consequence. Doesn’t always happen of course, but the failure to do that can result in some truly bad architecture, and it seems to come at the point where the architect loses sight of the purpose of the application in the first place.
Going back into the realm of buildings for a minute, a classic case in point is the new library building for the City of Seattle, opened up in Spring 2005. On paper, it looked impressive - a large angled window facade, sections designed to be organic and flowing and non-linear, an aspiring vision for the future. However, somewhere along the line the architect forgot about the two fundamental facets of libraries - it houses books and provides a space for readers to read them. Books are fundamentally rectangular prisms. This in turn means that they work best on linear shelves that can be arranged row upon row, with each row in turn maintaining a specific space between them to let people move through them browsing while at the same time minimizing the distance to insure the storage of a lot of books.
Angled walls and organic, rounded corridors cut down on the available space for books, forcing the need for open terraces that in turn gave the accoustics of the library all of the characteristics of a modern airport terminal. The inefficiency of storage cut down on the amount of space available for books and forced readers to go much farther to find their desired books, which in turn reduced the available space for study carrols and reader areas, and in keeping with the organic motif meant that there were fewer places to sit and read or study, largely in very stylish but incredibly uncomfortable chairs. In other words, it was a nice piece of Modern Art, but as a library it was a disaster, all because the architect failed to take into account the primary aspect of his job - that he was designing a building that needed to serve a very specific purpose with very strong constraints, not indulging in an artistic whim.
It is ultimately a lesson that software architects should take to heart. Design to the needs of the project, not the vanity of the architect, the extent of his comfort with certain technologies, or the desire to end up on the cover of a technical magazine. If the job is done well, most people should not think about it at all, though those that are in the know will certainly appreciate the talent and dilligence (and ultimately will reward appropriately). Let the work speak for itself, not by being flashy and gaudy, but by being well engineed and clearly defined and just as clearly documented. Otherwise you might was well just douse the design in lighter fluid and throw it, flaming, to the commons below.
Kurt Cagle is an author and occasional system architect.


I was at a party Saturday night where I met a woman who worked in materials testing, basically testing various types of building materials for various qualities and then making recommendations to Architects (building architects) about what to use when and why using material X for building Y was not a good idea because building Y will collapse and kill everyone no matter how good material X may look.
To summarize her opinion of Architects (building architects) they're a bunch of idiots without any real world understanding of the materials they're working with, given to off-base and very dangerous theoretical speculations who only care, at the end, that their designs look interesting.
Thank god Software architects suffer from none of the failings of building architects.
Modeling may be the technique but the goal of architecting models is communication. Typically, the consumer/buyer/customer/boss is not a tech savvy decision maker, or at least to the level of detail of those who try to decide if DOM or JDOM are the right technical winners. Hopefully they know other things and have other skills. The architect should be able to bridge the chasm of loss of detailed information.
So before one goes too far in the direction of calling the architect a space cadet (useless purveyor of theories and opinions), keep in mind that that programmers are often those who expose the consumer to the most choices and details that don't contribute to making choice. When faced with too many choices, there are fewer sales.
No winners in the who-has-the-best-dongle debate. If the architect is good at what they do, the programmers and the consumers are well-served. If not, YMMV.
Good posts, both.
I don't think that it's really a question here of who has the better dongle ;-) Ultimately, architects and developers/engineers are (or at least should be) two distinct positions that need one another - I can be both architect and developer, but because they are dealing with periodically conflicting needs, I don't think you can be both for the same project at the same time and be successful at it.
On the other hand, there are incompetents in architecture as much as there are idiots in programming (or engineering), with the one distinction here being that inferior architects can hide behind the shifting curtain of "aesthetics" to hide their own incompetency, while an incompetent programming generally cannot get away from it for very long before they find themselves either limited in their career growth or promoted out to management.
-- Kurt
I think the danger of Architecture in either profession is when it is divorced from reality. Over the years I've started treating "architecture" as a dirty word, only because it has typically been far-removed from the important vagaries of the real world.
You can't argue with the need for taking a "big picture" view of a system. But I can't tell you how many projects I've seen "architected" through diagrams and mounds of dead trees that didn't fit the real implementation of the system. In these cases it wasn't that the coders didn't "get it", it was that the architecture didn't have it all figured out. Humility, I think, is a key to modern software development--we just can't think it all out ahead of time.
To me arguing over whether an architecture-dominated view or a developer-dominated view is a "beer and tacos" argument. Neither one is better, and it's great when you have both. However I would be very wary of working on a project where those roles are separate. Architects who aren't coding are just imagining systems that will never see the light of day. Coders who don't think about architecture (and how to get away with as little as possible) are just wearing out their keyboards.
Fair enough.
You go to a meeting and they bring in the domain modeling tool to do the venerable routine of interviewing SMEs, then use that to extract nouns and verbs which become objects and methods.
1. Is that a good approach to architecture design?
2. Does it matter that one is designing a messaging system or a database?
3. How would you sort the first week of results before sending the architecture draft back to the stakeholders?
Good and bad we have in any profession or position, and in any career, we'll all be both, but mastering simplicity is the secret sauce of both because too complex and too simple are both recipes for do-over.
Good programmers can hide a lot of bad code in a compiled dll just as good architects can hide a bad design in a pretty diagram. Skill at the profession doesn't mean the right choices are made; just that the choices are better exposed or better hidden.
Did anyone take the model, Kurt, and make small bookshelves? Scale...
...you cannot eliminate complexity from an application, you can only shift it from place to place. The role of the architect in that regard includes determining where that complexity will emerge, and to insure that the complexity is in general passed on to those programmers (or systems or frameworks or whatever) that are most capable of handling them, reducing the complexity elsewhere in the application as a consequence.
Excellent description of architects, Kurt. I would just add to the above paragraph that the complexity also gets pushed to the users, sometimes appropriately and sometimes not. That aspect is exposed even more starkly when the "users" are themselves developers (when the "architects" are working on programming languages or library or tool code instead of complete applications).
But on another note, I'm sad now. I chose my current title of "System Architect" without realizing I was emulating Bill. Guess I'll have to change it to CIO or something... ;)
hi kurt Cagle
sory! :(
When I was a kid in Boy Scouts (lo those many years ago) the troop went on a field trip to a company (likely to someone’s dad, though which of us had such a cool dad I never did find out) that created scale models of prospective office buildings for architectural firms. At the age of twelve, it was perhaps understandable that I immediately equated architects with model builders, even though that wasn’t completely accurate in this particular case. However, the analogy is not a bad one from a programming standpoint.