Один прогноз кількарічної давнини постарів погано: «AI писатиме код, тож вивчати патерни проєктування безглуздо». Перша половина справдилася — значна частка diff’ів, які я сьогодні рев’юю, були згенеровані, а не набрані руками. Друга — перевернулася. Тепер, коли інженери самі пишуть менше коду, вміння розпізнавати структуру з одного погляду — сказати «це Strategy», «це хоче бути Decorator», «це Singleton, що сховався у статичному класі» — тихо стало навичкою з найбільшим важелем у всьому ланцюжку рев’ю.
Ось аргумент — від людини, яка викладає патерни й щодня випускає код з AI-інструментами.
Чому AI-згенерований код робить патерни важливішими, а не навпаки?
Тому що рев’ю замінило написання в ролі вузького місця, а патерни — це словник рев’ю. Коли ви писали код самі, структурне розуміння діставалося безкоштовно — кожне рішення ухвалювали ви. Згенерований diff приходить без рішень: правдоподібний, такий, що компілюється, і структурно неперевірений. Рев’юер, який уміє назвати те, на що дивиться, оцінює diff на 400 рядків за хвилини («Factory — ок; але ця retry-логіка хоче бути Decorator, а не копіпастою в шести хендлерах»). Рев’юер, який не вміє, читає рядок за рядком — або гірше: гортає і апрувить.
Назва — це компресія. «Тут має бути Strategy» замінює двадцять хвилин пояснень, чому switch за типами поведінки ще дасться взнаки — саме та розмова, яку я знову й знову веду на рев’ю згенерованого коду, бо моделі відтворюють найпоширеніше рішення зі своїх тренувальних даних, а найпоширеніше рішення — це купа if’ів.
Хіба моделі й так не знають патерни?
Вони знають патерни так, як бібліотека знає свої книжки. Попросіть реалізацію Strategy — отримаєте підручникову. Але складною частиною патернів ніколи не була реалізація — складним є вибір: розуміння, що цей клубок умов — три стратегії в одному плащі, або що «гнучка» абстрактна фабрика, яку видала модель, — спекулятивна загальність для задачі рівно з одним варіантом. Моделі помиляються у виборі в обидва боки: недо-патерноване дублювання, коли промпт вузький, і пере-патернована церемонія, коли промпт каже «зроби розширюваним».
Вибір вимагає знати сили, які патерн розв’язує, і ціну, яку він бере, — саме цій частині курс із патернів присвячує свій час: не «ось UML», а «ось запах, ось момент, коли патерн відпрацьовує свою складність, і ось момент, коли ні». Саме це судження ви й здаєте в оренду, коли рев’юїте згенерований diff.
Які патерни окупаються найбільше в AI-кодових базах?
Патерни композиції — Strategy, Decorator, Adapter, Facade — бо саме вони не дають повторній генерації перетворитися на повторне дублювання. Модель, яку попросили «додай логування в ці шість хендлерів», радо вставить той самий try/log/rethrow у шість місць; рев’юер зі словом Decorator у словнику перетворює це на одну обгортку. Adapter і Facade відпрацьовують себе саме на межах AI-систем: інтерфейси інструментів для агентів — це Adapter’и за побудовою, а будь-яка притомна LLM-інтеграція ховає провайдера за Facade, щоб вендора можна було змінити непомітно для кодової бази.
А ще є «спостерігач року»: Chain of Responsibility, що переродився як middleware у кожному агентському фреймворку. Якщо ви бачите класичну структуру всередині модної обгортки, зміна фреймворків перестає бути перенавчанням і стає впізнаванням — з тієї ж причини C#-інженери з вільним володінням патернами опанували agentic-воркфлоу швидше, ніж будь-хто очікував: hooks, суб-агенти й пайплайни — це патерни, для яких у них уже були імена.
Конкретніше: ось та шпаргалка, яку я приклеїв би до монітора кожному рев’юеру згенерованого коду. Третя колонка найважливіша: названий запит дієвий, «щось тут брудно» — ні.
| Патерн | Запах у згенерованому коді | Що сказати на рев’ю |
|---|---|---|
| Strategy | Switch або ланцюжок if-else за типами поведінки, що росте щоспринту | «Ці гілки — стратегії, винеси по одній на кожну поведінку» |
| Decorator | Той самий блок try/log/retry, вставлений у шість хендлерів | «Це одна обгортка, а не шість копій» |
| Adapter | Типи з SDK провайдера протікають у ваш доменний код | «Постав адаптер на межі; домен не має знати вендора» |
| Facade | Викликач оркеструє п’ять викликів підсистем у суворому порядку | «Сховай цю послідовність за однією точкою входу» |
| Factory | Пряме конструювання конкретних типів, розкидане по місцях виклику | «Централізуй створення; викликач не має обирати реалізації» |
| Chain of Responsibility | Одна функція поспіль робить auth, валідацію, логування і бізнес-логіку | «Це middleware — по одній стадії на кожну турботу» |
| Speculative generality (антипатерн) | Абстрактна фабрика та ієрархія інтерфейсів, що обслуговують рівно одну реалізацію | «Один варіант не потребує ієрархії — видали абстракцію, доки не з’явився другий» |
Як на практиці рев’юїти згенерований код на структуру?
Рев’юйте у два проходи з різними питаннями. Прохід перший, структурний: яким патерном це намагається бути? Чи є дублювання, що просить імені? Чи є церемонія, що проситься на видалення? Ви ще не читаєте рядки — ви читаєте форми, і це займає хвилини. Прохід другий, семантичний: тепер читайте рядки, що пережили перший прохід. Більшість команд роблять лише другий — тому згенероване дублювання й накопичується: читання рядок за рядком перевіряє, що кожна копія окремо коректна, і ніколи не помічає, що їх шість.
Рев’юїти можна лише те, що вмієш назвати. Грамотність у патернах більше не архітектурний факультатив — це навичка читання, яка вирішує, чи складається AI-розробка у складний відсоток, чи просто накопичується.
Зробіть структурний прохід навчальним, зробивши його вербальним: рев’юери називають патерн (або запах) у коментарі до рев’ю. «Витягни тут Strategy» — дієво і навчально; «щось тут брудно» — ні те, ні інше. Команди, які заводять звичку називати, вибудовують спільний структурний словник за квартал — і цей словник дає складний відсоток, бо матеріал просунутого курсу C# про reflection, generics та async-патерни лягає зовсім інакше, коли фундамент GoF уже на місці.
Інверсія, сформульована прямо
Раніше ми вчили патерни, щоб писати кращий код, і саме написання було практикою патернів. Тепер написання дедалі частіше безкоштовне, а отже, практика зникла — і судження має приходити з осмисленого вивчення, бо саме на рев’ю це судження й працює. Грамотність у патернах у 2026-му — не архітектурний факультатив; це навичка читання, яка визначає, чи складається AI-розробка в чисту кодову базу, чи в красиво відформатований смітник. Вчіться називати те, що бачите. Моделі цю частину за вас не зроблять.