gpt-4.1 пишет код

gpt-4.1 пишет код

На днях, как известно, OpenAI подвезли несколько новых моделек, которые сразу получили множество лестных отзывов. Я в это время был занят одним ботом и как раз испытал gpt-4.1-mini в качестве переводчика с научно-английского на доступный русский. Сравнил эту "мини" с предшественницей (gpt-4o-mini) - разница огромная. Старая мини-модель переводит на уровне гугл-транслэйт 10-ти летней давности, новая - прям отлично, почти на уровне gpt-4o.

Но, больше всего меня заинтересовала шумиха вокруг способностей новой модели (gpt-4.1) к программированию. 4.1 доступна только через API, поэтому опробовать я её решил через IDE Windsurf, который давал к ней полный доступ бесплатно вплоть 21 апреля. В общем, предвкушая отличный кодинг я запустил IDE...

Началось отлично: поставил технические требования, описал задачу, GPT по этой задаче составил тех-задание, составил план действий, структуру проекта, структуру таблиц в БД. Просто супер!
Создал проект, папки, файлы..

И, как только мы перешли к программированию, сразу начались проблемы.

Проблема №1 - appsettings.Development.json

Несмотря, на явные мои указания, что нужен этот файл и для разработки настройки берём из него, GPT об этом забыл. Но, это пол-беды. Я напомнил. Тогда он добавил чтение конфигурации из него, но, почему-то, не глобально, а исключительно для логгера. Когда не отработала миграция, он вспомнил про этот файл и добавил его в DbContextFactory.
Короче, пытался он его всунуть в каждое место, где не хватало конфигов, пока я не сказал сделать это единожды для всего приложения. Ну тогда, как бы нехотя, он переписал по нормальному.

Идём дальше.

Проблема №2 - путаем местами поля моделей

Сделал GPT две модели примерно такого вида:

public class Equipment { public Guid Id { get; set; } public string Name { get; set; } public string Number { get; set; } public DateTime TimeStamp { get; set; } //почему такое имя поля, а не, например InsertDate, непонятно }

и вот такую:

public class EquipmentHistory { public Guid Id { get; set; } public Guid EquipmentId { get; set; } public DateTime CheckedAt { get; set; } //и тут тоже непонятное название поля public Equipment? Equipment { get; set; } //почему nullable? }

Но странности именования полей, и вообще сама модель истории, которая не способна хранить историю изменений - ничто, по сравнению вот с этим:

public async Task TrackEquipmentAsync(Equipment equipment, CancellationToken cancellationToken = default) { await _equipmentRepository.AddAsync(equipment); await _equipmentHistoryRepository.AddAsync(new EquipmentHistory { Name = equipment.Name, // тут компилятор, естественно говорит, что нет такого поля Number = equipment.Number, // тут, собственно тоже CheckedAt = DateTime.UtcNow }); await _equipmentRepository.SaveChangesAsync(); await _equipmentHistoryRepository.SaveChangesAsync(); _logger.LogInformation("[EquipmentTrackingService] Equipment saved."); }

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

Проблема №3 - юзаем метод вместо свойства

Написал он такой вот класс-обёртку для результатов сервисов:

public class ServiceResult<T> { public bool IsSuccess { get; set; } public IEnumerable<string> Errors { get; set; } = new List<string>(); public T? Data { get; set; } public static ServiceResult<T> Success(T? data = default) => new ServiceResult<T> { IsSuccess = true, Data = data }; public static ServiceResult<T> Failure(IEnumerable<string> errors) => new ServiceResult<T> { IsSuccess = false, Errors = errors }; public static ServiceResult<T> Failure(string error) => new ServiceResult<T> { IsSuccess = false, Errors = new List<string> { error } }; }

Вроде всё ок. Ну понятно что для чего. Причём он САМ его написал. Да по моей просьбе, но сам. В тех-задание внёс, в план действий...
А потом в тестах вот такое пишет:

Assert.False(result.Success);

Тесты, естественно даже не собираются, нельзя в c# обратиться к методу как к свойству. GPT предлагает сделать Success свойством. Я возражаю, говорю это сломает нам инициализацию. Говорю - подумай! Я уже, если честно, злюсь на него - это ж ты сам написал и класс и тест. Ну простое же решение....
Но, решения он не нашёл.

Что же могло пойти не так?

Может быть виноват Windsurf. У меня сложилось ощущение, что модель забывала обо всём, что было дальше двух-трёх запросов. Странно, что при таких хороших отзывах модель выдаёт настолько плохой код. Ладно бы просто плохой, но он же даже не рабочий.

В общем, после такого опыта не могу разделить общих восторгов по поводу способностей новой модели в области программирования.

А у вас как gpt-4.1 себя ведёт в плане написания кода?

1
3 комментария