Wydajesz punkty badań, gotówkę i cztery miesiące kalendarza w grze na węzeł, który mówi, że daje ci wyselekcjonowane korpusy treningowe. Punkty znikają z konta. Korpusy nigdy nie przychodzą.
Nie raz. Nie czasami. Nigdy, w żadnej kampanii, od dnia napisania tego kodu.
Luka, na którą nikt nie ma sprawdzenia
Test jednostkowy odpowiada na jedno pytanie: czy ta funkcja robi to, czego oczekuję, gdy ją wywołam?
To pożyteczne pytanie i nie jedyne. Drugim jest to, czy cokolwiek dociera do tej funkcji ścieżką, którą użytkownik może przejść, i prawie żadne standardowe narzędzie o to nie pyta. Narzędzia do pokrycia też nie pomagają, bo to twój zestaw testów wywołuje, więc linia jest pokryta.
Wynikiem jest błąd bez objawu. Nie wywala się. Nie loguje. Ekran wygląda na skończony, zestaw jest zielony, a jedynymi świadkami są użytkownik, który próbuje coś zrobić i nie znajduje przycisku, oraz programista, który celowo poszedł szukać.
Przegląd w dziesięciu linijkach
Działa, jeśli projekt ma warstwę z regułami i warstwę z kontrolkami. U mnie są to warstwa symulacji, która nie importuje niczego z silnika, i warstwa UI, która ją konsumuje.
Wypisz każdą publiczną metodę warstwy reguł. Przeszukaj warstwę kontrolek pod kątem każdej nazwy. Zero trafień oznacza martwą albo nieosiągalną, i idziesz sprawdzić, która to.
Jest celowo prymitywny. Generuje fałszywe trafienia, które człowiek odrzuca w kilka sekund każde, i nic nie kosztuje. Przy pierwszym uruchomieniu na moim projekcie zgłosił 46 publicznych mutatorów, 21 bez wywołania w interfejsie i pięć, które miały być rzeczami, jakie robi człowiek.
Co faktycznie znalazł
| Co było nieosiągalne | Czego doświadczał gracz |
|---|---|
| Nagrody z węzłów badań | Zapłacone punkty, gotówka i cztery miesiące za korpus i rodzinę architektur, których nigdy nie przyznano. Każda kampania była na zawsze zamknięta w korpusie startowym i gęstym transformerze. |
| Anulowanie treningu | Żałowany projekt kosztował pełne dwieście dni. Nie było jak go zatrzymać. |
| Anulowanie programu architektury | Ten sam kształt. Zatwierdzony program blokował kolejny na miesiące, bez wyjścia. |
| Serwerownia | Kompletny system siatki z ciepłem, regułami stawiania i własnym przechodzącym zestawem testów. Żadnego wejścia. Napisana miesiące wcześniej i podpięta do niczego. |
| Pusty stan ekranu rekrutacji | Pusta strona z jednym przyciskiem, bo każda droga wejścia ustawiała najpierw kanał, więc pusty przypadek uznano za nieosiągalny. Był osiągalny. |
| Grafika półki na dyski | Grafika i siatka diod, obie skończone, rysowane przez nic. Nadal otwarte i świadomie. |
Łącznie dwanaście przez całe życie projektu. Trzy pierwsze trafiły do builda, w którego ludzie grali.
Ten najgorszy i dlaczego
Gracz płacił walutą, której nie da się odzyskać
Przypadek z węzłem badań to ten, o którym myślę. Brakująca funkcja jest rozczarowaniem. Funkcja, która pobiera zapłatę i nie dostarcza niczego, to inna kategoria, bo gracz wydał coś rzadkiego i nie ma jak się dowiedzieć, że go okradziono. Zakłada, że źle zrozumiał mechanikę.
To jest prawdziwy koszt tej klasy błędu akurat w grze. W narzędziu do pracy nieosiągalna funkcja jest nieobecna. W symulacji potrafi aktywnie okłamywać osobę grającą, a ona obwini siebie.
Naprawa bez rozluźniania testu
Kuszącą naprawą jest napisanie testu, który wywoła funkcję przyznającą i sprawdzi, że korpus przyszedł. Taki test przeszedłby również przed naprawą, bo funkcja nigdy nie była zepsuta.
Użyteczną naprawą jest test, któremu zabroniono wywoływać tę funkcję bezpośrednio. Kończy węzeł badań tak, jak robi to prawdziwy dzień, przez posunięcie symulacji, a potem odczytuje, co firma ma po tym.
Napisz jeden taki na mechanizm, w miejscu ukończenia, a ta klasa błędu nie może wrócić po cichu.
Czy praca z AI to pogarsza?
W moim doświadczeniu tak, i mówię to na każdej stronie, na której ma to znaczenie, bo pracuję z pomocą AI otwarcie.
Uczciwy koszt jest wąski i konkretny. Pomoc AI znacznie przyspiesza pisanie funkcji spełniającej opis. Nie robi zupełnie nic dla tego, czy cokolwiek kiedykolwiek tę funkcję wywoła. Więc tempo powstawania skończonych, poprawnych i niepodpiętych mechanizmów rośnie razem z tempem pisania mechanizmów.
Środkiem zaradczym nie jest pisanie mniej. Jest nim przeniesienie przeglądu wywołań z pamięci na harmonogram, gdzie uruchamia się niezależnie od tego, czy w danym tygodniu pamiętałeś, żeby być podejrzliwym.
Dlaczego to szczególnie problem samodzielnych
W zespole niepodpięta funkcja zwykle umiera w code review, bo druga osoba czyta zmianę i pyta, skąd to jest wywoływane. To pytanie jest całą obroną i jest darmowe, gdy ktoś inny czyta.
Samemu nikt go nie zadaje. Gorzej, każda siatka bezpieczeństwa, którą budujesz, jest też miejscem, gdzie awaria może się schować: zapasowy obrazek, wartość domyślna, gołe przechwycenie wyjątku, zielony test, który nigdy nie otworzył prawdziwego okna. Dodajesz je, żeby się nie wywaliło, i tym samym kasujesz jedyny sygnał, jaki miałeś.
Więc sprawdzenie musi być mechaniczne. Nie nawyk, nie zasada, której zamierzasz przestrzegać. Skrypt z liczbą, która trafia do opisu commita.
Każdy przypadek stąd jest ze Scaling Laws, tycoona o firmie AI wydanego jako darmowy publiczny build, z otwartym kodem i testami strażniczymi.
Strona gry i kod źródłowy · Poradnik siostrzany: błędy, które zamiast się wywalić, kończą się sukcesem
Pytania, które ludzie zadają
Czy funkcja może przejść wszystkie testy i być nieosiągalna?
Tak i jest to częste. Test wywołuje funkcję bezpośrednio, więc weryfikuje zachowanie i nie mówi nic o osiągalności. Dwanaście mechanizmów w jednym projekcie było skończonych, przetestowanych i nieosiągalnych.
Jak znaleźć kod, którego nic nie wywołuje?
Wypisz każdą publiczną metodę warstwy z regułami, przeszukaj warstwę z kontrolkami pod kątem każdej nazwy i obejrzyj listę zerowych trafień. Dziesięć linijek, prymitywne, skuteczne.
Dlaczego przeżywają tak długo?
Bo nie ma objawu. Zielony zestaw, czysty log, ekran wyglądający na skończony. Zauważy to tylko użytkownik polujący na przycisk albo programista, który celowo poszedł szukać.
Czy praca z AI zwiększa ryzyko?
Przyspiesza pisanie funkcji spełniających opis i nie robi nic dla tego, czy cokolwiek je wywołuje, więc tempo rośnie razem z tempem pisania. Uruchamiaj przegląd z harmonogramu, a nie z pamięci.