Легаси-код: что это и почему с ним классно работать
Что такое легаси-код
Самое общее определение легаси — это код, который используется кем-то помимо его автора. Другие определения:
-
код, написанный на старой версии языка или с использованием устаревшего фреймворка;
-
код, который не документировался, о нём недостаточно информации;
-
код, в котором нет тестов. Его трудно поддерживать и развивать, потому что программист не знает, сломает ли он что-то в процессе.
«Легаси — это огромная кодовая база, в которой тяжело разобраться. Зачастую это старые технологии и подходы к разработке программного обеспечения. Если посадить начинающего разработчика исправлять это, ему будет сложно научиться чему-то, что поможет в будущем. Такую задачу можно давать джуну только в том случае, если это небольшая несложная система, написанная на старых технологиях. Хотя типичному джуну, скорее всего, не хватит для этого навыков».
Сергей Бердышев, архитектор банковских систем
Из-за всего этого с легаси-кодом может быть страшно работать. Кажется, легче переписать его, чем выяснять, как модернизировать.
Однако легаси — это часть жизни любого крупного проекта. Например, в исходном коде Windows до сих пор остаются фрагменты кода, написанные 20 лет назад.
Как работать с легаси
Легаси нужно не переписывать с нуля или совсем не трогать, а постепенно, небольшими порциями развивать. Во время такой модернизации можно многому научиться. Более того, в новом проекте нельзя овладеть теми навыками, что нужны при работе с легаси-кодом.
Первый шаг работы с легаси — влиться в проект. Понять, какую задачу решает этот проект, правильно ли она решается. Ознакомиться с сопроводительной документацией. Изучить код, определить уровень его сложности и проблемности — часто ли код правится и ломается.
Нужно использовать хорошую свежую систему контроля версий, современную среду разработки. Она сбережёт много сил. Современные среды разработки реализуют навигацию по коду, анализ, предоставляют инструменты для реорганизации и отладки. Ещё одна хорошая практика — пользоваться трекером задач, так как описание задач в трекере — это дополнение документации. Не стоит игнорировать средства мониторинга событий и проверки качества кода.
Необходимо покрывать код тестами, добавлять к нему строки актуальной документации и комментарии, если они имеют смысл.
Постепенно нужно уменьшать сложность кода, убирать мёртвую функциональность — ту, в которой не заинтересованы пользователи, хотя она покрыта кодом. Хорошо использовать новую функциональность языка. Она повысит лаконичность кода — а если убрать лишние части, программа, возможно, заработает быстрее.
Конечно, нужно избавляться от копипаста — как в коде, так и в тестах.
Когда разработчик набрался опыта, перешагнул джуновский грейд, легаси может быть ему полезен. Легаси — это челлендж и простор для возможностей. Когда это большая, неповоротливая, но реально работающая махина, у программиста есть много вариантов, как её модернизировать. Необходимо с умом подходить к тому, что можно изменить.
Ещё один челлендж — как ориентироваться в большой кодовой базе. Все крупные компании работают на легаси-cтеке. Умение работать с большими репозиториями, со старым кодом — особый скилл, который будет крайне полезен, если программист целится в топовые компании.
Сергей Бердышев, архитектор банковских систем
Что такое рефакторинг и когда он необходим
Последнее определение легаси — это код с высоким уровнем технического долга.
Это значит, что код устаревший или плохо читаемый, с отсутствующей документацией, работающий неэффективно.
Основной способ борьбы с техническим долгом в коде — рефакторинг. Это переводится как «пересоздание». Смысл в том, чтобы переделать часть системы без прироста функциональности, то есть без изменений того, что система делает, но с улучшением читаемости и поддерживаемости.
Рефакторинг необходим, потому что системы не разрабатываются идеальными. Причиной могут быть сжатые сроки или слабое знание инструментов. Недоделки накапливаются, и в определённый момент оказывается, что система работает плохо или долго. Когда технический долг копится, становится дороже разрабатывать новые функции — или при их вводе ломаются старые.
Рефакторинг — не то, к чему нужно прибегать, когда начались проблемы. Не стоит допускать рост технического долга до критических значений, для этого нужно включить рефакторинг в процесс разработки, сделать обязательной частью.
Есть несколько признаков того, что рефакторинг необходим:
-
дублирование кода;
-
длинный, нечитаемый код;
-
размазывание логики, когда одна операция производится с использованием кода в разных частях системы.