Привет! Меня зовут Дмитрий Березницкий, я больше 25 лет работаю в разработке ПО. За это время видел, как одни команды росли и с лёгкостью внедряли новые фичи, а другие — всё больше погружались в хаос, где любое изменение требует недели усилий и проверки «на авось». Причина почти всегда одна — технический долг. Сегодня я расскажу, что это такое на практике, как его распознать, почему он опаснее, чем кажется, и какие шаги реально помогают.
Технический долг — это не просто неряшливый код. Это системная проблема, накапливающаяся из множества компромиссов, спешки, недостаточной инженерной культуры и отсутствия стратегического планирования. Поначалу всё кажется безобидным: «перепишем позже», «временное решение», «не до этого сейчас». Но потом проект буквально перестаёт двигаться.
И если долго игнорировать эти сигналы — наступает архитектурное банкротство. Это тот момент, когда изменить что-либо в системе уже практически невозможно: любое движение вызывает каскад непредсказуемых ошибок, а разработчики постепенно теряют мотивацию.
По данным Stripe, около 42% времени разработчиков уходит на поддержку некачественного кода. А компании, у которых технический долг под контролем, по данным McKinsey, растут на 20% быстрее. Это подтверждают и мои наблюдения: чем здоровее архитектура — тем быстрее команда реализует новые идеи и меньше выгорает.
Существует распространённое, но опасное упрощение: мол, технический долг — это просто код, который нужно переписать. На деле это больше похоже на финансовую задолженность. Как сказал Уорд Каннингем, автор концепции: «Каждая минута, потраченная на не совсем правильный код — это проценты по долгу». Проблема в том, что в отличие от ипотеки, технический долг не приходит со счётом в конце месяца. Он накапливается незаметно — до момента, когда становится слишком поздно.
Мартин Фаулер выделяет четыре типа технического долга: разумный и безрассудный, преднамеренный и непреднамеренный. Самый опасный из них — непреднамеренный и безрассудный. Когда команда даже не осознаёт, что создаёт проблемы на будущее.
Вот четыре наиболее разрушительных вида технического долга, с которыми мне приходилось сталкиваться чаще всего.
Архитектурный долг
Самый тяжёлый и опасный. Признаки: система не масштабируется, изменение одной части ломает другие, возникают проблемы с производительностью и внедрением новых технологий. Пример — Southwest Airlines, которые в 2022 году потеряли сотни миллионов долларов из-за сбоя старой IT-инфраструктуры.
Код с низкой читаемостью и структурой
То, что обычно называют «кодом-спагетти». Отсутствие модульности, повторение фрагментов, чрезмерная вложенность, плохие названия переменных — всё это делает поддержку практически невозможной. Иногда доходит до того, что разработчики предпочитают уйти из проекта, чем работать с подобной кодовой базой.
Использование устаревших технологий
По оценкам Reuters, около 43% банков всё ещё работают на COBOL. Во время пандемии это обернулось острой нехваткой специалистов и системными сбоями. Устаревшие технологии — это не только риск, но и серьёзное ограничение при найме и масштабировании.
Долг по тестированию
Отсутствие автоматических тестов, длительное ручное тестирование, страх вносить изменения из-за непредсказуемых последствий. Каждый релиз — как лотерея. Отсюда — регрессии, задержки и снижение качества продукта.
Откуда возникает технический долг?
Причины всегда одни и те же:
Сжатые сроки. Потребность «успеть к релизу» приводит к принятию временных решений, которые потом становятся постоянными.
Недостаток опыта. Неопытные разработчики, оставленные без наставничества, принимают архитектурные решения, к которым команда потом возвращается годами.
Разрыв между бизнесом и инженерами. Бизнес ждёт фичи, разработка говорит про рефакторинг — и никто не может объяснить другой стороне, зачем это нужно.
Отсутствие процессов контроля качества. Если код-ревью — формальность, тестов нет, а метрики игнорируются, технический долг становится нормой.
Что с этим делать?
Во-первых, признать проблему. Заведите карту технического долга — даже простая таблица в Jira или Notion, где задачи помечены по шкале «влияние на бизнес / сложность исправления», помогает расставить приоритеты.
Во-вторых, внедрите принцип «бойскаута»: каждый раз, когда вы работаете с кодом — оставьте его в чуть лучшем состоянии. Это может быть переименование переменной, вынесение логики, добавление теста — любое улучшение важно.
В-третьих, планируйте погашение технического долга. Например:
Выделять 10–20% спринта на работу с долгом;
Проводить отдельные «технические дни», когда команда фокусируется только на улучшении кода;
После нескольких продуктовых спринтов устраивать технический, полностью посвящённый качеству.
В-четвёртых, автоматизируйте всё, что можно. Статический анализ, CI/CD, тесты — всё это снижает риск и повышает прозрачность.
И, наконец, инвестируйте в развитие команды. Не ждите, что техническое качество появится само — обучайте, обсуждайте решения, создавайте инженерную культуру.
Что будет, если ничего не делать?
Во-первых, проект перестанет развиваться. Любая фича будет внедряться в три раза дольше. Во-вторых, начнётся отток специалистов. Люди не хотят работать с некачественным кодом — особенно те, кто умеет писать качественно. В-третьих, вы начнёте проигрывать конкурентам. Они быстрее. Они гибче. И в итоге — вы теряете рынок. В худшем случае — как Friendster, первая соцсеть, которая не справилась с ростом нагрузки и техническими ограничениями, в результате чего просто исчезла.
Если вы попали в проект, где технический долг уже критичен — не спешите паниковать. Оцените настрой команды. Если коллеги понимают проблему и готовы действовать — у вас есть шанс. Если же все смирились — возможно, стоит задуматься, хотите ли вы быть частью этого.
Главное — не откладывайте. Как и с любым долгом: чем раньше начнёшь погашать, тем меньше заплатишь в итоге.
Спасибо, что дочитали. Делитесь опытом: как вы боретесь с техническим долгом? Какие инструменты и подходы помогли вам? Уверен, у каждого есть своя история — пусть она станет полезной для других.
Комментарии (5)
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Не тому адресату статья адресована.
Зачастую линейный менеджмент в ИТ загнан в такие жесткие сроковые рамки и имеет горизонт планирования "еще бы день продержаться", что никакой мотивации им вешать статью расхода на бизнес в виде "надо бы техдолг разгрести" у них не остается. И менеджмент над менеджментом так же, им надо владельцам управленцам продать "сразу и еще вчера", "забить нишу на рынке". А владельцу надо ренту собирать, а не вот это вот все.
Сама система управления порочна в этом аспекте и порождает "техдолг" и далеко не только в кодовой базе, в вообще в принципе. В товарных остатках на складах, когда попытка инвентаризации вгоняет мол-ов в седину, в состоянии основных средств когда на бумаге здание есть, а на деле там свалка уже, в тех же взаиморасчетах когда вся будущая прибыль уже съедена выплатами по долгам, в кадровой политике когда компетенции персонала уже не соответствуют, везде, где применяется принцип "давайте сначала продадим, а потом, может быть.."
И иметь нулевой техдолг в кодовой базе когда все остальные висят домокловым мечем над организацией - выглядит перекосом.
Nestor_Siherti
Спасибо за статью. Очень важно и полезно. Много вокруг явных примеров непонимания всего о чем Вы пишете и удивленных вопросов: "Как же ж так ? Что ж такое ?"