Как стать автором
Обновить
603.82
OTUS
Цифровые навыки от ведущих экспертов

«Как я работаю с техническим долгом»: опыт сеньор-разработчика

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров576
Автор оригинала: Vinod Pal

Технический долг часто воспринимается как нечто негативное.

Однако некоторые разработчики настолько фокусируются на его избегании, что пишут каждую строчку кода с чрезмерной осторожностью, что приводит к замедлению процесса, срыву сроков и снижению продуктивности.

Я вовсе не призываю писать грязный код ради быстрого релиза — ни в коем случае!

Но иногда имеет смысл осознанно пойти на технический долг — при условии, что вы понимаете, зачем это делаете, и у вас есть план, как это исправить позже.

В этой статье я порассуждаю на тему того, что такое технический долг и поделюсь, как я с ним справляюсь, будучи сеньор-разработчиком.

Что такое технический долг?

Термин «технический долг» ввёл Уорд Каннингем, он сравнил его с финансовым.

«Небольшой долг ускоряет развитие, если он быстро погашается засчёт рефакторинга кода... Опасность возникает, когда долг не выплачивается». Уорд Каннингем
«Небольшой долг ускоряет развитие, если он быстро погашается засчёт рефакторинга кода... Опасность возникает, когда долг не выплачивается». Уорд Каннингем

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

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

Цена игнорирования технического долга

Как и в случае с любым другим долгом, проблема заключается не в самом долге, а в его своевременном погашении.

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

Сбои в инфраструктуре Twitter

После того как Илон Маск приобрёл Twitter в 2022 году, в компании произошли увольнения, затронувшие в том числе инженеров, отвечавших за критически важные системы.

У Twitter годами копился технический долг, но опытные инженеры знали, как с ним работать.

Перевод см ниже
Перевод см ниже

Сотрудник Twitter, признающий наличие технического долга в компании:

«При первом запуске приложения выполняется около 20 запросов для загрузки домашней ленты. Большинство из них не блокируют выполнение и происходят в фоновом режиме. Это включает изображения, пользовательские настройки, хэштеги и т.п.

Я думаю, есть три причины, почему приложение работает медленно. Во-первых, оно перегружено функциями, которые почти не используются. Во-вторых, мы накопили многолетний технический долг, так как жертвовали производительностью ради скорости разработки и новых функций. В-третьих, мы тратим много времени на ожидание сетевых ответов.»

После увольнений эти инженеры ушли, и их место заняли новые, менее опытные команды, которые столкнулись с трудностями при поддержке устаревшего кода.

Доход от рекламы резко упал, поскольку компании потеряли доверие к стабильности платформы.

Долг не исчезает сам по себе — он накапливается, если им не управлять.

Катастрофа Knight Capital на 440 миллионов долларов

Knight Capital, крупная финансовая компания, допустила одну небольшую, но крайне дорогостоящую ошибку: они оставили в системе старый, неиспользуемый код. Когда они развернули обновление, этот устаревший код был случайно активирован, что привело к волне незапланированных биржевых сделок.

Система вышла из-под контроля и за 45 минут совершила миллионы ошибочных биржевых сделок.

Убытки составили целых 440 миллионов долларов — ситуация была настолько тяжёлой, что компанию пришлось спасать инвесторам, и в итоге она была поглощена.

Если бы они вовремя занялись устранением технического долга — удалением или актуализацией ненужного кода — этого можно было бы избежать.

Провальный запуск Healthcare.gov

В 2013 году правительство США запустило сайт Healthcare.gov — портал для оформления медицинской страховки. Но уже в первый день он обрушился. Почему? Годы спешки в принятии решений и накопленный технический долг.

Сайт не был рассчитан на высокую нагрузку, обладал слабой архитектурой и не масштабировался.

Проект, изначально оценённый в 93,7 миллиона долларов, раздулся до 1,7 миллиарда из-за колоссальных усилий, потребовавшихся на исправление ситуации.

Погоня за быстрым релизом без чёткого плана на последующую доработку приводит к масштабной переделке и потере средств.

Почему не стоит чрезмерно бояться технического долга

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

Технический долг — это просто инструмент. Если вы его боитесь, вы упускаете суть. Мы осознанно берём его на себя, потому что он помогает быстрее выпускать продукт, проверять идеи и приносить ценность. В этом и заключается наша работа.

Подумайте: абсолютно каждый продукт существует с каким-то количеством технического долга. Даже крупнейшие и самые успешные компании в нём по уши. И знаете что? Они всё равно зарабатывают деньги. Пользователи по-прежнему пользуются их продуктами. Никто не говорит: «Я бы полюбил это приложение сильнее, если бы код был чище».

Будучи разработчиками, мы получаем деньги за то, чтобы решать бизнес-проблемы с помощью кода. Если ваш код решает проблему — он справляется со своей задачей.

Перфекционизм — враг прогресса.

Значит ли это, что можно бесконечно копить долг? Нет, конечно. Рефакторинг нужно делать тогда, когда это имеет смысл. Чистите то, что вас тормозит. Но если вы жертвуете выпуском фич ради идеального кода — вы теряете темп.

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

Как выявить технический долг

Вот несколько признаков, которые указывают на наличие технического долга в вашем коде.

«Не понимаю, почему установка нового окна занимает столько времени»
«Не понимаю, почему установка нового окна занимает столько времени»

Раннее выявление и устранение таких признаков помогает снизить их негативное влияние:

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

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

  • Замедление разработки. Код трудно читать, модифицировать или расширять. Разработчики тратят время на обходные решения или постоянное исправление связанных проблем.

  • Рост затрат на поддержку. Требуются частые патчи. Устаревшие библиотеки, фреймворки или зависимости увеличивают расходы и усложняют тестирование и отладку.

  • Недостаток документации или ясности. Плохая документация, непонятные имена переменных, «магические числа» или чрезмерно сложная логика мешают пониманию.

  • Нарушение лучших практик. Код игнорирует шаблоны проектирования, принципы SOLID и отличается негибкостью.

  • Наличие костылей и временных решений. Комментарии вроде «TODO», «FIXME» или «TEMPORARY SOLUTION» — явные признаки технического долга, с которым нужно разобраться.

  • Зависимость от поставщика или технологии. Сильная привязка к проприетарным инструментам, устаревшим технологиям или неподдерживаемым сторонним сервисам.

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

Как я управляю техническим долгом

Ниже я поделюсь стратегиями, которые стабильно помогают мне эффективно справляться с техническим долгом.

1. Признавать и фиксировать случаи технического долга

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

Я обычно оставляю себе короткую заметку о том, с чем не до конца разобрался, особенно если это может перерасти в серьёзную проблему.

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

2. Предотвращать технический долг

Лучший способ управления техническим долгом — это не допускать его изначально.

«Просто пиши код. Потом как-нибудь исправим»
«Просто пиши код. Потом как-нибудь исправим»

До написания первой строчки кода стоит потратить время на проектирование архитектуры. Надёжная база позволяет избежать излишней сложности и лишней переделки в будущем.

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

Хорошо продуманная архитектура естественным образом снижает риск накопления технического долга. Но иногда принятие долга — это верное стратегическое решение.

3. Документировать всё

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

Сохраняйте информацию в каком-либо виде — будь то общий документ, система тикетов или простая заметка. Без этого такие вещи легко забываются, и со временем мелкие проблемы превращаются в серьёзные.

Даже если вы не сможете заняться этим сами, возможно, это сделает кто-то из команды — но только в том случае, если есть запись. Быстрая заметка сейчас может избавить от кучи проблем в будущем.

4. Определить приоритеты

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

Вот простой способ приоритизации:

  • Срочно — если угрожает стабильности системы.

  • Скоро — если замедляет разработку.

  • Постепенно — если не критично, но стоит улучшить.

  • Никогда — если устранение обойдётся дороже, чем существование проблемы.

Цель — не полностью устранить техдолг, а грамотно им управлять.

5. Придерживаться лучших практик

Соблюдение проверенных практик в повседневной разработке помогает сократить технический долг уже на раннем этапе. Ниже расскажу о том, что помогает мне писать более чистый и сопровождаемый код.

Использование инструментов, которые помогают держать курс

Правильные инструменты и процессы могут заметно сократить техдолг — причём автоматически:

  • Статический анализ кода. Такие инструменты проверяют код и указывают на отклонения от общепринятых практик.

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

  • CI/CD-пайплайны. Автоматизация сборки и деплоя позволяет тестировать и выпускать изменения плавно и надёжно. Меньше стресса — меньше ошибок.

  • Инструменты анализа тестового покрытия. Показывают, какие участки кода не покрыты модульными тестами. Не обязательно 100%, но основные сценарии — обязательно.

  • Генераторы документации. Никто не любит писать документацию, но будущий вы (и ваша команда) скажут спасибо. Используйте автогенерацию, где это возможно.

  • Анализаторы зависимостей. Устаревшие или уязвимые библиотеки — как просроченные продукты: проблемы с ними неизбежны.

Решайте мелкие проблемы до того, как они станут большими

Проекты часто обрастают «мусором» — устаревшим кодом, временными фикcами, обходными решениями. Игнорирование этого ведёт к накоплению техдолга.

Выделяйте в каждом спринте немного времени на небольшие обдуманные улучшения кода.

Если кодовая база уже в плохом состоянии, выделите, например, 10% спринта на поэтапную очистку и улучшения. Это позволяет прогрессировать без серьёзных сбоев.

Сделайте это частью командной культуры

Хороший код — не только про личные привычки, но и про командную культуру. Поощряйте ревью кода, парное программирование и открытые обсуждения. Когда вся команда ценит чистоту и сопровождаемость кода — техдолг держится под контролем.

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

Простое правило: всегда оставляйте код в лучшем состоянии, чем вы его нашли.

Технический долг — не враг, а союзник 

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

Вместо того чтобы гнаться за идеальным кодом, спросите себя: стоит ли задержка результата, или можно зарелизить сейчас, а доработать потом? Иногда степень готовности «достаточно хорошо» — это и есть победа.

В следующий раз, когда захочется довести код до идеала, спросите: а стоит ли откладывать релиз? Или можно выпустить сейчас и доработать позже?

Делитесь своими мыслями и приёмами по работе с техническим долгом в комментариях.


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

Теги:
Хабы:
+4
Комментарии0

Публикации

Информация

Сайт
otus.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
OTUS