Генерация кода с помощью искусственного интеллекта обещает упростить разработку ПО за счет использования естественного языка, но некоторые эксперты считают, что качество обучающих данных и многозначность языка делают эту технологию непригодной для использования в корпоративном секторе. Саймон Риттер, заместитель технического директора поставщика Java-платформы Azul Systems, рассказал порталу ZDNet о двух фундаментальных проблемах корпоративного вайб-кодинга (vibe coding).
Обещание звучит заманчиво: опишите то, что вы хотите, на естественном языке, и ИИ выдаст рабочий код. Такой подход, называемый «вайб-кодингом», заставляет всех, от основателей стартапов до технических директоров крупных компаний, задаться вопросом, понадобятся ли им программисты через пять лет.
Создатель Java Джеймс Гослинг еще в начале этого года поделился своими мыслями по этому поводу: «Как только ваш проект [вайб-кодинга] становится хоть немного сложным, он почти всегда выносит вам мозг». Он также добавил, что вайб-кодинг «не готов для предприятий, потому что на предприятиях ПО должно работать каждый грёбаный раз».
Саймон Риттер, архитектор ПО, который не одно десятилетие занимается созданием корпоративных систем, приводит две фундаментальные проблемы, которые указывают на то, что скептицизм Гослинга вполне обоснован.
Мусор на входе, мусор на выходе
Первая проблема — это обучающие данные. Инструменты кодирования с помощью ИИ учатся на существующих репозиториях кода — таких как GitHub и Stack Overflow. Но вот в чем загвоздка: в большинстве своем код, который там есть, не очень хорош, утверждает Риттер. «Можно было бы предложить: „Ну ладно, давайте просто будем использовать весь код на GitHub“, — говорит он. — Получится ли в результате хороший код? Скорее всего, нет».
Риттер отмечает, что GitHub полон заброшенных экспериментов, студенческих проектов и быстрых хаков. Ответы на Stack Overflow часто ставят во главу угла не правильность, а работоспособность. В отличие от обучения ChatGPT на основе коллективной мудрости человеческого знания, нет очевидного источника неизменно превосходного кода в масштабах, необходимых для обучения ИИ. В информатике «мусор на входе» означает «мусор на выходе». Обучите ИИ на посредственном коде, и вы получите посредственные результаты.
Проблема естественного языка
Вторая проблема заключается в том, что естественный (в первую очередь — английский) язык — ужасный язык программирования, считает Риттер.
«Рассмотрим следующее предложение: „Курица готова к еде“ („The chicken is ready to eat“). Речь идет о живой курице, готовой поужинать, или о приготовленной курице, готовой к употреблению? Оба варианта прочтения вполне допустимы», — поясняет он.
В качестве другого примера Риттер приводит инструкцию по покупкам: «Купи две пинты молока, и если есть яйца, купи 12» («Get two pints of milk, and if they have eggs, get 12»). Двенадцать чего — яиц или пинт молока? Неясность заложена в самом языке.
«Это действительно одна из причин, по которой мы вообще используем языки программирования», — поясняет Риттер. Они существуют именно потому, что естественные языки многозначны. Компилятор может интерпретировать «if (x > 5)» только одним способом. Здесь нет места для недопонимания.
По словам Риттера, вы можете попытаться быть более точным в своих описаниях на естественном языке, но всегда найдется какой-то крайний случай, какой-то способ неправильно интерпретировать то, что вы имели в виду. В первую очередь именно поэтому мы не используем естественный язык для программирования.
Где ИИ действительно помогает
Все это не означает, что ИИ бесполезен для кодирования. Он уже доказал свою ценность в определенных областях, отмечает Риттер.
Современные IDE с поддержкой ИИ действительно полезны. Установите координату X, и система часто правильно предложит установить координату Y. Такое тонкое завершение кода повышает продуктивность разработчиков без проблем с надежностью при генерации целых приложений.
ИИ также превосходно справляется с генерацией отдельных методов или классов, когда требования конкретны и ограничены. Нужен класс доступа к базе данных для известной схемы? ИИ хорошо с этим справляется. Хотите рефакторить устаревший код? ИИ может модернизировать существующие реализации, где исходное намерение ясно из контекста.
Вайб-кодинг хорош для быстрых прототипов и личных проектов. Если что-то не работает, вы просто пожимаете плечами и пробуете снова, отмечает Риттер.
Но именно здесь и сейчас важное значение приобретает доминирующее положение Java в корпоративном секторе. Java не была разработана для быстрых экспериментов или одноразового кода. Она была создана для долгосрочной эксплуатации — для приложений, которые должны надежно работать в течение многих лет или десятилетий и обслуживаться командами разработчиков, которых не было, когда был написан исходный код.
Экосистема Java отражает эту реальность. По словам Риттера, корпоративные Java-приложения обычно включают обширные фреймворки, строгие протоколы тестирования и подробные требования к документации. Это не просто приятные дополнения, а необходимость, когда ваш код обрабатывает миллионы финансовых транзакций или управляет медицинскими записями пациентов.
Корпоративная реальность
Разработка для предприятий отличается. Когда вы создаете системы, которые обрабатывают данные о здоровье, финансовые транзакции или критически важную инфраструктуру, «пожать плечами и попробовать еще раз» — не вариант.
Корпоративные приложения требуют обширных модульных тестов. «Собираетесь ли вы доверять тестам, сгенерированным ИИ, для проверки кода, сгенерированного ИИ? Эти приложения требуют строгой проверки кода, а это означает, что квалифицированные разработчики должны понимать и проверять каждую строку — что в некоторой степени противоречит цели устранения программистов», — говорит Риттер.
Далее идет обслуживание. Корпоративные приложения часто работают десятилетиями. Будущие разработчики должны будут понимать и модифицировать код, который не был написан людьми, на основе спецификаций на естественном языке, которые с самого начала могли быть неоднозначными.
При серьезной разработке «большинство занимается проверкой кода. Вам понадобятся люди, которые обладают навыками для этого, что как бы уменьшает преимущества попытки устранить потребность в программистах», — говорит Риттер.
Реальное будущее
Вайб-кодинг — это не об устранении рабочих мест программистов, по крайней мере, не для важной работы. Будущее, вероятно, будет больше похоже на сложное автозаполнение кода, чем на полную его замену, считает Риттер.
Это не обязательно плохая новость. Языки программирования всегда развивались в направлении более высокого уровня абстракции. Мы перешли от ассемблера к C, затем к Java и современным фреймворкам, и каждый шаг делал разработчиков более продуктивными, сохраняя при этом точность, необходимую для серьезного ПО, отмечает Риттер.
ИИ, несомненно, будет играть более важную роль в этой эволюции. Но фундаментальное противоречие между неоднозначностью естественного языка и точностью ПО предполагает, что программисты-люди никуда не денутся в ближайшее время.