Привет, Хабр!
Периодически почитываю местные статьи про использование LLM в разработке, в комментариях обычно возникают дискуссии относительно эффективности такого подхода. Как я заметил, как правило и статьи, и уж тем более комментарии ограничены общими рассуждениями без конкретики, поэтому решил поделиться личным опытом по разработке мобильного приложения с помощью LLM, подкрепив публикацию исходниками, чтобы читатель мог более предметно оценить качество работы.
10 лет назад я начинал как разработчик на С++, спустя пару лет ввиду отсутствия других кандидатов руководство назначило меня PM. С тех пор руками я уже ничего не писал, только иногда поглядывал в код, который пишет команда — исключительно в целях углубления своего понимания внутренностей проекта. В июне этого года почувствовал накопившуюся усталость и, наверное, даже выгорание и решил сделать паузу в работе — уволился и устроил себе «мини‑пенсию» на несколько месяцев, только сейчас приступил к поиску работы. Ввиду большого количества свободного времени решил в качестве хобби попробовать написать собственное мобильное приложение — благо идея зрела давно и сформировалась достаточно быстро. Так как опыта мобильной разработки не было, решил воспользоваться LLM для генерации кода, заодно на собственном опыте проверить границы возможностей современных языковых моделей. Так как у меня уже был опыт взаимодействия с ChatGPT, я не долго думая купил подписку и начать творить (на момент начала моей деятельности уже вышла 5-я модель, с ней и работал).
Я думаю каждый замечал, что бывают дни, когда все получается на 10/10, ты полон энергии и энтузиазма, во всех сферах деятельности — работа, личная жизнь, спорт ты прям хорош и в конце дня чувствуешь полное удовлетворение. А бывают дни, когда все наоборот, за что бы ты ни взялся — все не получается, энергия на нуле, хочется просто как‑то дожить этот день, желательно спрятавшись от всех дел и задач. Чаще же бывают некие «средние» дни, когда все проходит не супер успешно, но и не ужасно. В попытках анализа этого феномена я искал какие‑либо внешние факторы, которые бы влияли на то, как пройдет день, но таковых не обнаружил. В итоге родилась идея вести грубо говоря дневник настроений, в котором каждый день по численной шкале отмечать как прошел день. Накопив сколько‑нибудь значимую статистику, можно повезти анализ и, например, заметить какую‑то периодичность или наоборот, заметить, что это некоторый случайный процесс без каких‑либо паттернов. То есть для меня это как некоторый инструмент для исследования и самоанализа. Понимаю, что для этого достаточно завести google‑таблицу, но по собственному опыту я понял, что надо прям хотеть на постоянке ее вести и очень легко забыть, забить и в скором времени бросить это занятие, но если бы было под рукой приложение — регулярно вносить данные было бы сильно проще.
Ввиду полного отсутствия понимания на каком языке писать, в какой среде разработки работать и как тестировать, я начал с запроса о выборе языка программирования, кратко описав общую идею приложения. ChatGPT предложил мне использовать Flutter, приведя какие‑то аргументы, в которые я, честно говоря, не особо погружался и можно сказать поверил вслепую. Затем я попросил как для пятиклассника пошагово описать алгоритм настройки среды разработки и средств отладки — мне была выдана очень простая и понятная инструкция по скачиванию и настройке Visual Studio Code и Android Studio. Без каких‑либо проблем я выполнил все шаги, создал первый простейший проект и «обкатал» полученные инструменты. Начало было положено и теперь я приступил уже к созданию своего приложения.
Мне не терпелось начать, поэтому по началу я не особо заморачивался с архитектурой, читаемостью и структурированностью кода: писал промты, получал код, переносил его в main.dart, запускал и радовался первым успехам — с самого начала ChatGPT выдавал вполне рабочий код, который компилировался, запускался и выполнял то, что я в принципе и ожидал. Самый базовый функционал, который у меня появился — просто ввод настроения, его сохранение и возможность просмотра в текстом виде введенных за все время данных. Тут проблем не было и я двигался дальше. Ниже можно ознакомиться с внешним видом окна ввода настроения и заодно посмотреть, по каким параметрам я оцениваю прошедший день.
Вводимые пользователем данные на тот момент сохранялись просто в оперативной памяти и по естественным причинам терялись при закрытии приложения и перезагрузки телефона. Я задался вопросом о том, какие варианты долгосрочного хранения можно реализовать и ChatGPT посоветовал мне рассмотреть два варианта: JSON и hive, приведя вот такие аргументы в пользу каждого:
Hive мне показался более разумным решением и ChatGPT оперативно и без проблем реализовал эту фичу. Затем я добавил окно настроек, приветственное окно, добавил всякие штуки тупа удаления и редактирования записей, блокирование ввода настроения больше 1 раза в сутки и так далее — приложение разрослось уже на 400+ строк кода. По мере разрастания кодой базы ChatGPT все больше допускал ошибок — забывал скобки, путал имена переменных, классов и методов — все больше времени уходило на исправление ошибок и отладку. Давно (если не сначала) напрашивалось сделать нормальную структура кода, растащив его по отдельным файлам. Эту задачу, естественно, я возложил на ChatGPT. Насколько эффективное решение он принял мне судить сложно, но вот результат:
В любом случае лично мне стало сильно удобнее + ChatGPT сам выдал мне готовые файлы исходя из того единственного main.dart, который у меня был. Также я решил перейти на так называемый проект: если до этого я все делал в одном чате, теперь я создал «проект», загрузив туда все файлы и настроив несколько чатов каждый под свое направление — получилась как бы мини‑команда, где у каждого своя зона ответственности, вот пример того, как я это реализовал:
Я продолжил наполнять приложение дополнительными фишками и заметил, что эта деятельность превратилась в каком‑то смысле в работу — времени уходит достаточно много, потому что добавив что‑то новое обязательно где‑то что‑то сломается. Несмотря на то, что каждый «член команды» видит все файлы проекта, он все равно допускает ошибки с именами, скобками и прочим. В общем и целом двигаться вперед можно, постепенно наращивая функционал, но это определенный труд — пусть тебе и не надо писать код, но необходимо в него вникать и достаточно осознанно вставлять новые куски кода, которые тебе выплевывает ChatGPT.
В какой‑то момент я решил добавить отправку ежедневных уведомлений‑напоминалок по времени, которое назначает пользователь. Спойлер — у меня так и не получилось это сделать. ChatGPT написал мне код нового сервиса notification_service.dart, я внедрил его в проект, но в процессе тестирования уведомления не приходили. В попытках решить проблему я начал мучать ChatGPT на предмет поиска решения и сделал отладочные кнопки, по нажатию на которые уведомление приходило моментально (вот это кстати заработало) или откладывалось на 1/5/10 минут (а это уже не работало). Перепробовав все его указания, я так и не добился результата. Тогда у меня достаточно сильно начала копиться злость, потому что я несколько дней напролет пробовал разные решения, а ChatGPT начал меня гонять по кругу, предлагая варианты, которые я уже пробовал. Я даже указывал ему на это, но он упорно предлагал мне одно и то же. Я полез самостоятельно изучать используемую библиотеку, читать форумы и гуглить проблему, но тоже не нашел решения. В конечном итоге я сдался и начал пилить другие фичи, решив вернуться к этому позже. Кстати, если вдруг кому‑то будет не лень посмотреть код с реализацией уведомлений — может подскажете что с ним не так (ссылка на гит в конце статьи).
На этом я пока и приостановился — с одной стороны есть разочарование, что важная на мой взгляд вещь по отправке уведомлений не работает, с другой стороны пока что я временно исчерпал идеи по дальнейшему наращиванию функционала. Определенные мысли, конечно, есть, но надо «дать им настояться».
Подводя некоторый промежуточный итог своей деятельности, могу оценить трудоемкость по написанию такого простенького приложения в ~15 человеко‑дней, общий объем кода, который сейчас есть ~1000 строк. Продуктивно это или нет — решайте сами, с точки зрения меня, как PM, сложилось впечатление, будто я работаю со средненьким джуном, который часто путается и ошибается, а где‑то и вовсе не способен сделать достаточно простую, как мне кажется, фичу по отправке запланированных ежедневных уведомлений. Анонсированный в начале статьи код приложения можете посмотреть тут.
P.S. Я знаю, что применяемый мной метод написания кода «отсталый», сейчас есть среды разработки с уже встроенным агентом на базе LLM, но честно говоря не думаю, что с точки зрения получения конечного результата в виде кода есть принципиальная разница. В каком‑то смысле мой «ручной» вариант мне кажется чем‑то даже лучше, потому что так я хоть немного, но вникаю в код. Если бы мне сразу выплевывали код в среде разработки думаю я бы погружался в него сильно‑сильно меньше.