Одно предсказание нескольких лет давности состарилось плохо: «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-разработка в чистую кодовую базу или в красиво отформатированную свалку. Учитесь называть то, что видите. Модели эту часть за вас не сделают.