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