Многие до сих пор уверены, что генерация кода через нейросети ускорила разработку в десять раз. На коротких видеороликах в сети это действительно выглядит потрясающе: человек без опыта за пару часов собирает рабочий сервис с авторизацией, базой данных и оплатой.
Специально для статьи мы потестили эту историю под нагрузкой, дабы наглядно освятить суть проблемы.
Взяли типичный проект, сгенерированный в связке Cursor и Claude за трое суток - бэкенд на FastAPI, база PostgreSQL 16, асинхронный драйвер asyncpg и кэш на Redis. Локально под одним пользователем интерфейс работал идеально, тесты светились зеленым.
Затем мы запустили утилиту k6 на отдельном сервере: 300 виртуальных пользователей, ступенчатый рост нагрузки в течение пяти минут, типовой сценарий добавления товара в корзину и перехода к оплате.
Сервер лег на сороковой секунде теста при достижении ста пятидесяти одновременных запросов.
Лог моментально забился ошибками: QueuePool limit of size 20 overflow 10 reached, connection timed out. Все последующие запросы уходили в таймаут, база перестала отвечать, а процессор утилизировался на девяносто процентов в холостых попытках раздать соединения.
Мы открыли сгенерированный код модуля оформления заказа.
С точки зрения синтаксиса придраться было не к чему: чистый асинхронный код, валидация через Pydantic, явные аннотации типов и аккуратные комментарии к каждой строчке.
Проблема крылась в архитектурной ошибке, которую модель повторяет с завидным упорством:
Смотрим на механизм работы этого фрагмента.
Контекстный менеджер async with db.begin() захватывает физическое соединение из пула и открывает транзакцию в PostgreSQL на шестой строке. На одиннадцатой строке код делает асинхронный HTTP-запрос к внешнему платежному шлюзу. В реальной сети ответ от банка идет от трехсот до шестисот миллисекунд.
Все эти полсекунды физическое соединение с базой данных висит заблокированным в ожидании сетевого пакета из внешнего интернета.
При трехстах параллельных пользователях пул из тридцати доступных соединений исчерпывается за десятую долю секунды. Все остальные эндпоинты сервиса - от простой авторизации до чтения профиля - встают в очередь и падают по таймауту.
Модель написала синтаксически верный код. Но она нарушила базовый закон надежности: сетевой ввод-вывод запрещено держать внутри открытой транзакции базы данных.
Вайб-кодер этой проблемы не увидел, потому что локально база всегда отвечает за одну миллисекунду.
Набор символов на клавиатуре никогда не был узким местом в программировании.
По нашим замерам в рабочих проектах, непосредственный ввод текста занимает у квалифицированного инженера от десяти до пятнадцати процентов рабочего дня. Остальные восемьдесят пять процентов уходят на удержание в памяти графа зависимостей, проверку краевых условий, разбор планов выполнения запросов и поиск мест, где система может сломаться при отказе сети.
Модели сократили фазу набора текста до пары секунд. Но объем кода в коммитах вырос в разы.
Тут, кстати, возникает неприятный перекос. Когда джуниор пишет код сам, он ошибается вполне предсказуемо: забывает закрыть скобку, путает типы или пишет неоптимальный цикл. Старший разработчик видит такую ошибку за двадцать секунд беглого взгляда на экран.
С кодом от языковых моделей ситуация принципиально иная.
Модель генерирует вежливый, идеально оформленный текст. В нем нет синтаксических огрехов, переменные названы красиво, а документация оформлена по стандартам. Но на четырехсотой строке сгенерированного файла может прятаться неатомарное обновление баланса без блокировки SELECT FOR UPDATE или неявная утечка сессии в генераторе.
Чтобы найти такую мину в чужом сгенерированном Pull Request на полторы тысячи строк, сеньор должен прочитать каждую строчку с максимальным уровнем концентрации.
В итоге старшие инженеры перестали проектировать архитектуру и превратились в круглосуточных аудиторов чужих правдоподобных галлюцинаций.
Это утомляет гораздо сильнее, чем написание систем с нуля.
Бизнес рассуждает, понятное дело, предельно прагматично: зачем брать стажера за небольшую зарплату, тратить на него часы наставника и ждать полгода отдачи, если платная подписка закрывает типовые скрипты за секунды?
Компании массово режут бюджеты на начинающих специалистов.
Но инженерное мышление не берется из чтения книг или просмотра курсов. Оно формируется через сотни часов рутинной отладки боевого кода.
Нельзя научиться проектировать распределенные базы данных, не набив руку на рутинных задачах:
Именно через эту неблагодарную рутину мозг инженера за три-четыре года вырабатывает интуицию: человек начинает физически чувствовать, где в кодовой базе прячется узкое место под нагрузкой.
Сегодня этот конвейер подготовки специалистов остановлен.
Через пять-семь лет текущее поколение ведущих инженеров уйдет в управление или сменит сферу деятельности. На рынке возникнет глубокая демографическая яма: людей с реальным опытом системной отладки не окажется, а вчерашние вайб-кодеры будут беспомощны перед упавшим кластером.
Чтобы не превратить проект в неуправляемое нагромождение чужого кода, зрелые команды вводят жесткие правила:
Сгенерировать миллион строк кода за выходные стало просто и дешево.
Вот только разбираться с последствиями в три часа ночи модель за вас не пойдет.