В начале осени я поставил себе небольшую задачу - изучить, как правильно работать с Cursor и собрать продакшен реди приложение для автоматизации своей рутины. Мой краткий отзыв на курсы по Cursor вы можете прочитать в заметке по ссылке, а эта статья будет посвящена практической части.
Я решил собрать TO_DO органайзер с триггерной логикой по таймеру для MacOS на SwiftUI - т.е. десктоп приложение на нативном языке для Макоси. Работу я решил вести в двух IDE - cursor для написания кода и XCODE для отладки и дебаггинга приложения.
Вся логика приложения уместилась в 32 тест-кейсах того, как оно должно работать. Т.е. 3 основных экрана, контекстное меню с командами и хоткеями, страница об авторе и внутренние триггеры бизнес-логики по таймерам.
Как вы знаете ИИ очень хорошо справляются с проблемой "белого листа", когда вам нужно что-то начать делать, но вы при этом не очень хорошо знаете фреймворк, который для этого используете.
В классической схеме вы можете:
Открыть на Youtube Fast Track видер на пару часов и повторяя его, построить базовый скелетон приложения.
Стянуть какой-то скелетон из гитхаба и запустить его, а потом вникать, что он делает и как оно работает.
Пройти какой-то туториал из документации фреймворка.
Тут же я написал небольшой промтп в стиле: "Создай базовый экран SwiftUI приложения, где я могу добавлять задачи и выводить их в список", и я получил много кода, который помимо логики приложения, имел саму обвязку фреймворка.
После нескольких крашей и скармливания ошибок, оно все исправило, и я смог запустить приложение, которое имело базовый скелетон для моего будущего приложения.
Как итог: тут экономия времени получилась какая-то колоссальная. Хотя я и потерял сильно много в понимании, того как работает этот фреймворк.
Я решил пойти максимально стартаперским путем, я сфотографировал кружку, которая стояла на столе и попросил cursor применить цвета с изображения для создания базового дизайна. И на мое удивление, получилось чертовски здорово. Вот это прямо какая-то магия.
Однако, уже при просьбе сделать приложение в стиле Liquid Glass, я столкнулся с тем, что оно нифига нормально не делает и тупит. В итоге, спустя 3 часа, я плюнул на попытке ИИ сделать, что мне нужно и уже в ручном режиме прописал все материалы и стили приложения.
Как итог: тут получилась интересная ситуация, что с одной стороны - оно сделала большую работу по созданию дизайн-системы и натягивании её на приложение, а вот уже точечные правки оно не вывезло и я перешел в ручной режим.
Я описал механизм по которому задачи в зависимости от времени создания и времени обновления должны двигаться по флоу и таймерам. Все это сделал в стиле классических тест-кейсов по шагам.
Я получил код, который в целом был похож на то, что я хочу, но уже на этапе тестирования тест-кейсов я выявил куча проблем. Которые в режиме дебага начал штука за штукой править.
Причем общие формулировки не работали, нужно было опускаться на уровень кода и конкретно говорить, что надо и как это надо сделать. Т.е. такой режим, когда я полностью описываю, задачи к привязки к коду, и уже ИИ система это воплощало в жизнь.
Как итог: мне не понравилось то, как я работал с этой штукой, ибо я стал таким тимлидом-мануал QA, который проверяет ручками код нерадивого разработчика, а потом описывает, что же нужно сделать. Получает код на повторное ревью и все по новой. Но все же я получил рабочий код.
После того, как я получил приложение, которое в целом делало то, что мне нужно, выглядело, как мне примерно нужно, я решил добавить к проекту Rules хорошей архитектуры и чистого кода, а так же линтер для Swift (swiftlint).
И оно расфигачило мне все приложение и поломало бизнес-логику. Мне понадобилось примерно 25 запросов, чтобы исправить все ошибки линтера и сделать код снова работающим, и еще пару часов, чтобы по тест-кейсам восстановить бизнес-логику приложения.
Я понимаю, что я допустил грубую ошибку и не прикрутил их с самого начала, тогда бы ИИшка писала чистый код с самого начала. Но вот этот момент с "делать рефакторинг с ИИ - это просто", нифига оказался не просто.
Как итог: с самого начала душите ИИшку правилами и заставляйте её прогонять линтеры самостоятельно, ибо потом оно может все поломать и вы потратите много времени, чтобы все исправить и восстановить оригинальное поведение.
Я попросил систему добавить в мой проект обычные и UI тесты для приложения. И оно достаточно бодро их создало. Однако, уже при оценке тестов я пришел к выводу, что оно проверяет все не так, как я хотел бы их проверять.
Условно проверялся текущий стейт, а ни бизнес-логика приложения с учетом ожидаемого поведения (flow-диаграмма). Но нужно отметить, что когда я стал закидывать тест-кейсы, оно по ним построило неплохо тесты.
В итоге: волшебной кнопки, что напиши все тесты - не получается. Но если вы потратите некоторое время на тест-дизайн и отдадите тест-кейсы по шагам, оно их воспроизводит - причем бодро.
Тут меня позабавило, что для того, чтобы подготовить папку с иконками разных форматов, ИИшка получив от меня оригинальное изображение, написала здоровенный скрипт на Python, а потом попросило меня исполнить этот скрипт локально на компе, а после чего удалила этот скрипт и временную папку, а результат положила в нужную мне папку. Результат меня устроил.
А вот с иконками контекстного меню ИИшка запуталась, начала подгружать различные пакеты, которые не подходили. В итоге спустя 10 запросов, я попросил Grok сказать, как надо, закинул этот ответ в cursor и ИИшка уже отдала мне работающий вариант.
После того, как я удовлетворился тем, как выглядит и работает приложение, я запросил ИИшку составить список того, что мне еще нужно, чтобы выложить приложение в виде файла и опубликовать в App Store.
В итоге, я получил скрипты билдеры под разные системы, файл политики конфиденциальности, экран обратной связи и прочие штуки по мелочи.
И как итог, спустя 15 дней работы, я получил продакшен реди приложение под MacOS!
1) Мне понравилось, как ИИшка делает базовый скелетон, который решает проблемы белого листа и позволяет начать процесс разработки гораздо быстрее, чем классическим способом.
2) Мне понравилось, как ИИшка справилась с базовым дизайном, вот при работе с точечными изменениями - оно входило в ступор, и не могло сделать то, что я хотел. И мне приходилось уже тыкать её носом.
3) Бизнес логику оно не вывезло без прямых команд того, что нужно делать и как работать с сущностями. Возможно стоит снижать свои ожидания и двигаться с бизнес-логикой маленькими шагами, а не ожидать получения всей таски после пары промтов.
4) В целом мне понравилось, как оно справилось с код-стайлом и правилами чистого кода и правильной архитектуры, хотя оно и поломало все приложение. Я ожидаю, что если в следующем приложение прикрутить эти правила с самого начала - оно изначально будет писать нужный код;
5) С тестами система снимает ручную работу, но тест-дизайн и необходимость тех или иных тестов - все же остается на стороне разработчика. Тут оно само не вывозит.
6) Сопутствующая обвязка - я думаю, оно справилось.
7) Что мне не понравилось больше всего - я объективно хуже знаю проект и не так хорошо в нем ориентируюсь, а значит большая часть работы скатывается к такому manual QA по тест-кейсам, чтобы убедиться, что приложение работает.
8) Мне не понравилось, как ИИшка расфигачивает приложение, после любых каких-то существенных правок, что потом либо откатывать и двигаться маленькими шагами, либо потом его править.
Как итог: я не думаю, что человек без знания программирования сможет сделать продакшен-реди приложение, просто накидывая промты в ИИ, ибо очень много мест, где нужно спускаться на уровень кода и точечно вносить правки. Однако, это хороший инструмент, чтобы оставаться на уровни лида/архитектора, который спускает постановки вниз "рукам" и валидирует результат.
Что касается экономии времени - спорный момент, и скорее нет, чем да. Поэтому расслабляем булки, программистов ИИ пока не заменит, но как инструмент - штука интересная.
Источник


