Twoje środowisko AI do kodowania to narzędzie skomplikowane. Twoja baza kodu jest złożona.
Nowe narzędzia AI do kodowania obiecują zwiększenie niezawodności agentów. Widzisz frameworki dla umiejętności (skills), supermocy (superpowers) i rozwoju opartego na specyfikacji (spec-driven development). Te narzędzia działają. Pomagają agentom podążać za procesem zamiast zgadywać.
Ale istnieje pułapka. Ludzie myślą, że lepsza konfiguracja dla jednego zadania tworzy spójny system. Tak nie jest.
Aby zrozumieć dlaczego, użyj frameworka Cynefin. Rozróżnia on problemy na dwa typy: skomplikowane (Complicated) i złożone (Complex).
Problemy skomplikowane Mają one możliwe do poznania rozwiązanie. Używasz analizy i umiejętności, aby je znaleźć. Przykładami są refaktoryzacja modułu lub napisanie funkcji walidacyjnej. Gdy już znajdziesz rozwiązanie, możesz je powtórzyć. Większość narzędzi AI do kodowania operuje właśnie tutaj. Skupiają się na jednostce pracy. Sprawiają, że zadania są powtarzalne i weryfikowalne.
Problemy złożone Nie mają one przewidywalnego rozwiązania. System jest siecią powiązanych elementów. Rezultaty pojawiają się dopiero po podjęciu działania. Czy czterdzieści scalonych zmian zepsuje architekturę za sześć miesięcy? Czy Agent A będzie sprzeczny z Agentem B? Nie znajdziesz tych odpowiedzi, patrząc na pojedynczy plik. Wynikają one z interakcji między elementami.
Niezgodność pojawia się wtedy, gdy oczekujesz, że narzędzia do problemów skomplikowanych rozwiążą problemy złożone.
Narzędzie może sprawić, że agent napisze idealną funkcję. Ale jeśli jedno zadanie używa userId, a inne user_id, system przestanie działać. Oba zadania były „poprawne” w izolacji. Awaria ma charakter emergentny. Wynika ona z interakcji, a nie z samej jednostki.
Nawet ogromne okna kontekstowe nie rozwiążą tego problemu. Większe okno pomaga zobaczyć więcej, ale widzenie to nie to samo co wnioskowanie. Możesz przeczytać całą bazę kodu i nadal nie wiedzieć, czy dojdzie do zakleszczenia (deadlock) pod obciążeniem produkcyjnym. To właściwość czasu wykonania (runtime).
Jak radzić sobie z obiema warstwami:
- Dla warstwy skomplikowanej: Używaj umiejętności (skills), specyfikacji (specs) i TDD. Sprawiają one, że indywidualny wynik agenta jest rygorystyczny.
- Dla warstwy złożonej: Stosuj metodę „sonduj-odczuwaj-reaguj” (probe-sense-respond). Nie możesz przewidzieć, co ulegnie awarii. Musisz scalać, wdrażać i obserwować. Używaj testów integracyjnych i obserwowalności (observability), aby wyczuć, co dzieje się, gdy elementy łączą się w całość.
Nie daj się zwieść obietnicy, że lepsza specyfikacja sprawi, że Twój system będzie stabilny. Specyfikacje sprawiają, że jednostka jest niezawodna. Nie sprawiają one jednak, że system staje się spójny.
Dopasuj metodę do dziedziny. Używaj narzędzi, aby dopracować jednostkę. Używaj eksperymentów, aby zrozumieć system.
Optional learning community: https://t.me/GyaanSetuAi
