Habits of High-Functioning Distributed Software Teams
Performant teams are what often make or break a tech company: there is a wide gap between ‘elite’ teams and the bottom 50%. Here are 5 best practices elite teams are using.
Evolutionary scientists argue that working together is what enabled homo sapiens to succeed as a species. Humans are collaborative beings, and it’s not surprising that:
“The team you work in will have a bigger impact on your career than the stack you choose to use or how good of an engineer you are” - Charity Majors, CTO at Honeycomb. (source→).
Performant teams are also what often make or break a tech company: there is a wide gap between ‘elite’ teams and the bottom 50%. The former have 208 times more frequent code deployments, and 106 times faster lead time from commit to deploy. And we all know that in tech if you stand still, you’re losing ground.
So how do we build happy and performant teams? “Hire the best engineers,” I hear you say. I wish it were that simple! Beyond the fact that there are many definitions of what makes the “best engineer,” our personal productivity is impacted by the environment around us, therefore a new joiner’s productivity will rise (or fall) to the level of the team they join.
Here are some aspects of high-functioning teams working on distributed software:
(1) Know your software
Cloud-native can be (and often is) dirty, chaotic, and complex. There are on average 25x more services and infrastructure resources per app and 5x specialist tools in the toolchain since 2010 (source →).
Being able to understand and communicate how your platform works is even more important in a world where distributed systems are becoming increasingly common as more organizations adopt cloud-based infrastructure.
A developer that can articulate how all the APIs, microservices, dependencies, and SaaS providers fit together is able to:
- (a) Foresee potential bottlenecks, limitations, and scalability issues within the system
- (b) Onboard and ramp up new team members more quickly. This levels up everyone’s performance and ensures higher-quality implementations from junior developers.
- (c) Work independently on tasks, certain of the team-wide alignment and knowing that everyone is pursuing a common end goal
Obviously, having a complete mental map of a distributed system can be challenging - which is why visual collaboration tools and documentation are a must-have for any development team. More about that in the next paragraph.
(2) Communicate or fail
86% of executives and employees believe the leading cause of workplace failures is the lack of effective communication and collaboration (source→).
In a distributed organization, the reality is that all teams are remote, which is an added layer of complexity, on top of the intrinsic difficulties of working with distributed systems mentioned in the first paragraph.
Successful teams implement these strategies:
- Focus on overlap instead of timezone difference: Overlap is how much time is available for meetings, 1:1 discussions, live interactions, and focused progress on work that requires pair (or mob) programming. Four hours is a good starting point so teams can develop an effective collaboration.
- Set frequent internal syncs and recaps: This can take the form of regular team meetings, daily stand-ups, code reviews, and daily recaps. The latter is particularly helpful when there is little overlap: sharing an end-of-day status provides breadcrumbs that will help the rest of the team catch up the next morning. Ultimately this is not just crucial to be productive, but it also helps teams identify potential issues and find solutions before they become major problems.
- Document the important decisions, no matter how small: Having good software development hygiene means taking a bit of extra time to record present-day context (e.g. descriptive commit messages, keeping all back-and-forth communication about a feature inside the tracking issue and not on Slack, etc.). Writing down decisions, processes, and proposals ensures visibility and helps preserve conversations for future you!
- Use collaboration tools to document requirements, manage tasks, and track progress: According to 65% of developers, changing demands delay code release more than anything else (source→). Select a tool that allows you to collaborate within one space for every stage of development and collect and share knowledge effectively. Not only will this improve team dynamics by ensuring clear alignment and ownership, but it will also allow senior developers to provide good guidance and mentoring to junior developers.
One final aspect of communication is liaising with the C-suite and effectively presenting the progress, concerns, and wins of the engineering team (especially now that the “middle management” layer in many tech companies has been significantly thinned (source→).
(3) Provide psychological safety
Trust is essential for effective collaboration and creativity: everyone should feel empowered to actively contribute to proposals, offer their thoughts and opinions, and provide feedback.
In high-functioning teams, this translates in:
- Safety in failure: Developers are no strangers to experimentation, but they know that their decisions have impacts, which can be a huge stressor. It’s critical to create a blameless environment where retrospectives are focused on constructive feedback and developers can request help from peers, instead of struggling alone for fear of judgment.
- Your value is not your output: Improvement happens incrementally and constantly, with the contribution from every single team member. Your objective should be helping the overall team reach its goals, not ensuring that your lines of code are included in the final product.
- Trust your team members: Each team member should have confidence in the skills and abilities of their colleagues and feel comfortable relying on them.
(a) All interactions are characterized by assuming positive intent and answering questions with generosity: assume that your peers are asking a question because they lack context, not because they haven’t attempted to try and find a solution on their own.
(b) Taking time off is painless: the team will continue to make the correct decisions in your absence because there is a culture of alignment and open communication where everyone feels in sync on the product and technical decisions.
(4) Focus on tasks, not on artificial deadlines
Nowadays, there are many variations of Agile methods (Scrum, Extreme Programming, Test Driven Development, Behavior Driven Development, etc.). However, Feature-Driven Development (FDD) is gaining traction and popularity thanks to its ability to deliver tangible software results often and efficiently.
Ultimately you want to run your team how you’d like your software to run: asynchronous, and event-based. The FDD framework allows just that:
- It’s scalable from small development teams to large multi-disciplinary teams working on complex long-term projects.
- Teams deliver small features frequently with short iterations (2-10 days instead of 2-4 weeks). This drives continuous incremental innovation and it makes it easy to track performance and fix errors.
- There is a strong emphasis on communication and collaboration between team members, which results in more comprehensive documentation and fewer meetings.
Of course, with this method, it’s critical to (a) have clear requirements and (b) break down your work into small units: features, bug fixes, etc.
Your team will be able to work on multiple tasks in parallel and, as soon as a feature is done, it can be tested, pushed to production, and then they can move on to the next task in the queue.
It’s also worth noting that this method avoids “head-of-line blocking” (devs who have completed their tasks don’t need to wait for the rest of the team to finish their sprint before starting new work) and it sets a more “natural” work rhythm.
With a 2-4 week development cycle, deadlines don’t always match the effective development time of the individual features, which can lend itself to developers ‘playing the system’: taking it easy at the start of the cycle and progressively ramping up the stress to deliver by the end date (and then, rinse and repeat).
Ultimately, the productivity of your team is determined by the answers to these questions:
- How frequently do you deploy?
- How long does it take for the code to go live?
- How many of your deploys fail?
- How long does it take to recover from an outage?
You want to choose an Agile method (or a combination of methods) that allows you to be as effective as possible.
(5) Standardize all the things
High-functioning teams take the time to standardize best practices and automate non-value-add or boilerplate workloads.
The first distinguishing factor is the use of a data-driven approach to prioritization, assessing tasks based on:
- Frequency (i.e. percentage of deployments)
- Developer time in hours
- Ops time in hours
This means that while “adding an env variable” might be a frequent task, it takes very little time from developers and DevOps. On the other hand, onboarding a new developer is a less frequent occurrence, but it can take up to 96 hours of combined time.
Secondly, every phase of the development cycle is codified with best practices: standardization by design offers a sort of safety net for developers. For example, if you have a defined design process before you start to work on a new feature, you know the entire team agrees and understands the requirements. If QA knows which changes are coming and what the dependencies are, for example, they are better prepared to identify problems.
Success is a team sport
In today’s highly complex, specialized, and social technology landscape, collaboration is the name of the game. Most software applications require knowledge of multiple languages, frameworks, and technologies. And, the software teams working on these applications need a quick and easy way to communicate and collaborate so product and feature development can keep up with customer demand.
To ensure your team is happy, thriving, and highly performant you need to empower them with the right visual collaboration tooling, communication best practices, work culture, and ‘safety net’ standardizations. A highly functioning team generates more output more quickly, and defines the success of your company, from your product to your brand.
When choosing how to make your team successful, you want to select software that is natively built for visual collaboration, fosters effective teamwork across every phase of development, and emphasizes communication and documentation.
Multiplayer is working on a platform that will improve how backend developers design, develop, and manage distributed software, and ultimately drive innovation, productivity, and success in tech companies. If you’re interested in checking it out, sign up for free now.