Еволюційна архітектура (Ніл Форд, Ребекка Парсонс, Патрік Куа) - підхід, за яким архітектуру не проєктують раз і назавжди, а постійно змінюють разом із системою. Ключове питання - як змінювати, не втрачаючи важливих властивостей (продуктивності, безпеки, модульності).
Функція придатності (fitness function) - автоматична перевірка конкретної архітектурної властивості. Термін запозичено з еволюційних алгоритмів, де функція придатності оцінює, наскільки рішення близьке до мети.
Приклади функцій придатності:
- модульність: arch-тести Pest - «модуль Billing не залежить від внутрішніх класів Catalog», «домен не імпортує HTTP-шар»;
- продуктивність: тест, що головна сторінка робить не більше 15 SQL-запитів (
expectsDatabaseQueryCount); бюджет часу відповіді в навантажувальних тестах; - розмір збірки фронтенду: CI падає, якщо JavaScript-бандл перевищив 250 КБ;
- безпека:
composer auditбез вразливостей високого рівня, заборонені функції черезarch()->preset()->security(); - якість: рівень PHPStan, покриття критичних модулів тестами;
- операційні: моніторинг SLO в продакшені - «функція придатності», що працює постійно.
Види:
- атомарні (одна властивість) і цілісні (поєднання - продуктивність разом із безпекою);
- тригерні (запускаються в CI на кожну зміну) і безперервні (моніторинг у продакшені);
- статичні (правила коду) і динамічні (вимірювання під навантаженням).
Чому це важливо: архітектура деградує поступово - кожен окремий pull request «трохи» порушує межі, і через рік модульний моноліт стає великою грудкою бруду. Функції придатності роблять архітектурні рішення виконуваними: порушення помітне в момент внесення, а не на ретроспективі.
Інші принципи еволюційної архітектури:
- останній відповідальний момент для рішень - вирішувати, коли знань достатньо, але до того, як відкладання стане дорожчим;
- зменшення зв'язності - чим менше залежностей, тим легше змінювати частини незалежно;
- малі інкрементальні зміни з можливістю відкату - замість великих переписувань.
Як почати: обрати 2-3 властивості, порушення яких найболючіші для проєкту (часто - межі модулів і N+1), і автоматизувати їх перевірку в CI.
Докладніше в документації: Building Evolutionary Architectures