Testowałem najświeższe GPT-5.x Codex-y na bardziej złożonych zadaniach, tak by przygotował produkt od A do Z. W zasadzie przekazałem mu w SKILLS-ach czego oczekuję, w czym piszemy, jakie ma dodatkowe biblioteki do dyspozycji, jakie frameworki i moduły dociągnąć, gdy będzie taka potrzeba. Zaznaczyłem również, żeby implementował tylko to, co niezbędne i rozbijał taska na mniejsze punkty (taki planner), który pozwalał mi je przeanalizować i sprawdzić, czy w ogóle to ma sens. Jeśli akceptuję, to przechodzi do implementacji.
Następnie z okienka z czatem z poziomu IDE ładowałem mu SKILLS.md i dawałem zadanie w stylu korpo-jiry taska: Przygotuj serwis, który poprzez API robi to i tamto. Kilka punktów, bardzo generyczny opis z ogólnymi wymaganiami. Do tego miałem jakieś proste testy, które pozwoliły stwierdzić, że aplikacja w ogóle działa. Dostawałem zwykle sensowny plan rozbity na parę punktów. Prosiłem o implementację, więc wyglądało to tak, że agent najpierw wykonywał pewne polecenia w oknie czatu. Zawsze prosił o potwierdzenie, czy wykonać tymczasowe zadanie, choć mogłem dać zielone światło na wszystkie komendy. Oczywiście nie dałem.
Takich iteracji było wiele, co pozwalało mu eksplorować środowisko, np. czy może się połączyć z bazą, czy mam zainstalowaną daną paczkę itd. Jak punkt z planu był pokryty kodem, to czekał na jego akceptację i szedł dalej. Gdy wykonał wszystkie punkty, a ja zaakceptowałem wykonywanie finalnej aplikacji, to na końcu wykonywał testy. Często musiał wtedy się poprawiać, ale generalnie było to autonomiczne, ja tylko akceptowałem wykonywanie kodu z jego modyfikacjami.
Wnioski: pomimo, że prosiłem o minimalny kod, to był on dla mnie dziwny, na zasadzie łapiemy generyczny Exception. Chyba lepiej, by w ogóle tego nie dodawał. Ogólnie kod był dla mnie niezrozumiały, umieszczał pomocnicze funkcje w celach debuggingu. Potem musiałem się upominać o refaktoryzację, by je usunął. Dodatkowo dodawał bardzo sprecyzowane wyjątki, czyli jak gdzieś w flow zrozumiał, że wysłanie wartości 10 powoduje błąd, to hardkodował tę wartość w if-e. Ja to odbieram tak, że jego celem było dostarczenie produktu, więc każde potknięcie po drodze to był hotfix, byleby działało. Natomiast LLM działa całkiem dobrze, jak mamy pogadać o koncepcji, czy nawet poprosić o napisanie jednej funkcji z dobrze zdefiniowanymi warunkami brzegowymi. Tylko że realnie takie coś nie przyspiesza pracy. Taki kod trzeba przemyśleć dokładnie w ten sam sposób, jak trzeba by go wymyślić od zera. W złożonych systemach, czy legacy, LLM raczej się pogubi.
Podkreślę, że to były testy na green field, by wyrobić sobie opinię i sprawdzić, czy rzeczywiście zawód programisty jest zagrożony. Nie podpisałbym się pod takim kodem na produkcji. W moim odczuciu dowiezienie produktu nie może być jednym kryterium i wiem, że biznes myśli inaczej, ale to nic. Dług technologiczny prędzej czy później się zemści i wtedy biznes zapłaci podwójnie, choć niewykluczone, że jakiś % firm wyrobi znaczne zyski i zwinie się, gdy narracja o AI się zmieni.