Od prawdopodobieństwa do pewności: nowa rola AI w tworzeniu oprogramowania
Generatywna AI produkuje kod oparty na prawdopodobieństwie, podczas gdy inżynieria oprogramowania wymaga pewności, co zmusza branżę do poszukiwania nowej, hybrydowej drogi dla tej technologii.
Obietnica, że sztuczna inteligencja wkrótce całkowicie zastąpi programistów, rozbrzmiewa w branży technologicznej z rosnącą siłą. Wizja, w której wystarczy opisać swoje potrzeby w języku naturalnym, a AI wygeneruje gotowy, działający kod, jest niezwykle kusząca. Jednak, jak zauważa Bertrand Meyer, wybitny informatyk i autor licznych publikacji, nie jest to pierwsza taka rewolucja na horyzoncie. Podobne deklaracje towarzyszyły wprowadzeniu języka COBOL w latach 60., narzędzi CASE w latach 80. czy platform low-code/no-code w ostatniej dekadzie. Każda z tych innowacji podnosiła poziom abstrakcji i usprawniała pracę, ale żadna nie wyeliminowała potrzeby programowania ani samych programistów. Obecna fala entuzjazmu wokół generatywnej AI, choć oparta na bezprecedensowych możliwościach, natrafia na fundamentalne przeszkody, które kwestionują jej samodzielną rolę w tworzeniu profesjonalnego oprogramowania.
Podstawowy problem leży w naturze samej technologii. Współczesne modele AI, w tym wielkie modele językowe (LLM), działają na zasadzie statystycznego prawdopodobieństwa. Analizując gigantyczne zbiory danych treningowych, generują odpowiedź, która jest najbardziej prawdopodobna w danym kontekście. Takie podejście sprawdza się rewolucyjnie w dziedzinach, gdzie pewien margines błędu jest akceptowalny, a nawet pożądany. W analizie obrazów medycznych czy tłumaczeniu maszynowym, wynik poprawny w 95% przypadków jest ogromnym postępem w stosunku do alternatywy. Jednak inżynieria oprogramowania, zwłaszcza w systemach krytycznych (np. w bankowości, lotnictwie czy medycynie), rządzi się innymi prawami. Tutaj oprogramowanie albo działa niezawodnie i zgodnie ze specyfikacją, albo nie działa wcale. Subtelny błąd logiczny, pominięty przypadek brzegowy czy nieprawidłowa obsługa zasobów mogą prowadzić do katastrofalnych w skutkach awarii, utraty danych lub luk bezpieczeństwa. Tam, gdzie stawką jest niezawodność, rozwiązania „prawdopodobnie dobre” przestają być wystarczające.
Dwie główne przeszkody, które stoją na drodze do w pełni zautomatyzowanego programowania przez AI, to trudność precyzyjnego specyfikowania wymagań oraz zjawisko „halucynacji”. Popularny termin „prompt engineering” w rzeczywistości jest nową nazwą dla jednej z najtrudniejszych dyscyplin inżynierii oprogramowania - inżynierii wymagań. Okazuje się, że precyzyjne, jednoznaczne i kompletne opisanie tego, co system ma robić, jest zadaniem równie złożonym, jak samo programowanie. Drugim, jeszcze poważniejszym problemem są halucynacje modeli AI. Nie chodzi tu jedynie o spektakularne błędy, jak pomylenie polecenia przeniesienia plików z ich usunięciem. Znacznie groźniejszy jest tzw. przypadek diaboliczny, w którym AI generuje kod wyglądający na poprawny, ale zawierający ukrytą, trudną do wykrycia wadę. Programista, ufając sugestii modelu, może wpaść w „pętlę halucynacji” - podążać za pozornie obiecującą ścieżką, która z każdą kolejną iteracją prowadzi go coraz głębiej w ślepy zaułek, marnując czas i komplikując projekt. Zjawisko to wydaje się być nieodłączną cechą obecnej generacji AI, a nie jedynie jej „chorobą wieku dziecięcego”.
Czy to oznacza, że AI jest bezużyteczna w tworzeniu oprogramowania? Absolutnie nie. Rozwiązaniem, jak proponuje Meyer i inni eksperci, nie jest odrzucenie tej technologii, lecz jej mądre połączenie z rygorem i dyscypliną inżynierii oprogramowania. Zamiast stawiać naprzeciw siebie kreatywność AI i precyzję metod formalnych, należy je połączyć. Propozycja zakłada hybrydowy model pracy, który wykorzystuje mocne strony obu światów. Kluczem staje się synergia pomiędzy probabilistycznym generowaniem kodu a jego dowodową weryfikacją. W tym ujęciu sztuczna inteligencja staje się niezwykle potężnym asystentem, który potrafi błyskawicznie tworzyć prototypy, implementować standardowe algorytmy czy nawet pomagać w tworzeniu formalnych specyfikacji, ale jej wynik zawsze musi zostać poddany rygorystycznej kontroli.
Taki nowy proces, określany niekiedy jako „vibe contracting + vibe coding”, mógłby wyglądać następująco: w pierwszym kroku deweloper, być może z pomocą AI, tworzy precyzyjną, formalną specyfikację działania komponentu (tzw. kontrakt). Następnie generatywna AI („vibe coding”) na podstawie tej specyfikacji tworzy pierwszą wersję kodu. Kluczowy jest jednak trzeci etap: weryfikacja. Za pomocą zautomatyzowanych narzędzi do dowodzenia twierdzeń (proof tools) i metod formalnych, wygenerowany kod jest matematycznie sprawdzany pod kątem zgodności z kontraktem. Proces jest iteracyjny - wykryte niezgodności są korygowane przez poprawę kodu lub doprecyzowanie specyfikacji, aż do momentu, gdy zostanie uzyskany formalny dowód poprawności. W ten sposób probabilistyczny charakter AI zostaje okiełznany przez deterministyczną pewność matematyki.
Implikacje takiego podejścia są ogromne. Rola programisty nie zniknie, ale ulegnie ewolucji. Ciężar pracy przesunie się z ręcznego pisania linijka po linijce kodu na zadania wyższego rzędu: precyzyjne definiowanie problemu, tworzenie specyfikacji, projektowanie architektury oraz nadzorowanie i weryfikowanie pracy AI. Programista stanie się bardziej inżynierem lub wręcz architektem systemów, który zamiast układać cegły, projektuje budynek i kontroluje jakość pracy zautomatyzowanych maszyn. Zamiast pytać „jak to napisać?”, kluczowe staną się pytania „co dokładnie system ma robić?” oraz „jak udowodnić, że to robi?”. Taka transformacja wymagać będzie nowych umiejętności, łączących kreatywne myślenie z analitycznym rygorem, ale otwiera drogę do tworzenia oprogramowania o znacznie wyższej jakości i niezawodności, niż jest to możliwe obecnie. Małżeństwo kreatywności AI z dyscypliną metod formalnych może okazać się najważniejszym krokiem naprzód w historii inżynierii oprogramowania.