If managed properly, software engineering lends itself well to remote setups: businesses can tap into a larger talent pool, employees enjoy a more productive familiar and productive work environment, and even society at large benefits from fewer people getting into cars and commuting every day.
Of course, that's a pretty big if. Running a remote team is a complex endeavour that requires a lot of buy-in from both managers and team members, and that only really works with constant attention to many subtle aspects of human interaction.
In over a decade of remote work—on both sides of the equation—I have learned that a successful distributed team depends on three all-important factors.
1. Communication
The most obvious challenge a distributed team faces is getting information to flow properly at all levels.
Much of the talk I see on this topic focuses on tooling: Should you use Slack, HipChat, or plain old IRC for chat? What about screen sharing, or pair programming?
To me, the answer to that question is painfully obvious: who cares? Do your research and eventually you will settle on the particular combination of tools that work for you. No solution is going to fit all needs; more importantly, the tools aren't going to magically make you and your team good at communicating with each other.
Instead, the focus needs to be on the cultural aspects of communication. We tend to underestimate the amount of information that, in real life, gets exchanged using non-verbal means. You can pick up all sorts of important bits of data just by wandering near your colleagues discussing some project detail or other, or even by watching the way the people around you behave, who they hang out with, and so forth.
This kind of interaction is deeply ingrained in the thousands of years we spent building communities that depend on physical presence to exist. It simply does not translate well into a reality in which your colleagues may not even be awake while you're at work.
This means that, in a distributed environment, you need to overcommunicate using a necessarily limited set of tools. Team members (and those they interact with) must get into the habit of articulating their ideas in detail and often, and management must be ever vigilant to ensure that information flows to more people than would be normal in real life.
2. Permanence
Realtime communication—the kind online chat tools like Slack provide—offers a very limited window into what's happening in your team. Important conversations get lost in the hubbub of messages that tend to accumulate through the day, and are soon pushed into a chat history that is hard to keep up with.
For this reason, a remote team must take asynchronous communication very seriously, and create a virtual paper trail that provides engineers with the information they need to understand the environment in which they work: What led to a particular decision? What is making a project evolve? Which goals is the team trying to achieve?
Here, again, the tooling is not all that important, at least as long as you don't rely on e-mail, which has the double disadvantage of (a) being very noisy and (b) only including a select group of people in every conversation. Instead, you can use something like the popular P2 Wordpress theme, or even an old-fashioned chat forum. Any number of solutions will work as long as they allow you to compartmentalize information into discrete topic, make it easy to follow long-running discussions, and force interaction to occur in as public a way as possible.
As a side benefit, permanence (particularly extended to encompass tools like version control and wikis) also helps you capture the knowledge that is locked away inside the heads of your team members, helping to limit bus-factor and absence problems; when things are written down and easily accessible, nobody needs to be woken up at 3AM while they're on vacation, and there's no need to panic because the engineer who wrote a misbehaving piece of code left two months ago.
3. Context
The most important aspect of remote work is also the hardest to manage. Broadly defined, context is “everything that makes people feel that they are part of a team.”
In a traditional office environment, it's easy for the social bonds to form. We grab colleagues for a coffee and discuss an ongoing project; managers quickly call up meetings to discuss problems and come up with solutions; all kinds of spontaneous interaction happens simply because that's the way we've been interfacing with each other for longer than any of us can remember.
Without face time (particularly if only part of your team is remote), context does not happen naturally, and must be continuously nurtured and encouraged. Management must ensure that remote workers are on par with their local counterparts, and get to be included in the social fabric of the team by participating in discussions, being included in the decision making process, and visiting in person as often as possible.
Translating context to a remote team is very challenging, but it's also essential to the team's success. Without inclusion, remote workers feel underappreciated and cannot fully contribute their knowledge and experience, leading to loss of self esteem, loneliness, and poor morale.
On the other hand, if you do manage context properly, distributed teams can be surprisingly social, leading to interpersonal bonds that span continents, cultures, and timezones, and resulting in a productive and happy work environment for all involved.