Легаси-код: что это и почему с ним классно работать

Ничто не вечно, и мир не идеален. Код, что ранее был свеж и соответствовал всем требованиям, с течением времени превращается в «наследие». Он устаревает, его становится сложно поддерживать. Возможно, те, кто его писал, уже не работают над проектом, а документацию по нему никто не составлял. Вот и получается, что код никто не трогает и он продолжает работать по уже забытой логике. В статье разберёмся, почему легаси — это не всегда головная боль, а иногда совсем наоборот

Что такое легаси-код

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

  • код, написанный на старой версии языка или с использованием устаревшего фреймворка;

  • код, который не документировался, о нём недостаточно информации;

  • код, в котором нет тестов. Его трудно поддерживать и развивать, потому что программист не знает, сломает ли он что-то в процессе.

«Легаси — это огромная кодовая база, в которой тяжело разобраться. Зачастую это старые технологии и подходы к разработке программного обеспечения. Если посадить начинающего разработчика исправлять это, ему будет сложно научиться чему-то, что поможет в будущем. Такую задачу можно давать джуну только в том случае, если это небольшая несложная система, написанная на старых технологиях. Хотя типичному джуну, скорее всего, не хватит для этого навыков».
Сергей Бердышев, архитектор банковских систем

Из-за всего этого с легаси-кодом может быть страшно работать. Кажется, легче переписать его, чем выяснять, как модернизировать.

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

Как работать с легаси

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

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

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

Ne

Необходимо покрывать код тестами, добавлять к нему строки актуальной документации и комментарии, если они имеют смысл.

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

Конечно, нужно избавляться от копипаста — как в коде, так и в тестах.

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

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

Что такое рефакторинг и когда он необходим

Последнее определение легаси — это код с высоким уровнем технического долга.

Это значит, что код устаревший или плохо читаемый, с отсутствующей документацией, работающий неэффективно.

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

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

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

Есть несколько признаков того, что рефакторинг необходим:

  • дублирование кода;

  • длинный, нечитаемый код;

  • размазывание логики, когда одна операция производится с использованием кода в разных частях системы.

Краткий пересказ от YandexGPT