В современном мире разработки программного обеспечения искусственный интеллект всё активнее внедряется в процессы создания кода, помогая разработчикам ускорить работу и повысить качество конечного продукта. Тем не менее, вокруг возможностей искусственного интеллекта существует множество споров: от утверждений, что AI способен писать любой софт без ошибок, до мнений, что сгенерированный код часто бывает низкого качества и сложен для поддержки в долгосрочной перспективе. Чтобы разобраться в реальной эффективности AI при написании кода, был проведён эксперимент, в котором шесть различных AI-агентов боролись за звание лучшего в создании кода по одной и той же задаче. Целью было объективно сравнить их результаты на практике с помощью различных метрик качества кода и оценить их удобство для дальнейшего использования и развития. Задача, которая была поставлена перед всеми агентами, заключалась в разработке простого веб-приложения для личного финансового учёта.
Решение должно было позволять пользователям вести учёт отдельных транзакций, контролировать бюджеты по категориям, а также обеспечивать интерактивные графики и удобные фильтры для детального анализа финансовых данных. Задача была сознательно выбрана простой, чтобы все агенты могли справиться с ней в одной итерации, что позволило создать равные условия для сравнительного анализа. Шесть AI-агентов, участвовавших в эксперименте, представляли разные подходы и технологии. Среди них были браузерные агенты, CLI-инструменты и интеграции в IDE. Каждый из них имени соответствующий уникальный стиль генерации кода и архитектурные решения.
Среди участников были такие агенты как Loveable, Bolt, V0, Replit, Claude Code и Cursor. Все шесть агентов успешно сгенерировали рабочие решения, хотя у некоторых из них потребовалась небольшая корректировка во время процесса разработки. Браузерные агенты продемонстрировали высокую эффективность, реализовав заданные функции сразу за один проход. Агенты Cursor и Claude использовали более пошаговый подход, сначала формируя план реализации, после чего получали небольшие подсказки для устранения ошибок, таких как неправильно реализованное добавление новой транзакции. Что интересно, каждая команда AI разработала самобытную архитектуру проекта, отражающую их внутренние стратегии и предпочтения.
Браузерные агенты в основном использовали современные фронтенд-фреймворки с TypeScript и компонентным подходом. Loveable и Bolt сделали ставку на React/TypeScript с разной степенью структуризации: Loveable выстроил проект по функциональному принципу с большим числом мелких файлов, тогда как Bolt предпочёл более лаконичную и упрощённую структуру. V0 выбрал Next.js с маршрутизацией, что сделало его архитектуру наиболее сложной в сравнении с остальными. Replit использовал комбинированный подход с Python на бэкенде и JavaScript на фронтенде, что также выделяло этот агент среди прочих.
В противоположность этому Cursor и Claude Code применили более упрощённые архитектуры. Cursor сосредоточился на использовании ванильного JavaScript в одном файле приложения, что уменьшило количество модулей и упростило структуру. Claude пошёл ещё дальше, создав максимально минималистичный проект из одного файла HTML, JavaScript и CSS. Этот минимализм упрощал понимание кода, однако потенциально требовал значительной доработки в будущем для расширения функциональности. Анализ качества созданных кодов проходил с использованием нескольких объективных метрик.
В числе таких показателей были когнитивная и цикломатическая сложность — меры того, насколько сложно понимать и поддерживать код. Также применялась метрика Halstead Volume, отражающая сложность кода с точки зрения используемых операторов и операндов, и индекс поддерживаемости, который указывает на риск возникновения ошибок и удобство сопровождения. Дополнительно анализировались такие распространённые кодовые запахи, как избыточно длинные функции, дублирование кода и сложные условные конструкции. По уровню сложности всё же наблюдались значительные различия между агентами. Loveable и Replit отличались большим числом функций с высоким уровнем как цикломатической, так и когнитивной сложности.
Такие сложные участки кода усложняют понимание и увеличивают стоимость поддержки. V0 и Bolt были более сдержанны, имея всего по две функции с высокой сложностью, хотя у V0 некоторые отдельные функции имели весьма высокий показатель цикломатической сложности. Cursor выделялся большим числом сложных функций, но сами функции были менее тяжёлыми по сравнению с Loveable и Replit. Claude продемонстрировал хорошее качество, имея минимальное число сложных функций и более низкие максимальные показатели по этим метрикам. Совпадения наблюдались в сравнении поддерживаемости.
Большинство агентов получили высокий индекс поддерживаемости, указывающий на устойчивость к ошибкам и удобство к доработкам. Единственным отклонением можно выделить Loveable и V0, которые слегка отставали по этому параметру, отчасти из-за высокой сложности отдельных функций. Значительным образом отличалась также метрика Halstead Volume. Несмотря на то, что браузерные агенты в целом показывали более низкие средние показатели, некоторые функции в рамках проектов Replit и Loveable имели очень высокий Halstead Volume — в 2-3,5 раза превосходящий аналогичные показатели Bolt, V0, Claude и Cursor. Это указывало на избыточную сложность и потенциальные трудности сопровождения.
Что касается размера функций, Bolt и V0 оказались наиболее бережными, имея по две функции длиной более 50 строк, в то время как Loveable и Replit имели множество затяжных функций, которые в 5-9 раз превышали такой порог. Claude и Cursor заняли промежуточные позиции с 5 и 4 длинными функциями соответственно. Итогом эксперимента стало признание Bolt и Claude Code лидерами по большинству показателей качества. Bolt превзошёл конкурентов по количеству чистого и организованного кода, что делало его проекты хорошо масштабируемыми и удобными для поддержки. Claude Code выделялся минималистичным подходом, который хотя и требовал больее серьёзных доработок для полноценного роста, в итоге показал высокую сбалансированность между простотой и функциональностью.
Важно отметить, что ни один из шести AI-агентов не сгенерировал нерабочий или крайне низкокачественный код. Даже Loveable и Replit, которые временами казались излишне сложными и навороченными, создавали решения, от которых можно легко оттолкнуться для дальнейшего развития и масштабирования. Это опровергает распространённое мнение о том, что AI программируют исключительно неряшливо и непрактично. В заключение стоит отметить, что рассмотренный эксперимент основывался на сравнительно простой задаче. Для понимания реального влияния искусственного интеллекта на качество программных продуктов необходимы более масштабные тесты с ростом сложности и длинные циклы поддержки сгенерированных проектов.
Также будет интересно оценить, каким образом изначальное качество кода влияет на успех последующего развития продукта другими агентами или разработчиками. В ближайшем будущем предполагается проведение ещё ряда исследований в этом направлении, которые помогут лучше понять роль AI в современной разработке программного обеспечения и его способности создавать надёжный, поддерживаемый и качественный код.