I've been fortunate in my career to have had a couple of great managers. The rare combination of vision and execution found in my managers at Microsoft Research and DuClaw Brewing Company have established a kind of gold standard in my mind. I've been thinking about management a lot lately. I'll probably be head down doing technical work for the next few months, but after that I hope to build and run a new technical team. Even though I aspire to be like the outstanding managers I've worked for, I don't think you have to be great to be successful. As a matter of fact, I think that being a good manager can be distilled into 2 simple steps.
Step 1: Make It Terrible to be Bad
There are plenty of good people who are bad employees, especially in the technical world. Since I've worked mostly in software, I'll focus there for a moment but the same principle is applicable to any industry. My definition of a good developer is one who develops good software. It's no surprise then that I think a bad developer is someone who doesn't develop good software. As a manager, it's your job to make the environment unpleasant for bad employees. Yes, you get extra points for offering up solutions to their crapitude like training and whatnot but even if you don't you can still be good manager simply by making bad employees not want to be there. Why am I harping on this so much? Because bad employees are a cancer to a team and they kill the team from the inside. First we have displacement – a bad employee is sitting in the seat that could be occupied by a good one. Next we have infection – bad employees have a very strong potential to turn others bad either by active instruction ("Here, junior dev, let me show you the wrong way") or through passive observance ("Why should I be any better if that guy sucks and he's still here?"). And finally we have repulsion – good employees don't enjoy working with bad ones so they leave.
Step 2: Make it Easy to be Good
The step is all about clearing the path for your direct reports. Most technical people really enjoy what they do, it's all the other stupid stuff that turns what they enjoy into "work". This is one of the reasons so many good and great developers work for start-ups, small software companies, or the few "big name" companies that you read about all the time like Google. It's about the purity of the work as much as it is about the work itself. This is where most companies inflict Death By 1000 Cuts – poorly managed web filtering that blocks technical blogs? Cut. Stupid HR rules that require filling out a paper form once a month? Cut. 17" screen instead of a 24"? Cut. Slow network, unstable email server, not enough hard drive space? Cut, cut, cut. Sure, any given one of these isn't enough for someone to leave but put enough of them together and you've got one seriously unpleasant and ineffective environment to work in.
The steps are listed in order of importance. Sure, you can start knocking off some of the low hanging fruit to make it easy to be good while you're putting the heat on the bad folks but you can't ignore step 1 and make it up by doing lots of step 2. When a patient is diagnosed with cancer, the immediate focus is on eradicating the cancer not on adding lean muscle or lowering cholesterol. Yes, the latter two can contribute to improved overall health by they simply don't matter if you don't take care of the most pressing need first.
*-as-a-Service is all the rage these days. Everywhere you turn you see Software-as-a-Service, Platform-as-a-Service, and Infrastructure-as-a-Service. It reminds me of the late 90s when everything was Internet, Intranet, and Extranet – you know, back when it was so new and important that we capitalized the words.
Even though we're seeing some serious overuse, my problem isn't with the terms it's that the root words are incorrectly swapped around so much that folks have a hard time thinking about them correctly. Sometimes everything is lumped into SaaS since it was first. Other times Platform and Infrastructure are used synonymously. My goal here isn't to introduce you to SaaS, PaaS, and IaaS . . . chances are you have an idea of what these are if you read this blog. Instead, my goal is to show you a way to think about them to know what fits where including a 2-part value proposition of each. This is especially important if you're building software that falls into one of these 3 groups.
Infrastructure-as-a-Service
Unless you work for Amazon, Rackspace, GoGrid, or one of the other big providers chances are good that you're not building IaaS. Infrastructure is just that: the foundation where you run your system. This service is all about providing you infrastructure components like servers and networking goodies such as load balancers, firewalls, and VPNs. The "service" part of it is the management software that lets you click (or programmatically call) to provision new resources. Click: new server. Click: new network segment. You get the idea. The important takeaway here is that you are renting infrastructure that lets you do what you want, but it's pretty much up to you to make it do something valuable. The 2-part value proposition of IaaS is that you can rent infrastructure instead of buying it and that someone who is better than you will be running it, provided you go with a quality provider.
Software-as-a-Service
At the other end of the spectrum, we have Software-as-a-Service. SaaS should do something of value immediately after you sign up for it. Sure, there may be some customization involved but the bulk of a valuable problem should be solved by the software that you're renting. If you work for a software startup, then there's a good chance that you're working on a SaaS product or that there will be a SaaS version of your product offered in the near future (either by your company or a new competitor). The SaaS 2-part value proposition is that you only have to pay for software you use and you have a solution to the problem that's better than what you can build in the time you have. That last part is especially important since if you can't find something worthwhile to rent, then you've just stumbled upon a great market opportunity (or you're awful at using Google, but I'll give you the benefit of the doubt).
Platform-as-a-Service
This is actually the term that's been stuck in my head and led to this post. PaaS should let you build something of value after signing up. It's a step away from infrastructure in that you don't have to worry about the underlying servers and networking, but it's also a step from being SaaS because it doesn't do anything of general value until you get to work. I think that a lot of the confusion around the term can be credited to the success of Salesforce.com. They started as a SaaS offering and then created the first really successful PaaS offering (while continuing to offer plenty of SaaS goodness). Their hosted Customer Relationship Management system is often cited as the first successful SaaS product. Later they created Force.com which lets developers build new applications on top of their infrastructure. Another factor that contributes to confusion about what constitutes PaaS is the use of the word "platform", one of the most nebulous terms in the tech industry. I think that Architecture-as-a-Service may be a more accurate (though not necessarily better) description because what you're paying for is someone else's solutions to common development tasks. Instead of worrying about collecting data, storing it, retrieving it, searching for it, etc., you use the provided platform – its architecture. The 2-part value proposition is that you can use the platform to build software without having to solve all of the problems common to software development.
To give a little perspective, I'm currently working on a PaaS system that will be used to create several SaaS products. I'm using IaaS (Amazon EC2) for testing and production deployment. So I rent from Amazon and others rent from me. The spread between what I pay and what I charge is dependent upon my solutions to both development problems (the PaaS layer) and business problems (the SaaS apps).
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!