Как defect prediction помогает находить баги до релиза?
Дефекты в коде не случайны. Файлы с высокой цикломатической сложностью, большим количеством авторов и частыми изменениями статистически содержат в 3–5 раз больше багов, чем стабильные модули. Мы строим ML-модель, которая анализирует статические метрики кода, историю изменений и паттерны коммитов, чтобы заранее указать на зоны риска — до того как баг попадёт в продакшен. Наша система цикломатической сложности (термин Томаса Маккейба) интегрируется в ваш CI/CD и выдаёт предупреждения на каждый Pull Request. Опыт внедрения на 300+ проектах показывает: количество инцидентов снижается на 30–40%, а время на code review сокращается на 20%.
Почему defect prediction — не просто статический анализ?
Статический анализатор находит уже существующие ошибки: неиспользуемые переменные, потенциальные NPE. Но он не предскажет, какой модуль «взорвётся» через месяц. Defect prediction использует историю изменений: если файл меняли 10 раз за 30 дней, в нём 5 авторов и цикломатическая сложность 20, вероятность дефекта в следующем спринте — 80%. Такие паттерны не видны статическому анализатору.
Какие признаки мы используем?
Качество предсказания определяется набором признаков. Используем три группы: Метрики кода (статический анализ):
- Цикломатическая сложность (McCabe complexity)
- LOC, LLOC, количество методов на класс
- Глубина наследования (DIT), связанность (CBO) для OOP
- Количество параметров методов
- Halstead Volume, Maintainability Index
Git-метрики (history-based):
- Количество коммитов за 30/90/365 дней (change frequency)
- Количество уникальных авторов
- Возраст файла (days since creation)
- Количество merge conflicts в истории
- Code churn:
(lines_added + lines_deleted) / LOC
Process-метрики:
- Количество связанных issues/tickets
- Время жизни PR до merge
- Количество review iterations
- Количество revert-коммитов
import pandas as pd from sklearn.ensemble import GradientBoostingClassifier from sklearn.pipeline import Pipeline def build_defect_predictor(train_df: pd.DataFrame): feature_cols = [ 'cyclomatic_complexity', 'loc', 'num_authors', 'change_frequency_90d', 'code_churn', 'avg_pr_iterations', 'dit', 'cbo', 'halstead_volume' ] pipeline = Pipeline([ ('clf', GradientBoostingClassifier( n_estimators=300, max_depth=5, learning_rate=0.05, subsample=0.8, random_state=42 )) ]) pipeline.fit(train_df[feature_cols], train_df['has_defect_90d']) return pipeline Сбор и разметка данных
Разметка — ключевой этап. Определяем «дефектный» файл: файл, к которому привязан хотя бы один commit с сообщением, содержащим fix, bug, defect, hotfix за период наблюдения. Дополнительно — ручная разметка от команды по серьёзным инцидентам.
Для формирования датасета используем PyDriller для извлечения git-метрик и radon для Python-метрик, lizard — универсальный анализатор для Python, Java, Go, C++, JavaScript.
# Сбор метрик через radon и lizard radon cc src/ -j -a > complexity_metrics.json lizard src/ --csv > code_metrics.csv Модель на Gradient Boosting показывает AUC-ROC на 10% выше, чем логистическая регрессия, на датасетах с дисбалансом классов. Мы гарантируем точность предсказания: precision в топ-20% рискованных файлов — 0.71–0.78.
Интеграция в Code Review процесс
Модель запускается при открытии Pull Request. В комментарии к PR добавляется предупреждение для файлов с defect_probability > 0.7:
⚠️ High defect risk detected in `src/payment/processor.py` Predicted defect probability: 83% Risk factors: high cyclomatic complexity (18), 5 authors, changed 12 times in last 30 days Recommendation: mandatory 2 reviewers, add integration tests Дополнительно система формирует еженедельный отчёт «Технический долг по риску» — топ-20 файлов, требующих рефакторинга или усиленного тестирования.
Метрики качества на реальных проектах
| Метрика | Значение |
|---|---|
| AUC-ROC | 0.82–0.89 |
| Precision (top 20% risky files) | 0.71–0.78 |
| Recall (известные дефекты) | 0.74–0.82 |
| Предсказания за 14+ дней до бага | 68% случаев |
Поддерживаемые языки и репозитории
Java, Python, Go, TypeScript/JavaScript, C++, C#, PHP. Репозитории: GitHub, GitLab, Bitbucket — через API или локальный клон.
| Размер кодовой базы | Срок внедрения |
|---|---|
| До 50k строк | 2–3 недели |
| 50k–500k строк | 3–5 недель |
| Более 500k строк | 5–8 недель |
Как внедрение влияет на стоимость поддержки?
По нашим данным, внедрение системы сокращает количество багов, доходящих до продакшена, на 35%. Это уменьшает затраты на горячие фиксы и снижает нагрузку на дежурную команду. Один из клиентов после внедрения сократил время на debugging на 40% за счёт приоритизации рискованных модулей. Мы гарантируем качество: поддержка модели в течение 3 месяцев после внедрения. Свяжитесь с нами для оценки вашего проекта — получите консультацию по внедрению defect prediction в вашу команду. Наш опыт — более 300 проектов в области ML.
Что входит в работу
- Аудит кодовой базы и сбор метрик (цикломатическая сложность, git-история)
- Обучение модели с подбором гиперпараметров (AUC-ROC > 0.85)
- Интеграция в GitHub/GitLab через webhook (комментарии к PR)
- Дашборд с топ-рисковыми файлами и трендами
- Документация и обучение команды (2 сессии)
- Гарантия качества: поддержка 3 месяца, корректировка модели при дрейфе данных
Закажите аудит вашего репозитория уже сегодня.







