Architecture & High Performing Teams
Companies have a never ending quest to continuously adopt new tools, processes and new architectures with the goal of enabling teams to move fast and build high performing teams. What is a high performing team? If you ask a product manager, they will say "It’s a team that can deliver new value faster". If you ask a Team lead they will say along the lines of "A high performing team can pay down its tech debt faster, spends majority of the time building new value to the product and optimizes their work for improved quality and faster delivery."
"so what makes these teams move fast?" Now this is a great question! I have been fortunate to work with some of these high performing teams. Juggling down the memory lane, I was trying to find the answer to this question in a way that discounts the personal traits of any individual in the team. I stumbled upon three unique qualities that distinguished a high performing team from others:
- Ability to make sweeping changes: A high performing team is cable of making large scale sweeping changes in their code base. They can change their underlying domain model, database schema or even create a new version of a service. And most importantly, they can do this without the need of handholding any other team.
- Damage control: The biggest damage one can do by check in any new piece of code is limited to their own stack. Every change in code is a risk to the system and can break production. One should never check in any code and break service that belongs to some other team. In some cases this may not be entirely possible but the goal is to keep the blast radius as small as possible.
- Zero downtime deployments - Teams I have worked with have embraced componentized and independent deployments. They can quickly deploy or rollback (when things go wrong) versions of their services and apps, again without the need to hand hold any other team.
- Ability to make sweeping changes: this requires clear boundaries in the code and sense of ownership along with well understood dependency b/w teams. Architecture principles that enables this are:
- API first development
- APIs as a clear interface for communication for both internal and external consumption
- Bounded context boundaries
- Damage control: Principles and practices that enables damage controls are:
- Discourage sharing internal domain artifacts: DRY is an anti-pattern in microservices architecture. Note -you can share frameworks and other general purpose libraries as long as they are not rapidly introducing breaking changes.
- Work in small batches
- Self-contained repository structures
- Zero downtime deployments: Principles and practices that enables ZDT are:
- small deployable artifacts (services or apps)
- Forward/Backward compatible code
- Feature toggles and branch by abstraction
- Blue/green deployments