За последние несколько лет большие языковые модели (LLM) вызвали настоящий переворот в мире программирования. Их способности автоматически генерировать код поставили перед сообществом сотни вопросов, но самым главным остается один — какой будет судьба профессии разработчика? Вокруг этого развернулись дебаты о роли человека в создании программных продуктов, о том, как далеко может уйти автоматизация, а также о том, где действительно находятся ограничения таких систем. Сегодня можно выделить два основных направления, в которых развивается взаимодействие с LLM. С одной стороны, есть автономные агенты, которые практически не требуют вмешательства человека. Речь идет о зорко популяризируемом подходе, известном как «vibe coding», при котором программисты перестают напрямую писать код, а взаимодействуют с кодовой базой исключительно через диалог с моделью.
Такие чат-боты даже могут запускать интерпретацию и тестирование кода. С другой стороны, существуют инструменты, выступающие в роли ассистентов, которые помогают разработчику, предсказывая или дополняя код, словно бы расширяя возможности автодополнения. Каждый из этих подходов имеет своих поклонников и критиков. Одни уверены, что с развитием вычислительных мощностей LLM достигнут человеческого уровня мастерства и смогут полностью заменить программистов в создании промышленных систем. Другие считают такие надежды наивными, утверждая, что генерация кода останется поверхностной и не сможет масштабироваться до реальных, сложных проектов.
Автор статей и исследователь Алперен Келес, к которому можно отнестись как к опытному наблюдателю с практическим опытом и глубоким пониманием темы, предлагает взглянуть на проблему с другой стороны. Он отмечает, что каждое программное обеспечение должно соответствовать определённому понятию правильности, и пока люди писали код, контроль верности был одним из важных этапов разработки. LLM могут снять с программиста непосредственную нагрузку по написанию кода, но процесс проверки остается за человеком — он лишь переходит на другой уровень. Разные сферы требуют различной степени тщательности при проверке. Веб-сайт, созданный для личного мероприятия, будет протестирован не так строго, как приложение для бизнес-аналитики или системы управления крупной облачной платформой.
В последнем случае проверка и доказательная база должны быть максимально жесткими, вплоть до математических доказательств корректности. Такая разница во внимании к проверяемости кода критична и подчеркивает, что не только степень требований меняется, но и сами способы верификации. Интересно, что это объясняет неожиданное явление — LLM относительно успешно справляются с генерацией UI-кода и фронтенд-разработкой, включая целые веб-приложения, тогда как их применение в бэкенд-серверных проектах, не менее распространённых, не стало массово популярным. Причина заключается не только в том, что UI-код проще внешне и встречается чаще в открытых репозиториях для обучения моделей. Главный фактор — проверяемость.
Проверять визуальную составляющую интуитивно проще и быстрее, достаточно взглянуть на страницу и сразу заметить расхождение с задумкой. В свою очередь, проверка серверной логики требует продуманной системы тестирования: подготовка входных данных, создание состояния, мониторинг ответов и их анализ, что усложняет процесс и повышает порог доверия к порожденному коду. Это неслучайно и влияет на то, почему решения с UI кажутся более эффектными и востребованными в рамках LLM. Другой пример проверяемости очевиден в области разработки игр, где на первый план выходит проба и ошибка, а не формальное доказательство корректности. Такие игры часто строятся на простых архитектурах, без долговременного хранения состояния или сложного взаимодействия, что позволяет справляться с ошибками за счет снижения требований к логике и более гибкого пользовательского опыта.
Это выбор в пользу возможности быстрой проверки, а не глубокой устойчивости к ошибкам, что отражает ключевую проблему масштабируемости моделей. Таким образом, поддержать идею автономных интеллектуальных агентов, которые смогут написать, проверить и доработать сложные ПО без участия человека, сталкивается с проблемой того, что сама проверка становится узким местом. Даже если система автоматически создаст тесты, их нужно интерпретировать и оценивать в контексте первоначального замысла пользователя, а значит человеческий контроль пока незаменим. Автор подчеркивает важность переосмысления подходов к верификации. Чтобы расширить границы автоматизации с LLM, необходимо создавать более удобные инструменты и интерфейсы, предназначенные для проверки.
Представляется перспективным внедрение методов случайного тестирования на основе декларативных свойств, когда пользователь формулирует правила, которым должна соответствовать программа, и эти ограничения проверяются на основе случайных входных данных. Такой подход уже доказал свою эффективность в повышении надежности, хотя пока не получил широкого распространения среди сообществ разработчиков. Еще одна важная идея состоит в том, что мы должны начать говорить о «правильности» программ в более широком контексте, помимо функциональной корректности. Показатели производительности, безопасности, доступности и гибкости играют не менее важную роль и требуют разработки методов измерения и верификации. По мнению автора, в настоящее время программная инженерия часто упускает эти аспекты, сжимая все ожидания пользователя в понятие «функциональности», а остальные свойства объединяет в «нефункциональные характеристики», требующие отдельного внимания.
Подводя итог, Келес утверждает, что будущее за теми системами, которые смогут надежно и последовательно проверять качество и соответствие кода задумке. Лишь при наличии таких «совершенных оракулов», способных давать однозначные ответы «правильно/неправильно», LLM смогут проявить себя во всей полноте своего потенциала. Примером идеального оракула являются игровые состязания или конкурсные задачи по программированию, где результат очевиден и объективен. В реальном мире полный оракул недостижим, но даже неполные системы доказательства, как в случае с формальными методами верификации, уже способны значительно повысить надежность и безопасность построенных решений. Эта перспектива несет с собой важный вызов для индустрии.