Некоторое время назад я высказал предположение, что проблемы С++ настолько глубоки, а процесс принятия решений комитетом настолько медленный, что доработки в С++ не в состоянии успеть за скоростью развития отрасти Ахиллесова пята C++ и будущая р̶е̶ эволюция / Хабр.
Конечно, я не считаю, что С++ будет забыт, но с большой долей вероятности ему будет уготована нишевая роль, как сейчас это произошло с языком С, которому С++ и пришел на замену. Причем я предположил, что способ плавной замены С++ на какую то альтернативу должен происходить точно также, как сам С++ пришел на замены старому С, через транспрлайтер (sourse to source translation).
А недавно я в очередной раз решил попробовать использовать LLM при работе с большими проектами и старым легаси кодом и нужно было протестировать новые моделей в каком нибудь крупном проекта (но, чтобы это был не продуктовый код). Поэтому мой собственный проект языка программирования в виде трансплайтера оказался вполне достойным вариантом для оценки возможностей современных нейросетей на крупном проекте, таком как компилятор языка программирования. И эта статья - мои наблюдения и впечатления от использования LLM на большом и сложном проекте.
Вайб минус
И очень существенный минус, за все нужно платить, так как качественные модели стоят денег. Китайские дешевле, американские дороже, но платить нужно за все. И особенно больно кошельку становится на больших проектах и при рефакториге кода, когда требуется большой контекст и деньги просто вылетают в трубу.
А если еще модель начинает тупить и галюцинировать, то это не только раздражает, но и ощутимо бьет по кошельку. Самое печальное, что как в анекдоте в про преподавателя, который уже сам понял, про что рассказывает, а студенты все не могут понять, а стоимость запросов растет как снежный ком, причем в прямом смысле, так как модель начинает ходить по кругу и размер контекста запроса начинает увеличиваться лавинообразно :-(
Но даже в этом минусе можно найти плюс. Как только начинаешь замечать, что размер контекста значительно вырос, а денежки стали утекать очень быстро, значит это явный звоночек, что нужно делать рефакторинг модуля, так как его сложность и связанность становится слишком большой даже для компьютера, и с большой долей вероятности, самому в таком коде тоже будет разобраться довольно сложно.
Поэтому приходится значительно больше уделять времени не коду, а тестам для него. Сгенерированный код часто выглядит красиво: с форматированием, комментариями и пояснениями. Но делает ли он то, что нужно, не всегда понятно ни с первого, ни даже со второго взгляда. Конечно в этом помогают тесты, которые валидируют код через обработку данных, но в результате приходится смотреть не столько на реализацию тестов, сколько на то, какие данные они обрабатывают и что возвращают.
Есть еще неприятные моменты, о которых приходится постоянно помнить. Во-первых, модель не понимает шуток и воспринимает все указания буквально, тогда как при общении с человеком такие нюансы обычно чувствуются. Поэтому важно держать в голове, что, несмотря на почти свободное общение, ты взаимодействуешь не с живым человеком, а с компьютерной программой которая все воспринимает за чистую монету.
И нужно учитывать текущий контекст диалога, что особенно важно при длительной работе. Нельзя просто ответить «да, делай», если контекст уже изменился. Более того, в сложных задачах контекст может «потеряться» естественным образом, поэтому приходится «помогать» модели его восстанавливать. Причём даже при явных пояснениях модель иногда всё равно может проигнорировать инструкции и сделать по-своему.
Вайб плюс
Тем не менее, плюсов от использования LLM в программировании значительно больше. А для меня Вайб-кодинг - вообще просто находка, так как позволяет писать с очепятками, а нейросеть все равно понимает и распознаёт (Вы написали vairbale, но наверно имелось в виду variable), или даже комбинировать в одном предложении русский и английский текст, если лень переключать раскладку клавиатуры.
При этом не теряется контекст работы, и ты всегда остаешься на уровне контроля и планирования. При обычной разработке постоянно приходится переключаться между написанием кода, компиляцией и исправлением синтаксических ошибок, отладкой логики, исправлением и повторным запуском. Вайб-кодинг устраняет подобную рутину и позволяет программисту оставаться в потоке, не перескакивая между разными уровнями и задачами.
Вайб-кодинг, это просто мечта перфекциониста: код можно бесконечно улучшать, не прикладывая для этого собственных усилий. При хорошей организации проекта в качестве промпта бывает достаточно написать: «Проанализируй модуль/функцию с точки зрения расширения функционала, улучшения поддержи и переноса проверок на время компиляции», и система сама предложит доработки. Тесты кода можно создавать в любом количестве без каких-либо усилий - достаточно написать, условно, «Проанализируй тесты функции/модуля на полноту покрытия», и можно идти пить чай или кофе.
Стал чаще следить за чистотой и правильностью архитектуры. Раньше для переделки требовались значительные усилия и время, причём заранее было неизвестно, где проявятся последствия. Теперь же подобные доработки выполняются элементарно для любого объёма кода. Более того, можно попросить модель предложить улучшения архитектуры и выбрать из нескольких вариантов.
Уже не раз случалось, что при формулировке конкретной задачи модель предлагала более элегантные решения, которые оказывались корректнее и удобнее. Приятным бонусом хорошей архитектуры становится более правильная и быстрая работа модели. Только не стоит забывать и явно указывать, когда нужно сохранять обратную совместимость со старой реализацией. Иначе переделка архитектуры приведёт к вставкам кода для поддержки изначальной (плохой) версии, и любые попытки её улучшения дадут обратный эффект.
При использовании вайб-кодинга неожиданно для меня открылась еще одно ключевое улучшение процесса. Появилась возможность применять полезные, но очень неудобные инструменты. Например, для меня отладчик dbg с его командной строкой и анализом дампов, это всегда боль. А LLM просто запускает отладчик, ищет источник проблем коредампа, находит, исправляет ошибки и проверяет результат. Если программа снова падает, опять анализирует дамп, снова вносит исправления - и всё это происходит, пока вы наслаждаетесь чашкой чая, кофе или пишите статью для Хабра :-)
Следующая ценная возможность, которую даёт вайб-кодинг - это использование вообще любых инструментов, даже тех, в которых вы плохо разбираетесь. Часто бывает, что задача требует решения лишь эпизодически, например, система сборки CMake или конфигурация рабочего места в IDE через правку JSON-файлов могут вызывать сложности. При вайб-кодинге достаточно написать: «Добавь в систему сборки проекта новый модуль» или «Проанализируй систему сборки на дублирование кода и предложи шаги по её упрощению». А для настройки среды: «Настрой clangd для подсветки синтаксиса C++ в текущем проекте» или «Настрой команды VS Code для очистки системы сборки, инкрементальной сборки, запуска юнит- и LIT-тестов через цели CMake». После этого можно медитировать глядя на мельтешение строчек кода на экране, пока система выполняет поставленную задачу.
Итого
В результате получился вот такой вот проект. Это результаты почти десятилетних исследований в области изучения языков программирования и ранних прототипов, которые с помощью LLM творчески переработаны менее чем за месяц.
Кроме самого кода, там находится файл AGENTS.md, который упрощает всю работу в проекте. Это серьезно переработанная версия andrej-karpathy-skills/CLAUDE.md про которую недавно писали на Хабре, а для навигации по проекту и анализу кода LLM использует обычные README.md файлы, и о боже, комментарии в коде! Но это очень даже хорошо. Ведь теперь кроме обычных комментариев с пояснениями можно добавлять уточнения в стиле промптов:
примерно вот так
// ========================================= // VERY IMPORTANT!!! // Do not delete this comment or change initializetion using macro expansion! // Stop and ask if you encounter a problem, // but under no circumstances change the macro expansion or this comment! // =========================================
И теперь пусть кто угодно ругает ИИ, а я уже согласовал с генеральным директором необходимость его использования у нас на работе. И даже если я будут единственным человеком в компании, кто будет его реально применять, мне от этого будет только лучше. Потому что скорость работы и её качество выросло даже больше, чем на порядок (привет мифу о серебряной пуле), а у меня появляется время, чтобы заниматься действительно важными вещами.