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

Фраза «нам нужно переписать этот модуль» почти никогда не получает одобрения бизнеса. Она звучит как просьба выделить время на невидимую работу без понятной отдачи. Рабочий разговор начинается иначе: команда связывает конкретный участок кода с задержкой релиза, количеством инцидентов, ручными операциями или стоимостью следующего изменения. Ниже — практика переговоров, ревью и планирования рефакторинга для команд, где код проходит через Git и code review. Подход не привязан к версии конкретного фреймворка или языка.
Почему бизнес отклоняет разговор о техдолге
Для разработчика проблема видна в структуре кода: дублирование, длинные методы, неявные зависимости, тесты, которые нельзя запустить отдельно. Для бизнеса важны другие последствия:
- релиз функции переносится на две недели из-за изменений в связанном модуле;
- каждая правка требует ручной проверки нескольких сценариев;
- ошибка в одном месте приводит к возвратам, обращениям в поддержку или простою;
- нового сотрудника приходится долго вводить в проект;
- изменение, которое должно занимать день, занимает пять.
Сам по себе плохой код не всегда требует немедленного рефакторинга. Если участок редко меняется и не влияет на критичный путь, его можно оставить в списке наблюдения. Предложение должно появляться там, где техническая проблема уже меняет стоимость продукта или скорость команды.
Бизнесу не нужно покупать «чистый код». Ему нужно понимать, какой риск исчезнет, какой процесс ускорится и что команда получит за потраченное время.
Техдолг — это условное обозначение будущих затрат, которые возникают из-за временного или неудачного технического решения. В отличие от денежного долга, у него нет единого обязательного платежа: стоимость проявляется через новые часы разработки, дефекты и ограничения для изменений.
Сначала ревью: отделите долг от личных предпочтений
Переговоры разваливаются, если ревью превращается в список вкусов: «этот класс выглядит плохо», «так никто не пишет», «нужно использовать другой паттерн». Перед разговором отделите нарушение правила от архитектурного риска и от личного стиля.
Что фиксировать в ревью
- Повторяемость проблемы. Одинаковая логика скопирована в нескольких местах или ошибка возникала в нескольких релизах.
- Зона воздействия. Укажите конкретный маршрут, сервис, таблицу, очередь или бизнес-сценарий.
- Цена изменения. Сравните обычную задачу без препятствия и задачу, которая проходит через проблемный участок.
- Риск. Зафиксируйте, что произойдёт при ошибке: неверный расчёт, недоступность функции, потеря времени поддержки.
- Граница работы. Назовите, что не входит в рефакторинг. Иначе задача превратится в переписывание всей подсистемы.
Хорошее замечание в ревью проверяемо. Вместо «разделите этот класс» напишите: «Изменение тарифа требует правки в четырёх методах и двух тестовых наборах. Предлагаю вынести расчёт скидки в отдельный компонент, чтобы следующий тариф менялся в одном месте. В этом pull request делаем только выделение логики, поведение не меняем».
Четыре способа договориться о работе
Один и тот же техдолг можно предложить бизнесу по-разному. Выбор зависит от срочности риска и от того, можно ли встроить работу в ближайшую задачу.
| Подход | Когда применять | Что получает бизнес | Цена и риск |
|---|---|---|---|
| Рефакторинг внутри функции | Проблема затрагивает код, который уже меняется | Меньше отдельного планирования, снижение риска в текущем релизе | Работа может расширить задачу, если не обозначить границу |
| Отдельная техническая задача | Участок часто ломается, но не связан с текущим продуктовым запросом | Понятный объём, отдельная оценка и критерии результата | Задача конкурирует с функциями и может откладываться |
| Постепенная замена | Систему нельзя остановить, а переписывание слишком рискованно | Изменения идут без большого переключения в один релиз | Временно поддерживаются старый и новый пути |
| Не исправлять сейчас | Код редко меняется и не создаёт заметного риска | Команда сохраняет время для более дорогой проблемы | Нужно поставить дату повторной проверки, иначе решение забудут |
Как выбрать подход
Если команда уже открыла модуль для продуктовой задачи, выбирайте локальный рефакторинг внутри неё. Это самый дешёвый момент: контекст уже загружен, а поведение можно проверить теми же тестами.
Если проблема регулярно появляется в разных задачах, нужна отдельная работа с измеримым результатом. Например: уменьшить число мест, где задаётся правило расчёта, добавить тесты для граничных сценариев и сократить ручные проверки перед релизом.
Если старый код нельзя отключить за один релиз, используйте постепенную замену. Сначала добавьте проверку нового пути на ограниченном наборе сценариев, затем переведите трафик или операции, после чего удалите старую реализацию. Детали переключения зависят от архитектуры и требуют отдельного плана отката.
Как превратить просьбу в задачу для планирования
Техническая задача должна выглядеть не как «почистить код», а как ограниченный проект с причиной, результатом и способом проверки.
- Опишите симптом. Например: изменения в расчёте доставки требуют правок в трёх слоях, а последние два релиза сопровождались ручной перепроверкой заказов.
- Укажите участок. Назовите репозиторий, сервис, маршрут или бизнес-сценарий. Не отправляйте команду искать проблему по всему проекту.
- Зафиксируйте базовую точку. Запишите текущий срок выполнения типовой задачи, число затронутых файлов, количество ручных шагов или частоту дефектов. Если данных нет, поставьте сбор измерений первым пунктом.
- Опишите границы. Укажите, какие модули не меняются, какие внешние контракты сохраняются и какой объём не входит в работу.
- Назначьте критерии готовности. Это могут быть автоматические тесты для сценариев, отсутствие изменения внешнего поведения, удаление дублирования в конкретных местах и прохождение стандартного ревью.
- Добавьте план отката. Для небольшого рефакторинга достаточно вернуть commit. Для изменения схемы данных или последовательности обработки нужен отдельный обратимый шаг.
Формулировка для планирования может выглядеть так: «Вынести проверку лимитов из обработчика заказа в отдельный компонент. Сохранить текущие ответы API, покрыть три граничных сценария тестами и убрать четыре дублирующихся условия. Не менять схему базы и правила расчёта. Оценка — после короткого технического исследования».
Как провести разговор с бизнесом
Начните с решения, а не с обвинения
Не говорите, что прежняя команда «написала всё неправильно». Это переводит разговор на защиту людей и прошлых решений. Объясните, почему решение перестало подходить текущему продукту: выросло число сценариев, добавились интеграции, изменился объём данных или требования к скорости релизов.
Полезная структура — «факт, последствие, предложение». Сначала факт: конкретная задача затронула пять несвязанных файлов. Затем последствие: проверка занимает дополнительный день и повышает вероятность пропуска сценария. После этого предложение: выделить одну ответственную часть и проверить её на двух ближайших изменениях.
Не обещайте экономию без измерений
Фраза «после рефакторинга разработка ускорится вдвое» почти всегда вызывает недоверие. Если данных нет, обещайте не результат, а способ его проверить. До начала работы соберите несколько наблюдений: время от начала задачи до pull request, число замечаний по одному типу, количество откатов или ручных операций. После изменения сравните тот же показатель на сопоставимых задачах.
Важно не выдавать единичный удачный релиз за доказательство. На срок влияют размер задачи, очередь ревью и срочные инциденты. Достаточно заранее договориться, какой показатель смотрите и через сколько задач возвращаетесь к оценке.
Что ломается в переговорах и реализации
- «Перепишем всё». Большой объём трудно оценить и почти невозможно защитить перед бизнесом. Разделите работу по границам поведения и релизам.
- Рефакторинг без тестового барьера. Команда меняет структуру и одновременно бизнес-логику, после чего не может доказать, что поведение сохранено. Сначала закрепите критичные сценарии тестами или проверяемыми примерами.
- Смешивание с функциональностью. В одном pull request появляются новая функция, миграция и перестройка модулей. Ревью становится дольше, а откат — опаснее.
- Метрика ради отчёта. Уменьшение числа строк или классов не доказывает пользу. Следите за временем изменения, дефектами, откатами и ручной проверкой.
- Отсутствие владельца после согласования. Задача попадает в общий список и теряется. Назначьте ответственного, окно выполнения и дату повторной проверки результата.
Когда рефакторинг лучше отложить
Отложить работу — не значит проиграть переговоры. Это разумное решение, если участок не меняется, риск ограничен, а рядом есть более дорогая проблема. Зафиксируйте причину отказа и условие возврата: например, повторное изменение модуля, рост времени обработки или второй инцидент с тем же источником.
Не стоит начинать большой рефакторинг перед жёстким релизом, если нет времени на тестирование и откат. Исключение — ситуация, где без изменения нельзя снизить текущий риск. Тогда обсуждайте не идеальную архитектуру, а минимальный безопасный шаг, который удержит систему до следующего окна.
Что делать дальше
Возьмите один свежий pull request и выберите замечание, которое повторяется или задерживает задачу. Проверьте его по четырём вопросам: какой факт подтверждает проблему, кто несёт последствия, сколько стоит бездействие и как проверить результат. Затем оформите короткую техническую задачу с границами, метрикой и планом отката.
После двух-трёх таких задач сравните не количество исправленных классов, а время изменений, число дефектов и объём ручной проверки. Если показатель не изменился, пересмотрите гипотезу: проблема могла быть не в структуре кода, а в тестовом контуре, процессе ревью или архитектурной границе.
Проверка рекламы на риски: Что в макете вызовет вопросы ФАС: превосходные степени, сравнения, обещания результата, маркировка.
Спросить за 40 ₽Источники: Technical Debt Quadrant — Martin Fowler, Google Engineering Practices: Code Review
Частые вопросы
Как объяснить техдолг руководителю, который не разбирается в коде?
Нужно ли выделять отдельный спринт на весь техдолг?
Что делать, если бизнес не согласовал рефакторинг?
А если рефакторинг нельзя закончить до релиза?
Как понять, что рефакторинг действительно помог?
Можно ли обсуждать техдолг прямо в code review?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.