Перейти к основному содержанию
Разработка3 мин чтения

Технический долг: когда рефакторить, а когда терпеть

Не всякий беспорядок в коде надо исправлять. Разбираем, как считать стоимость технического долга и по каким признакам понимать, что дальше терпеть дороже.

График роста времени на доработки по мере накопления технического долга

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

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

Что долгом не является

  • Код, написанный не в вашем любимом стиле, но понятный и покрытый проверками
  • Простое решение в месте, которое не меняется годами
  • Устаревшая библиотека, которая работает, поддерживается и не имеет уязвимостей
  • Дублирование в двух местах, если эти места живут по разным правилам

Всё это — нормальные компромиссы. Рефакторинг участка, который никто не трогает, не ускоряет ничего и не экономит денег: он просто тратит время на приведение в порядок того, что и так не мешает.

Признаки настоящего долга

По каким симптомам видно, что долг стал дорогим
СимптомЧто за ним стоитПоследствие
Оценки задач растут при том же объёмеКаждая правка задевает лишнееПланирование перестаёт работать
Одна правка ломает несоседний участокНет границ между частямиПравки боятся вносить
Только один человек может править участокЗнание не в коде, а в головеОтпуск превращается в риск
Проверки перед выпуском только рукамиНет автоматических тестовВыпуск редкий и напряжённый
Новичок выходит на работу месяцамиЛогика размазана и не описанаКоманду сложно расширять

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

Как считать стоимость

Простая оценка: за сколько месяцев рефакторинг окупится
type DebtEstimate = {
  tasksPerMonth: number     // сколько задач в месяц идёт через проблемный участок
  extraHoursPerTask: number // сколько лишних часов уходит из-за состояния кода
  hourlyRate: number
  refactorHours: number     // оценка работ по приведению в порядок
}

export function paybackMonths(e: DebtEstimate): number {
  const monthlyLoss = e.tasksPerMonth * e.extraHoursPerTask * e.hourlyRate
  const refactorCost = e.refactorHours * e.hourlyRate

  if (monthlyLoss === 0) return Infinity // участок не трогают — платить нечем

  return refactorCost / monthlyLoss
}

// Срок окупаемости до полугода — берём в работу.
// Больше двух лет — участок либо трогают редко,
// либо переписывать надо не его

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

Как встроить в работу

  1. Держать постоянную долю времени на технические задачи — обычно от 15 до 20 процентов
  2. Приводить в порядок то, что трогаете по текущей задаче, а не то, что просто не нравится
  3. Крупные куски выносить в отдельные задачи с оценкой окупаемости
  4. Перед рефакторингом покрывать участок проверками, иначе изменения нечем подтвердить
  5. Фиксировать до и после: время на похожие задачи, число возвратов в работу

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

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

Частые вопросы

Как объяснить бизнесу необходимость рефакторинга
Через скорость и деньги, а не через качество кода. Сравните оценки похожих задач полгода назад и сейчас, посчитайте разницу в часах и умножьте на ставку. Дальше сопоставьте с оценкой работ — получится срок окупаемости, который можно обсуждать.
Переписать с нуля или рефакторить постепенно
Постепенно, за редкими исключениями. Переписывание оправдано, когда меняется сама модель работы продукта или технология больше не поддерживается. В остальных случаях поэтапная замена частей за работающим интерфейсом дешевле и безопаснее.
Сколько времени выделять на технические задачи
От 15 до 20 процентов ресурса команды на постоянной основе. При меньшей доле долг накапливается быстрее, чем разбирается, при большей — заметно замедляется развитие продукта. Долю стоит поднимать временно, если оценки задач начали расти.
поддержкаразработкапроцессыкачество

Похожая задача в вашем проекте?

Разберём вашу ситуацию и пришлём оценку по этапам — без обязательств и общих слов.

Обсудить задачу

Вопрос по статье
или по своему проекту

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

Написать нам

Поля со звёздочкой обязательны для заполнения.