Сценарий 12: Оценка технического долга¶
Технический лидер выявляет и определяет приоритеты технического долга.
Быстрый старт¶
# Выберите сценарий технического долга
/select 12
Выявление технического долга¶
Общий показатель технического долга¶
> Рассчитать показатель технического долга
╭─────────────── Сводка по техническому долгу ───────────────────────────╮
│ │
│ Общий показатель технического долга: 34/100 (умеренный) │
│ │
│ Распределение по категориям: │
│ │
│ Долг сложности: 42% ████████░░ │
│ - 23 функции превышают порог сложности │
│ - 5 функций длиннее 300 строк │
│ │
│ Долг дублирования: 28% █████░░░░░ │
│ - обнаружено 15 кластеров клонов │
│ - около 450 продублированных строк │
│ │
│ Долг связанности: 35% ███████░░░ │
│ - 8 циклических зависимостей │
│ - 12 модуля с высокой связанностью │
│ │
│ Долг документации: 31% ██████░░░░ │
│ - покрытие комментариями 67% (целевой показатель: 80%) │
│ - 23 публичные функции без документации │
│ │
╰──────────────────────────────────────────────────────────────────────╯
Основные проблемные участки¶
> Найти участки с высокой концентрацией технического долга
╭─────────────── Проблемные участки ───────────────────────────────╮
│ │
│ Топ-10 файлов по плотности долга: │
│ │
│ # Файл Показатель Проблемы │
│ ────────────────────────────────────────────────────────────── │
│ 1 src/backend/tcop/postgres.c 78 Сложность, объём │
│ 2 src/backend/parser/gram.y 72 Сгенерирован, сложный │
│ 3 src/backend/executor/execMain 65 Сложность │
│ 4 src/backend/optimizer/plan.c 61 Связанность │
│ 5 src/backend/catalog/pg_type.c 58 Дублирование │
│ │
│ Рекомендация: сосредоточьтесь на пяти самых проблемных файлах для достижения максимального эффекта │
│ │
╰─────────────────────────────────────────────────────────────────╯
Категории технического долга¶
Долг по сложности¶
> Найти элементы долга по сложности
╭─────────────── Долг по сложности ─────────────────────────────╮
│ │
│ Функции с высокой сложностью: │
│ │
│ 🔴 exec_simple_query() CC: 47 │
│ Оценка времени рефакторинга: 4-8 часов │
│ Влияние: Высокое (ключевой путь выполнения запросов) │
│ │
│ 🔴 ExecInitNode() CC: 32 │
│ Оценка времени рефакторинга: 2-4 часа │
│ Влияние: Среднее (функция диспетчеризации) │
│ │
│ Глубоко вложенный код: │
│ - 5 функций с глубиной вложенности > 5 │
│ - 12 функций с глубиной вложенности > 4 │
│ │
│ Общий долг по сложности: ~40 часов │
│ │
╰───────────────────────────────────────────────────────────────╯
Долг по связанности¶
> Найти проблемы связанности
╭─────────────── Долг по связанности ───────────────────────────╮
│ │
│ Циклические зависимости: │
│ │
│ 🔴 executor ↔ optimizer │
│ Файлы: execMain.c, createplan.c │
│ Влияние: Сложность порядка компиляции, трудности тестирования │
│ │
│ 🔴 catalog ↔ utils │
│ Файлы: pg_class.c, relcache.c │
│ Влияние: Сложность инициализации │
│ │
│ Функции с высокой расходимостью (> 20 зависимостей): │
│ ProcessQuery() зависит от 34 модулей │
│ PostgresMain() зависит от 28 модулей │
│ │
│ Функции с высокой сходимостью (> 50 вызывающих): │
│ palloc() 89 вызывающих │
│ ereport() 156 вызывающих │
│ │
╰───────────────────────────────────────────────────────────────╯
Долг по устаревшему коду¶
> Найти устаревшие шаблоны кода
╭─────────────── Устаревший код ────────────────────────────────╮
│ │
│ Обнаруженные устаревшие шаблоны: │
│ │
│ 🟡 Объявления функций в старом стиле: 12 │
│ Пример: void func() вместо void func(void) │
│ │
│ 🟡 Неявные преобразования типов: 45 │
│ Риск: Потеря данных или неопределённое поведение │
│ │
│ 🔴 Закомментированные блоки кода: 23 │
│ Общее количество строк: ~340 │
│ Рекомендация: Удалить или задокументировать │
│ │
│ 🟡 Комментарии TODO/FIXME: 156 │
│ FIXME: 34 │
│ TODO: 89 │
│ HACK: 12 │
│ XXX: 21 │
│ │
╰───────────────────────────────────────────────────────────────╯
Приоритизация¶
Матрица приоритизации технического долга¶
> Приоритизируйте элементы долга по степени влияния и трудозатратам
╭─────────────── Матрица приоритизации ───────────────────────╮
│ │
│ Низкие затраты Высокие затраты │
│ ┌─────────────┬─────────────┐ │
│ Высокое │ БЫСТРЫЕ │ КРУПНЫЕ │ │
│ влияние │ ПОБЕДЫ │ ПРОЕКТЫ │ │
│ │ ───────────│ ───────────│ │
│ │ • Удаление │ • Рефакторинг │ │
│ │ мёртвого │ postgres │ │
│ │ кода │ .c │ │
│ │ • Исправление│ • Разделение│ │
│ │ документации│ крупных │ │
│ │ │ модулей │ │
│ ├─────────────┼─────────────┤ │
│ Низкое │ ДОПОЛНЕНИЯ │ ИЗБЕГАТЬ │ │
│ влияние │ ───────────│ ───────────│ │
│ │ • Очистка │ • Глубокий │ │
│ │ стиля │ рефакторинг│ │
│ │ • Обновление│ рабочего │ │
│ │ комментариев│ кода │ │
│ │ │ │ │
│ └─────────────┴─────────────┘ │
│ │
╰──────────────────────────────────────────────────────────────╯
Примеры вопросов¶
- «Рассчитать показатель технического долга»
- «Найти участки с высоким уровнем долга»
- «Показать элементы долга, связанные со сложностью»
- «Найти проблемы с связанностью»
- «Определить приоритеты долга по степени влияния»
- «Найти комментарии TODO/FIXME»
Связанные сценарии¶
- Рефакторинг — Устранение технического долга с помощью рефакторинга
- Производительность — Технический долг, связанный с производительностью
- Соответствие стандартам — Долг, связанный с соответствием стандартам
- Массовый рефакторинг — Снижение долга в крупном масштабе