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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Когда вы должны решить переписать

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

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

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

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

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

Плюсы перезаписи:

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

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

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

Шанс исправить предыдущие ошибки.

Минусы перезаписи:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Это помогает обнаруживать ошибки и очищать грязь и гниль.

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

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

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

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

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

Вы рискуете усложнить код, а не упростить его.

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

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

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

1. Разбейте весь процесс

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

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

2. Определите и удалите зависимости

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

3. Переменные зонда и запуск тестов

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

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

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

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

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

Делайте это шаг за шагом.

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

Создайте временную шкалу и придерживайтесь ее.

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

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

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

Протестируйте снова.

Рекомендации по рефакторингу устаревшего кода

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

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

Вот несколько советов разработчиков DST Global, как выполнить работу:

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

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

Следуйте маленьким шагам

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

Запустить тесты

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

Рефакторинг не должен вводить новые функции

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

Заключение

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

Рефакторинг устаревшего кода
Получить консультацию у специалистов DST
Напишите нам прямо сейчас, наши специалисты расскажут об услугах и ответят на все ваши вопросы.
Комментарии и отзывы экспертов
RSS
22:55
+4
Все просто: рефакторинг кода является необходимой частью разработки программного обеспечения, а также процессом, который следует не только не бояться, но и приветствовать. Хотя на первый взгляд рефакторинг может показаться сложным и довольно затратным по времени, но именно он является ключевым инструментом для поддержания качества кода и обеспечения его эффективности и гибкости в долгосрочной перспективе.

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

И главное — не бойтесь рефакторинга, ведь он помогает создавать качественные и гибкие программные решения.
22:55
+4
На словах оно всегда красиво, а на деле никакое tdd не спасет от рандомных или совсем неочевидных регрессий.

да и целесообразность чаще всего очень туманна. Менять не сильно качественный код, прошедший кучу багфиксов и испытаний времени, на новый классный, стильный и молодежный может быть очень опрометчиво.
22:56
+4
Рефакторинг через TDD помогает обезопасить себя от неочевидных ошибок, здесь также очень сильно зависит от того, насколько правильно разработчик понимает текущую бизнес-логику. Если тесты хорошо провалидированы, то промахов не возникает. Отмечу, что регрессионное тестирование всё равно проводится после написания тестов.

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

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

я не хочу, чтобы вы меня поняли неправильно, вы по книжке описали теорию того, как следует проводить рефакторинг функционала, это полезно и кому-то определенно пригодится, но в то же время я считаю, что чаще всего код рефакторить очень опасно, особенно ключевого функционала, и намного полезнее для бизнеса будет запечатать такой код в каком-то модуле и рефакторить его только в случае самой крайней необходимости.
21:53
+1
Примерно так же “ведет” себя легаси. Поэтому работа программиста, который взялся за задачу модернизировать и “вдохнуть вторую жизнь” в проект, должна быть в некой степени ювелирной. Большинство программистов пытаются избегать и вообще “спрыгнуть с темы” технического долга. Даже составил хит-парад самых распространенных цитат, которые приходилось слышать от программистов, оказавшихся в условиях legacy:

— Мы делали “просто” сайт, а теперь вы хотите получить новую “плюшку”, и нам нужно все это переписать, так как у нас легаси…
— Никто не знает, как это работает…
— Чтобы добавить модуль, необходимо весь сайт проверить — только так мы поймем, что и где может вылезти…
— Я туда не полезу ни в коем случае, там уже все плохо…

Но опыт в программировании показывает, что жизнь после legacy существует. Ведь в программировании нет проблем. Есть только задачи, которые нужно решать. И перед составлением плана действий “по преодолению наследственного кода” нужно понять, насколько плохо обстоят дела на проекте в целом. По ходу практики выделил 6 стадий проблемности проекта:
02:36
«Ненавижу читать чужой код», — такую фразу можно часто услышать от программистов. Причина их ненависти в том, чужой код пишут не они. Это не значит, что каждый разработчик страдает манией величия, все гораздо проще: читатель никогда не испытает того потокового состояния, в котором находился программист, когда создавал свой код. Поэтому пассивное чтение иногда бывает скучным.

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

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

Как правильно читать код

Научитесь проводить «раскопки» в коде

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

Если вы работаете над кодовой базой, в которой разработчики использовали контроль версий, то у вас есть доступ к метаданным. Изучите следующие команды для Git, чтобы узнать, как изменялся код (они подойдут и для SVN):

git blame

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

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

Некоторые модули могут выделяться из остального кода и иметь очень общее назначение. Выполните git blame и посмотрите, какие части основного файла недавно изменяли. Так вы узнаете проблемы, которые решала команда в последнее время. Возможно, разработчики долго пытались наладить библиотеку, которая не слишком хорошо работала. Может, там просто шаблонный код, который нужно регулярно обновлять.

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

git log и git grep

Используйте команду git log, чтобы увидеть историю коммитов по всему репозиторию. Команда git grep поможет вам найти в коммитах конкретный текст, например, название функции someFunction: git log | grep someFunction -C 3. Последние флаги покажут вам найденные выражения с тремя строками окружающего контекста.

Также git log может показать вам историю отдельного файла. Чтобы ее посмотреть, используйте флаг -p: git log -p index.js. Обращайте внимание на имена авторов коммитов, чтобы знать, кому в будущем адресовать вопросы.

Переключайтесь между коммитами и изучайте историю кода

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

Если проект хранится на GitHub или подобном сервисе, вы можете узнать много нового, читая пулл-реквесты и код-ревью. Обращайте внимание на тикеты — карточки-задачи для отслеживания работы над багами, внедрения функций. Читайте обсуждения в тикетах: там могут быть «болевые точки», с которыми вы можете столкнуться в будущем, поэтому лучше иметь представление о них заранее.

Читайте спецификации

Specs или спецификации — это новые комментарии к коду. Читайте unit specs, чтобы выяснить предназначение функций, модулей и возможные пограничные случаи (edge-cases), которые они обрабатывают.

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

Воспринимайте комментарии как подсказки

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

Обращайте внимание на стиль написания кода

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

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

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

Избавляйтесь от «мусора» в коде

Пока вы читаете код, вам могут встретиться функции и целые файлы, которые разработчики никогда не используют, и комментарии, на которые никто не отвечал несколько лет. Не тратьте на разбор всего этого много времени — избавьтесь от «мусора». Если этот код все еще нужен, кто-нибудь отметит это на код-ревью. Удалив ненужное, вы сбережете силы и время того, кто будет читать этот код после вас.
Вам может быть интересно
В этой статье разработчики компании DST Global расскажут, что такое парадигмы программирования и зачем они нужны. Какие бывают парадигмы программирования и как их можно использовать?Что такое парадигм...
Мастерство, необходимое для создания производительных, масштабируемых и удобных ...
В мире есть много способов программирования. Но од...
Название PHP расшифровывается как гипертекстовый п...
Прежде чем мы узнаем для чего и как придумали объе...
Что такое программное обеспечение для разработки п...
В этой статье от разработчиков компании DST Global...
В этой статье разработчики компании DST Global опи...
В программировании существует такое понятие, как «...
REST API (Representational State Transfer Applicat...

Новые комментарии

Сегодня специалисты разных сфер внедряют LLM в свои повседневные задачи. С их по...
Параметры LLM можно сравнить с нейронными связями: чем их больше, тем “умнее” мо...
Насколько понимаю самые популярные опенсорсные модели сегодня: — GPT-J: ра...

Заявка на услуги DST

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

Адрес

Ижевск, ул. Воткинское шоссе, д. 170 Е, Технопарк Нобель, офис 1117

8 495 1985800
Заказать звонок

Режим работы: Пн-Пт 10:00-19:00

info@dstglobal.ru

Задать вопрос по почте

Укажите ваше имя
Укажите ваше email
Укажите ваше телефон