Рефакторинг легаси кода: cоветы, шаги и лучшие практики

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

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

Легаси код обычно всегда ассоциируется с техническим долгом – ценой достижения быстрого запуска и оптимального времени выхода на рынок; однако пренебрегая качеством и долговечностью кода, который впоследствии все равно придется переделывать. По данным консалтингового исследования Hitachi, легаси системы препятствуют эффективности по меньшей мере 90% организаций.

Несомненно, легаси код постепенно становится серьезным бременем для предприятий. Недавнее исследование консорциума по качеству программного обеспечения в IT показало, что в 2018 году легаси системы обойдутся компаниям в США более чем в 500 миллиардов долларов, а в последующие годы эти цифры будут еще выше.

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

Не существует быстрого и легкого способа решения проблем, но рефакторинг легаси кода – это эффективный способ переделать старые и ранее существовавшие программные системы и оптимизировать их функциональность.

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

Что такое рефакторинг устаревшего кода?

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

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

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

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

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

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

По мнению экспертов, это была кибер-утечка данных, которая не должна была произойти. В отчете Управления правительственной отчетности США объясняется, что нарушение в значительной степени стало прямым следствием легаси кода на сайте Equifax. Впоследствии устранение последствий взлома обошлось компании более чем в 1 миллиард долларов.

Легаси код становится проблематичным в основном из-за грязного кода, загнивания кода, сломанного кода или просто устаревшего кода. И для решения этой проблемы рефакторинг  – не единственный метод, который может быть использован. Некоторые эксперты выступают против рефакторинга и предлагают только переписать код.

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

Рефакторинг легаси кода против переписывания кода

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

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

Когда вам следует сделать выбор в пользу переписывания

Переписывание – это процедура, при которой разработчики отбрасывают весь существующий код и начинают новый процесс программирования. Здесь весь код реструктурируется и переделывается, чтобы отразить первоначальную функциональность и, возможно, добавить новые возможности. Вот причины, по которым вам стоит задуматься о переписывании:

– При крупных переходах: вам следует подумать о переписывании, если вы делаете какой-либо крупный переход в своей архитектуре, например, переходите от монолита к микросервисам или переходите с angular js на angular. Здесь каждый элемент старой программы может быть воссоздан с нуля.

– Когда большая часть кода грязная или неработоспособная: иногда весь код или большая его часть откровенно грязны и неработоспособны. В таких ситуациях начинать рефакторинг будет пустой тратой времени; лучшим решением будет переписать код. Некоторые эксперты предлагают правило 80% – если 80% кода нуждается в рефакторинге, его следует переписать.

– Когдафреймворк больше не может поддерживаться: зачем пытаться исправить то, что практически невозможно поддерживать или стало слишком сложным и дорогим? Если код невозможно поддерживать, просто перепишите его.

– Когда команда не может интерпретировать код: если команда не может интерпретировать предыдущую программу, пришло время переписать ее.

Плюсы рерайтинга:

– Программа будет иметь обновленные и новейшие функции.

– Переписывание предаст программе новый вид и дизайн.

– Непрерывная итерация.

– Возможность исправить предыдущие ошибки.

Минусы рерайтинга:

– Переписывание часто отнимает больше времени.

– Вы потратите больше ресурсов, включая деньги.

– Вы рискуете упустить поддерживаемую ранее функциональность.

– Это может потребовать новых знаний или изучения нового языка.

Когда следует выбирать рефакторинг легаси кода

Вот причины, по которым вам следует рефакторить легаси код:

– Если вы не можете позволить себе прервать непрерывность работы: иногда переписывание может означать, что вам придется прекратить работу, что нанесет ущерб вашему бизнесу. Поэтому, вместо того чтобы закрывать магазин и заставлять клиентов ждать, вы можете применить прогрессивный рефактор.

– Когда нужно сделать код более читабельным: иногда разработка программного обеспечения занимает длительный период времени, возможно, годы, что может означать, что проект может завершить другой набор инженеров. Или просто разработчики, создавшие программу, ушли из жизни. В таких ситуациях рефакторинг необходим, чтобы новые инженеры могли понять, интерпретировать и поддерживать программу.

– Нормативные требования: определенные нормативные стандарты и политики могут потребовать от вас провести модернизацию вашей системы. 

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

– Необходимость расширения является существенной: если продукт функционирует, но добавление новых функций занимает слишком много времени, или в результате обновления возникает масса проблем, то вам определенно следует провести рефакторинг.

– Риски безопасности: устаревшие программы подвержены риску взлома и нарушениям безопасности. Поэтому, чтобы это предотвратить, необходимо проводить рефакторинг и регулярные обновления.

Плюсы рефакторинга:

– Код становится более организованным и простым для понимания.

– Тщательный рефакторинг легаси кода улучшает работу и производительность программы без изменения ее функций.

– Он помогает обнаружить баги и очистить грязь и что-то, что давно должно было умереть.

– Экономия времени и ресурсов.

– Программу становится легче поддерживать и масштабировать.

Минусы рефакторинга:

– В итоге вы можете изменить производительность и функциональность кода.

– Это может стоить вам больше времени, чем вы предполагали.

– Вы рискуете усложнить код вместо того, чтобы упростить его.

Простые шаги по рефакторингу легаси базы кода

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

Итак, каков же подход к рефакторингу легаси кода? Ниже будут описаны шаги, которые помогут начать рефакторинг.

1. Разбиение всего процесса на части

Когда вы смотрите на модуль, первое, что приходит вам в голову, - как и с чего начать. Не стоит сразу же бросаться в бой: вы будете перегружены и запутаетесь. Разбейте модуль на мелкие относительные кусочки. Это поможет вам легко определить точки изменения.

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

2. Выявление и устранение зависимостей

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

3. Проверка переменных и выполнение тестов

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

4. Определение и внедрение соответствующей архитектуры

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

Советы и основные принципы рефакторинга легаси кода

– Разбейте программу на более мелкие и относительные пункты.

– Делайте по одному шагу за раз.

– Определите области изменений и запишите их.

– Составьте график и придерживайтесь его.

– Используйте тест-кейсы.

– Автоматизируйте процесс рефакторинга, где это возможно.

– Проанализируйте и сравните результаты.

– Проверьте еще раз.

Лучшие практики рефакторинга легаси кода 

Про рефакторинг легче рассказать, чем его осуществить. Это деликатный вопрос, который может привести к большим проблемам при неправильном подходе. Не забывайте: цель – оптимизировать программу, не изменяя ее функций.

Ваши потребности в рефакторинге должны решаться профессиональными инженерами, имеющими опыт в рефакторинге легаси кода. Вот несколько советов по выполнению этой работы:

Подготовьтесь к необходимой реализации

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

Двигайтесь маленькими шагами

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

Выполняйте тесты

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

Рефакторинг не должен привносить новые возможности

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

Заключение

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

Перевод статьи: «Legacy Code Refactoring: Tips, Steps, and Best Practices», Pavel Tantsiura.

Читать еще:

10 способов улучшить свой код

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

Как перейти в IT из другой сферы

Как войти в IT из другой профессии, без опыта? И возможно ли это? Разбираемся в сегодняшней статье.

Языки программирования в тренде через 20 лет

Узнайте, каким будет программирование через 20 лет и какие языки будут востребованными и перспективными. Читайте подробнее в блоге Kata Academy.

7 лучших редакторов кода для разработчиков

Выбираете редактор кода для разработки? Обзор самых популярных и удобных редакторов — читайте в блоге Kata Academy.

Подписаться на рассылку