«Работает — не трогай»: почему этот завет программистов опасен
Есть священное правило, которое шёпотом передают новичкам: если код работает, не прикасайся к нему. В нём есть мудрость, но и ловушка. Разберёмся, откуда взялся этот страх и почему слепое следование ему медленно убивает проекты.
Самые страшные слова в комментарии к коду: «Не знаю, зачем эта строчка, но без неё всё ломается. Не удаляй».
Правило «работает — не трогай» родилось из реального страха. Но превращённое в догму, оно загоняет проект в угол, где никто уже ничего не понимает и боится дышать.
Откуда берётся страх
У каждого программиста была эта боль: ты меняешь невинную мелочь — и где-то на другом конце системы всё внезапно рушится. После пары таких случаев вырабатывается рефлекс: лучше ничего не трогать. Особенно если код старый, его писал давно уволившийся человек, и никто толком не знает, как он работает. Такой код называют легаси (legacy) — «наследство».
В этом страхе есть рациональное зерно. Рабочая система ценна сама по себе. Каждое изменение — это риск внести новый баг. Поэтому «не чини то, что не сломано» иногда — мудрый совет: не надо переписывать стабильный модуль просто потому, что он «некрасивый».
Где правило превращается в ловушку
Проблема в том, что код не живёт в вакууме. Вокруг него всё меняется: появляются новые требования, обновляются библиотеки, находятся уязвимости в безопасности. Если к части системы вообще нельзя прикасаться, происходит вот что:
- Дыры в безопасности не закрываются — ведь обновление страшно.
- Знание о коде умирает. Чем дольше его не трогают, тем меньше людей понимают, как он устроен.
- Растёт «зона страха». Появляются целые куски системы, которые все обходят стороной.
В итоге проект превращается в минное поле. Простейшая задача упирается в кусок, который «нельзя трогать», и команда городит уродливые обходные пути вокруг него вместо того, чтобы починить корень.
Опасная разновидность: код, который боятся даже понять
Худший случай — когда строчку оставляют «на всякий случай», не понимая, зачем она. Помните взрыв ракеты Ariane 5? Там тоже работал лишний код, оставленный по принципу «вроде не мешает, пусть будет». Код, смысла которого никто не знает, — это не страховка, а бомба замедленного действия.
Настоящее решение — не смелость, а тесты
Противоядие от страха — не бесшабашность, а автоматические тесты. Если код покрыт хорошими тестами, его не страшно менять: внёс правку, запустил проверки, за минуту увидел, сломалось что-нибудь или нет. Тесты превращают «не трогай, а вдруг» в «трогай спокойно, мы это контролируем».
Поэтому опытные команды, получая страшный легаси-код, действуют так: сначала обкладывают его тестами, фиксируя текущее поведение, и только потом начинают аккуратно улучшать. Тесты становятся той самой страховочной сеткой, которая позволяет работать без паники.
Маленькими шагами вместо большого прыжка
Ещё одно противоядие — менять страшный код понемногу. Не переписывать весь модуль разом (это почти гарантированно внесёт новые баги), а улучшать его маленькими безопасными правками: переименовать запутанную переменную, разбить гигантскую функцию на части, добавить пояснение там, где логика неочевидна. Каждый такой шаг крошечный, его легко проверить, и риск минимален. Через десятки таких шагов «зона страха» постепенно превращается в обычный понятный код, к которому больше не боятся подходить.
Золотая середина
Правильная позиция лежит между двумя крайностями. «Трогай всё подряд ради красоты» — безрассудно. «Не трогай ничего и молись» — путь к гниющему проекту. Зрелый подход звучит так: «Понимай, что трогаешь, и подстрахуйся тестами». Тогда код остаётся живым, а не превращается в музей экспонатов, к которым страшно подойти, и проект не загоняет сам себя в угол.