Когда техдолг кусает в спину: как мы очистили 2600 строк мёртвого кода

Проект trend-analysis вырос из стартапа в полноценный инструмент анализа трендов. Но с ростом пришла и проблема — код начал напоминать старый чердак, где каждый разработчик оставлял свои артефакты, не убирая за собой.
Мы столкнулись с классической ситуацией: git показывает нам красивую историю коммитов, но реальность была печальнее. В коде жили дублирующиеся адаптеры — tech.py, academic.py, marketplace.py — целых 1013 строк, которые делали ровно то же самое, что их потомки в отдельных файлах (hacker_news.py, github.py, arxiv.py). Вот уже месяц разработчики путались, какой адаптер на самом деле использует API, а какой просто валяется без дела.
Начали расследование. Нашли api/services/data_mapping.py — 270 строк кода, которые никто не импортировал уже полгода. Потом обнаружили целые рабочие процессы (workflow.py, full_workflow.py) — 121 строка, к которым никто не обращался. На фронтенде ситуация была похожей: компоненты signal-table, impact-zone-card, empty-state (409 строк) спокойно сидели в проекте, как будто их кто-то забыл удалить после рефакторинга.
Но это был只 верхушка айсберга. Самое интересное — ghost queries. В базе была функция _get_trend_sources_from_db(), которая запрашивала таблицу trend_sources. Только вот эта таблица никогда не была создана (CREATE TABLE в миграциях отсутствовал). Функция мирно работала, возвращала пустой результат, и никто не замечал. Чистый пример того, как техдолг становится невидимым врагом.
Мы начали с DRY-принципа на фронтенде — извлекли константы (SOURCE_LABELS, CATEGORY_DOT_COLOR и др.) в единый файл lib/constants.ts. Потом привели в порядок бэкенд: исправили credits_store.py, заменив прямой вызов sqlite3.connect() на правильный db.connection.get_conn() — это была потенциальная уязвимость в управлении подключениями.
Очистили requirements.txt и .env.example — закомментировали неиспользуемые пакеты (exa-py, pyvis, hypothesis) и удалили мёртвые переменные окружения (DATABASE_URL, LANGSMITH_*, EMBEDDING_*). Исправили даже шаблоны тестов: эндпоинт /trends/job-t/report переименовали в /analyses/job-t/report для консистентности.
Итого: 2600+ строк удалено, архитектура очищена, сразу стало проще ориентироваться в коде. Техдолг не исчезнет полностью — это часть разработки, — но его нужно время от времени погашать, чтобы проект оставался живым.
А знаете, почему Angular лучший друг разработчика? 😄 Потому что без него ничего не работает. С ним тоже, но хотя бы есть кого винить.
Метаданные
- Branch:
- refactor/signal-trend-model
- Dev Joke
- Почему Angular лучший друг разработчика? Потому что без него ничего не работает. С ним тоже, но хотя бы есть кого винить