I spoke with Ben Linders of InfoQ (thrilled to be published at that website!) about challenges and communication patterns for Distributed Teams, uncovering bits of my Atlassian Summit 2018 speech.
The biggest challenge of distributed teams is communication, which is essential for establishing ground rules on collaboration. Shifting working hours to accommodate each other and team liaisons help to communicate and synchronize work. Teams based on trust, respect, and openness will thenselves to help people throughout the organization and foster a culture that keeps teams in sync.
InfoQ spoke with Kiniabulatov about the challenges of distributed teams, how product owners and stakeholders collaborate at SkuVault and how the workflow is managed, how distributed teams communicate effectively and synchronize their work, and how SkuVault nurtures a culture that keeps teams in sync.
So as you know my speciality is distributed teams 🙂 This post is about what changes does the agile communication face (and scrum in particular), when it’s adjusted to the distributed teams. This is my experience, I don’t assume this is a silver bullet, but such approach works for me for the last 5 years and proved itself to be proficient.
Let’s divide communication by types:
stragetic meetings (plannning, retrospective)
daily huddles (e.g. daily standup in scrum)
Let’s add another dimension: geographical distribution:
Collocated teams – everything’s perfectly fine for all three types of communication events. Teams, working in scrum, that are collocated face no issues with any of those.
Distributed teams with little difference in timezones, but still with overlapping hours. Great examples are US – Chile / Mexico. Netherlands / India.
Daily syncup can be handled with almost no pain, as well as planning and retrospective (if you incorporate scrum in your company).
Instantness of clarification on work tasks is lost (when overlapping hours end), however given that skype / hangouts / whatever you use is just a click away – no significant impediments are to be found.
No matter what you think about focused team, and that it processes everything faster due to unitedness, whenever team member is outside of her overlapping hours with the rest of the team – communication lag happens.
Distributed teams with no overlapping hours (8+ hours difference).
Approaches here are:
3.1 Team liason. When someone from the team in one part of the world is having a meeting during his time off work, to sync up with other part of the team in different timezone. Usually, team liason is someone from product team, however there are different examples of who syncs up with dev team in the industry. It can be simply a representative from one part of the team that syncs up on the progress with the other part (just like in scrum of scrums)
3.2 Timezone Compromise approach. Teams change their work schedule, to have a compromise in at least 1 overlapping hour, in order to sync properly. For example, start of working day for one part of the team in western hemisphere moved from 10am to 9am, and eastern hemisphere team changes their working day to start from 10am to 9am. Thus, you got at least 1-2 hours overlapping. Whoa, problem solved -> we can get back to bullet 2, on how teams with overlapping hours work together! But remember, everything depends on team configuration, whether the team is comfy with selected approach, and development tasks specifics.
3.3 And finally, you can set up communication process in a way it’s comfortable for everyone in the distributed team. My personal beliefs is that redundant communication is always less efficient than on-demand-clear-bulleted-discussion, thus I’d prefer clear agenda and clarification when needed.
— 3.3.1 First of all, that means that people still are participating in retrospectives and planning sessions, cause those events happen once per 2-3 weeks (thus distraction or working off-time is tolerable). However, those meetings / scrum rituals are to be performed with clear goals, and well-prepared bullets. Try to not allow offtop conversations (when someone gets into topic not relevant to current discussion). Remember, team values personal time, and no team member should suffer from poorly planned meetings.
— 3.3.2 Second, it means that daily sync (or daily standup, if you follow scrum) can be done via text, at the end of team’s working day. In order to reach more visibility, developer can share a link to the branch, that he worked on. But main goal is to have an exceprt of what team member has done during the day, that is visible for everyone (e.g. special channel on updates in telegram). Some people also propose asynchronous video messages (Dave Snowden of cognitive edge shared this experience of his with me, referring to the times he worked at IBM) – you record video message for the team, and even share the screen, if you want some visual material on your work.
— 3.3.3 Third, clarificational communication (meaning day-to-day clarification communication type) is done on demand. Meeting for such batch of clarifications is done in a compromise time, so that noone’s felt left out). The good part of that is since you don’t have to get explanations on critical and extremely complex clarifications every day – you don’t need to torture your colleagues with evening / early morning calls each day. Usually, most of the impediments are resolved via instant messaging. Please keep in mind, that requirements standardisation is a key role in these clarifications, as properly structured requirements save a lot of time while developing a feature.
— 3.3.4 And fourth, but equally important, more standards and documenting. The more info necessary you prepare for your colleagues overseas, for the questions that may rise during your off-time, the less he will be stuck. Please use common sense in how much you need to prepare. When team gets to know each other, such planning becomes much easier. And finally, efficient process always means that person doesn’t get stuck 🙂
Finally, we’re getting to my favourite ever part!
Distributed teams with no overlapping hours + language barrier! I’ve been working with those for the last three year, and here are the additional steps to make it all work efficiently.
The three common baseline rules to follow are:
Prepare meeting agenda prior to the meeting. I’m talking about writing down basic points, explanations, and maybe even branching when presenting solutions (depending on meeting complexity). It’s obvious, that people not fluent in english can’t properly communicate during the meeting – everything starts to require much more time, which isn’t efficient (and quite heavy, when it comes to hourly payrates 😉
More documenting. You may say that Agile says “working software over comprehensive documentation”, however when dealing with distributed teams + no overlapping hours + language barrier, I can’t stress enough how much documentation means. There are key principles better to be described, as the team grows: communication standards (what type of communication is done via which tool, working time, speed of response), requirements acceptance, visual standards for documentation. All three principles affect how developer understands the task he’s supposed to work on. Requirements should have only one way of interpreting, should include clear pre-and-post-conditions; bugs are to be described in reproducible steps.
And finally, it’s essential to have a bi-lingual person (team liason), who helps with english (he comes up with translation of complex bits, moderates the discussion). This person is better to be a developer or someone who gets the technical part well, as she often helps with syncing two development parts of the team. She may also add meeting notes on technical details agreed once meeting is over. That person most likely will sacrifice some of her time off, since hours don’t overlap.
At the end of the day, there are plenty examples across my experience, and blogs, how people manage to work with just on demand meetings, and create complex projects together. Those are git, atlassian and, among others – SkuVault.
Let me add an additional rule to common sense manifesto – process over redundancy. Greatly established process, understandable and rational for all parts of the team, makes it easy to track progress through transparency, keep team motivation high (for being productive) and time off undistracted.
2 weeks after we had the actual meetup, here’s the follow-up post 🙂
Topics this time:
Keynote by me on cynefin and how it fits our company projects. Had some discussion & arguing on applicacy of cynefin when it comes to rough development times, migrations, firefighting-based development. Overall, model was introduced, and the fact-and-experience-based arguments are always the best. Cause we all keep it harsh, true and ironic, when it comes to sharing something you’ve been stuffing bumps on!
Afterwards beer-session was a 3-hour-rant on headhunting of employees by Moscow, Saint-Petersburgh, Europe and States, and that Ufa developers became much more audacious, over the past crisis-driven years (given that there was no crisis in Moscow and the rest of the world). Seems like the raises are imminent, if you want to keep the developer. Headhunting becomes more brutal and sneaky at the same time!
Yet another topic was keeping the valuable professional, when he reaches the limites of intra-company growth, and what is best to offer in those cases.
Overall, meetup gathers momentum and creates a community. We already got bigger guys from the enterprisey-yet-more-or-less-tolerable-sector, few startups on mobile/IoT/PaaS, Banking, Digital 🙂
Small and duct-tapey resolution for the time, when you have an All -> [statusName] JIRA workflow transition.
By default, it results in the following: Default Ticket Screen shows transition from current to current status, among others. So e.g., you have an In Progress ticket, you have the transition to the very same In Progress. To avoid that, use simple conditioning for the transition:
Go to transition Conditions
Click Add New
Select ‘Value Field’ from the given list
Select logical operator ‘doesn’t equal’ / ‘!=’
And put a value in it (name of current status, and the value to be handled as string)
This works in the following way:
Perform Transition (if (Status doesn't equal string('currentStatus') condition is met).
@AtlassianTeam! A good UX would be something like a checkbox, checked by default, and labelled “Don’t show transition option to same status”.
In order to let developer work as productive as possible, management should ensure the following bits related to her work are tackled:
Requirements Fallback – whom to ask
Issue Description & Decomposition
We moved closer to ‘no interruption’ bullet by creating on call teams, that are reacting to whatever urgent issues arise. (hållo to Kniberg’s Scrum from the Trenches 2nd edition – our own way of ‘firefighting teams’!).
However, there was no requirements preparation workflow a while back, so as the features grew more complex, more dependencies were discovered, we faced the inevitable given our product size: scope creeps, miscommunication, conclicting scenarios and inconsistency.
In order to bring all departments that were related to requirements eliciting and approval, we’ve created Product Management flow, which had to be highway to hell to better requirements.
Product Management Flow
We aimed to tackle the following areas by creating a formalized workflow:
Easy to understand sequence of steps
Each step has an accountable person, visible to all participants
Workflow encourages Argumentation and Discussion -> no misinterpreted suggestions and details are hashed out collaboratively
Each step ensures higher quality requirements, by providing criterias to be met on the output
Workflow consists of sequential steps: New Issue -> Discovery -> Sign Off -> Analysis
Ticket is created by trigger from multiple sources (marketing, services, tech, customer support forums,..). During this state, the ticket is relatively empty, providing only the request and source of the request.
Transition: In order to move the issue to the next stage, Product Owner reviews whether we’ll ever do this feature. If no – he closes it. Yes, sometime – he moves the ticket to Backlog. Yes, near-future – he moves it to Preliminary Analysis.
Preliminary Analysis (Discovery)
Step Goal: Product owner should outline Feature goal (what we need to achieve, benefits for our company and customers); describe basic business process (general 1-2 sentenses on how it works among the warehouse, since we’re a warehousing solutions company); and add that to wiki-page for that feature.
Brief feature description
Shipments are a way to track sale items that have been shipped to the customer of the Sale. A Shipment exists in SkuVault once a Tracking Number is assigned by the carrier.We want to provide an ability to connect and save tracking numbers, so that our users can have more visibility and editing right inside the app.
What do we want to achieve
Allow people that use shipping providers that don’t integrate with marketplaces as SkuVault How it works on the warehouse
Goal: Allow clients to label products with tracking number, and see shipments in relation to Sale they are attached to
Picker gets to the QC table
QC performing person takes the product, QCs it and labels the product with shipping label and tracking number
The tracking number is added to the system and can be visible in relation to the sale
User tracks the product via tracking number
Stakeholder Sign Off
Since there’s quite a stream of tickets, we let Stakeholders approve bunch of tickets at a time. Someone might say ‘Hey, isn’t that Product Owner’s responsibility, to approve?’. Well, first of all our product is big and includes different areas and domains: services, marketing, tech, operations – all having their own pursuits respectively, even if we’re moving towards the same goal.
Step Goal: approve the idea, general process and timeline for the feature to be developed.
The next step would be to gather related parties and start..
Analysis is biggest, most collaborative and complex part of the workflow. It involves:
[Business Analysts (creating User Stories)] => [collaborative efforts between BAs / UX / Developers (Wireframing)] <=> [BA / Developers (requirements adjustments, brainstorms, decomposition and clarification)].
Outcome: clear and atomized User Stories with Backend Subtasks with estimates, that give you ability to grasp and plan the feature for development. By you I mean us, Project Managers 🙂
Example: User Story – formalized and easy to grasp description, representing user activity and ability to interact with it.
Precondition: user is on Sale Info page
Before the user clicks a Shipment Tab in the Sale Info page, the hint at the top says “Click a Shipment for Detailed Information”
When the user clicks a Shipment line they see complete Shipment details at the top.
list of fields for Shipments can be seen in Shipments – Plans / Technical Requirements
They can click a button for Shipped Items or Total Cost to see detail for the items.
If a Tracking URL exists for a shipment the user can click it to open the URL in a new tab.
After new tab opens, user is navigated to shipping carrier website with tracking url info
If there is not a tracking url user simple sees “Unknown” instead of the url.
If a Label (ie: PDF) is present, the user can view it in a new tab, or download it by clicking on ‘Download’ button
Post-condition: user is able to see related Shipments info
We got strict rules for creating user stories, technical tasks, support requests and bug reports. This ensures same standards across out task-tracking system (Jira, and properly used Kanban magic) for different issue types, and allows to interpret requirements with the single possible way (which is extremely helpful :).
Right, so in a nutshell, this dramatically increased our requirements quality, and gave us ability to start analysing scope creeps properly, visibility for similar projects and better prognosis. There are things to improve, such as redundancy removal from the requirements, optimizing time spent on the workflow, better communication when estimating client requests – we’re getting closed to that!
one more thing: “oh, author, your flow is redundant for smaller features!”. You’re right, just remove sign off phase and ease analysis to accomodate simple story description for that feature / improvement ;).