Below is an article originally written by Hannah Henderson, Engineering Manager at PowerToFly Partner CircleCI, and published on March 31, 2020. Go to CircleCI's page on PowerToFly to see their open positions and learn more.
Communication is hard, communication on a remote team is harder. Fortunately, it can be as effective on a distributed team as it is on a colocated one, if not more so. This post delves into ways our team has learned to counter the two biggest challenges of remote communication: understanding tone and upholding a collaboration framework.
Although this post is written from my point of view of as an Engineering Manager, the practices described and templates linked are valuable for anyone on a remote team: they are the result of collaboration, ideas, and retrospective takeaways from people throughout our Engineering organization.
Getting to know a distributed team
Hyper-communication goes a long way towards ensuring that folks understand their peers' intent. This is especially true early in a groups' formation when trust, the hallmark of an effective team, is first getting built. To lay that foundation of mutual understanding, spend time getting to know the individuals on your team, and helping them get to know each other.
Do this by:
- Conducting asynchronous introductions to collect information and set expectations.
- Implementing these agreed-upon standards in synchronous sessions.
- Adjusting guidelines as-necessary based on input from the team.
Keep in mind that on a highly-distributed team, it can be difficult to find overlapping working hours on everyone's calendar. This overlap is synchronous time. Synchronous time is valuable, and should be treated as such. Know what you're hoping to achieve before entering synchronous interactions. Use your asynchronous time for focused individual work and to prepare for synchronous interactions.
When your team is forming, use asynchronous time to collect information, set expectations, and allow folks to define their own boundaries.
- Make sure you're familiar with the company's existing communication expectations. Stomping all over folks' toes is not a great way to build relationships. If you're new to a team, consider sending out a short message explaining that you'll be asking lots of questions while learning the ropes. If you use Slack, update your status to say something similar.
- Send out a detailed questionnaire to learn what the team needs (or, at the very least, what the members of the team think they need). If you're a manager stepping into a new team, I recommend sending out some variation of this form to solicit as much input as possible and to suss out the lay of the land.
- Define a team manifesto. Write this as soon as is reasonably possible. Broadly, this document should roll-up your understanding of what processes exist in order to codify healthy practices and value-signal. In the past, I've boiled this down to two sections:
- People (please make sure you're familiar with everyone's write-up) - I expect teammates to get to know each other as people with rich lives, curious interests, and priorities outside of work. I signal that I really care about this bit by populating my own profile first, and listing everyone's name as its own section.
- Team Process (you can skim this, it's good as a reference) - The frameworks defined in our team entente are important, and I sincerely hope we follow them. That said, process for the sake of process doesn't add value; I'm happy when we achieve our guidelines 80 percent of the time.
- Prepare for synchronous time. The logistics of organizing face-time on a distributed team can be difficult (especially during the month plus of global daylight savings misalignment). Ask folks to fill out a Team Schedule and remind them to populate their personal profile in the team manifesto.
Synchronous relationship building
Synchronous time is critical to the storming, norming, and performing phases of team development. Use this time to get to know your direct reports and to create space for folks on the team to get to know each other.
Note that asynchronous communication doesn't go away, it, along with synchronous communication, is further-established in your Communication Framework (below).
- Maximize your one-on-ones. Get to know your reports and drive alignment with this Getting to Know Each Other exercise. Consider grabbing some questions from this extensive set to round out subsequent 1:1s.
- Build in time for water cooler chit chat. Remote teams don't cross paths at lunch or in the hallway. Create space and synchronous time to connect. This may mean padding meetings with time for banter; it definitely means creating chat groups for shared interests (which are also async-friendly). We have #random, #wordnerds, #keyboards, #babies, and #bread, to name a few.
- Set up scheduled pairing. Randomly assign a pairing partner, and rotate partners once a week until everyone has paired with everyone else at least once. At the beginning of each matchup, the members of each pair should set up (best effort) three hour pairing blocks every day for the week. Sometimes, "best effort" only equates to an hour of pairing. Particularly on teams with a wide timezone spread, actually scheduling sessions ensures that folks are able to connect during their working hours.
For us, after a few rotations through the whole team, folks were comfortable reaching out and ad-hoc pairing. During one of our retrospective meetings, we decided to stop scheduled pairing.
- Make a team channel and share status updates. (This is also async-friendly.) We have a private team channel where folks post all manner of status updates: their good mornings when they hop online, notes about what they're picking up, lunch breaks, hot takes and random observations (debates about the plural form of "octopus" and whether or not an Xbox qualifies as an essential shelter-in-place item spring to mind).
We use JIRA and Namely, and have integrated Kanban board updates with the channel, as well as weekly updates from Namely about folks' PTO and birthdays.
Setting up a communication framework
On a remote team, it is especially easy for information to fall between the cracks. It is important to set up process that acts as a communication forcing function. There's no need to run around after folks trying to extract information and context, let your process be the heavy. Our team takes an Agile-inspired approach with a recurring two-week cycle of meetings.
Pro-tip: use the availability collected during asynchronous introductions to pick meeting times.
Meetings for knowledge transfer
Scrum-flavored methodologies are popular because they tend to work. That said, on a remote team the focus of each of these classic meetings is a bit different: they're all much more geared towards teasing out information disconnects and misalignment in advance.
Our standup is at the end of the day for our European teammates and in the morning for our West Coasters. These engineers won't overlap again for 20+ hours.
- Standup (30 minutes, daily). This daily check-in is our only guaranteed synchronous time on any given day. Instead of a 5-15 minute session, we block off 30 minutes so there's time to properly exchange context and also to chat. We review a Kanban board, and, importantly, the standup leader shares their screen and takes update notes on every card as an alignment forcing function. These notes often come in handy during cross-team collaboration and even during incidents (rather like a well-written git log that actually includes the "why".) Schedule standup back-to-back with other regular team meetings so that you can roll straight from one into another, and get out early if time allows.
- Planning (1 hour, weekly). We groom our backlog by Friday each week, and set up asynchronous points poker that everyone is expected to fill out by our Tuesday planning meeting. This allows us to spend the Planning meeting using estimates as indicators in deciding what treatment is appropriate for each card. Use this process to tease out context. Don't always ask the junior person to explain why they think something will be hard. DO ask a senior engineer that has given a high estimate to share what they know about the dragons in that space. Your goal is to expose information, not people. By the end of Planning, the cards in our Next Up column are ordered by priority and, we hope, are generally correct, and shovel-ready.
- Retrospective (1 hour, fortnightly). An excellent time to check in on team processes and to decide how they can be changed to better suit the needs of the team. We have a Slackbot reminder asking folks to add topics to the meeting agenda. As team-appropriate concerns are raised in 1:1s, I will often seed the retrospective document with them. These conversations have led to larger discussions on topics like when and how to give code review (at what point is asking for a complete overhaul OK? Not OK? How do we push back without escalating disagreement?) as well as pairing preferences and retrospectives of on-call escalations. As much as possible, the questions, concerns, and thoughts of the folks on the team should drive the content of this meeting.
- Big Picture (1 hour, fortnightly). This meeting reserves space for Product to keep Engineering in the loop about the grander vision of what we're doing and why. It should provide broader directional context for folks on the team so that:
- They understand the value of their work.
- They're better-equipped to make decisions that roll up into the company's goals.
For each of the above meetings, there's a more detailed breakdown in this Two weeks in the life of Foo Team meetings document, which is worth a skim. It includes recommendations on what to include in invite bodies (especially an agenda and a link to meeting notes stored in a single folder for improved discoverability), many examples of specific questions to ask, and several templates.
Calendar tips and tricks (because time zones are hard)
Configure your calendar to do some heavy lifting for you. I use Google Calendar, and have gotten tons of mileage from:
- Adding my working hours. This feature notifies folks that when they send invitations that fall outside of my office hours.
- Turning on world clock. Mine is configured to show the time in California, Japan, and Germany. When I click on a window in my calendar, the world clock displays local time for everyone at that window.
- Displaying secondary time zones. Mine are configured to show the time in Ireland and in California. My current team is spread across these time zones.
- Adding my Pagerduty rotation to my calendar. I do not want to be notified by Pagerduty unless I'm being paged. I live by my calendar, so this helps me see when I am on-call without the extra notifications.
- Adding the Zoom Scheduler to my calendar. Because 99.9% of my meetings are virtual, they all require a meeting room link. This annoying-to-configure extension puts a giant, handy "Make it a Zoom meeting" button on my draft calendar invites.
Effective remote communication requires intentionality. By adopting the practices in this guide, picking and choosing what works for your team, it's possible to establish the foundation of trust and communication framework that enable remote teams to flourish. The resulting communication will rival that of a collocated team, and will be inherently better for context-sharing and information discoverability.