Как и многие в последние месяцы я был очень заинтригован новой версией chatGPT 4 и ее возможностями в области программирования. Бесконечные видео и статьи о программировании простых игр и программ давали очень оптимистичные результаты, но не давали однозначного ответа на вопрос - может ли чат GPT программировать код для продакшена и заменить собой часть программистов? Для этого необходимо было найти реальную задачу, которая бы позволила проверить GPT в менее тепличных условиях, а конкретно меня интересовала возможность его работы с объемным кодом. Из-за угрозы утечки конфиденциальных данных в настоящий момент не представляется возможным использование его в работе. Поэтому я решил, что в настоящий момент самым правильным будет применить чат GPT для опенсорс проектов.

Итак, условия нашей задачи:

У меня есть небольшой проект анимированных кнопок для iOS написанный мной 8 лет назад на Objective C. Это достаточно простой код, который содержит очень подробное описание анимаций разных слоев кнопки. Всего код состоит из 500 строчек кода.

Пример кода:

- (NSArray *)fromMenuToCrossAnimationValues:(CALayer *)line
                                    reverse:(BOOL)reverse
{
    NSMutableArray *values = [NSMutableArray array];
    CGFloat lineMult = line == _topLayer ? 1.0 : -1.0;
    CGFloat yTransform = _middleLayer.position.y-line.position.y;
    
    CATransform3D transform = CATransform3DIdentity;
    [values addObject:[NSValue valueWithCATransform3D:transform]];
    transform = CATransform3DTranslate(transform, 0, yTransform, 0.0);
    [values addObject:[NSValue valueWithCATransform3D:transform]];
    
    transform = CATransform3DRotate(transform, M_PI_4*lineMult, 0.0, 0.0, 1.0);
    [values addObject:[NSValue valueWithCATransform3D:transform]];
    if (reverse) {
        values = [[[values reverseObjectEnumerator] allObjects] mutableCopy];
    }
    return values;
}

Стоит отметить, что я не пишу под iOS уже больше 5 лет. Целью нашего эксперимента будет — переписать код полностью на Swift, поддержать SwiftUI и SwiftPackage (с этими вещами я не знаком).

Первый день

Для начала я спросил его, сможет ли он cконвертировать objective-c в swift.

Me: Do you know objective c language? Can you convert some code on objective c to swift?

Answer: Yes, I'm familiar with Objective-C, a programming language often used for iOS and macOS development, as well as Swift, Apple's modern programming language for the same platforms. While I cannot directly overwrite code as an AI, I can help you understand how to convert Objective-C code into Swift code.

Дальше надо было понять, каким способом отправлять код в ChatGPT так как, даже моя небольшая библиотека не помещается в лимит промпта (2048 символов). Поэтому я решил попробовать такой подход:

Me: I will send you objective c code by parts. Please send me back an example of rewriting it on swift when i tell you - i finished.

Answer: Sure, please go ahead and send the Objective-C code in parts. Once you tell me you've finished, I will help you convert it into Swift code. Me: Chunk of code Answer: Chunk of code

ChatGPT стал транслировать код сразу, по мере его отправки, что привело к ошибкам в новом коде, из-за отсутствия полного контекста. В результате я принял решение, посылать код минимальными функциональными частями. Например: один метод, объявление структуры. Это не так удобно, но все равно лучше, чем ничего.

После проверки базовой гипотезы можно приняться за создание проекта с нуля.

Me: How to create new swift library project of ios ui component with Package.swift and example application for tests?

Answer: Creating a new Swift library project for an iOS UI component with a Package.swift file and an example application for testing involves a few more steps compared to a regular Swift package. Follow these steps:

...

Предложенный им алгоритм действий содержал следующие ошибки:

  • Просил делать лишние шаги. Это показывает, что с простыми вещами чат справляется хорошо, но если нужна более сложная конфигурация, то он теряется.

  • Не смог решить проблему с подключением локального пакета в xcode. Хотя решение гуглится за 30 секунд.

  • Код который он сгенерировал для библиотеки компонентов не содержал в себе паблик сигнатуру для класса кнопки. Из-за чего код тестового экрана не компилировался.

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

Таким образом на все про все ушло около 2-х часов.

Второй день

Во второй день я(зачеркнуто ChatGPT) приступил к непосредственной конвертации кода. Всего у меня ушло около 20-ти запросов на отправку всего кода библиотеки в ChatGPT. Занятие это весьма нудное и затяжное, требующее при этом определенного внимания, чтобы что-то не пропустить.

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

Допускает глупые ошибки:

[self.layer addSublayer:layer];

был транслирован в

layer.addSublayer(layer)

Этот код приводит к крашу в рантайме из-за бесконечного цикла при добавлении слоя в самого себя.

Из-за большого количества запросов, лимит в 25 сообщений был быстро исчерпан и я решил, попробовать исправить некоторые ошибки с помощью ChatGPT 3.5. Но после работы с более старшей версией он выглядит максимально бесполезным при программировании.

Всего в этот день был потрачен один час моего времени, большую часть которого я просто копировал код и отправлял его в ChatGPT.

Третий день

Удалось закончить конвертацию кода и скомпилировать его. Большую часть времени я пытался реализовать поддержку SwiftUI для своего компонента, подсказки и сгенерированный код ChatGPT очень сильно помогали в этом. Но из‑за того, что я не знал эту технологию было трудно составить правильно промпты, чтобы получить ожидаемый результат.

В результате спустя час, я увидел на экране иконки кнопок, но они не работали как надо ибо в коде присутствовали баги.

Последний день

Весь последний день я посвятил отладке багов. Это было не сложно и сводилось просто к перепроверке сгенерированного кода, вот несколько примеров ошибок.

Оригинал:

[_topLayer addAnimation:topAnimation forKey:tbAnimationKey];
[_bottomLayer addAnimation:bottomAnimation forKey:tbAnimationKey];

Конвертированный код:

topLayer.add(bottomAnimation, forKey: TBAnimatedButton.tbAnimationKey)
bottomLayer.add(bottomAnimation, forKey: TBAnimatedButton.tbAnimationKey)

Оригинал:

times = @[@(0.0),@(0.4), @(0.4), @(1.0)];

Конвертированный код:

let middleTimes = reverse ? [1.0, 0.6, 0.6, 0.0] : [0.0, 0.4, 0.4, 1.0]

Спустя два часа, все баги были исправлены и я получил аналог своей старой библиотеки полностью переписанный на Swift.

Вывод

Всего на весь этот проект у меня ушло 6 часов моего времени. Я не думаю, что справился бы сам быстрее, так как пришлось бы потратить еще столько же времени, чтобы вспомнить как писать на Swift. Но сам процесс я не могу назвать приятным, ибо он весьма механический и скучный, при этом все равно требует тщательной проверки.

ChatGPT 4 действительно может писать код, но для решения реальных задач его использовать тяжело из‑за маленького контекста и не всегда удобного интерфейса.

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


  1. Aesma
    25.04.2023 11:56

    Тоже жду gpt4 чтобы переписать старую игрушку ????


    1. stealapanda Автор
      25.04.2023 11:56
      +1

      Боюсь, если у игрушки тестов нет, то это только усложнит процесс. Но возможно замотивирует попробовать.


  1. Gargo
    25.04.2023 11:56

    вы расскажите лучше, как транслируете навигацию из UIKit в SwiftUI


    1. stealapanda Автор
      25.04.2023 11:56

      Если бы я знал...


    1. NineNineOne
      25.04.2023 11:56

      В SwiftUI легко использовать навигацию из UIKit, достаточно обернуть вьюшку в UIHostingController, и вызывать push/present