I’ve had this entry in draft mode for a while, and seeing as I am likely to have limited access to the Internet next week, it’s probably best that I get it out there. After all, I believe that all constructive feedback (both positive or negative) is useful.
The traditional software architect role is an interesting one. Developers, who choose not to go down the management line for one reason or another, typically take up this role. Defining what an “architect” does in a traditional software environment seems to be pretty well known. Trawling some job advertisements you see role descriptions like, “translate business requirements into a framework”, “high level analysis and design”, and “technological evangelization”. My observations of a real ‘architect’ at work is that they generally do spike-like work, develop a little (but usually not so little) framework here or there, or suggest implementation patterns in the form of a tutorial or cookbook.
As a mad keen developer, who is into Test Driven Development (TDD), constant refactoring, and evasion of Big Design Up Front (BDUF), I question where does this role fit into newer software development processes? I respect these people, because they have been around for much longer than I have. They probably have a wider repository of patterns to drawn upon and the wisdom of learning from many different projects. I question this, because I think the typical responsibilities fail in an environment that I like to work it.
Architects in their traditional sense, typically fail because they work leagues ahead of the development team. Sometimes they run with BDUF, but other times, they do spike work that sets a pattern for a simple use case, but fails to address the needs of many other ones. Since they rarely look back at the things they have done, architects rarely get any feedback, and one of the most useful of eating your own dog food. It sometimes gets to the point where the architect starts dictating architecture with diagrams instead of actual code, failing to see the difficulties of how untestable or how inflexible it might be when actually implemented!
Here is my revised list of descriptions on the software architect role in a modern software development team:
- The architect should be an embedded member of the development team – Like it is important to have a customer representative and a tester during an iteration, the architect must be someone a team member can go to for direction relating to a technical feature when unsure. Although it is okay for architects to work on technical spikes in advance, they should also be looking at the implemented result under all real circumstances.
- Identifying, extracting and naming patterns out of the system – Refactoring code is excellent at a microscopic developer level as you can draw out a better, more maintainable piece of code. Refactoring during an iteration by developers working on stories tend to have too much of a narrow focus to influence a large entrenched system. Excellent test coverage and well-written tests also give the architect an ability to execute on this, without having to leave the code in the state that it is.
- System-wide Odor Purification – Bad smells reside in code all over the place for one reason or another. Identifying bad smells throughout a system, highlighting them, developing a strategy for getting rid of them, or better yet, actually removing them is important. Once again, developers do this on a microscopic level but similar smells may co-exist in several parts of the system.
- Mediating technical discussion – Although BDUF is never useful, it is sometimes to useful for a team to talk about different problem solving strategies (a general approach) to take. Reality will always step in and cause something to deviate from a ‘plan’, and the architect should support brainstorming activities and should be able to step in and prevent discussions that become ineffective, and do turn into BDUF.
I see all your definitions are at a “microscopic” level. Waterfall certainly does not work. But at eh marco level, how does the “architeture” emerge? Through TDD? I think TDD works well at a lower level, but someone has to be responsible for choosing the right framework, protocols, and data format before you start coding for a single user story.
Thanks for the report. Link has been fixed. I agree with you that TDD by itself does not work. TDD + Refactoring to Patterns can lead to better code, but on large system, you could still end up with explosions of patterns that can also be confusing (I believe it is important to use the same patterns consistently across the system).
That is why, if the team cannot take care of this, then it is role of an ‘architect’ is to ensure that these needs are met. On projects I have worked on, there is never a ‘right’ framework/protocol/data format for the life of an entire project. There is a starting point at which the ‘architect’ can help select, but they must continually review these decisions based on how the system actually uses these.
I suppose I should have indicated that my role descriptions are intended to be additional ones on top of what someone traditionally lists as the duties of an architect.
Not really a comment, but a glitch report. “eating your own dog food” is a broken link.
Patrick, one thing to remember is that different teams have different needs.
An architect on a small one-team project has a role that is not too different from a technical lead. Architects in this position get to be embedded in development, do development work, and stay fairly close to the metal. In a larger, multi-team project, the architect is usually further away from the work, which is a shame.
Probably the best description of the architect role I’ve seen is “keeper of the flame”. The architect is the one responsible for ensuring that the system, _as a whole_, maintains conceptual integrity. The techniques (and the required skills) for doing this are different for different team types.
The list you’ve given is what I personally look to see in a team technical (not managerial) lead. Or, to put it another way, what I hope to see in every member of the team. 🙂
Besides all that, an architect should be responsible for the technologies and methodologies to use. He is the one with enough experience to choose between Java or .NET for a particular project, RPC or a message system, XP or RUP, etc.
Since he is the most experienced, he can act as a coach everytime it is necessary too.
Patrick: very nicely put.
Robert, agreed that the architect role will be different in different circumstances. I suppose the point of view that I am taking this from is the one in which XP or Scrum traditionally works best in (teams of 7 +/- 1 or 2). Therefore the role may be different in a larger, multi-team project. The list I composed was intentionally for what I do see as a technical lead (I shudder to think of the day that an architect is the managerial lead).
Mauricio, you do have a good point too that an architect is there to help set up a project, but I think it is much harder to define (or maybe that should be redefine) the role of that person when the project is intended to be maintained for a long period of time. I dislike the idea of architects simply going around, establishing what should and should not be used for every project and then moving on (they lose out on the feedback loop that I consider very important).
Mike, thanks!