Мне всегда было интересно, как AI-инструменты изменят трудовые будни программиста. Когда появился ChatGPT, я начал пробовать использовать его в работе, и он быстро стал для меня вспомогательным инструментом. Недавно вышло крупное обновление, и стала доступна новая функциональность, которая делает его ещё удобнее для разработчика. В этой статье я покажу, как использую обновленный ChatGPT-4 в решении ежедневных задач: работе с терминалом, анализе кода и создании новых фичей в приложении. Также попробую разобраться, сможет ли нейросеть стать надежным помощником в решении конфликтов с констрейнтами.  Для наглядности буду демонстрировать всё на открытом pet-проекте, чтобы вы видели работу новых функций GPT-4 в действии. Подготовка GPT-4 к работе Работа с терминалом Анализ модулей и исправление ui Разработка новой фичи  Исправление верстки 	 Рефлексия: возможности и ограничения GPT-4 в разработке	 Заключение Для начала покажу полезные функции GPT-4, которые облегчают работу с ним. Одна из ключевых — «Индивидуальные инструкции». Они позволяют задать дефолтный контекст для работы ChatGPT-4. При создании запросов вам не придётся каждый раз указывать одинаковые параметры. Это сократит объём промптов и улучшит точность ответов. В первом окне можно указать, например, следующие инструкции: «Меня интересует техническое решение задач, связанных с программированием на языке Swift. Ответы должны быть лаконичными и содержать краткое объяснение того или иного решения».  Во втором окне лучше уточнить формат ответов: «Мне нужны примеры реализации задач или объяснение предоставленных кусков кода. Тон должен быть дружественным. Ответ должен объяснять принятое решение. Обращайся ко мне как Марк. У ChatGPT может быть свое мнение по поводу различных тем». Не пренебрегайте разделом «Настройки и бета-версия». Он открывает ранний доступ к функциональности, которая находится в бета-тестировании и может оказаться крайне полезной в работе. В отличие от версии 3.5, четвёрка способна обрабатывать не более 40 запросов в течение трёх часов. Держим в голове эту информацию и бережно относимся к нашим доступным запросам.  Возможности GPT-4 я покажу на популярном открытом pet-проекте с GitHub, который использует API от newsapi.org: это приложение для iOS, которое отображает ленту новостей. Все дальнейшие примеры в этой статье будут основаны на нём: https://github.com/dkhamsing/news. ChatGPT-4 неплохо справляется с базовыми задачами в терминале. Для начала я попробовал установить с его помощью CocoaPods и подключить библиотеку SnapKit для оптимизации вёрстки UI-элементов. Попросил GPT расписать все шаги: Я использовал эту инструкцию и успешно добавил нужную библиотеку в проект. Теперь нужно убедиться, что все зависимости функционируют как положено и что с нашим проектом всё в порядке. Чат-бот сгенерировал правильные терминальные команды, чтобы убедиться в корректной работе всех зависимостей:  Теперь проект готов к дальнейшей разработке. В заключение хочу подчеркнуть, что это только вершина айсберга. Возможности GPT-4 по работе в терминале этим не ограничиваются. Для iOS-разработчика он также может быть полезным в вопросах установки и обновления Ruby, управления файлами, взаимодействия с REST API, мониторинга сетевых соединений, генерации и проверки SSL-сертификатов и для решения многих других задач. Давайте пойдем дальше и воспользуемся ранее подключенной нами функцией «Расширенный анализ данных». Поскольку проект не очень объёмный, выделим основные файлы приложения, загрузим их в GPT-4 и попросим его провести ревью кода. Для этого перейдём во вкладку Explore на главной странице. В появившемся списке выберем Data Analysis. Данный модуль позволит нам одновременно загрузить в GPT-4 не более 10 файлов для анализа кода, хранящегося в них. После загрузки и анализа данных мы получаем следующий ответ от GPT-4: Неплохо для начала. Мы сами ещё не изучали проект, но ChatGPT уже подсказывает основные моменты, на которые стоит обратить внимание.  Одно из самых верных замечаний — это необходимость разгрузить вью-контроллер и передать часть выполняемой логики во вью-модель. Я остался в том же чате и передал запрос GPT-4 с просьбой разгрузить контроллер, но искусственный интеллект путался в ответах и предоставлял нерабочие блоки кода.  Одно из возможных решений в такой ситуации — создание нового чата и передача в него точного контекста для решения задачи. Передадим GPT файлы NewsViewController и NewsViewModel и добавим конкретный запрос. После общения с чатом и отправки порядка 5-7 уточняющих или корректирующих запросов удалось добиться следующего решения: Мне удалось разгрузить NewsViewController, вынеся порядка 80-90 строк кода, отвечающих за логику обновления, в NewsViewModel. Сразу же можно подметить, что в решении реализация хранится просто в расширении к вью-модели, хотя можно было бы сделать, например, протокол, отвечающий за реализацию методов обновления таблицы и коллекции. Также методы setTableHandler и setCollectionHandler выглядят как братья-близнецы, и их можно было бы объединить в один вспомогательный метод.  Таких мелких замечаний к ChatGPT-4 можно предъявить много, но мы также можем передать эти запросы непосредственно в чат и добиться нужной нам реализации. Вопрос только в том, что будет быстрее и удобнее для конкретного разработчика: регулярно передавать уточняющий контекст в чат или реализовать всё самостоятельно.  С рефакторингом разобрались. Давайте попросим сделать интерфейс приложения чуть более дружественным для пользователя. При медленном интернете мы будем наблюдать пустые новостные ячейки.  Давайте попросим ChatGPT добавить спиннер загрузки, чтобы сообщить пользователю о том, что данные загружаются. Для этого мы передадим ему код ячейки, которая используется для различных новостных изданий. Далее идёт весь код используемой ячейки. После непродолжительного общения и добавления нового необходимого контекста мы получаем ответ: Далее GPT-4 предоставляет код, который позволяет добиться следующего эффекта: Выглядит неплохо, но спиннер скрывается некорректно после загрузки изображений. ChatGPT показывает себя хорошо в создании прямолинейных и простых решений, но если представить, что мы будем использовать его в крупном приложении, могут возникнуть проблемы с формулировкой запроса: придётся подробнее описывать задачу, при этом стараться не перегрузить GPT условиями. В любом случае лучше проверять все решения самостоятельно и доводить их до ума вручную. Попробую добавить новую полезную функцию в нашем новостном приложении, используя исключительно GPT-4. В приложении уже имеется большое количество статей, поэтому предлагаю создать отдельный экран для статей, которые понравились пользователю. Для контекста в этом запросе я предоставил код, который требует доработки и исправлений в соответствии с архитектурой, используемой в приложении. Без него я бы вряд ли смог добиться желаемого результата.  Важно предоставить только необходимый контекст. Я не загружал ChatGPT лишней информацией, а сфокусировался на тех участках кода, которые действительно требуют модификации. Я понимал, что мне понадобится создать новый экран и обработать его в SceneDelegate (поскольку приложение использует именно его, а не AppDelegate). К тому же потребуются стандартные методы для работы с tableView. По этой причине я включил в запрос код класса NewsTableHandler, который специализируется на работе со стандартными методами таблиц.  Для меня это одна из главных сложностей работы с ChatGPT: необходимо всегда предоставлять корректный и полный контекст для получения качественных ответов. На конкретный вопрос мы получили вполне конкретный ответ: В этот раз от GPT мы не получили финальной рабочей реализации. Я создал как минимум шесть уточняющих запросов с различными просьбами. Например, просил «создать FavoritesViewController и написать его реализацию», «предоставить рабочую реализацию для NewsTableHandler», «использовать contextMenuConfigurationForItemAt», а также исправить краш на определённой строке кода. В конечном итоге от GPT мне удалось получить базовую реализацию таббара и отдельного экрана для списка понравившихся новостей. Попробуем добавить функцию добавления новости в Favorites путём долгого тапа на соответствующей новостной ячейке, а также возможность удаления новости из этого списка. Кроме того, открывать страницы новостей будем не в браузере, а в отдельной webView. Я дал ChatGPT конкретные инструкции и буквально через четыре-пять запросов смог добиться от GPT нужной реализации функционала. Для достижения результата потребовалось изменить всего два файла: SceneDelegate и NewsTableHandler, а также создать один новый файл — FavoritesViewController. В целом, представленный код — хороший стартовый пункт для iOS-приложения, но есть области для улучшения. Основные замечания, которые сразу бросаются в глаза:  дублирование кода при инициализации контроллеров,  использование UserDefaults для хранения данных, что неэффективно для больших объёмов данных,   отсутствие разделения ответственностей в FavoritesViewController.  Кроме того, стоит улучшить обработку ошибок и использовать Auto Layout для создания более гибкого интерфейса. Все эти замечания мы можем далее передать чату для доработки кода и его улучшения.  Напрашивается вывод: ChatGPT без конкретного контекста предлагает нам решение «в лоб». Чтобы улучшить его, потребуется большее количество запросов и предоставление более полного контекста.  В самом начале статьи мы добавили библиотеку SnapKit в наш проект. Давайте попросим чат использовать эту библиотеку для улучшения нашего кода. Основной контроллер в проекте, NewsViewController, использует NSLayoutConstraint для вёрстки. Из-за этого запись получается довольно объёмной. SnapKit позволит оптимизировать данный аспект. Мы предоставим чату только код, связанный с констрейнтами, и попросим его отказаться от использования NSLayoutConstraint в пользу SnapKit. Также мы попросим сделать это максимально лаконично.  Сейчас вёрстка находится в двух методах — таблицы и коллекции — и выглядит следующим образом. P.S. Код, связанный с вёрсткой, выделен в красную рамку для удобства. В конечном счёте мы получаем довольно неплохой результат: констрейнты для таблицы и коллекции записаны в одну строчку соответственно. Нельзя назвать этот пример чем-то сложным или необычным, такая запись довольно распространена. Однако сам факт, что мы можем попросить GPT осуществить такую запись и получить её корректную реализацию, выглядит весьма заманчиво. Давайте усложним задачу и попросим переписать наши констрейнты для ячейки ApolloCell с более сложной логикой. Подход будет тем же самым: мы зададим контекст, связанный исключительно с методом, в котором осуществляется вёрстка, и оставим просьбу без изменений из предыдущего запроса. В конечном счёте чат принимает код в таком виде. Возвращает уже исправленный метод, использующий библиотеку SnapKit. Запись выглядит довольно лаконично и воспринимается гораздо проще, чем раньше. Плюсы, которые мы приобретаем — мы можем подвергнуть рефакторингу констрейнты, не особо погружаясь в их реализацию. Это возможно при одном условии: если сложность вёрстки не слишком высокая. Это ускоряет и упрощает работу. Тем не менее этого мало, и давайте протестируем GPT-4 на ещё более сложной задаче. В приложении используется ячейка AppleNewsCell, и всё с ней хорошо, кроме одного момента. При использовании данной ячейки в консоль Xcode прилетают ошибки каждый раз, когда ячейка переиспользуется в таблице. Хранение данных об ошибках в консоли — не слишком хорошая практика, поэтому я попросил ChatGPT избавиться от этих ошибок. Как и в прошлый раз, передал ему код, связанный с вёрсткой, а также текст ошибки из консоли.  Прошу GPT исправить эти ошибки и перевести вёрстку на добавленный фреймворк, и в итоге получаю код, который корректно отрисовывает ячейки, но выводит ошибки в консоль. После обработки кода чатом мы избавились от ошибки в консоли, но получили некорректное поведение ячейки уже в приложении. Увидев неожиданное поведение ячейки, всегда можно передать в чат дополнительный контекст и попросить его исправить ситуацию. В итоге мы получили следующий код: Теперь элементы в ячейке отображаются корректно. Единственное, для некоторых элементов применяются отступы: это отклонение от первоначального дизайна.  Самое важное в данной ситуации — мы смогли избавиться от ошибки в консоли и добиться корректного отображения ячейки. Дальше мы можем самостоятельно или с помощью GPT довести код до ума, сохраняя нужные отступы. Из этого можно сделать несколько заключений. С простой вёрсткой GPT справляется неплохо и помогает оптимизировать код, переводя его на нужный фреймворк. С задачами посложнее может понадобиться больше контекста, и придётся использовать большее количество запросов для достижения результата. Всегда можно поправить код вручную, и порой это быстрее, чем написание запросов.  Но, глядя на ответы GPT-4, в голову приходят мысли о том, что AI может стать новым инструментом разработчика. Было бы неплохо начать осваивать его уже сейчас и находить способы полезного взаимодействия с ним. ChatGPT-4 показывает хорошие результаты в работе с терминалом. Я больше не гуглю неизвестные ошибки, а напрямую обращаюсь в чат за помощью. Он воспринимает как «человеческие» вопросы, так и команды терминала, что упрощает и ускоряет работу.  Хотя ChatGPT и предлагает «решения в лоб» при реализации той или иной функциональности, такое поведение обусловлено контекстом, с которым работает GPT-4. Если мы декомпозируем задачу и будем предоставлять искусственному интеллекту небольшие и чётко сформулированные запросы с необходимыми для реализации задачи кусками кода, то шансы на успех сильно увеличатся. Также это помогает в решении багов или их диагностировании. GPT — удобный вспомогательный инструмент при вёрстке. Здесь широкое поле для экспериментов. Мы можем переписывать существующий код на разные фреймворки, пробовать различные комбинации в вёрстке и прочее. Все эти операции не отнимут много сил, так как ChatGPT сможет взять работу на себя. Все эти возможности открывают перед нами интересное направление для экспериментов с кодом. Порой решения GPT-4 удивляют и заставляют думать, что это какая-то магия. Но иногда они вынуждают тебя сидеть и кропотливо объяснять чату, что именно и в каком виде ты хочешь получить.  Если сравнивать персональные ощущения от работы с GPT-3.5 и GPT-4, то «четвёрка» гораздо быстрее и лучше улавливает контекст. Хотя главным отличием я бы всё-таки отметил возможности, связанные с заранее обозначенным дополнительным контекстом и более широким инструментарием «четвёрки». Этот аспект мы разбирали в главе «Подготовка GPT-4 к работе». В итоге выбор остаётся за конкретным программистом: открыть ли своё сердце AI или продолжать работать по старинке. В скором будущем, я думаю, нас ждёт большое количество статей, конференций и мнений работников IT о том, как они смогли интегрировать GPT в свой продукт или компанию, на что это в конечном счёте повлияло и какие кейсы максимально успешны. Всё это покажет лишь время. В данный момент GPT-4 остаётся некой «чёрной коробкой», которую продолжают изучать пользователи. Никаких инструкций и очевидных прикладных решений по использованию ChatGPT нет, но это не мешает энтузиастам изучать и делать самые смелые предположения о том, как лучше применить его в своей работе. В этой статье я поделился с вами наблюдениями по взаимодействию iOS-разработчика и GPT-4; надеюсь, вы нашли полезные идеи и для себя!  iOS Разработчик