Мыслишки. Вайбкодинг

Последнее время (а если быть точным, то где-то последние полгода) на просторах интернета, в основном зарубежного, распространилось такое явление как вайбкодинг.

Что это такое? Простыми словами - написание проектов с использованием LLM, а точнее продвинутых редакторов с их интеграцией, таких как Cursor или Windsurf.

Один из ярких примеров этого явления - игра fly.pieter.com, которая сделана с помощью Cursor и приносит своему разработчику 50к долларов ежемесячно.

Почему вайбкодеры появились только сейчас?

Здесь будет немного душная историческая справка.

Способность трансформеров к написанию кода обнаружили ещё до хайпа ChatGPT. В 2021 году Github презентовали свой Github Copilot на базе GPT-3 (первые версии ChatGPT работали на GPT-3.5). И в целом, в этом нет ничего удивительного, поскольку то, как трансформеры работают под капотом, очень хорошо ложится на задачу написания кода.

Когда ChatGPT стал популярным (а это был конец 2022 года), то все (и я в том числе), были увдивлены его возможностями. Да, тогда он часто галлюцинировал, выдавал некорректную информацию и часто писал о том, что "Я не могу решить эту задачу за вас", но всё же это было что-то новое и свежее.

Однако, на тот момент пользоваться чатом для создания хоть каких-то полноценных проектов, было довольно сложно. Причин сразу несколько - неудобный интерфейс (нужно постоянно туда-сюда копировать код), маленький размер контекста (модель забывает, что ей писали, через 2-3 массивных сообщения), да и общее качество ответов оставляло желать лучшего (вспоминаем про галюцинации). Но прогресс не стоит на месте.

Поистине прорывом в использовании LLM я считаю возможность вызова функций. По факту это превращает модель в своего рода "ядро", на которое можно накрутить любые возможности. Хочешь, чтобы твоя LLM ходила на сторонний API и запрашивала нужные данные? Пожалуйста. Хочешь, чтобы LLM знала какие файлы лежат в папке на твоём компьютере? Легко. При этом, для использования этих функций не нужно дообучать модель, достаточно грамотно описать их и передать в виде списка вместе с промптом.

И вместе с улучшением и увеличением возможностей самих моделей (увеличенный контекст, возможность "рассуждать", более высокое качество ответов, вызов функций) позволили создать из LLM агентов, способных полноценно выполнять комплексные задачи.

Как это вообще работает?

Для многих процесс написания кода с помощью нейронок остался на уровне "помучать чат в надежде, что он выдаст что-то толковое". На самом деле, вайбкодинг ушел от этого горзадо дальше.

Интерфейс AI-редактора мало чем отличается от классического. Более того, и Cursor, и Windsurf построены на базе VS Code.

Примерно так выглядит Cursor IDE в пустом проекте

В панель справа пишется промпт, и... всё. Модель в режиме агента сама прошерстит рабочую директорию, откроет и просмотрит нужные файлы, при необходимости внесёт в них изменения. И пользователю останется лишь проревьювить изменения (или подтвердить их все в надежде, что повезёт). В случае, если написанный код будет содержать ошибки синтаксиса или линтера, агент попытается их исправить.

И вот так, промпт за промптом вырисовывается проект. Никакого копирования кода туда-сюда, всё происходит внутри IDE.

Насколько всё идеально?

А вот здесь, как говорится, есть нюанс.

Я закодил с использованием Cursor три проекта, относительно небольших. Все три проекта это frontend. Я backend-разработчик, из фронтенд-фреймворков я полноценно могу что-то сделать на Blazor (и то с трудом). Что я могу сказать?

В целом, первое время использование агента в Cursor вызывает настоящий вау-эффект. У тебя под рукой имеется полноценный помощник, понимающий тебя с пары предложений. Создание чего-то работоспособного proof-of-concept происходит примерно за час времени, и потом это всё наполняется фичами. Но по мере того, как проект разрастается, начинаются первые проблемы.

Чаще всего они заключаются в том, что агент теряет общее "понимание" происходящего в проекте и работает ah-hoc, игнорируя какие-то общие детали, из-за чего всё работает не так, как ожидается. Также, если за этим не следить, то агент особо не заморачивается над структурой проекта.

У меня есть живой пример. Когда я работал над первым своим проектом с использованием Cursor, то вообще не думал над какой-то структурой, и поэтому у меня получился весь код приложения в одном jsx-файле. Такой подход плох тем, что проблемы с некачественными ответами начинаются значительно раньше, так как модели приходится держать контекст на несколько сотен строк. Я попросил сделать рефакторинг, и это сработало.

Во второй раз я задумался над рефакторингом гораздо раньше (когда размер App.tsx был в 300 строк), и агент грамотно сделал разделение по файлам. Но я забыл, что помимо tsx есть ещё и css. Со временем он разросся, и сейчас это файл на 1200 строк. Я три раза пытался его отрефакторить, но каждый раз это заканчивалось провалом, так как внешний вид полностью ломался.

Ещё одна проблема - LLM не очень хорошо дружит с некоторыми фреймворками. Первые два проекта были на React, и там в целом было всё ок. Но я решил поэкспериментировать со Svelte 5, и вот тут начались дополнительные проблемы. LLM допускала слишком много ошибок при написании кода, и большинство из них были связаны с использованием устаревшего синтаксиса или подхода. Скорее всего, это связано с тем, что стаблиная 5 версия вышла недавно, и LLM просто не была натренирована на этих данных. Опять же, скорее всего это решается подключением сайта с документацией к проекту, но я пока особо не заморачивался.

Почему это круто?

Вообще, мне нравится название вайбкодинг по причине того, что оно полностью соответствует происходящему. Когда я начал использовать Cursor, у меня появилась дополнительная мотивация что-то делать и кодить, так как всю рутину можно спихнуть на LLM. Плюс, это открывает возможность быстро достичь какого-то результата с использованием незнакомых и малознакомых технологий (я раньше никогда не писал на React).

Если LLM сразу правильно поймёт, что тебе нужно (а шансы этого растут с выходом новых моделей), то внедрение несложной фичи может занять 5-10 минут. Ну и всегда можно начать заново с другим промптом, если между вами произошло недопонимание.

Один из проектов, который я сделал с помощью Cursor был для корпоративного хакатона, посвященному ИИ (что довольно иронично). У нас в команде не было фронтендеров, поэтому бэк мы писали сами, а фронт я делал с помощью Cursor. За то время, которое у нас было, я бы не за что не смог реализовать что-то подобное самостоятельно, даже если бы хорошо знал React.

Кроме того, вайбкодинг способен значительно улучшить процесс знакомства с технологией на реальном примере. Хотя тот же React я не знаю, но благодаря Cursor, я стал хотя бы понимать, как решаются те или иные задачи. Кроме того, вместо реализации каких-то фич, Cursor вполне способен объяснять, что происходит в том или ином месте в коде. Если поставить перед собой такую цель, то изучить React вполне возможно.

Программисты больше не нужны?

В своём недавнем выступлении CEO Anthropic заявил, что через год ИИ будет генерировать почти 100% всего кода. Это уже успели растиражировать непрофильные СМИ и телеграм-каналы с заголовками "Через год ИИ заменит всех программистов", что, конечно же, далеко от истины.

Самая главная проблема, которая пока остаётся нерешенной - компании не спешат отправлять свой код непонятно куда. Cursor и аналоги неплохи для каких-нибудь пет-проектов, не попадающих под коммерческую тайну. Если же речь идёт о чем-то закрытом, то здесь сразу начинаются проблемы с применимостью всех этих новомодных ИИ-помощников.

Проблему могло бы решить использование on-premise инструментов, которые разворачиваются в локальном контуре. Но здесь имеется риск столкнуться с двумя проблемами. Во-первых, стоимость оборудования для того, чтобы крутить такие модели с приемлимой производительностью (мы же хотим обеспечить инструментами всю компанию) будет просто космической. Во-вторых, какими бы крутыми не были opensource-модели, всё же качество их ответов в задачах, связанных с написание кода, не дотягивает до того же Claude Sonnet 3.5/3.7, который на текущий момент является общепризнанным лидером.

Конечно, эта ситуация меняется. Ежедневно (!) выпускаются всё новые и новые версии моделей, и через какое-то время текущий уровень Claude будет вполне подъемным для моделей, которые можно запустить на небольшом кластере.

Я часто встречаю в интернете AI-скептиков, с разной степенью отрицания. Кто-то до сих пор считает LLM улучшенной версией Т9, кто-то аргументирует слабость современных LLM тем, что она не смогла решить специфическую задачу на каком-нибудь непопулярном фреймворке. Ну и ещё примерно миллион аргументов о том, что на самом деле современная индустрия LLM это огромный такой пузырь, который лопнет при любой возможности.

На мой взгляд, как, минимум, глупо отрицать тот факт, что генеративные модели в целом, и LLM в частности, упростили многие рутинные процессы. И я сейчас говорю не только о написании кода. Прогресс виден даже невооруженным глазом. За 2 года был пройден путь от примитивного интерфейса чата, который забывал, что ты ему писал 5 сообщений назад, до полноценных IDE, взаимодействие с которыми выполняется исключельно через поле ввода промпта и не требует взаимодействия с кодом (хоть и с нюансами).

Конечно, не всё так идеально. На текущий момент, вайбкодинг всё таки требует наличия определенного опыта и знаний. Я сомневаюсь, что неподготовленный человек с нулём опыта в программировании сможет скачать условный Cursor и сделать что-то работоспособное. Всё же, то, что предлагает LLM иногда далеко от корректного решения.

Имеются вопросы касаемо безопасности этих решений. Современные системы и так довольно дырявые, а если в продакшн пойдут полностью сгенерированные решения, боюсь, что новости об очередной утечке данных будут ежедневной рутиной.

Другой вопрос, что с развитием этого направления, скорее всего будет изменяться и набор компетенций, и процесс обучения. Многие разработчики уже довольно успешно используют языковые модели вместо Google и Stackoverflow. И на мой взгляд, без базовых умений работы с LLM в ближайшем будущем программистам не обойтись.

Обсудить написанное и накидать автору в панамку можно здесь.