February 4, 2012

BigVisible Blog

Pitfalls in implementing Distributed Agile

Distributed teams are a reality in today’s workforce, based on data from the November 2009 DDJ state of the IT Union Survey only 45% of agile teams are actually co-located. Distribution can come in a variety of shapes and forms, ranging from team members on a different floor in your building to being on the other side of the globe. Stating the obvious here, but the missing element is the inability to work face to face.

When starting out many people operate under the assumption that Agile can’t work across distances or worse yet they convert their distributed waterfall organization over to just start doing Agile and are surprised when they don’t like the results they get. It should be no surprise to us that when team members get a chance to work face to face, the results can be quite good. Working face to face certainly doesn’t guarantee good results (it certainly didn’t for decades before off-shoring and distributed workforces came into vogue) nor does taking a distributed Agile approach have to mean pain and failure. What it does mean is you have to know what you are getting into and make sure you are addressing the specific needs of doing Agile over distance.

Agile needs a high degree of collaboration to work successfully. I’m talking true collaboration, not just people working on the same project together. So anytime we take on an agile endeavor, we have to create an environment that allows collaboration to flourish. In order for collaboration to work; 1) people need to know and be comfortable with each other 2) everyone has to bring something to the table 3) you have to be able to work on the same thing at the same time (you may not always be working on something at the same time as someone else, but you have to be able to do it when you need to).

When we look at distributed teams, the main challenges that stand out to me are: geography, time zones, and talent spread.

Geography:
With the conveniences of modern technology like video conferencing, web chatting and instant messaging, the globe is getting smaller and geography issues are becoming more conquerable. It still isn’t the same as sitting next to someone, but I think it is workable. I’ve even heard of some cool new technology that connects two rooms with a display wall that makes the rooms feel actually physically connected to each other.

Time zones:
Time difference plays a bigger role than the actual distance between team members. The less overlap there is in “normal working hours”, more independent or solo work is going to be taking place (read: less collaboration) which can easily take teams off track. Successful Agile teams have strong and immediate feedback loops that allow them to validate work with each other before investing too heavily in an approach. The more of the workday team members are spending without the ability to reach out to someone in another role, the deeper the investment becomes in something that could be discarded.
It’s not uncommon for people to be asked to work adjusted hours to better accommodate everyone on the team, but this can create issues with employee’s family schedules or cause “extended days”. With extended days, team members may often get stuck working their adjusted hours to work with their team and also working their“ normal working hours” because they are expected to be in the office during those hours. This isn’t a sustainable model and will lead to burnout very quickly.

Talent Spread (or alternatively cross pollination of disciplines within a physical location):
In software, truly successful collaboration happens across disciplines, where you have a developer working with a Product Owner, or a UI designer and a QA tester, or a QA tester and a developer. There are numerous permutations, but the point is people representing different skill-sets, concerns and areas of expertise get a multiplier effect when they are able to work together and collaborate. I personally love having analysts and testers work together on creating test cases/requirements. My rationale is analysts are good at building things and figuring out how to make stuff work, testers are great at breaking things and seeing the cracks. By having the two disciplines collaborate, teams get really solid sets of tests that are well thought through and cover most scenarios. Obviously, Product Owners, developers and anyone else on the team are welcome and necessary partners in that collaboration as well.

Applying this idea against the backdrop of outsourcing and off-shoring models that many companies have adopted where entire departments or disciplines are moved to a new location (i.e.: development or QA to India) and you can see how challenging real collaboration can be for many teams. I’ve heard the argument for 24-hour workdays for years, but in practice, I’ve only seen it work for short bursts on a project where the team had a good grasp on what they were doing for the next week or so. However, beyond that, obstacles are encountered, feedback is needed, design reviews happen and the list goes on. All these things effectively put traffic lights into the 24-hour workday and all the lights are rarely green at the same time.

So what to do?

When setting up a distributed team, consider the following:
• Have the fewest number of different physical locations involved in that team.
• Don’t ever have one person working alone in a location.
• Make sure you have team members with different skill-sets in the same location and try to build a critical mass there.
• A double-digit time difference between team members is going to be a challenge and is not likely a sustainable approach. If this is unavoidable because of the locations your company operates in, build a fully enclosed product development team in each location that ideally has a product owner embedded with them and can work side by side with the team.
• Have a remote PO or PO proxy that is empowered to make product decisions when the primary PO is not available. Expecting the PO to be available 24 hours a day is unreasonable, conversely constantly waiting to the next day for a decision is a big red traffic signal that backs everything up.
• Travel – team members should get together to spend time face to face to build strong relationships and an understanding of each other. Ideally an entire sprint can be spent together working side by side so team members actually get a sense for how they work over the cycle of a full sprint. It’s helpful if travel can happen repeatedly over the course of the project to help to continue to grow the relationships.

I ran a mid-size Agile program a few years ago with a mix of distributed and co-located teams where many of these techniques were employed so I can say with first hand knowledge, you can do Agile across distances if you follow some basic guidelines and are willing to invest in the right things.

I’m sure there are many other creative techniques that can be used to bridge the gaps and I’d love to hear from anyone else who has successfully done something different.

To Direct or to Self-Organize

It is sometimes attractive to impose processes. The reasons that it is attractive make sense: We know what works based on our experience. Those of us who study process have a lot of anecdotal evidence that some things are better than other things, and why not share our wisdom with those who lack our wear?

However, this only makes sense if we don’t value learning. If we don’t value learning then we can assert that we who know, know. We know because we have learned, and we can share what we know with those less fortunate than us. They should be grateful to have benefited from our wisdom and to have been spared the many trials that we have endured.

If we value learning then we value systems that can learn, but that implies that we must let go. We must let go of the idea that what we have learned is what others should learn. Their experiences are necessarily different than ours. If they succeed it is their success. If they fail it is not our failure.

The quality of a good coach/teacher/parent, is to provide everything that is needed to succeed, to motivate, to encourage, to endure, and to get the hell out of the way.

Your Opinion of Agile Doesn’t Matter

There has been a storm of blog posts, tweets, and other noises lately about why Agile is this or that, why it is good or bad, why it works or doesn’t work, etc. None of it actually matters.

There are two things we ought to be talking about: 1) How do we change our organizations to optimize the delivery of value? 2) How do we make the lives of people involved in software development better?

XP, Scrum, Lean, Kanban, Agile, and whatever else are collections of ideas and practices each united by strong principles and all designed to help us figure out how to solve some of these problems. Each is limited by its point of view. None is a panacea. None will fit your situation “out-of-the-box” without considerable thought and adaptation.

So, use these ideas and these practices. Do so thoroughly and unapologetically. But, I don’t care what you think Agile is or is not, whether you think it is good or bad, whether you think it works or doesn’t work, whether you think I am doing it right or doing it wrong. It doesn’t matter.

An Agile Team is an Engine

[In a private email discussion with the other BigVisible coaches I came up with the following metaphor. I thought it might be of general interest, so I'm reproducing it here with a few small edits.]

An Agile team is like an engine. An engine needs four basic things to work well:

  1. Feed it lots of fuel and air at the right moment.
  2. Ignite the fuel and air at the right moment to generate power.
  3. Transfer power to the drive line to do some useful work.
  4. Remove waste gasses at the right moment to maintain volumetric efficiency on the next stroke.

Agile teams need similar things:

  1. Feed them valuable ideas to implement at the right moment.
  2. Implement high-quality software at the right moment to realize value.
  3. Transfer that value out to the customer so that they can do their work.
  4. Receive feedback at the right moment to maintain the delivery of value on the next iteration.

Extending the metaphor:

  • Scrum is a bigger engine. It is theoretically capable of generating higher output, if you give it all of the things above.
  • XP (or “technical practices” if you prefer) is a well tuned ignition system. You need it to maximize efficiency and clean power output.
  • Kanban says, “Find the bottleneck and eliminate it.” That is great advice (For engines too) but maybe not specific enough to tell us how to make a Civic beat a Ferrari. [Note: I deliberately diminished the importance of finding and eliminating bottlenecks here. To be clear, I think it is one of the most important skills a coach (or engine builder) can have.]
  • Effective product ownership and related business practices are your intake plenum. The fastest way to sap an engine’s power is to starve it here (That’s why they call it the “throttle.”)
  • Your direct line to your customer is like your exhaust system. The tighter and twistier and more packed with crap it is the less power you will get.

To go fast you need all of these parts to work together. So, start with a bigger engine. Sure, why not? Start with more efficient spark. Sure, why not? If you want to get faster you’ve got to understand the whole system, and it more or less doesn’t matter where you start.

There is more to Done than we know about.

Since the Agile Community is looking to manufacturing for so much wisdom these days, let’s look at what Done means when spoken by a manufacturing professional.  First there is Done at a workcenter, meaning what I built there meets a predefined acceptance criteria that apply to one some or all of the parts made there.  In manufacturing, no part can be consider part of WIP unless it has met the acceptance criteria of the last workcenter it passed through. This is because manufacturing has a couple more definitions of Done that are more comparable to what we think of. Done can also refer to one of two very carefully specific definitions of done, both of benefit the on-line computer shoppers of the world.

First there is MEI which means Manufacturing End Item and represents all the components needed to make the final assembly of what you the customer order. Second there is the CEI or customer end item which is what you buy. These two terms are core to the shopping on the web. When you select the stuff you want on your, iPhones,  personalized bathrooms, or your next auto all work because of MEI and CEI.  The choices you have for building your computer, like disks, and memory, different optical drives not to mention the skins you can wrap them in all reflect MEI’s or Manufacturing End Items. They can be combined because of an extensive Quality integration effort that assures all the bits do fit and will work properly. When they are stuck together they fill your order which defines DONE for your Customer End Item or CEI. So having multiple definitions of DONE can actually add value, as long as you pay attention to the quality needed to integrate all the parts at the end.

Don’t worry, manufacturing has kept up with the times as more and more manufacturing has taken to Modular Manufacturing. In fact in this global economy entire manufacturing systems are designed to be modular so that not only the parts are broken into smaller and smaller levels of DONE but so are the manufacturing steps. For those interested see “A hybrid methodology for synthesis of Petri net models for manufacturing systems”(http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=143353). So in a very real sense the high tech geek world we live in is about three generations behind the guys on the factory floor because most of what they are doing to determine discrete points of Done is to base it on measurable value Pretty cool huh?  Oh yeah they have been using some form of a task board and dependent demand planning  in a pull mode (AKA Kanban) for about 500 years.

Now to make this happen each step has its own QA, QC and Test criteria, patterns and harnesses. This means that if someone down stream figures a way to get folks to want people a choice in the type of metal used in their iPhone 8 antenna, the manufacturing step that makes the antenna will be ready to provision the web page where people choose the metal for the antenna – and the time to market will be the speed at which you can key in the changes to the web page.

So how close are we – software – are becoming the choke point in this whole innovation stream? We could be, if we insist on  sticking with what we are comfortable and wait to the end of the cycle to get the work tested and then have problems logged; wait until the next meeting to get needed changes through some form of CCB; wait for an optimally utilized Product Owner to have time to approve the work, and then have to wait in line while an understaffed and over committed QA group hand crafts test cases 12 timezones away to start this cycle all over again.

If however we develop defined criteria for each step of the process and, like the modular manufacturing world, base our breakdown on what is valuable to the ‘on-line’ shopper mindset.  Who knows what could happen?  Perhaps discussion that don’t get into what done is.

Agile Learning

Jerry Weinberg commented on my last post regarding the Definition of Done saying that we aren’t really done until we have stopped. When pressed further he said that even delivering to production was insufficient, because we might get it wrong, and if we get it wrong we aren’t really “done.”

Of course, he’s absolutely right, and it leads nicely to one of my favorite topics that I’ve been wanting to blog about:

Agile software development is about learning. We work from a premise that the final solution is not known (or knowable) until we have delivered it, and that, therefore, we must collaborate with customers to build and define a working solution incrementally. Along the way we learn about the problem space that we are exploring and we incorporate that knowledge and our own expertise to drive towards a heuristic solution.

That may seem obvious, but it has an interesting implication. All software development processes/methodologies tend to obsess over the question of how much we can get done per unit time. However, if we know that we are engaged in learning, and we understand that learning means sometimes getting it wrong in order to adjust and get it right, then how much we can do is the wrong question. The right question is how long does it take before we can find out that we are wrong. In other words, what is the delay before our next opportunity to learn?

Scrum’s notion of “Done” is not really about being done, but about getting to the point where we can get real feedback to learn from. The same is true for the Lean notion of “Cycle Time.” Each cycle is an opportunity to learn. If there is any chance that we will get it wrong then we need at least two cycles. In fact, the likelihood that we will ever get it right is directly related to the number of opportunities we have to learn before we stop. I’ll let you chew on that for a while.

[Note: the assertion in the last paragraph originally said that the likelihood of getting it right within some period of time was inversely related to the length of our learning cycles. Hopefully, the way I wrote it above is somewhat clearer. The notion of keeping learning cycles small is a natural and important consequence of the above. You will hear more from me about that at some point.]

Definition of Done

One slightly peculiar question that comes up over and over again with new Scrum teams is: what is the definition of done? And, how do we determine what our team definition of done is?

It is a peculiar question, because if we weren’t practicing Scrum the answer would be obvious. In fact, the Lean and Extreme Programming communities more or less agree on what “done” means without any real discussion: Done == deployed in production, in the hands of real customers.

When Scrum folks talk about the “Definition of Done,” however, they mean something slightly different. There is an important assumption here: software can reach an intermediate state called “done” where it is not yet “released,” but is “potentially shippable.”

Potentially shippable is an equally peculiar idea. In theory it ought to mean that to release or not to release is purely a business decision at this point. The software is complete, accepted, and tested, but it is not released. In practice it often means that the main development activities have been completed but there is some amount of intangible work to be done that may or may not fit inside of a Sprint (e.g. QA testing, deployment to various environments, formal release process, etc.) This is a poor, but common, way to address the “Definition of Done.”

Potentially shippable software is actually a useful idea. From a technical excellence point of view the goal should be continuous delivery, but from a business perspective continuous delivery might not be feasible. In fact, in some domains big-bang delivery actually has inherent value (e.g. any COTS, especially commercial games, and various forms of online media.) [actually, even in those environments continuous delivery is useful, but only after the initial release hits its date...] What we want is for continuous delivery to be attainable, so that it becomes a business decision not to do it. Thus, XP has long had the concept of always releasable software.

So, how do Scrum teams define done? I suppose the real answer is, however they want to, but I suggest the following: Start with everything that it would take to release the software to production. Then, to the extent that it is infeasible to do all that stuff, scale back to something that can be accomplished within a Sprint. Then, continuously improve (i.e. inspect and adapt) until the definition is once again everything that it would take to release the software to production.