Привет, Хабр!

Периодически почитываю местные статьи про использование 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, но честно говоря не думаю, что с точки зрения получения конечного результата в виде кода есть принципиальная разница. В каком‑то смысле мой «ручной» вариант мне кажется чем‑то даже лучше, потому что так я хоть немного, но вникаю в код. Если бы мне сразу выплевывали код в среде разработки думаю я бы погружался в него сильно‑сильно меньше.

Комментарии (13)


  1. Kliperts
    15.10.2025 05:59

    Пока LLM очень ограничена, как маленький ребёнок, который делает в жизни первые шаги. Полностью довериться ей нельзя, постоянно нужен глаз да глаз. И чаще вреда от нее больше, чем пользы. Но все же, как помощник, подсказчик, уже здорово может облегчить работу над проектом. Не более, все же самому нужно писать код, выстраивать логику и разбираться что и в каком виде необходимо для достижения поставленных целей и задач.


  1. daager
    15.10.2025 05:59

    Вам нужно было попробовать уже Codex. У него лучше с контекстом т.к. доступ ко всему коду. Тем более входит в подписку. Я через Codex решаю задачи, когда нужно, чтобы он контекст лучше понимал.

    Иногда мне нужно реализовывать экраны не сложные с точки зрения написания кода, но муторные т.к. нужно отовсюду что-то достать, похоже обработать, похоже вывести и мне проще дать эту задачу Codex и получить её минут через 10.

    Сам я пока могу кодить части с которыми ИИ в теории тоже мог бы справиться, но я дольше буду максимально подробно описывать промпт и потом исправлять. Для меня ИИ это джун и интерактивная документация (т.к. на работе на просьбу о помощнике мне отказали), которому я даю джуновские задачи, которые сложно интерпретировать и реализовать неверно.

    Как раз недавно нужно было сделать экран, грубо говоря вывести списки пяти разных моделей и вывести в определенном виде. Я просто написал создай такой-то экран, возьми 5 моделей, выведи с заголовками, примеры использования и методов можешь найти в таком-то файле, сами модели лежат вот там. И он справился, еще и учёл как обычно списки и экран компоную.


  1. dron88
    15.10.2025 05:59

    В работе с LLM тоже есть стажёры, джуны, мидлы, сеньоры и т.д. Выстажор, и. О что вы делали две недели, опытный мидл LLMоператор и немного в теме программирования сделает за 2-3 часа. Здесь нужно быть в теме, использовать ide с интегрированным Codex, Claude или Gemini code. Включить режим план мода, прописать идею, оценить план от AI и наслаждаться реализацией. А потом Некст уровень, агенты и субагенты, mcp и.д.


  1. 45stvol
    15.10.2025 05:59

    Gemini cli - работы на 30 минут.


    1. Nik_Otin
      15.10.2025 05:59

      Попробуйте.


  1. S1908
    15.10.2025 05:59

    А почему не курсор?


  1. yaiko
    15.10.2025 05:59

    Тоже для себя делала скрипт через нейросеть. Если посидеть подумать, написать все условия и ограничения, то в целом результат выходит неплохой. А вот для крупных проектов уже вряд ли, ощущение, что часть данных которые нейросеть сама же и выдала, она же и забыла


  1. Skukler
    15.10.2025 05:59

    Я соглашусь с комментариями выше, это действительно не сложная задача для текущий ai ide, может на час-полтора

    Но все равно желательно хотя бы немного понимать, что вы делаете. Чтобы успешно реализовать уведомления, нужно понять вообще как они работают. Есть локальные, есть которые тригерит бекенд и с ними по разному работать. И тут вопрос что именно пытался сделать жпт


  1. SpiritCow
    15.10.2025 05:59

    Текущие модели не очень хорошо пишут код на dart. Структуру проекта делают плюс минус норм, но виджеты очень плохие получаются. Видимо из-за того, что по Дарту не так много учебной выборки в сравнении с тем же js


  1. Nik_Otin
    15.10.2025 05:59

    У меня тоже не получается переложить на ИИ написание даже небольших программ. Какие-то процедуры и функции - нормально, а программу 400+ кода уже так косячит, что больше времени на исправление ошибок уходит. Проблема в том, что генеративный ИИ не может понимать, он на основе входных данных генерирует наиболее подходящие выходные. И чем больше входных данных, тем больше вариантов для выходных и меньше шансов свести связный ответ, в результате чего появляются галлюцинации. Все кто тут надувая щёки рассказывает, что это вы не умеете пользоваться ИИ, на самом деле сами не пользуются вообще. Просто есть люди, которым важно что бы о них думали как о супер-пупер спецах, но на деле это спецы пускать пыль в глаза не имея за душой ничего, кроме самомнения. Всё-бы ничего, но из-за таких вот "профи" начинаешь на ИИ возлагать надежды большие, чем ИИ действительно может. Это как робот-пылесос не заменит уборку обычным пылесосом, чтобы там не говорили и показывали обзорщики. Но после просмотра этих обзоров думается "ну вот этот все будет убирать". Не будет.


  1. AIKALININA
    15.10.2025 05:59

    Фразв "Мне стало сильно удобнее" ; сильно‑сильно меньше - вызываю предположение, что автором тоже является ChatGPT .


  1. Sellter
    15.10.2025 05:59

    Я вот вообще в коде полный 0. Но как-то по работе понадобилась программа по штрихкодированию. Пользовался уже готовой, но мне все время что-то не хватало. И решил написать сам, через chatgpt. В итоге я перешел на copilot github и моя программа переросла в полноценную систему учёта с остатками и отчетами. Именну такую, которая мне и нужна. В итоге ещё и web приложение компаньон написал со всеми синхронизациями. Главное, правильно ставить задачи ИИ. И он всё сделает так как надо


  1. Zabalkanskiy
    15.10.2025 05:59

    Отложенные уведомления во флаттер в некоторых библиотеках работают только в релизных версиях, в дебаге могут не работать. Возможно вы с этим столкнулись при разработке.