# Мёртвый код и дубли: как найти и удалить без страха

> Что такое мёртвый код, откуда он берётся в вайбкоде и как его удалить без страха: поиск использований, инструменты, логи, флаги и маленькие коммиты.

Published: 2025-08-29 · Source: https://subxcat.com/ru/articles/remove-dead-code · Author: SUBXCAT

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

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

## Чем он мешает, если ничего не ломает

Мёртвый код не падает и не тормозит, поэтому его легко терпеть. Цена у него другая:

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

Последний пункт — главная причина заняться этим всерьёз. Забытый маршрут 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 может провести такую чистку вместе с твоей командой и настроить проверки, чтобы мусор не копился снова.
