Lex Humanitas показывает, где форма скрывает власть и подменяет смысл.

Модуль 2. Команда как инженерная система

Введение

Основной тезис модуля

Команда — это не просто несколько разработчиков, которых поместили в один чат, добавили на одни и те же встречи и назначили им общего руководителя.

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

Набор людей Команда
Каждый выполняет порученную ему работу. Люди совместно отвечают за общий результат и способны его достигать.

Поэтому лид отвечает не только за отдельных людей и не только за список задач. Он отвечает за то, чтобы команда в целом была способна выполнять свою функцию.

Это другой уровень наблюдения.

Можно собрать сильных инженеров и получить слабую команду. Один человек будет знать production, второй — бизнес-логику, третий — инфраструктуру, но между ними не возникнет общего контура действия. Каждый локально компетентен, однако система в целом зависит от ручной координации, внешних решений и нескольких незаменимых людей.

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

Главный вопрос этого модуля:

Способна ли данная конфигурация людей, знаний, полномочий и связей устойчиво выполнять свою функцию?


Зачем лиду системная модель команды

Без системной модели проблемы команды почти неизбежно сводятся к свойствам отдельных людей:

  • Разработчики медленные.
  • Middle недостаточно самостоятельный.
  • Senior слишком конфликтный.
  • QA опять задерживает выпуск.
  • DevOps не помогает.
  • Product приносит плохие требования.
  • Команда не проявляет ownership.

Каждое такое утверждение может содержать часть наблюдаемой реальности. Но само по себе оно ещё ничего не объясняет. Оно локализует проблему в человеке раньше, чем исследована система, внутри которой человек действует.

Middle может выглядеть несамостоятельным, потому что право принимать решения фактически принадлежит только лиду. QA может постоянно задерживать выпуск, потому что тестирование отделено от разработки и начинается лишь после завершения всей фичи. Senior может захватывать каждое обсуждение, потому что только у него есть знание о критической части системы. Product может приносить требования в последний момент, потому что у команды вообще нет устойчивого способа включаться в продуктовый discovery.

Системный взгляд не отменяет личную ответственность и не объявляет любое поведение следствием процесса. Он позволяет сначала установить причинность:

Что создаёт наблюдаемое поведение?

  • Недостаток компетенции?
  • Неясная ответственность?
  • Отсутствие полномочий?
  • Монополия на знание?
  • Конфликт целей?
  • Избыточная когнитивная нагрузка?
  • Плохая граница команды?
  • Внешняя зависимость?
  • Или сознательный отказ человека выполнять принятую ответственность?

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

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


1. Функция команды

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

Формулировка функции не должна сводиться к перечню технологий или операций:

Слабая формулировка:

Мы backend-команда. Пишем Java-сервисы и обрабатываем задачи из Jira.

Более точная формулировка:

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

В первом случае команда описывает, что её участники делают. Во втором — какую часть работающей реальности она удерживает.

Функция команды должна позволять ответить на вопросы:

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

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


2. Граница ответственности

Ответственность существует только тогда, когда определена её граница.

Команда должна понимать:

  • Что принадлежит нам?
  • Что не принадлежит нам?
  • Какие решения мы принимаем сами?
  • Какие решения требуют согласования?
  • За какой результат с нас можно спрашивать?
  • На что мы не можем реально повлиять?

Размытая граница создаёт два противоположных режима.

В первом команда считает своей ответственностью только написание кода:

  • Требования дал Product.
  • Архитектуру определил архитектор.
  • Инфраструктуру сделал DevOps.
  • Проверил QA.
  • В production выпустил Release Manager.

Логика команды при этом такая: «Если пользовательский сценарий не работает — это проблема между подразделениями».

Формально каждый выполнил свою операцию. Системного владельца результата нет.

Во втором режиме на команду возлагают ответственность за всё, но не дают соответствующих полномочий:

  • Команда отвечает за срок, но не управляет приоритетами.
  • Команда отвечает за production, но не имеет доступа к наблюдаемости и deployment.
  • Команда отвечает за архитектуру, но каждое решение утверждается внешним комитетом.
  • Команда отвечает за качество требований, но подключается после того, как решение уже продано заказчику.

Это не ответственность, а назначение виновного за результат, который команда не контролирует.

Поэтому лид должен сопоставлять три вещи: ответственность, полномочия и доступные средства действия. Они должны соответствовать друг другу.

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


3. Командная способность, а не сумма индивидуальных навыков

Наличие нужного специалиста ещё не означает наличия способности у команды.

Например, в команде может быть один человек, который умеет:

  • разбираться с production-инцидентами;
  • изменять CI/CD pipeline;
  • диагностировать Kafka;
  • согласовывать архитектурные решения;
  • объяснять предметную область;
  • выпускать релиз.

В отчёте о составе команды все компетенции присутствуют. В реальности они принадлежат одному человеку. Следовательно, команда не обладает этими способностями устойчиво — она арендует их у конкретного участника.

Нужно различать:

В команде есть человек, который это умеет.

Команда как система способна это делать.

Командная способность предполагает, что:

  • знание не существует только в одной голове;
  • действие не заблокировано отсутствием одного человека;
  • другие участники понимают хотя бы основные принципы и ограничения;
  • существуют способы передать и восстановить знание;
  • право на действие не монополизировано без необходимости;
  • команда способна воспроизвести результат в изменившихся условиях.

Для анализа можно составить карту способностей:

Способность Кто умеет Кто может подменить Где зафиксировано знание Риск потери
Диагностика production Анна Игорь частично Runbook отсутствует Высокий
Изменение бизнес-правил Сергей, Мария Анна ADR и domain guide Низкий
Работа с deployment Павел Никто Pipeline описан частично Критический
Общение с внешним API Мария Сергей Contract tests Средний

Такая карта показывает не seniority отдельных людей, а устойчивость способности команды действовать.


4. Архитектура принятия решений

Команда определяется не только тем, кто выполняет работу, но и тем, где принимаются решения.

Во многих командах декларируется автономность, но реальный механизм может выглядеть так:

  1. Разработчик обнаруживает проблему.
  2. Middle идёт к senior.
  3. Senior идёт к лиду.
  4. Лид идёт к архитектору.
  5. Архитектор идёт к Product.
  6. После нескольких встреч решение возвращается разработчику.

Внешне никто не бездействовал. Однако команда не способна преобразовать наблюдение в решение без длинной цепочки разрешений.

Лиду необходимо сделать видимой архитектуру решений:

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

Проблема не решается декларацией «проявляйте больше ownership». Если человек не понимает область допустимого решения или уже получал наказание за самостоятельность, он будет возвращать решение наверх.

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

Масштаб решения Как принимается
Локальное и обратимое Локально.
Меняет контракт нескольких команд Совместно владельцами затронутых границ.
Меняет бизнесовый смысл продукта С участием Product и соответствующего владельца результата.

5. Распределение знания

Команда действует через знание. Поэтому распределение знания является частью её архитектуры.

Нужно видеть как минимум четыре вида знания:

  1. Предметное знание — как устроен пользовательский сценарий, бизнесовые правила и ограничения.
  2. Техническое знание — как устроен код, данные, интеграции и инфраструктура.
  3. Операционное знание — как система ведёт себя в production, как её диагностировать и восстанавливать.
  4. Историческое знание — почему были приняты существующие решения и какие альтернативы уже проверялись.

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

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

  • У области есть основной владелец.
  • Есть как минимум ещё один человек, способный продолжить действие.
  • Команда понимает границы и ключевые решения области.
  • Критическое знание имеет внешнюю опору: ADR, runbook, схема, contract test или рабочий пример.

Задача лида — не стать главным хранилищем знания. Если знание существует только в голове лида, команда выглядит сильной лишь до тех пор, пока лид лично присутствует во всех процессах.


6. Когнитивная нагрузка

Команда может быть формально укомплектована и при этом не справляться с системой, потому что объём удерживаемой сложности превышает её способность понимать происходящее.

Когнитивная нагрузка возникает не только из количества задач. Её создают:

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

Признаки избыточной когнитивной нагрузки:

  • Ни один человек не может объяснить систему целиком хотя бы на уровне основных контуров.
  • Любое изменение требует участия нескольких узких специалистов.
  • Команда постоянно забывает неочевидные ограничения.
  • После переключения на другую область требуется несколько дней, чтобы восстановить контекст.
  • Документация не помогает, потому что сама отражает сложность, а не разрезает её.
  • Инженеры знают операции, но перестают понимать причинность системы.

Один из подходов, который использует это ограничение при проектировании команд, — Team Topologies. В нём когнитивная нагрузка — один из критериев определения границы: команда должна владеть таким участком системы, который она реально способна понимать и изменять. (3)

Ответом на перегрузку не всегда является найм ещё одного разработчика. Иногда необходимо:

  • уменьшить границу ответственности;
  • выделить сложную подсистему;
  • убрать технологическую вариативность;
  • создать платформенную возможность;
  • передать команде недостающее знание;
  • автоматизировать повторяющиеся операции;
  • изменить архитектуру продукта;
  • прекратить поддерживать часть ненужной сложности.

7. Автономность команды

Автономность — это не отсутствие руководителя и не право игнорировать другие команды. Это способность принимать достаточный класс решений и доводить собственную функцию до результата без постоянного внешнего ручного управления.

Для автономности команде необходимы:

  • ясная функция;
  • понятная граница ответственности;
  • доступ к необходимой информации;
  • компетенции для работы внутри границы;
  • право принимать решения соответствующего масштаба;
  • доступ к инструментам и средам;
  • обратная связь от production и пользователей;
  • известные способы взаимодействия с внешними владельцами.

Ложная автономность выглядит так:

Декларация: «Вы автономная команда, поэтому разбирайтесь сами».

Но фактически:

  • приоритеты меняются снаружи;
  • архитектурные решения принимаются снаружи;
  • production закрыт;
  • бюджет и инструменты недоступны;
  • внешние команды не обязаны отвечать;
  • за сроки всё равно отвечает команда.

Это не автономность, а изоляция при сохранённой ответственности.

Есть и противоположная подмена: команда получает полномочия, но возвращает каждое решение лиду. Тогда лид становится центральным процессором, а остальные участники — периферией исполнения.

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


8. Внутренняя связность и качество коммуникации

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

Команда теряет связность, когда:

  • проблема известна одному участнику, но не становится знанием команды;
  • несогласие скрывается до момента реализации;
  • решения принимаются в личных переписках и не возвращаются в общий контур;
  • человек сообщает о действиях, но не сообщает о рисках и неизвестности;
  • технический язык не переводится в последствия для продукта;
  • Product, QA и разработка удерживают разные версии того, что строится;
  • конфликт интерпретируется только как личная несовместимость, хотя стороны защищают разные ответственности;
  • встречи существуют, но не создают решений.

Качество коммуникации можно проверять не количеством сообщений и встреч, а тем, насколько точно команда способна совместно ответить:

  • За что мы отвечаем?
  • Что сейчас является главным изменением?
  • Какие ограничения нельзя нарушить?
  • Где находится неизвестность?
  • Какие решения уже приняты?
  • Кто должен действовать дальше?
  • Где требуется помощь или эскалация?

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


9. Внешние зависимости и способы взаимодействия

Команда никогда не существует полностью изолированно. Она зависит от продукта, платформы, инфраструктуры, безопасности, внешних сервисов, других доменов и организационных решений.

Наличие зависимости само по себе не является дефектом. Проблема возникает, когда зависимость:

  • не названа;
  • не имеет владельца;
  • не имеет понятного способа взаимодействия;
  • требует постоянных персональных договорённостей;
  • блокирует команду на неопределённый срок;
  • заставляет обе стороны удерживать лишнюю сложность;
  • выдаётся за автономность одной из команд.

Для каждой значимой зависимости лид должен понимать:

Вопрос Содержание
От кого зависит команда? Конкретная другая команда или владелец результата, а не абстрактный отдел
Что именно требуется? Решение, сервис, данные, консультация, доступ или изменение
Кто владеет результатом? Где находится окончательная ответственность
Каков режим взаимодействия? Совместное исследование, потребление сервиса или временная помощь
Как завершается взаимодействие? Условие выхода, стабильный контракт или переданная способность
Что происходит при сбое? Эскалация, fallback, ограничение функции или остановка

Team Topologies как язык командной архитектуры

Team Topologies предлагает не универсальную схему организационной структуры, а язык для различения типов команд и способов их взаимодействия. В модели выделяются четыре фундаментальных типа команд: stream-aligned team, platform team, enabling team и complicated-subsystem team. (1)

Stream-aligned team

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

Platform team

Платформенная команда создаёт внутренний продукт, который уменьшает нагрузку на stream-aligned teams и даёт им возможность самостоятельно использовать инфраструктурные или технические возможности. Платформа не должна становиться ещё одним центром заявок и ручных разрешений.

Enabling team

Enabling team временно помогает другим командам освоить недостающую способность, технологию или способ работы. Её результат — не постоянная зависимость, а возросшая самостоятельность принимающей команды.

Complicated-subsystem team

Команда владеет подсистемой, требующей специализированного знания, которое было бы чрезмерной нагрузкой для stream-aligned team: например, сложный алгоритмический, математический или технический контур.

Кроме типов команд Team Topologies различает три режима взаимодействия: Collaboration, X-as-a-Service и Facilitating. (2)

Collaboration

Две команды временно работают вместе, когда необходимо исследование, обучение или совместное обнаружение новой границы. Постоянная «коллаборация» без срока и условия завершения обычно означает, что ответственность так и не была разделена.

X-as-a-Service

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

Facilitating

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

Лиду не требуется механически перекрашивать существующие отделы в четыре типа. Ценность модели появляется, когда она позволяет задать точные вопросы:

Сначала — о границе и зависимости:

  • Почему эти люди находятся в одной команде?
  • По какому потоку ценности проведена её граница?
  • Какую когнитивную нагрузку она удерживает?
  • Какая зависимость между командами необходима?
  • Какой режим взаимодействия существует фактически?
  • Когда временное взаимодействие должно закончиться?

Затем — о том, не прикрываем ли мы организационные проблемы правильными названиями:

  • Не выдаём ли мы постоянную неясность за Collaboration?
  • Не называем ли мы платформой отдел ручного обслуживания заявок?
  • Не создаёт ли enabling-команда вечную зависимость от своих экспертов?

10. Способность команды восстанавливаться

В этом модуле речь идёт не о восстановлении технического сервиса после production-инцидента — это отдельная тема reliability. Здесь рассматривается устойчивость самой команды как действующей системы.

Команда должна сохранять способность действовать, если:

  • ключевой человек временно недоступен;
  • один из участников ушёл;
  • изменились приоритеты;
  • появилась новая внешняя зависимость;
  • произошла реорганизация;
  • обнаружилось, что прежнее решение неверно;
  • объём работы резко вырос;
  • команда получила новую область ответственности.

Устойчивость не означает, что любое изменение проходит без потерь. Она означает, что команда умеет обнаружить потерю способности, перестроить знания, перераспределить ответственность и восстановить управляемое действие.

Обратная сторона — хрупкая команда: её критические способности и решения зависят от отдельных людей или случайного порядка работы.

Признаки хрупкой команды:

  • Без лида никто не принимает решения.
  • Без одного senior нельзя выпускать изменения.
  • После ухода Product Owner исчезает знание о смысле продукта.
  • Новая технология автоматически отдаётся единственному человеку, который её уже знает.
  • Любая срочность уничтожает существующий порядок работы.
  • После ошибки команда ищет виновного, но не меняет механизм, который воспроизводит ошибку.

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


Итоги модуля

Лид должен перестать смотреть на команду только как на сумму сотрудников и начать видеть:

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

Главное различение модуля:

Если результат существует только благодаря постоянному личному вмешательству лида, лид пока не построил командную систему. Он сам временно заменяет её собой.

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


Источники

  1. Team Topologies: Key Concepts
  2. Team Topologies: Team Interaction Modeling
  3. Team Topologies: Fast Flow
Прокрутить вверх