With cheap software talent all over the globe, it’s tempting to spread a development project around the world and around the clock. You can skype over to those guys for free, it’ll be like you’re in the same room, and hey, your developers are sleeping a full third of the day; you’ve got to be able to improve on that!

The pitfalls of adding people to a team are well known – you add communication and learning overhead that will often end up delaying, rather than hurrying, the completion of a project. But let’s say you manage that issue – the teams are brought on line together at the beginning of the project, or the new guys have experience in the field, or you budget in a healthy load of learning time – you still run into the tragic poetry of Conway’s Law.

Simply stated, Conway’s law says that any team that produces a product is constrained to produce a product that is a mirror image of its communications structure. It sounds like black magic at first, but it really makes all the sense in the world. Creating a single thing – anything – takes a lot of communication and shared understanding. Put a team in two different buildings and you’ll already start to see trouble. It will be easier to make assumptions and keep coding then to walk outside in the cold. Introduce time zone differences, language barriers, and shoddy IP telephony, and you’re lucky if the two teams manage to communicate at all. Throw in one more team on another continent, and you’re doomed.

When my little company was swallowed by IBM, we were brought under a team in Massachusetts that was also trying to swallow a team in Boca, coordinate with a team in Texas (that had a person working remotely in California), manage the offshore folk in Malaysia, and be manged by the suits in Silicon Valley. Together, we were tasked with putting together a system that really had to function as one unit. A full half of the time was spent in throwing pieces back and forth over the walls between the groups groups and trying to figure out who was responsible for what. Only when we disengaged a bit, and plowed forward on a piece that could really stand alone, did we make any progress. In the end, we created as many different pieces of the puzzle as we had teams, and they worked together just as well as our teams did.

There are situations where having multiple teams can be helpful. Have the offshore team do the translation work, write plug-ins against a well documented API, or do the data-entry. As long as the assignments and the architecture are in line with the implicit team dynamics, you’ve got a good shot.

Let’s assume for a second that what I’ve said is right. The big question comes from the development methods of the major open-source projects. They have people spread out to the four winds, and they manage to come out with some really great stuff. Granted, a lot of these projects have a very small team at the lead with the rest of the folk filing in as testers and patchers, but some of the biggest and most successful are entirely distributed. How does that work? I’m thinking that there may be another dynamic at play.

If a team has a home in a physical location, bringing on a remote team will be a serious chore. But if the only home for the project is on the Internet, then no one is remote. If everyone knows that the core communications happen online, then the project has just one home – online. Remote communications are no substitute for face-to-face communications, but if they are all that you’ve got, you make the best of them. If I don’t have any team without the ‘remote’ team, then the whole distributed team can really function as one.

Is it possible to carry the mindset of the entirely distributed team into a situation where there are people physically concentrated together? I haven’t seen it happen. My intuition tells me that it’s a tall order, but I’m happy to be proven wrong.

Advertisements