Мне всегда было интересно, как AI-инструменты изменят трудовые будни программиста. Когда появился ChatGPT, я начал пробовать использовать его в работе, и он быстро стал для меня вспомогательным инструментом. Недавно вышло крупное обновление, и стала доступна новая функциональность, которая делает его ещё удобнее для разработчика.

В этой статье я покажу, как использую обновленный ChatGPT-4 в решении ежедневных задач: работе с терминалом, анализе кода и создании новых фичей в приложении. Также попробую разобраться, сможет ли нейросеть стать надежным помощником в решении конфликтов с констрейнтами. 

Для наглядности буду демонстрировать всё на открытом pet-проекте, чтобы вы видели работу новых функций GPT-4 в действии.

Подготовка ChatGPT-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 расписать все шаги:

Я использовал эту инструкцию и успешно добавил нужную библиотеку в проект. Теперь нужно убедиться, что все зависимости функционируют как положено и что с нашим проектом всё в порядке.

Чат-бот сгенерировал правильные терминальные команды, чтобы убедиться в корректной работе всех зависимостей: 

xcodebuild -workspace TheNews.xcworkspace -scheme TheNews -destination 'platform=iOS Simulator,name=iPhone 12' clean build, 

Теперь проект готов к дальнейшей разработке.

В заключение хочу подчеркнуть, что это только вершина айсберга. Возможности GPT-4 по работе в терминале этим не ограничиваются. Для iOS-разработчика он также может быть полезным в вопросах установки и обновления Ruby, управления файлами, взаимодействия с REST API, мониторинга сетевых соединений, генерации и проверки SSL-сертификатов и для решения многих других задач.

Анализ модулей и исправление ui

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

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

Мой опыт: возможности и ограничения GPT-4 в разработке

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; надеюсь, вы нашли полезные идеи и для себя!

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


  1. Andrey_Epifantsev
    23.11.2023 11:05
    +5

    1. Вы реально общались с ChatGPT на русском языке? Это не приводит к более низкому качеству ответов чем общение на английском?

    2. Я так понял, что часть задач ChatGPT решить не смог, а на часть потребовалось столько уточнений, что проще и быстрее было бы написать самому. Получилось ли в итоге по вашим ощущениям ускорение работы? И примерно во сколько раз?

    3. ChatGPT-4 стоит денег. И это количество денег пропорционально количеству данных загруженных в него и количеству данных полученных от него. Загрузка всего проекта в контекст может влететь в копеечку. Если не секрет, сколько денег ушло на описанное в статье общение с ChatGPT? Окупили ли эти деньги полученную экономию времени?


    1. sHaggY_caT
      23.11.2023 11:05
      +1

      1. если не использовать API, а только вебинтерфейс и ChatGPT plus подписку, то он бесплатный (но лимитирован количеством сообщений в час) - вы платите фиксированную абонентскую плату, см. скриншот:


      1. techTalesmith Автор
        23.11.2023 11:05

        Да, полезный скрин, спасибо!


    1. fettgesicht
      23.11.2023 11:05
      +2

      1. По моему опыту - приводит. Лучше спрашивать на английском


      1. techTalesmith Автор
        23.11.2023 11:05

        Да, тут скорее всего работают личные предпочтения, но порой можно и поэкспериментировать)


    1. techTalesmith Автор
      23.11.2023 11:05
      +1

      Приветствую!

      Относительно вопросов:

      1. Да, общался с чатом исключительно на русском языке. Порой он стремится даже на вопрос, заданный на русском, отвечать на английском. Если в индивидуальных инструкциях указать отвечать на русском языке, то все ответы будут на русском. Заметил, что если ответы чата не очень точные и не соответствуют ожиданиям, можно попробовать задать вопрос на английском, иногда это помогает. Что самое интересное, порой помогает и обратный подход.

      2. По моим ощущениям, в некоторых случаях GPT может помочь в исправлении конкретной, не слишком сложной проблемы. Если все проходит успешно, то эффективность решения задачи увеличивается в несколько раз. Однако, если задача более серьезная, то решение всё же зависит от конкретного разработчика и вполне возможен даже проигрыш по времени.

      3. Тут уже речь идет о подписке уровня Enterprise. У меня такой подписки нет, поэтому подсказать, какие там функции и насколько они эффективны, не могу. Что касается стоимости, стандартная подписка на GPT-4, по-моему, сейчас составляет примерно 25$ в месяц. Лично мне кажется, что опыт интересный и стоит своих денег. Хотя, наверное, каждый индивидуальный случай использования требует отдельной оценки.


  1. odilovoybek
    23.11.2023 11:05
    +1

    Знаете, если добавлять в конце запроса слова "максимально эффективный и быстрый", "соответствовать принципам X" и т.п., то качество сниппета получается на голову выше.


    1. techTalesmith Автор
      23.11.2023 11:05

      Круто, спасибо! Надо будет попробовать в следующий раз. Ещё можно попробовать указать это в индивидуальных инструкциях, чтобы не приходилось постоянно уточнять это в запросе.


  1. flyer2001
    23.11.2023 11:05
    +1

    Спасибо за статью! А как словами объяснять когда поехала верстка или когда надо сверстать новый экран. Chatgpt вроде умеет распознавать изображение. Игрались с этим?


    1. techTalesmith Автор
      23.11.2023 11:05
      +1

      Пожалуйста, и спасибо вам за то, что прочитали!

      Когда происходит сбой в верстке, лучше указывать сразу более подробный контекст: например, указать вьюху или ячейку, с которой возникла проблема, добавить логику, отвечающую за отрисовку, и ошибки, которые появляются в консоли (если такие есть). Загружать картинку не пробовал, но кажется, что данный подход лучше сочетается со Snapshot-тестами. Так как этот инструмент довольно распространён, возможно, именно в этом сочетании кроется ключ к успешному обнаружению и исправлению проблем с версткой.


  1. RaymanOne
    23.11.2023 11:05
    +1

    Тоже недавно писал на свифте с помощью GPT. Хорошо помог, но приходилось много додумывать и поправлять, пользуясь статьями по теме.


    1. techTalesmith Автор
      23.11.2023 11:05

      Круто, отличный опыт!