# Подходит ли бюджет когнитивной нагрузки вашей команде?

> Составьте бюджет когнитивной нагрузки и выявите скрытую операционную работу, связанную с сервисами, языками, развертываниями, вариантами, предупреждениями и поставщиками.

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

Эта разница важна, когда основатель говорит: «Нам нужна всего одна интеграция» или «Этот клиент стоит отдельного развертывания». Запрос может быть разумным с финансовой точки зрения. Но если он создаёт ещё один объект, способный вызвать страницу для инженера, ещё один сценарий выпуска или ещё одну зависимость, которая может сломаться вне вашего контроля, то будет отнимать внимание ещё долго после празднования запуска.

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

## Численность штата не равна операционной ёмкости

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

Я много раз видел, как руководство путало результат с ёмкостью. Команда быстро выпускает изменения в течение квартала, потому что самый сильный инженер компенсирует нехватку контекста. Потом этот человек уходит на неделю, истекает сертификат, клиенту нужно исправить старый выпуск, и обычное изменение превращается в вечер археологических раскопок. Сложность не возникла «внезапно». Организация откладывала её признание, пока один человек держал всё в голове.

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

Бюджет помогает перейти к более содержательному разговору, чем «кажется, команда перегружена». Он спрашивает:

- Какие производственные обязанности каждый дежурный инженер может выполнять без ожидания специалиста?
- Для каких систем нужен конкретный человек, помнящий недокументированную историю?
- Какие новые запросы добавляют новый сценарий сбоя, а не просто нагрузку на существующий путь?
- Чем команда перестанет владеть, если примет этот запрос?

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

## Инвентаризационная, операционная нагрузка и нагрузка изменений различаются

Система может выглядеть безобидно на архитектурной схеме и всё равно каждую неделю занимать команду. Так происходит, когда руководители объединяют три разных вида нагрузки под одним расплывчатым словом «сложность».

**Инвентаризационная нагрузка** показывает, сколько объектов команда должна знать. Сервисы, языки, репозитории, облачные аккаунты, хранилища данных, поставщики, маршруты развертывания, исключения для клиентов и семейства предупреждений увеличивают инвентаризацию. Сама по себе она не вредна. Продукт с несколькими продуманными компонентами может быть здоровее монолита, который никто не понимает.

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

**Нагрузка изменений** показывает, сколько условий инженеры должны сохранять при каждом изменении продукта. Старый язык может быть приемлемым, если он стабилен и изолирован. Он становится дорогим, когда каждая новая функция требует к нему обращаться, тестировать незнакомую цепочку сборки и согласовывать редкое развертывание.

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

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

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

## Оценивайте неопределённость, а не количество инструментов

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

Используйте простую оценку неопределённости, которую инженер должен держать в голове. Для каждого объекта поставьте три оценки:

| Показатель | 0 | 1 | 2 | 3 | 4 |
| --- | --- | --- | --- | --- | --- |
| Знакомство | Любой инженер справится по актуальной документации | Большинство инженеров справятся | Одному инженеру нужно немного освежить знания | Большая часть контекста у одного владельца | Контекст недоступен или заперт у ушедших сотрудников и в старых сообщениях |
| Непрозрачность сбоя | Сбой очевиден, восстановление привычно | Сигнал понятен, диагностика несложна | Есть несколько вероятных причин | Диагностика проходит через несколько систем или поставщиков | Сбой проявляется косвенно, восстановление неясно |
| Связанность изменений | Изолировано и протестировано | Затрагивает одного известного соседа | Требует согласованных изменений | Требует нескольких систем или согласований | Изменения непредсказуемо влияют на клиентов, данные или выпуски |

Затем рассчитайте:

```text
нагрузка объекта = активные экземпляры × (знакомство + непрозрачность сбоя + связанность изменений)
```

Формула намеренно простая. Не притворяйтесь, что оценка 37 обладает научной точностью. Её задача, заставить группу взрослых объяснить, почему поставщик, язык, маршрут или предупреждение получили 3, а не 1.

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

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

```text
премия за прерывание = 0, 2 или 4
нагрузка объекта = активные экземпляры × (знакомство + непрозрачность сбоя + связанность изменений + премия за прерывание)
```

Ставьте 0, если объект не может вызвать страницу. Ставьте 2, если страница возможна, но сигнал редкий и хорошо понятный. Ставьте 4, если объект регулярно создаёт неоднозначные или затрагивающие несколько систем страницы. Это помогает увидеть важную разницу: шумное предупреждение не просто раздражает. Оно отнимает способность к восстановлению именно тогда, когда команде особенно важно ясно мыслить.

Не позволяйте командам оценивать свою работу в одиночку. Соберите на час людей, которые создают, поддерживают, продают и эксплуатируют систему. Инженеры часто занижают оценку исключения для клиента, потому что знают, как с ним справиться. Поддержка видит недостающую часть: исключение «простое» лишь потому, что одного инженера подключают к каждому разговору о продлении договора.

## Сервисы и языки дорожают из-за пробелов в ответственности

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

Оцените каждый production-сервис, но не ограничивайтесь списком репозиториев. Учитывайте воркеры, планировщики, отчётные задания, административные приложения, конвейеры загрузки данных и старые сервисы, которых «никто не касается». Фраза «никто не касается» часто означает, что никто не проверял восстановление.

Для каждого сервиса заведите короткую операционную карточку:

```text
Сервис: invoice-export-worker
Группа владельцев: Product engineering
Затронутое обещание клиенту: экспорт приходит на следующий рабочий день
Основной сигнал сбоя: возраст очереди экспорта
Безопасный откат: развернуть предыдущий образ, сохранить задания в очереди
Риск для данных: дублирование экспортов при обходе идемпотентности задания
Зависимости: очередь, объектное хранилище, почтовый провайдер
Последняя репетиция восстановления: [дата]
```

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

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

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

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

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

## Пути развертывания, варианты и зависимости умножают нагрузку

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

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

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

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

Варианты для клиентов часто становятся способом купить выручку за счёт незаметной инженерной работы. Запрос продаж начинается с поля, изменения брендинга или формата экспорта. Потом появляется отдельное правило доступа. Позже нужны другая политика хранения, собственное расписание заданий и сроки выпуска, не совпадающие с основным продуктом. На этом этапе перед нами уже не настройка, а второй продукт внутри первого.

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

1. Можно ли развернуть его обычным артефактом и через обычный конвейер?
2. Можно ли тестировать его без доступа к production-аккаунту клиента?
3. Можно ли откатить его, не меняя общее поведение для остальных клиентов?
4. Сможет ли инженер, который его не создавал, поддержать его по актуальной документации?

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

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

Для каждой внешней зависимости напишите предложение, начинающееся словами: «Когда эта зависимость недоступна, наш клиент может...». Если оно заканчивается словами «ничего» или «ждать бесконечно», вы нашли зависимость с высокой непрозрачностью. Решите, должен ли продукт работать в ограниченном режиме, поставить работу в очередь, показать понятный статус, использовать резервный путь или сразу отклонить запрос. Ответ будет разным. Оставлять его неопределённым, самый дорогой вариант.

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

## Предупреждения выставляют счёт за прерывания

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

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

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

Перед тем как разрешить предупреждению вызывать страницу, проведите проверку:

```text
В 02:00 дежурный инженер получает эту страницу.

Какое обещание клиенту может быть нарушено?
Какое первое действие инженер может выполнить за 15 минут?
Какие данные покажут, что действие помогло?
Кто отвечает за окончательное исправление, если страница повторится?
```

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

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

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

## Пример оценки показывает скрытую стоимость «небольшой» сделки с крупным клиентом

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

Запрос выглядит как четыре пункта. Бюджет показывает настоящую операционную поверхность.

| Объект | Активные экземпляры | Знакомство | Непрозрачность сбоя | Связанность изменений | Премия за прерывание | Нагрузка |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| Отдельный путь развертывания | 1 | 3 | 3 | 4 | 2 | 12 |
| Интеграция с провайдером идентификации | 1 | 2 | 3 | 3 | 2 | 10 |
| Воркер и расписание экспорта | 1 | 2 | 2 | 3 | 2 | 9 |
| Процесс согласования выпуска клиентом | 1 | 3 | 2 | 4 | 0 | 9 |
| Новая зависимость от поддержки поставщика | 1 | 3 | 3 | 2 | 2 | 10 |
| **Добавленная нагрузка** |  |  |  |  |  | **50** |

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

Чего делать не стоит, так это принимать сделку под названием «одна интеграция». Такая формулировка скрывает от подписывающего договор человека работу по развертыванию, поддержке, поставщику и согласованиям.

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

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

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

## Установите предел до того, как его обнаружит инцидент

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

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

Затем создайте три порога принятия решений.

| Условие бюджета | Правило решения |
| --- | --- |
| Новая работа остаётся ниже предела и имеет понятного владельца | Одобрить через обычный процесс планирования |
| Новая работа превышает предел, но заменяет существующую нагрузку | Одобрить только при наличии конкретного плана удаления или объединения |
| Новая работа превышает предел и добавляет незнакомый операционный путь | Отложить, выделить для неё людей или изменить запрос |

План удаления должен быть конкретным. «Потом наведём порядок» не считается. Назовите сервис, поставщика, путь развертывания, семейство предупреждений или исключение для клиента, которое исчезнет, и укажите рядом дату и владельца.

Здесь команды часто делают неправильный выбор. Они начинают переписывание с нуля, потому что это кажется продуктивным, но оставляют живыми дублирующий CI-путь, неиспользуемого поставщика, шумные предупреждения и ветку для крупного клиента. Бюджет улучшается только тогда, когда ответственность исчезает или становится заметно легче.

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

## Тратьте бюджет там, где это почувствуют клиенты

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

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

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

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

Аудит Team & AI полезен, когда спор уже стал дорогим: он заставляет за короткий цикл принять решения об инвентаризации, карте ответственности и консолидации. Но для начала не нужен внешний консультант. Пропустите следующий сервис, вариант или зависимость через рабочую таблицу до того, как кто-то пообещает их клиенту.
