Привет! Меня зовут Дмитрий Березницкий, я больше 25 лет работаю в разработке ПО. За это время видел, как одни команды росли и с лёгкостью внедряли новые фичи, а другие — всё больше погружались в хаос, где любое изменение требует недели усилий и проверки «на авось». Причина почти всегда одна — технический долг. Сегодня я расскажу, что это такое на практике, как его распознать, почему он опаснее, чем кажется, и какие шаги реально помогают.
Технический долг — это не просто неряшливый код. Это системная проблема, накапливающаяся из множества компромиссов, спешки, недостаточной инженерной культуры и отсутствия стратегического планирования. Поначалу всё кажется безобидным: «перепишем позже», «временное решение», «не до этого сейчас». Но потом проект буквально перестаёт двигаться.
И если долго игнорировать эти сигналы — наступает архитектурное банкротство. Это тот момент, когда изменить что-либо в системе уже практически невозможно: любое движение вызывает каскад непредсказуемых ошибок, а разработчики постепенно теряют мотивацию.
По данным Stripe, около 42% времени разработчиков уходит на поддержку некачественного кода. А компании, у которых технический долг под контролем, по данным McKinsey, растут на 20% быстрее. Это подтверждают и мои наблюдения: чем здоровее архитектура — тем быстрее команда реализует новые идеи и меньше выгорает.
Существует распространённое, но опасное упрощение: мол, технический долг — это просто код, который нужно переписать. На деле это больше похоже на финансовую задолженность. Как сказал Уорд Каннингем, автор концепции: «Каждая минута, потраченная на не совсем правильный код — это проценты по долгу». Проблема в том, что в отличие от ипотеки, технический долг не приходит со счётом в конце месяца. Он накапливается незаметно — до момента, когда становится слишком поздно.
Мартин Фаулер выделяет четыре типа технического долга: разумный и безрассудный, преднамеренный и непреднамеренный. Самый опасный из них — непреднамеренный и безрассудный. Когда команда даже не осознаёт, что создаёт проблемы на будущее.
Вот четыре наиболее разрушительных вида технического долга, с которыми мне приходилось сталкиваться чаще всего.
Архитектурный долг
Самый тяжёлый и опасный. Признаки: система не масштабируется, изменение одной части ломает другие, возникают проблемы с производительностью и внедрением новых технологий. Пример — Southwest Airlines, которые в 2022 году потеряли сотни миллионов долларов из-за сбоя старой IT-инфраструктуры.
Код с низкой читаемостью и структурой
То, что обычно называют «кодом-спагетти». Отсутствие модульности, повторение фрагментов, чрезмерная вложенность, плохие названия переменных — всё это делает поддержку практически невозможной. Иногда доходит до того, что разработчики предпочитают уйти из проекта, чем работать с подобной кодовой базой.
Использование устаревших технологий
По оценкам Reuters, около 43% банков всё ещё работают на COBOL. Во время пандемии это обернулось острой нехваткой специалистов и системными сбоями. Устаревшие технологии — это не только риск, но и серьёзное ограничение при найме и масштабировании.
Долг по тестированию
Отсутствие автоматических тестов, длительное ручное тестирование, страх вносить изменения из-за непредсказуемых последствий. Каждый релиз — как лотерея. Отсюда — регрессии, задержки и снижение качества продукта.
Откуда возникает технический долг?
Причины всегда одни и те же:
Сжатые сроки. Потребность «успеть к релизу» приводит к принятию временных решений, которые потом становятся постоянными.
Недостаток опыта. Неопытные разработчики, оставленные без наставничества, принимают архитектурные решения, к которым команда потом возвращается годами.
Разрыв между бизнесом и инженерами. Бизнес ждёт фичи, разработка говорит про рефакторинг — и никто не может объяснить другой стороне, зачем это нужно.
Отсутствие процессов контроля качества. Если код-ревью — формальность, тестов нет, а метрики игнорируются, технический долг становится нормой.
Что с этим делать?
Во-первых, признать проблему. Заведите карту технического долга — даже простая таблица в Jira или Notion, где задачи помечены по шкале «влияние на бизнес / сложность исправления», помогает расставить приоритеты.
Во-вторых, внедрите принцип «бойскаута»: каждый раз, когда вы работаете с кодом — оставьте его в чуть лучшем состоянии. Это может быть переименование переменной, вынесение логики, добавление теста — любое улучшение важно.
В-третьих, планируйте погашение технического долга. Например:
Выделять 10–20% спринта на работу с долгом;
Проводить отдельные «технические дни», когда команда фокусируется только на улучшении кода;
После нескольких продуктовых спринтов устраивать технический, полностью посвящённый качеству.
В-четвёртых, автоматизируйте всё, что можно. Статический анализ, CI/CD, тесты — всё это снижает риск и повышает прозрачность.
И, наконец, инвестируйте в развитие команды. Не ждите, что техническое качество появится само — обучайте, обсуждайте решения, создавайте инженерную культуру.
Что будет, если ничего не делать?
Во-первых, проект перестанет развиваться. Любая фича будет внедряться в три раза дольше. Во-вторых, начнётся отток специалистов. Люди не хотят работать с некачественным кодом — особенно те, кто умеет писать качественно. В-третьих, вы начнёте проигрывать конкурентам. Они быстрее. Они гибче. И в итоге — вы теряете рынок. В худшем случае — как Friendster, первая соцсеть, которая не справилась с ростом нагрузки и техническими ограничениями, в результате чего просто исчезла.
Если вы попали в проект, где технический долг уже критичен — не спешите паниковать. Оцените настрой команды. Если коллеги понимают проблему и готовы действовать — у вас есть шанс. Если же все смирились — возможно, стоит задуматься, хотите ли вы быть частью этого.
Главное — не откладывайте. Как и с любым долгом: чем раньше начнёшь погашать, тем меньше заплатишь в итоге.
Спасибо, что дочитали. Делитесь опытом: как вы боретесь с техническим долгом? Какие инструменты и подходы помогли вам? Уверен, у каждого есть своя история — пусть она станет полезной для других.
Комментарии (6)
gun_dose
19.06.2025 05:04Ещё один важный момент с техническим долгом - работать на упреждение. А именно, следить за появлением новых фич в испрльзуемом языке, фреймворке и т.д. А также следить за планами разработчиков языка или фреймворка по объявлению старых фич deprecated, чтобы отказываться от устаревших фич не в последний момент, а постепенно.
Поясню на примере. Сейчас в Symfony и её производных отказываются от doctrine annotation в пользу php атрибутов. Сейчас большинство проектов поддерживает оба способа, но это значит, что уже сейчас в новом коде надо полностью отказаться от аннотаций. Тот, кто продолжает их использовать сейчас, увеличивает технический долг, который придётся решать во время обновления мажорной версии фреймворка.
И да, кстати, простота или сложность обновления мажорной версии фреймворка - это лучший индикатор того, насколько хорошо или плохо на проекте обстоят дела с техническим долгом.
john_galt
19.06.2025 05:04Как по мне, архитектурный, технический и прочие "долги" уже должны быть заложены в жизненный цикл продукта при его выпуске в свет. Заложить запланированную и маштабируемую неопределенность. Но это как раз одна из тех неочевидных идей, на которые решаются немногие команды.
tenzink
19.06.2025 05:04Пожалуйста, не используйте "принцип бойскаута". Приходит на PR diff +1000 -1000. Из которых к постулируемой задаче относится +100 -100, а оставшиеся +900 -900 от "бойскаута". И ревьюер не может хорошо отревьюить ни то, ни другое. Более того, в blame потом складывается впечатление, что код менялся под продуктовую фичу, и археолог должен потом с трудом разбираться зачем менялось столько кода под неё. Самые разрушительные баги я наблюдал в коммитах с названием "minor refactoring".
Не делайте как бойскаут. Отделяете PR с бизнес логикой от решения тех долга.
SwingoPingo
19.06.2025 05:04Не тому адресату статья адресована.
Зачастую линейный менеджмент в ИТ загнан в такие жесткие сроковые рамки и имеет горизонт планирования "еще бы день продержаться", что никакой мотивации им вешать статью расхода на бизнес в виде "надо бы техдолг разгрести" у них не остается. И менеджмент над менеджментом так же, им надо владельцам управленцам продать "сразу и еще вчера", "забить нишу на рынке". А владельцу надо ренту собирать, а не вот это вот все.
Сама система управления порочна в этом аспекте и порождает "техдолг" и далеко не только в кодовой базе, в вообще в принципе. В товарных остатках на складах, когда попытка инвентаризации вгоняет мол-ов в седину, в состоянии основных средств когда на бумаге здание есть, а на деле там свалка уже, в тех же взаиморасчетах когда вся будущая прибыль уже съедена выплатами по долгам, в кадровой политике когда компетенции персонала уже не соответствуют, везде, где применяется принцип "давайте сначала продадим, а потом, может быть.."
И иметь нулевой техдолг в кодовой базе когда все остальные висят домокловым мечем над организацией - выглядит перекосом.Dhwtj
19.06.2025 05:04Да, с горизонтом планирования прямо беда.
И вот значит, выходит бойскаут разработчик и в свое личное время начинает рефакторинг, так его учили умные дядьки из университетов.
Получит ли он за это деньги? Нет, но люлей получить может за сломанный код.
Получит ли он за это одобрение других разработчиков? Немножко. Но он быстрее уволится, чем эффект рефакторинга сработает.
Вот и выходит, что рефакторинг это чистка кармы, не более.
Моя любимая картинка
Nestor_Siherti
Спасибо за статью. Очень важно и полезно. Много вокруг явных примеров непонимания всего о чем Вы пишете и удивленных вопросов: "Как же ж так ? Что ж такое ?"