Tools and practices to help you deal with legacy code - Dennis Doomen - NDC Porto 2023
Интересно выступление на тему работу с наследием прошлого или, проще говоря. легаси кодом. В этом выступлении автор приводит алгоритм своих действий в качестве консультанта, которого зовут для занятий археологий вокруг legacy систем. Алгоритм мне показался интересным, поэтому я решил расписать его кратко
- Деннис начинает с анализа прода, включая изучение запущенных процессов и их конфигурации.
- Дальше он изучает код и его структуру и ищет проблемы - обычно именно эти проблемы мешают клиенту и он призывает решить их Денниса
- Деннис сравнивает код с системой управления версиями и ищет закомментированные или измененные части кода
- Он изучает log файлы, а также отчеты о сбоях и уже найденные проблемы
- Дальше Денис занимается exploratory testing и пробует воспроизвести проблемы, о которых сообщали клиенты.
- При изучении кода автор обращает внимание на пространства имен, подходы к неймингу классов и функций, а также создает ментальные карты и визуализирует зависимости между частями проекта
- Автор отмечает, что сейчас появились AI инструменты, которые можно просить объяснить логику того или иного куска кода
- Для улучшения кодовой базы стоит удалять куски неиспользуемого кода - если они понядобятся, то мы сможем их восстановить из системы контроля версий
- Перед внесением изменения в код автор создает safety nets, создавая высокоуровневые тесты, которые позволяют отследить изменения в поведении программы. Тут автор рекомендует книгу "Working Effectively with Legacy Code" от Michael Feathers
- Дальше автор работает над автоматизацией сборки и развертывания программы, чтобы не делать это руками, а сделать нормальный CI/CD пайплайн. Тут автор рекомендует Ansible или Pulumi
- Отдельно автор говорит про стратегии ветвления и версионирования программы (semver)
- Также надо выстроить работу с исключениями, сделать нормальное логгирование с уровнями и использовать open telemetry для трейсинга
- Следующий шаг - это использование статического анализатора кода, в .net автор рекомендует Roslyn
- Дальше автор отформатировать код в единый стиль и применить это изменение одним коммитом, а дальше настроить линтеры и поддерживать этот стиль:)
- Автор топит за то, чтобы даже на старых платформах использовать новые возможности языка, используя аналог polyfills из js, но для .net платформы
- Дальше автор говорит про реструктуризацию кода и перенос связных частей в отдельные функциональные папки, отдельно он предлагает дублировать код для снижения coupling разных частей кода (это позволяет оставить меньше связей, хоть и в угоду дублированию)
- Важная часть посвящена применению шаблонов проектирования при рефакторинге старого кода - автор считает их полезными идиомами, которые позволяют снизить сложность старого кода за счет использования знакомых концепций
- Дальше автор вспоминает SOLID и отдельно упоминает про последнюю концепцию с DIP (dependency inversion principle), которая помогает нам организовать зависимости между частями нашего legacy приложения. Автор говорит о том, что зависимости надо оставлять от более абстрактных и стабильных компонентов и если требуется выделять зависимость в интерфейс и использовать инверсию. Тут же автор вспоминает про композицию и наследования и объясняет почему он предпочитает первое второму
- Ну и финал выступления посвящен вопросам архитектуры, где автор вспоминает про onion architecture, hexagonal architecture, clean architecture и говорит, что они решают определенные классы проблем:) То есть выбирать архитектуру надо от того, какие проблемы мы хотим решить
В итоге, у автора получился хороший рассказ о том, что надо сделать, чтобы ваше наследие (legacy app) засияло новыми красками:)
#Software #Architecture #SoftwareDevelopment