In the previous post I talked about software architecture and software architects in general. In this post, I get into some specifics along with recommendations if you find yourself in a similar situation. It is important to note that the advice that follows is for people who want to build good software in a good organization that supports your effort. If you feel (or find) that you don't have the support necessary to get your architecture adopted, you may want to read Terrance Ryan's book Driving Technical Change
Have an opinion
If I could give only one piece of advice to a software architect it would be to have an opinion. Wishy-washy architects who speak vaguely in buzzword driven platitudes are the worst because they are inherently un-fixable. You can fix "wrong", but you can't fix "unclear". Since there are so many possibilities with software the only way you can achieve clarity is through having an opinion and being able to describe/defend it. As an example, it was important to me that the system I designed be asynchronous from the beginning since I knew that we'd need to integrate with some slow external systems. The opinion I formed is:
When the user clicks Save, their part is done. The system should allow them to keep working and then notify them (if necessary) when the processing of their action is complete.
This led to a bunch of design decisions that wouldn't have been nearly as clear if I had a generic "the system needs to be fast" bullet point.
Be wrong early
You have your opinion and you start discussing it with others – your peers, your manager, your team, or whoever else will listen. Be prepared to find out that you're wrong. "Wrong" can come in a bunch of flavors: You've chosen a technology that's going to be difficult/impossible to get deployed, you've designed for a problem that doesn't exist, you failed to consider something that's critical. The "be prepared" part means listening to feedback and watching reactions to find out that something could be wrong even if you're not being told exactly what. It also means separating out general push-back from specific problems, especially from developers. I once found myself in a surprising discussion with a developer over the design of my auditing strategy because he was worried that the database administrators wouldn't handle the data growth well. Notice that that's a general fear that has less to do with the system (after all, auditing requires data growth by definition) and more to do with the environment. We ended up keeping the design after discussing the various ways in which we could address data growth both with and without database administrator support.
Don't ship PowerPoint
If you're an architect, there is a strong possibility that you'll need to put your thoughts and designs into a slide deck to present to others. This is a great exercise as long as you don't see it as your final deliverable. The architecture I found myself designing needed to support several business units and perform a wide range of functions. I had my opinions, I had my designs, but I didn't consider the architecture complete until I'd built at least a prototype. In this case, that actually meant building the first module and I can tell you that things changed substantially from the time the paper design was done to the time we completed that module. Even if you can't build an actual portion of the finished product, you should at least build a representative example of what you've designed and demonstrate that it exhibits the properties for which you've designed.
Know your environment
In the opening paragraph I noted that the advice was for people who wanted to build good software in a good organization. If you're reading this blog, you probably have an idea of what "good software" is (i.e. meets user needs, can be extended, etc.), but you may not know what I mean by "good organization". The cornerstone of a good organization is honesty and most of the organizational problems I've encountered stem from a lack of honesty – anywhere from people kidding themselves to folks outright lying. In the context of development and architecture, you'll know you're in a good place if your opinions are met with open discussion and debate. It's surprisingly satisfying to have someone show you that you're wrong and then watch your design improve as you hash out a better solution together. You'll know you're in the wrong place if your opinions are met with silence, unproductive bickering, or passive aggressive avoidance. If you find yourself in such a place, then once again check out Driving Technical Change or dust off your resume and start to look around. There are too many good places to let the bad ones grind you down.
2 Years ago today, I wrote about centralized architecture groups in organizations. A few months after I wrote that post, I was commissioned to write a whitepaper about enterprise architecture by a local boutique consulting firm. The idea of software architects has been on my mind a lot lately. While I've been selling myself as a Big Swinging Developer for the past several years, I recently found myself in an architect role accidentally. I'll go into some specifics in the next post, but first I want to throw out some of my thoughts on software architecture in general and software architects in particular.
WTF is Software Architecture?
It's one of those terms that seems to mean something different every time you hear it. In the realm of consulting it often translates to "the most expensive PowerPoint slides you've ever seen". My personal definition is:
"software architecture is the collection of hard-to-change decisions about a system"
Decisions like whether to use an ORM, or an Enterprise Service Bus, or how security is going to be handled. These aren't impossible-to-change decisions, but if you've ever been on a project where something of this magnitude was either overlooked or chosen poorly, you know that this kind of mistake threatens to sink a system.
What Does an Architect Really Do?
That depends on two things: The individual and the organization. The problem with the title "Software Architect" is that there isn't a strong connotation of what will be delivered. A "Software Developer" better deliver software. A "Graphic Designer" better deliver designs. A "Software Architect", however, has no corresponding delivery requirements. This is left largely to the individual and it's then often left to the organization to decide whether or not to tolerate what they do all day value the role.
In the past 5 years, I've been fortunate enough to work with the full spectrum of architects and the full spectrum of organizational attitude. My favorite type of architect is one who has a good grasp of how software fits into an organization, the technical ability to address the challenges, and feels a responsibility for the success of the developers who will be implementing the vision. Former colleague Mike was a great example of this. He know his stuff, had strong opinions on the things that were important to him, and always provided a reference implementation to show that his design was practical. My least favorite type of architect is one who generates nothing but documents (PowerPoint being a favorite), dictates "how things should be", and then blames the developers when the vision turns out to be impossible or useless or both.
But architects don't exist without an environment in which to practice, which is why organizations are almost as accountable for architect quality as the individuals. The quality of the environment is more easily determined by what it won't tolerate than by what it encourages. Sure, you want a place that encourages quality work and personal accountability, but that's not enough. What separates the good from the bad is that the bad organizations will tolerate (or even value) the Big Talkers who spend days preparing for a presentation without ever once vetting the practicality of what they're proposing. You probably know who I'm talking about, the folks who will show you super-complicated diagrams of their Service Oriented Architecture but can't answer a single question about how to version or end-of-life any of the listed services. Casting things into "good" and "bad" is a little simplistic, though. There are really 3 types of environments:
The Consciously Good Organization
These are the folks who have their act together. Somewhere along the way, they've committed to creating first-rate systems. If you find yourself in an environment like this, they'll likely have a really good architect who you can learn a lot from. If you're brought into to be an architect in this type of organization, you are being brought in explicitly for the role and you'll have a good idea of what it means to succeed. There is money to be made in a consciously good organization since they tend to pay for quality, but note that the competition for the role will be fierce and you'll have to be really good to land the gig.
The Cluelessly Bad Organization
These are folks who want to be good, but don't know how. Or maybe they don't even know that they want to be good, but they have a feeling that things could be better and are receptive to ideas on how to improve. Honestly, this is my favorite type of environment. There is a lot of money to be made in these types of organizations because they are often leaving so much of it on the table with bad systems. Not only is the money good, but the work will be very pure in that you'll spend much of your time showing them how things can be better and then implementing it. If you are correct in your analysis and solid in your implementation then your work will easily pay for itself and you can continue until you've built them into a sustainable technology powerhouse.
The Delusionally Bad Organization
This is the danger zone, because these folks think they're good but they aren't. Remember when I mentioned that you can more easily determine the quality of the organization by what they tolerate? This is where that little nugget comes in handy. The delusionally bad organization does some things well (and will point them out as evidence that they're "good"), but they tolerate mediocrity to the point where the good stuff almost doesn't matter. The way you can tell the delusional from the clueless is that the delusional will actually know a lot about what it means to design and build first-rate systems . . . but then they won't do it. Instead of building good stuff, everything turns into a messy collection of compromises that's explained away by factors beyond their control. The good news is that there's money to be made in this type of environment because they will, in fact, need help. The bad news is that they will make you earn every freakin' penny of it. The work isn't really the work, the work will be trying to get things done in an environment that thinks it's okay even while things are crumbling around them. You'll suggest a way of doing something, get told that it's not necessary, and then see the negative effects of not having it . . . all before lunch.
Is an Architect Role Right For You?
As you might imagine, the job of software architect isn't for everyone. One of the best programmers I know has no desire to be an architect even though he certainly has the technical qualifications. So how do you know if the position is right for you? I think that before even attempting the role, you need the following:
Wide technical experience with some pockets of depth – you should be able to build everything yourself, even though you won't.
Network operations or sysadmin experience.
Defensible opinions on how software should be built.
The ability to convey complex ideas in simple language.
Ideas about how software and technology can make organizations more successful.
Have I missed any big ones? If so, leave a message in the comments below!
"What should I do?" is another question I hear a lot, especially from the people I manage. It gets phrased differently sometimes:
What would you like me to do?
How would you like this done?
How should this be done?
How should it work?
This may be the most value-robbing question ever. It essentially turns an opportunity to show who you are and what you can do into nothing more than a task to be completed. Asking what should be done is, essentially, asking someone to design the solution to the problem that you've been assigned. When I run a team, I want my team members to design (and implement) the solution. One of my management mantras is, "Bring me options and ask for a decision".
I can hear the naysayers now: "But Jay, not everyone who reports to me can design the solutions to the problems we have."
I'm not suggesting that your only options are what your team brings you, I'm suggesting that before they ask for help they demonstrate an attempt at solving the problem. This is how you build design skills: You practice and you find out where you're wrong. Eventually you get to the point that your designs are accepted by your manager consistently and you get to move up a notch. Without that practice, though, you'll remain stuck where you are.
So instead of finding out (and doing) what you should do, do what you can. Present options to whoever needs to make the decision and if the options are unacceptable, then ask for help. Look for the growth opportunity in everything you do and you'll be amazed at how quickly you grow.
There are a handful of techniques that I rely on to make clients happy. Of these techniques, the one that requires almost no thought, no training, and no special skills is to work hard.
It's also the most effective technique that I've ever used.
There are people who are just as successful as I am that don't work nearly as hard. These people are better at what they do than I am at what I do. They are smarter, luckier, or something-ier than I am and I applaud them for it. I choose a simpler path and one that is much more repeatable and transferable: I choose to work really hard when the opportunity presents itself. I think too many people misinterpret the phrase "work smarter, not harder" to mean "don't work hard, figure out how to get things done without much effort". My translation is "work hard, and if a better way becomes apparent then do that . . . but also hard, and just get more done". There's a reason why this is called Big Swinging Developer and not Super Comfortable Developer.
To be clear, "hard" doesn't just mean hours. Sure, there'll be times when nothing but brute force will do and you should be ready to plow through when it's time, but there's more to it than that. Hard work is all about doing the things that others won't. The messy, unpleasant, yet valuable tasks that lie around undone because doing them is unattractive. As I alluded to in a post about brownfield development:
There's money to be made in doing things that others don't want to do. A lot of money.
Go ahead and give it shot. There's bound to be a loose end where you work that's been languishing forever. Attack it. Get it done. Do it in addition to whatever else you were going to do that day or that week. Rinse. Repeat.