Унаследованный код с годами становится только хуже
Унаследованный код не стареет как вино. Он становится хуже с каждым днем, пока вы его игнорируете.
На прошлой неделе я потратил три часа на отладку проблемы, которая должна была занять 20 минут. Виновником оказался модуль валидации 2019 года. Его не трогали, потому что он работал. На самом деле он не работал. Я нашел комментарий «TODO: refactor this» от 2020 года.
Многие относятся к унаследованному коду как к необязательному долгу. Они думают, что вернут его, когда появится время. Унаследованный код работает как плесень. Он распространяется. Он заражает всё вокруг. Чем дольше вы ждете, тем дороже обходится очистка.
Цикл предсказуем:
- Вы наследуете запутанную, но рабочую фичу.
- Вы добавляете еще один оператор "if", чтобы заставить её работать.
- Через полгода кто-то другой делает то же самое.
- Через год в файле 800 строк и ноль тестов.
Эти скрытые издержки бьют по вам тремя способами:
- Падает скорость. Вы тратите больше времени на понимание контекста, чем на написание кода.
- Растет количество багов. Одно исправление ломает что-то другое, потому что логика запутана.
- Проблемы с онбордингом. Новым разработчикам трудно понять, почему одна и та же логика существует в семи разных местах.
Следите за этими тревожными признаками:
- Бесполезные комментарии вроде «HACK: do not touch this».
- Дублирование бизнес-логики в разных файлах.
- Циклические зависимости, когда сервисы зависят друг от друга.
Не переписывайте всё. Полное переписывание проваливается в 80% случаев. Вместо этого используйте инкрементальный рефакторинг с использованием тестов характеризации.
Следуйте этому процессу:
- Зафиксируйте текущее поведение с помощью тестов, даже странные моменты.
- Проведите рефакторинг кода, не меняя этого поведения.
- Повторяйте, пока код не станет читаемым.
- Изменяйте поведение только после того, как у вас появятся настоящие тесты.
Правила, которых следует придерживаться:
- Никогда не проводите рефакторинг без тестов.
- Избегайте улучшений, которые меняют поведение кода. Баг может оказаться фичей, на которую полагается клиент.
- Не трогайте «тихий» код. Если модуль не менялся три года и не вызывает проблем, не лезьте в него.
Сосредоточьте свои усилия на коде, с которым работаете часто.
Источник: https://dev.to/taina_costa_f/legacy-code-nao-envelhece-como-vinho-quanto-mais-espera-pior-fica-132h
