У будь-якому великому проєкті поганого коду більше, ніж часу на його виправлення. Рефакторити «все погане» неможливо - і не потрібно: складний модуль, який ніхто не змінює роками, нікому не заважає.
Аналіз гарячих точок (hotspots, ідея Адама Торнгілла «Код як місце злочину») поєднує два виміри:
- складність коду - довжина, вкладеність, цикломатична складність файлу чи методу;
- частота змін - скільки разів файл змінювали за останні місяці (з історії Git).
Гаряча точка = складний код, який часто змінюють. Саме там зосереджені витрати часу команди й помилки: кожна зміна складного файлу повільна й ризикована, і робиться вона часто.
# найчастіше змінювані файли за рік
git log --since="1 year ago" --name-only --format="" | sort | uniq -c | sort -rn | head -20
Перетин цього списку з найскладнішими файлами (за даними PHPStan, phpmetrics, PhpStorm) дає короткий список кандидатів.
Чому це краще за інтуїцію:
- пріоритет за впливом: покращення файлу, який змінюють щотижня, окупається швидко;
- аргумент для бізнесу: «80% змін за квартал зачіпали ці три файли, і в них 60% багів» - зрозуміліше, ніж «код поганий»;
- виявляє приховані проблеми: часто гаряча точка - «божественний» клас (
OrderServiceна 3000 рядків), через який проходить половина змін.
Додаткові сигнали з історії Git:
- зв'язок змін (change coupling): файли, які майже завжди змінюються разом, - прихована залежність чи неправильно розділена відповідальність;
- знання авторів: файли, які змінювала одна людина, - ризик для команди («bus factor»);
- частота виправлень: коміти з «fix» у тих самих файлах.
Як діяти з гарячою точкою:
- рефакторити поступово, разом з функціональними змінами - правило бойскаута: залишити файл трохи кращим після кожної зміни;
- спершу тести для поведінки, яку змінюють найчастіше;
- розділяти великий клас на менші за відповідальностями - щоб зміни розподілилися;
- виміряти після: чи зменшилися складність і кількість змін, що зачіпають файл.
Інструменти: CodeScene (комерційний), git log з простими скриптами, phpmetrics, SonarQube - для оцінки складності.