Jak nauczyliśmy maszyny liczyć i myśleć za nas? Część 20: Doniosłe znaczenie błędów w programach

Od początku rozwoju informatyki błędy w programach stanowiły poważny problem. Istniała konieczność pisania wielu programów dla wielu różnych zastosowań. Lecz ludzie są omylni, dlatego błędy w programach zdarzały się dość często.

Publikacja: 10.03.2022 20:26

22 lipca 1962 r. NASA wystrzeliła rakietę, która miała zanieść próbnik Mariner 1 na orbitę Wenus

22 lipca 1962 r. NASA wystrzeliła rakietę, która miała zanieść próbnik Mariner 1 na orbitę Wenus

Foto: NASA/Bricktop/wikipedia/domena publiczna

Historia informatyki, którą staram się przybliżyć państwu w kolejnych felietonach tej serii, składa się z historii rozwoju sprzętu (hardware) i oprogramowania (software). O historii rozwoju sprzętu komputerowego pisałem w częściach od 1 do 13 felietonów tej serii, natomiast kolejne części prezentowały historię rozwoju metod i narzędzi programowania (w szczególności języków algorytmicznych). Dziś chcę się zająć wstydliwą częścią historii programowania, to znaczy opowiedzieć o błędach popełnianych w programach i ich konsekwencjach tychże błędów.

Skąd się wzięła pluskwa?

Od początku rozwoju informatyki błędy w programach stanowiły poważny problem. Istniała konieczność pisania wielu programów dla wielu różnych zastosowań – ale ludzie są omylni, dlatego błędy w programach zdarzały się dość często. Obecnie, wiedząc o tym, stosujemy takie języki programowania, żeby prawdopodobieństwo popełnienia błędu uczynić możliwie jak najmniejszym. Ale na początku, gdy programowano w językach maszynowych (vide „Początki programowania”, „Rzecz o Historii” z 17 grudnia 2021 r.) i zaczęto się zmagać z pierwszymi błędami w programach, zaczęto też nazywać owe błędy pluskwami (ang. bug). Wiadomo, że tę nazwę wprowadziła do języka informatyki Grace Hopper. O tej niezwykłej kobiecie pisałem w tej samej części (nr 14) niniejszej serii felietonów, co więcej – wspominałem o niej potem wielokrotnie w dalszych częściach serii, ponieważ wiele fundamentalnych elementów współczesnej informatyki jest wynikiem jej awangardowych koncepcji i pionierskich dokonań. To właśnie ona sprawiła, że błąd w programie komputerowym w anglojęzycznej literaturze nazywany jest bug, co w języku polskim zwykło się zastępować słowem pluskwa.

Wyjaśniano tę nazwę na różne sposoby. Między innymi wiedząc, że twórczyni tej nazwy Grace Hopper była admirałem marynarki USA, fantazjowano, że dokuczliwe błędy w programach skojarzyły się pani admirał z pluskwami, które niekiedy pojawiały się na okrętach US Navy i bardzo się dawały we znaki. Na okrętach wykonuje się wtedy operację odpluskwiania (debugging) – i tak też nazwano działania zmierzające do wykrycia oraz usunięcia błędów z programu komputerowego.

Okazuje się, że prawdziwe jest inne wytłumaczenie pochodzenia nazwy „bug” (ogólnie owad, niekoniecznie pluskwa). Otóż gdy Grace pracowała z komputerem Mark II, w pewnym momencie zaczął się on dziwnie zachowywać. Popełniał błędy w obliczeniach i nie słuchał rozkazów. Było to dokładnie 9 września 1947 r. o godz. 15.25. Zaczęto szukać przyczyny i o 15.45 znaleziono ją: do wnętrza maszyny dostała się ćma i zablokowała działanie przekaźnika nr 70 w panelu F! Incydent opisano w dzienniku pracy komputera, przyklejając dodatkowo „winowajczynię” (ćmę) do odpowiedniej strony – co można zobaczyć na rysunku w internecie. Ćmę usunięto, a samą czynność Grace nazwała „usunięciem owada” (debugging). Znam tę historię i tu dla porządku ją przytaczam, chociaż jako programista z 30-letnią praktyką zaciekłego szukania błędów w programach (moich własnych oraz moich studentów) bardziej skłaniam się do wiązania słowa bug z dotkliwie gryzącymi pluskwami, a nie z niewinną i sympatyczną ćmą!

Kosztowny brak jednej kreski

Każdy błąd w programie jest czymś bardzo niekorzystnym. Przecież nie używamy komputerów dla zabawy, tylko nakazujemy im określone obliczenia po to, żeby w oparciu o wyniki tych obliczeń podjąć jakieś konkretne działania. Dostajemy wynik, wierzymy, że jest prawidłowy, działamy zgodnie z owym wynikiem – a rezultat tego działania jest odmienny od oczekiwanego. Bo w programie był błąd, podany przez komputer wynik był nieprawidłowy, a podjęte na jego podstawie działanie fatalnie się skończyło.

Przy programowaniu komputerów najbardziej szokująca jest dysproporcja pomiędzy przyczyną (drobnym błędem w programie) a skalą skutków. Kiedy uczyłem studentów programowania w języku FORTRAN, opowiadałem im o najdroższej kresce w historii świata. Otóż 22 lipca 1962 r. z przylądka Canaveral na Florydzie wystrzelono ogromną rakietę, która miała zanieść próbnik Mariner 1 na orbitę planety Wenus. Rakieta zawierała ogromne ilości paliwa, bo miała lecieć bardzo daleko. Ale zaraz po starcie rakieta zaczęła się zachowywać nieprawidłowo i wszystko wskazywało na to, że runie z góry jak monstrualna fala ognia na zamieszkane wybrzeże Florydy nieopodal Orlando. Przerażeni kontrolerzy lotu w 293. sekundzie wydali rozkaz samozniszczenia rakiety. W gigantycznym wybuchu zginął próbnik Mariner i ponad miliard dolarów włożonych w budowę rakiety!

Przyczyną był błąd w programie sterującym lotem rakiety, napisanym w języku FORTRAN. Program ten liczył kilkaset tysięcy linii kodu, ale w jednej z nich zapomniano dopisać jedną małą kreskę. Pokazywałem tę feralną linię kodu studentom i wyjaśniałem, jak komputer powinien był zareagować, gdyby ową kreseczkę wpisano, jak reagował, gdy jej nie było. Nie wchodząc w szczegóły, można stwierdzić, że komputer sterował rakietą „nerwowo”, bo każda, nawet najmniejsza odchyłka prędkości od wartości zapisanych w programie wywoływała gwałtowne reakcje systemów sterujących, co destabilizowało rakietę. W tych warunkach katastrofa była nieunikniona.

„Pluskwa milenijna”

Opowiadanie o płonącej rakiecie zapewne niewielu z państwa wzruszyło, bo na co dzień nie wystrzeliwujemy w Polsce rakiet na inne planety. Ten rodzaj katastrofy raczej więc nam nie zagraża. Natomiast 20 lat temu wszyscy byliśmy zagrożeni z powodu tzw. pluskwy milenijnej, która mogła nam poważnie dokuczyć w momencie przejścia z 1999 r. do roku 2000. W odróżnieniu od skomplikowanych przyczyn wielu innych błędów programów komputerowych, które mógłbym opisywać wyłącznie specjalistom, mechanizm błędu pluskwy milenijnej był bardzo prosty, dlatego mogę go państwu szczegółowo opisać.

Otóż w większości zastosowań komputerów duże znaczenie mają daty. Służą one m.in. do tego, żeby określać, co było wcześniej, a co później. Dzięki temu ściągając zdjęcia do cyfrowego albumu, możemy je automatycznie uporządkować według kolejności ich wykonania; planując płatności w banku możemy wydać proste polecenie, żeby pewną płatność wykonać ponownie za tydzień, za miesiąc lub za rok; sterując komputerowo jakimś systemem możemy określić, ile czasu musi upłynąć od wykonania jednej czynności do rozpoczęcia następnej itd. Czas to bardzo ważna kategoria!

Niestety, twórcy pierwszych systemów komputerowych działali pod presją wymogu oszczędzania pamięci. Dlatego ktoś wpadł na pomysł, że zamiast we wszystkich datach zapisywać pełny numer roku, na przykład 1975 czy 1988, można zapisać tylko 75 czy 88 – bo to „19” się automatycznie doda przy wyświetlaniu lub drukowaniu odpowiednich dokumentów. I tak to działało przez kilkadziesiąt lat! Ale nadeszła chwila, kiedy rok 1999 miał się zamienić w 2000, i wtedy zrozumiano, że wszystkie dokumenty powstające w tym roku będą miały domyślną datę 1900, w efekcie czego to, co nastąpi później, będzie przez wszystkie systemy komputerowe traktowane jako zdarzenie wcześniejsze. Zamęt szykował się okrutny, gwałtownie wprowadzano do systemów komputerowych poprawki, a największe przerażenie budziła niepewność, czy udało się te poprawki wprowadzić naprawdę wszędzie, bo nawet pojedynczy nieskorygowany system informatyczny mógł wprowadzić zamieszanie o trudnych do przewidzenia skutkach.

Być może niektórzy czytelnicy w tym momencie wzruszyli ramionami: „Jakie nieszczęście może wynikać z błędnie datowanego raportu?”. Ale jeśli uświadomić sobie, że systemy komputerowe są używane w różnych systemach sterowania, np. w kontroli ruchu lotniczego, to perspektywa zderzających się samolotów naprawdę nie wyglądała dobrze!

Na szczęście okazało się, że ową „pluskwę milenijną” udało się zneutralizować skutecznie i nic złego się nie stało. Mam związaną z tym prywatną zabawną przygodę, o której pozwolę sobie wspomnieć. Otóż na przełomie lat 1999/2000 byłem rektorem AGH i do moich obowiązków należało m.in. ogłoszenie – z zegarkiem w ręku! – momentu nadejścia Nowego Roku z balkonu na tradycyjnym balu odbywającym się w głównym gmachu uczelni. Zaplanowałem więc drobny żart: uzgodniłem z obsługą techniczną, że gdy przez głośniki odliczę: „...trzy, dwa, jeden, ZERO!”, to elektryk wyłączy zasilanie oświetlenia budynku, zapadnie ciemność i wszyscy będą przerażeni, że oto alarmujące zapowiedzi mediów spełniają się na ich oczach! Nie doceniłem jednak poziomu zabezpieczeń energetycznych AGH. Gdy główne zasilanie budynku zostało (celowo) odcięte – w ułamku sekundy ruszyło zasilanie awaryjne. W ferworze składanych życzeń, strzelających korków szampana, głośnej muzyki nikt nawet nie zauważył chwilowego „mrugnięcia” świateł i żart się nie udał.

Śmiertelne skutki błędów w oprogramowaniu

„Pluskwa milenijna” nie ugryzła, eksplozją rakiety można się nie przejmować, ale niestety niektóre błędy w programach odebrały życie ludziom. Szeroko znanym (ale z pewnością niejedynym) przypadkiem tego rodzaju był błąd w oprogramowaniu systemu Therac-25. System ten służył do sterowania procesem naświetlania twardym promieniowaniem jądrowym pacjentów, u których wykryto raka. Jeśli rak położony był głęboko i w sąsiedztwie ważnych narządów, które chirurg usuwający nowotwór też – chcąc nie chcąc – musiałby uszkodzić, lepiej było posłużyć się metodą radioterapii (tzw. nożem gamma), a nie uciekać się do zabiegu operacyjnego. Sama metoda jest bardzo dobra i stosuje się ją do dziś. Na świecie są tysiące ludzi, którym w ten sposób uratowano życie. Ale wymaga ona użycia komputera, bo trzeba wielokrotnie wprowadzać do ciała pacjenta wąskie wiązki promieniowania, tak kierowane (komputerowo!) z różnych stron, by przecinały się one w obszarze nowotworu. W nowotworze kumuluje się w efekcie stopniowo śmiertelna dawka promieniowania, która go zniszczy, natomiast przez zdrowe tkanki owe wiązki promieniowania przechodzą tylko raz i to przez krótki czas, dlatego stopień ich uszkodzenia jest pomijalnie mały.

Realizacja tej metody leczenia wymaga bardzo precyzyjnego kierowania źródłem promieniowania (np. bombą kobaltową) na podstawie obrazów stereotaktycznych wybranej części ciała (najczęściej mózgu) i do tego celu koniecznie trzeba stosować komputer. Niestety, w oprogramowaniu tego komputera, który sterował pracą systemu Therac-25, był błąd i pacjenci otrzymywali wielokrotnie większą dawkę promieniowania od tej, którą zalecił lekarz. W efekcie niszczony był nie tylko rak, ale także zdrowe tkanki pacjenta. Potwierdzono oficjalnie, że w latach 1985–1987 błędnie działający komputer zabił co najmniej pięć osób, chociaż rzeczywista liczba ofiar mogła być znacznie większa.

Wiedząc, że błędy w programach komputerowych stanowią poważny problem, warto się dowiedzieć, jak się z owymi błędami walczy. Ale o tym napiszę już w następnym odcinku tego cyklu.

Autor jest profesorem AGH w Krakowie

Historia informatyki, którą staram się przybliżyć państwu w kolejnych felietonach tej serii, składa się z historii rozwoju sprzętu (hardware) i oprogramowania (software). O historii rozwoju sprzętu komputerowego pisałem w częściach od 1 do 13 felietonów tej serii, natomiast kolejne części prezentowały historię rozwoju metod i narzędzi programowania (w szczególności języków algorytmicznych). Dziś chcę się zająć wstydliwą częścią historii programowania, to znaczy opowiedzieć o błędach popełnianych w programach i ich konsekwencjach tychże błędów.

Pozostało 95% artykułu
2 / 3
artykułów
Czytaj dalej. Subskrybuj
Historia
Pomogliśmy im odejść z honorem. Powstanie w getcie warszawskim
Historia
Jan Karski: nietypowy polski bohater
Historia
Yasukuni: świątynia sprawców i ofiar
Historia
„Paszporty życia”. Dyplomatyczna szansa na przetrwanie Holokaustu
Historia
Naruszony spokój faraonów. Jak plądrowano grobowce w Egipcie