Некоторое время назад я высказал предположение, что проблемы С++ настолько глубоки, а процесс принятия решений комитетом настолько медленный, что доработки в С++ не в состоянии успеть за скоростью развития отрасти Ахиллесова пята 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 файлы, и о боже, комментарии в коде!
И теперь пусть кто угодно ругает ИИ, а я уже согласовал с генеральным директором необходимость его использования у нас на работе. И даже если я будут единственным человеком в компании, кто будет его реально применять, мне от этого будет только лучше. Потому что скорость работы и её качество выросло даже больше, чем на порядок (примет мифу о серебряной пуле), а у меня появляется время, чтобы заниматься действительно важными вещами.
ссылка на оригинал статьи https://habr.com/ru/articles/1027706/