Поработал несколько недель в Cursor с моделями gpt
и claude
.
С ним можно решать рабочие задачи на больших проектах! С серьёзными оговорками, но можно.
Для модели через UI набивается контекст из кусков кода большой кодовой базы, к которому могут автоматом цепляться также промты-подсказки к этим кускам. Для текущей задачи набрасывается из частей контекст, дальше поиском по кодовой базе он расширяется по необходимости. И происходит такая же магия, как и с диалогами с ИИ — внезапно всё начинает работать так, как будто ИИ понимает твой код.
Что может#
Насчёт того, какие задачи может решать ИИ. Формально, если декомпозировать до уровня “впиши в исходник такую строку” — любые, так что дискуссия на тему “решает ли задачу xxx или нет” — спекулятивная. Можем пробовать описать задачу на высоком уровне. Если получилось — отлично, если нет, просим сделать что-то более простое. Если не получилось — еще более простое. Можно пробовать примерно такие:
- “вот тз, составь план действий и выполни задачу по нему” (тут копится постепенно массив общих уточняющих промтов, которые можно шарить между разными промтами)
- “посмотри, как реализован похожий функционал в таком-то классе, собери дополнительные данные по проекту, составь план того, что собираешься делать”
- “тут в твоём коде возникнет/возникает ошибка компиляции/выполнения из-за того, что ты забыл. Учти замечания, собери информацию о том, как можно решить проблему и попробуй решить”
- “добавь функцию, выполняющие такие шаги” (на уровне - “впиши вот сюда обхода контейнера, и для каждого элемента вызови функцию, не забудь учесть такие-то моменты”)
- “я добавил код, который правильно решает описанную задачу, посмотри и проверь”
(хотя иногда и это не помогает)
Качество#
В общем, пока, ИИ выдаёт достаточно посредственный код на не особо сложных задачах. Но по сути он уже продан бизнесу.
Во-первых, он пишется и переписывается очень быстро, менеджеры уже потирают руки, предвкушая как будут заявлять об увеличении KPI и предлагать теперь писать программы без программистов. Если без сарказма — то действительно достаточно быстро можно проверить, не решится ли задача одним промтом с нескольких попыток.
Во-вторых, хаслеры компаний, занимающихся нейронками продали идею, что качество будет расти со временем и уже вот-вот станет как у топовых программистов. Пока оно сомнительное, но и действительно серьёзно растёт, если сравнивать соседние поколения моделей.
Но чтобы собрать конвейер без участия людей, нужно, чтобы процесс решения всё-таки надёжно сходился к решению, а не бесконечным скачкам вокруг для задач, который не решились сходу — для этого будто бы всё еще нужен новый Генри Форд, а не управляющие роем ИИ вайб-кодеры.
Остаётся вопрос цены — кто-то будет пользоваться моделями похуже и подешевле и с ограничениями, кто-то — новейшими и безлимитными, но пользоваться будут все.
Писать и помогать исправлять сложный код пока всё еще не получается. На олимпиадных задачах последний раз проверял на Advent of Code (полгода назад). Граница была достаточно чёткая — решает первую половину задач (с подсказками и итерациями, ну и иногда я ему скармливал часть решения и просил дописать), вторую не решает (в advent of code первая половина как раз простая “для всех”, вторая более сложная, для олимпиадников). Алгоритмы вычислительной геометрии для 3d проверял недавно, тоже не может реализовать без ошибок.
- Рандомные мысли про функциональные языки программирования — про эксперименты с Advent of Code на F#, репа. До 12.1 решал с ИИ, 12.2 и 13-15 ИИ не осилил, дальше скорее всего бы тоже.
- Geogebra, Python и GJK — GJK в 3D ни написать правильно, ни исправить написанное ни одной моделью не смог, пришлось вручную
Также не удаётся писать поддерживаемый код. ИИ бесстрашно скопирует с небольшими отличиями огромные куски из кодовой базы, не особо заметит какие-то маркеры, которые живой программист распознает как необходимые костыли (еще и выбросит эти участки без предупреждения как ненужные на его взгляд), и не задумается о переделке кода или рефакторинге, вместо продолжения расширения. И плевать ему на промты с объяснениями этих идей.
Интересно будет посмотреть на следующие поколения.
Создание болванок#
Плохо получается попросить сделать заготовку кода, который затем дописать руками. Если повезет, то переделывать нужно будет около половины нагенеренного. Заставить улучшить заготовку сложно (можно с большим количеством хитростей и детальным описанием текстом, но пока быстрее руками дописать). Это по опыту с заготовками в реальной кодовой базе игры, а также по паре отзывов других программистов на их проектах вайб-кодерские фокусы типа “я нарисовал скриншот, и ии написал мне по нему целое приложение” не считаются, там нет никаких требований к этой заготовке.
Чтение кода#
ИИ меняет процесс чтения кода, продвинутый поиск по кодовой базе — меняется формат не только написания, но и чтения кода. Причём этот формат удобнее всего что я видел. Фактически окно диалога с ИИ — самый продвинутый интерфейс поиска. И не отравляет интерфейс множеством новых элементов, как решарпер или подобные инструменты, и открыт к расширению как вывода (у ИИ есть доступ к командной строке, ну и всякие средства визуализации vs code), так и ввода (может читать код, доки, логи гита и описание из системы задач)
Из удобного — можно попросить построить mermaid-диаграммы
разных типов (которую можно в том числе отобразить внешним рендером)
(пример sequence diagram процесса сложной логики в коде, передача управления между компонентами)
Это сильно ускоряет адаптацию в новой большой кодовой базе, или какой-либо её части. Ну и в общем, меняет то, как читаешь свой и чужой код.
Можно также скормить код и попросить привести альтернативные алгоритмы или подходы. Иногда ИИ предлагает advanced алгоритмы за пределами стандартных книг и первых 10 страниц гугла, до которых добраться можно, только если давно и углубленно ковыряешься в предметной области. Даже если ИИ не всегда сам способен реализовать описанную идею, расширяет возможности по дальнейшему поиску информации. Можно относиться к этому так: ИИ хоть не является экспертом, но читал всех экспертов и помнит об этом.
Статический анализ#
Еще один способ проверить код на ошибки от опечаток/невнимательности (+/-1, перепутанные xyzw в формулах, пост/пред-инкремент, </<=, какие-нибудь неучтенные нетривиальные приведения типов языка), или проверить на отсутствующие проверки корректности. С этим средне справляются статические анализаторы, ии тут может быть местами лучше (хотя и false positive тоже больше, но даже с учётом этого цена каждой такой опечатки высока, и хорошо, если есть дополнительное средство её отловить).
Ну и если код пишет ИИ — вероятность именно опечаток сильно снижается. Хотя у него могут быть свои типы граблей, из-за которых он может допускать ошибки, это, кажется, один из новых практических навыков, писать AI-friendly код (кое-где в daScript
меняли синтаксис ради того, чтобы то, как пишет ИИ, стало правильным).
Объяснение дизассемблера#
Можно попросить помочь разобрать низкоуровневый код (например, дизассемблированный C++ код). Вполне себе распознаёт простые паттерны (может и более сложные, не доводилось в последнее время особенно залезать в это). Тестировал на простых примерах из godbolt-а и когда-то давно на NES 6502 ассемблере, его тоже понимает
- Формат сжатия уровней в Jurassic Park [NES] - тут использовал для разбора трейслогов из эмулятора
Малознакомые языки#
Можно быстрее начать писать код на малознакомом языке или фреймворке с использованием его идиом и практик, а не “как на привычном языке”.
К примеру, для C++ программиста, когда нужно написать что-то на js, sql, cmake, bash, или функциональном языке. Причем даже зачастую на малознакомом для ии языке он тоже может нормально писать, какие-нибудь там dascript ecs или quirell functional reactive gui.
Или если пытаешься собрать большой open-source проект на какой-нибудь системе сборки (почему-то именно системы сборки особенно плохи в диагностических сообщениях).
Я не знаю, насколько быстро учишься на таких подсказках от ии, но в любом случае, наличие примеров кода или способов решить проблемы лишним не будет.
Помощь с малопонятной документацией#
- ИИ и математика — объяснить что-то, собрать детали или перефразировать иногда помогает лучше разобраться в проблеме
По ссылке я писал про математические формулы, но касается также и просто кода. Вероятнее всего, даже для, плохого кода (который часто встречается в реальных проектах с долгим временем жизни), при большом его количестве размазанном по кодовой базе, можно собрать полезную информацию, не изучая его весь, и с этим вполне может справиться ИИ. В итоге — меньше времени тратится на то, чтобы искать и расспрашивать авторов о причинах, или пробовать выполнять код (вообще, конечно, если для понимания кода нужно применять отладчик, хоть бряки, хоть логи — это уже тревожный симптом).
Обработка списков#
Как-то подозрительно плохо получаются запросы вроде “собери мне список из всех элементов, которые удовлетворяют предикату”. ИИ не стесняется что-то выбрасывать, пропускать или выдумывать. Также сложно сказать “возьму из файл список на 50 элементов и для каждого сделай что-то”. Проще руками скармливать по 4-5 элементов из этого списка, чтобы убедиться, что всё элементы будут обработаны. Это наверное легко как раз каким-нибудь пайплайном пофиксить, типа 1 экземпляр генерит список задач, другой раскидывает на кусочки.
Ну или подъедут диффузные сетки, если там как с картинками будет, то можно инструменты более интересные собирать, врываясь с ноги в процесс рассуждения, а не примитивным промт-хакингом.
Ссылки#
https://probablydance.com/2024/04/09/how-i-use-llms-to-program/ - тоже практика использования