Почему быстрые команды не делают организацию быстрой

Один из самых важных показателей команды – это скорость её поставки. Об оптимизации этого параметра все вокруг говорят уже давным-давно (да я и сам целый цикл постов про расшитие бутылочных горлышек написал). Все стараются улучшать качество процессов, CI/CD, развивать своих инженеров.

Но иногда можно заметить забавный парадокс: в подразделении несколько команд, которые прекрасно и быстро работают, но общая поставка всё равно еле ползёт.

⭐️ Как же так получается?

Каждая команда контролирует только свой поток работы: свой бэклог задач, спринты, релизы и так далее. При смещении фокуса внимания на уровень хотя бы нескольких команд появляется много дополнительных факторов: ➡️ Одной команде нужно дождаться API от другой команды, у которой другие приоритеты ➡️ Загруженный архитектор становится боттлнеком ➡️ Изменения одной команды затрагивают ещё три других, и решение требует кучи согласований ➡️ Закончились свободные стенды для тестирования (или он вообще один) ➡️ И множество иных причин

В итоге в lead time появляется колоссальное количество ожидания, которое никак не разруливается на уровне одной команды.

⭐️ Граф зависимостей

По сути, отношения и зависимости между командами выстраиваются в такой же граф зависимостей, какой вы можете найти у себя в коде. И этот граф точно так же может быть плотным или разреженным, однонаправленным или двунаправленным, аккуратным или запутанным до уровня современного искусства.

И в этом графе нужно очень хорошо разбираться, потому что производительность подразделения определяется не только скоростью самих команд, но и тем, как они связаны и взаимодействуют между собой. Можно ускорить одну команду на 50% и не получить общего ускорения, потому что она на каждые два дня работы будет неделю ждать смежников.

Если большинство изменений регулярно пересекает границы команд, возможно, неправильно проведены сами границы.

У меня есть прекрасная история, которая иллюстрирует эту проблему: мы делали фичу совместно с соседним отделом. Фича казалась небольшой, но её невозможно было поставить по частям, независимо. Мы собрались, окнули архитектуру и приступили к работе.

Наша часть была готова через неделю. А релиз фичи состоялся через полтора месяца, потому что у смежников полезли проблемы: то API забыли описать, то руки тестировщиков заняты чем-то другим, то ещё что-то. В итоге получилось, что общий результат был плачевным, хотя моя часть была сделана быстро.

Главная проблема была не в том, что смежники работали плохо, а в том, что результат одной команды в принципе не имел ценности без результата другой.

⭐️ Где проблемы, Лебовски?

Если большинство фич регулярно требует участия нескольких команд и создаёт ожидание, то проблема скорости может быть уже не внутри команд, а в границах ответственности и архитектуре.

Поэтому нужно анализировать: ➡️ Где регулярно возникают простои ➡️ Какие команды блокируют друг друга и как часто ➡️ Какие зависимости становятся бутылочным горлышком ➡️ Не нужно ли поменять архитектуру (и оргструктуру заодно)

Производительность подразделения зависит не только от высокой производительности каждой команды в отдельности, но и от того, насколько они не мешают друг другу поставлять ценность (кстати, похожую модель хорошо разбирает книга Team Topologies).

Быстрые команды не обязательно делают организацию быстрой. Иногда главная оптимизация — не ускорить команды, а убрать лишние зависимости между ними.


В этом посте были ссылки, но мы их удалили по правилам Сетки