Подробное руководство
Симулятор потери скорости из-за технического долга: во сколько команде разработки обходится переделка
Аналитический обзор отрасли
Технический долг — это накопленная стоимость срезанных углов: код, который работает, но его трудно менять, отсутствующие тесты, запутанные зависимости и старые системы, которых никто не понимает. Он редко появляется в бюджете. Вместо этого он проявляется в ощущении, что всё занимает больше времени, чем раньше. Оценки сдвигаются, мелкие изменения ломают несвязанные вещи, а команда проводит спринты за работой, не создающей ничего нового. Счёт за это приходит не в виде платежа, а в виде меньшего числа функций, выпускаемых каждый месяц при том же фонде оплаты труда.
Структура задачи — налог на мощность. Если пятая часть каждого спринта уходит на обходные решения и переделки, команда ведёт себя так, будто она на пятую часть меньше, хотя зарплаты не изменились. Долг к тому же накапливается. Каждая новая функция, построенная на шаткой основе, добавляет сложности, поэтому теряемая доля растёт, если часть усилий не тратится на погашение. Погашение долга стоит результата сейчас, и поэтому его всегда соблазнительно откладывать, а решение заслуживает расчётов.
Модель домино прослеживает потери. Доля спринта, теряемая на долг, уменьшает мощность, доступную для новой работы, и это сокращает число выпущенных функций. Меньше функций уменьшает ценность, поставляемую на доллар фонда оплаты труда, а бремя переделок, тушения пожаров и текучести растёт вместе с долгом. Последний блок сравнивает выпущенную ценность с реальной стоимостью команды. Скромный рост долга может превратить здоровую отдачу в убыток, потому что фонд оплаты труда фиксирован, а ценность — нет.
Айсберг показывает то, что скрывает строка фонда оплаты труда. Видимым остаётся сам фонд оплаты труда. Под водой лежат часть фонда, потраченная на переделки, тушение пожаров, которые долг вызывает в production, текучесть инженеров, уходящих из утомительных кодовых баз, и ценность функций, которые так и не были созданы. Последняя статья — упущенная выгода, которая никогда не появляется в бухгалтерии, хотя обычно именно она самая крупная. С помощью симулятора найдите уровень долга, при котором команда перестаёт окупать себя, и проверьте, стоит ли план погашения усилий.
Формулы и методология
Модель — это месячный взгляд на продуктовую команду. Фонд оплаты труда — это инженеры, умноженные на полную стоимость. Часть спринта уходит на долг, часть — на сознательное погашение, а остальное идёт на новые функции. Выпущенные функции — это инженеры, умноженные на функции на инженера и на эту оставшуюся долю, оценённые по ценности функции. Долг вызывает также инциденты в виде доли стоимости переделок и повышает текучесть, оцениваемую в четыре месячные зарплаты полной стоимости на одну замену. В проекции долг каждый месяц растёт, если погашение не финансируется.
- Доля созидания
- b = 1 − долг − погашение
- Часть спринта, которая идёт на новые функции.
- Выпущенные функции
- F = инженеры × функции на инженера × b
- Новые функции, поставленные за месяц.
- Стоимость переделок
- W = фонд оплаты труда × долг
- Часть фонда оплаты труда, не купившая новой ценности.
- Стоимость текучести
- A = инженеры × (1 % + 0,06 % × пункты долга) × 4 месяца × стоимость
- Ожидаемые месячные расходы на замену инженеров; растут вместе с долгом.
- Чистый результат
- Чистая прибыль = F × ценность − фонд оплаты труда − 0,15 × W − A
- Поставленная ценность минус реальная стоимость команды. Точка разрыва — там, где он обращается в ноль.
Каскадная эластичность
Доля долга — самый эластичный параметр, потому что она одновременно снижает результат и увеличивает расходы на инциденты и текучесть. Ценность функции и функции на инженера масштабируют всю отдачу. Фонд оплаты труда важен, потому что это фиксированная база, которую ценность должна превзойти.
Три реальных примера
Старт на собственных средствах
Небольшая команда с чистой кодовой базой
Команда из трёх человек держит долг низким, быстро выпускает и высоко ценит каждую функцию относительно фонда оплаты труда. Переделок мало. Загрузите пример и посмотрите на раннее преимущество чистой основы и на то, как мало долга нужно, чтобы начать её разрушать.
Растущий средний бизнес
Крупная команда, которая вкладывается в погашение
Команда из сорока пяти человек несёт умеренный долг, но резервирует десятую часть каждого спринта на уборку. Функции выходят в хорошем темпе, а инцидентов мало. Загрузите пример и посмотрите, почему дисциплинированное погашение масштабируется.
Кризис типа «чёрный лебедь»
Быстро растущая кодовая база, которую никто не может менять
Команда из двадцати пяти человек унаследовала годы срезанных углов. Больше половины каждого спринта уходит на переделки и инциденты, текучесть высока, а времени на погашение нет. Загрузите пример и посмотрите, как большой фонд оплаты труда производит мало и какой рычаг возвращает месяц в плюс.
Матрица отраслевых ориентиров
| Показатель | Опасная зона | Среднее по отрасли | Лучшие 10 % |
|---|---|---|---|
| Доля спринта, потерянная на переделки | Выше 40 % | 15–25 % | Ниже 10 % |
| Время, зарезервированное на погашение долга | Ноль | 5–10 % | 15–20 % при необходимости |
| Выпущенная ценность на доллар фонда оплаты труда | Ниже 1,0 | 1,2–1,6 | Выше 2,0 |
| Месячная текучесть инженеров | Выше 2,5 % | 1–1,5 % | Ниже 1 % |
| Работа над инцидентами как доля стоимости переделок | Выше 25 % | 10–15 % | Ниже 8 % |
Переменные и рычаги
Инженеров в команде
Разработчики, работающие над продуктом, в эквиваленте полной занятости.
Рычаг: Не добавляйте инженеров в команду с тяжёлым долгом в первую очередь: каждый новый человек унаследует то же торможение и замедлит онбординг.
Полная стоимость инженера в месяц
Зарплата плюс налоги, льготы, оборудование и накладные расходы на одного инженера за месяц.
Рычаг: Держите зарплаты на уровне рынка, но сократите скрытые накладные расходы: каждый час, потерянный на долг, оплачивается по полной ставке.
Спринт, потерянный на долг и переделки
Доля инженерного времени, потраченная на обходные решения, исправление ошибок, медленные сборки и борьбу со старым кодом вместо новых функций.
Рычаг: Сделайте долг видимым: составьте список худших модулей, оцените часы переделок и сначала исправляйте те, что затрагивают больше всего функций.
Функций на инженера в месяц (без долга)
Сколько значимых функций один инженер выпускал бы за месяц, если бы время не терялось на долг.
Рычаг: Уберите трение в сборке, тестировании и ревью: от опыта разработчика зависит, сколько функций может выпустить человек.
Месячная ценность выпущенной функции
Выручка, экономия или удержание, которые типичная функция добавляет в месяц после выпуска, по вашей собственной оценке.
Рычаг: Выпускайте функции, которые двигают выручку или удержание; если выпущенная ценность низка, никакая скорость не сделает команду прибыльной.
Спринт, вложенный в погашение долга
Доля спринта, сознательно потраченная на сокращение долга. Это стоит результата сейчас и уменьшает долг позже.
Рычаг: Резервируйте постоянную долю каждого спринта, часто от десяти до двадцати процентов, на долг, который блокирует предстоящую работу.
Как пользоваться этим симулятором
- 1Начните с реалистичного пресета или введите размер команды, полную стоимость и оценку доли переделок.
- 2Изучите пять блоков домино и посмотрите, что раньше станет красным: скорость или бремя долга.
- 3Нажмите «Найти мою точку разрыва», чтобы увидеть долю долга, при которой команда становится убыточной.
- 4Сравните текущий план с планом погашения на 24-месячном графике.
- 5Измерьте переделки за несколько спринтов и пересматривайте модель каждый квартал.
Каких ошибок избегать
- Считать время, потерянное на долг, бесплатным из-за фиксированных зарплат, хотя каждый час несёт полную стоимость.
- Добавлять инженеров в медленную кодовую базу и ждать пропорционального роста скорости.
- Планировать полное переписывание кода с нуля вместо постепенного погашения долга там, где он блокирует предстоящую работу.
- Игнорировать текучесть, которая является реальной и повторяющейся ценой неприятного кода.
Часто задаваемые вопросы
Как оценить долю спринта, теряемую на долг?
Несколько спринтов помечайте тикеты и запросы на слияние, которые являются переделками, исправлением ошибок или обходными решениями, затем разделите это время на общее инженерное время. Спросите у команды приблизительное число для перекрёстной проверки.
Всякий ли технический долг плох?
Нет. Срезать угол, чтобы быстрее учиться или уложиться в срок, может быть хорошим компромиссом, если вы это отслеживаете и погашаете. Долг становится проблемой, когда он неуправляем и накапливается.
Сколько времени тратить на погашение?
Зависит от уровня долга и предстоящей работы. Постоянные от десяти до двадцати процентов — обычная практика, но тратьте их на долг, блокирующий запланированные функции, а не на уборку ради уборки.
Как оценить ценность функции?
Оцените месячную выручку, удержание или экономию затрат, которые она добавляет, хотя бы приблизительно. Если не получается, используйте как отправную точку средний рост выручки, делённый на число выпущенных функций.
Как найти уровень долга, при котором команда теряет деньги?
Нажмите «Найти мою точку разрыва». Инструмент сдвигает каждый параметр к худшему краю и сообщает значение, при котором месячная прибыль обращается в ноль.
Насколько это точно?
Это учебная модель с заявленными допущениями, а не управленческая консультация. Реальные инженерные результаты зависят от многих факторов. Подставьте свои данные.
Это учебная модель планирования с заявленными допущениями. Она не является финансовой, налоговой или юридической консультацией. Подставьте собственные данные и проверяйте важные решения у квалифицированного специалиста.