Мёртвый код и дубли: как найти и удалить без страха
Что такое мёртвый код, откуда он берётся в вайбкоде и как его удалить без страха: поиск использований, инструменты, логи, флаги и маленькие коммиты.
Мёртвый код — это код, который лежит в проекте, но не выполняется: неиспользуемые файлы, функции, которые никто не вызывает, страницы без ссылок на них, ветки условий, которые никогда не срабатывают. Дубли — его близкие родственники: две-три версии одной функции, из которых живая только одна, и не всегда понятно какая.
В проектах, написанных с ИИ, мёртвого кода особенно много. Ассистент охотно пишет новую функцию вместо того, чтобы найти старую, оставляет прошлую версию «на всякий случай» и не убирает за собой после неудачного эксперимента.
Чем он мешает, если ничего не ломает
Мёртвый код не падает и не тормозит, поэтому его легко терпеть. Цена у него другая:
- ты тратишь время, читая и поддерживая то, что не работает;
- ИИ-ассистент находит старую версию функции и правит её, а не живую — правка «не применяется», и ты не понимаешь почему;
- при обновлении библиотек ломается код, который всё равно никто не вызывает, и его приходится чинить;
- в мёртвом коде иногда живут открытые эндпоинты, которые никто не проверял, — и они вполне доступны снаружи.
Последний пункт — главная причина заняться этим всерьёз. Забытый маршрут API без проверки прав — это не мусор, это дверь.
Как найти мёртвый код
Поиск использований. Самый простой и надёжный способ. Для каждой подозрительной функции или компонента ищи по всему проекту, где их вызывают. Редакторы умеют это делать через «Find all references», и это точнее текстового поиска.
Инструменты. Для JavaScript и TypeScript есть утилиты, которые находят неиспользуемые файлы, экспорты и зависимости, — например, knip. В других языках компилятор или линтер часто сам предупреждает о неиспользуемых функциях и переменных. Запусти, посмотри список, но не удаляй всё подряд: инструмент не знает, что функцию вызывает внешний сервис или cron.
Логи и аналитика. Посмотри, какие страницы и эндпоинты реально вызываются за последний месяц-два. Маршрут, на который не пришло ни одного запроса, — кандидат на удаление.
Покрытие кода. Если тесты есть, отчёт о покрытии покажет участки, которые не выполняются ни одним тестом. Это не доказательство смерти, но хороший повод посмотреть.
История git. Файл, который не трогали год и который ни на что не ссылается, скорее всего, остался от прошлой жизни проекта.
Где искать дубли
Дубли видны по названиям: formatPrice и formatPrice2, UserCard и UserCardNew, api.ts и api-old.ts. Ещё их выдают похожие куски кода в разных фичах — например, одна и та же проверка прав, скопированная в пять обработчиков.
С дублями порядок такой: найди живую версию, проверь, что все вызовы идут в неё, перенаправь остальные и только потом удаляй лишние. Если версии отличаются, разберись, какое отличие важно. Иногда «старая» функция делает что-то, о чём новая забыла.
Как удалять без страха
Маленькими коммитами. Одно удаление — один коммит с понятным сообщением. Если что-то сломается, откатишь ровно одно изменение и сразу поймёшь, что именно было живым.
Сначала выключить, потом удалить. Если сомневаешься, используется ли маршрут или фича, не удаляй сразу. Спрячь за флагом или добавь в начало обработчика запись в лог вроде deprecated route hit. Подожди неделю-другую. Если запись не появилась — удаляй спокойно.
Удалять, а не комментировать. Закомментированный код — тот же мёртвый код, только ещё и мешает читать. Git помнит всё: если удалённое понадобится, его можно достать из истории.
Проверять после каждого шага. Сборка, тесты, быстрый проход по главным сценариям. Если тестов нет, хотя бы открой ключевые страницы руками.
Не смешивать с другими правками. Удаление мёртвого кода и рефакторинг живого — разные коммиты. Иначе при поломке не понять, что из двух виновато.
Как не накапливать снова
Добавь в инструкции для ИИ-ассистента правило: перед созданием новой функции искать существующую, не оставлять старые версии и удалять за собой код неудачных попыток. Раз в месяц запускай инструмент поиска неиспользуемого кода — это занимает минуты. И просматривай изменения перед коммитом: новые файлы с суффиксом 2 или new должны вызывать вопросы.
Коротко
- Мёртвый код — это то, что лежит в проекте, но не выполняется; дубли — несколько версий одного и того же.
- Он мешает читать, путает ИИ и иногда оставляет открытые эндпоинты без проверок.
- Ищи через поиск использований, инструменты вроде
knip, логи, покрытие и историю git. - Сомнительное сначала выключай или логируй, удаляй через неделю тишины.
- Удаляй маленькими отдельными коммитами и не комментируй вместо удаления — git всё помнит.
SUBXCAT может провести такую чистку вместе с твоей командой и настроить проверки, чтобы мусор не копился снова.