Dlaczego stoimy wobec ciągłego kryzysu oprogramowania?

Dlaczego stoimy wobec ciągłego kryzysu oprogramowania?

Gdy w lutym 1995 roku otwarto w końcu nowy port lotniczy w Denver, nastąpiło to z półtorarocznym opóźnieniem, a dług wynosił blisko miliard dolarów. Dlaczego? Ponieważ nie działał automatyczny system bagażowy. A działo się tak dlatego, że instrukcje podane komputerom obsługującym system nie potrafiły uporać się z zadaniem przemieszczenia wszystkich walizek z jednego miejsca w drugie. To był tylko jeden z ostatnich (i kosztownych) przykładów problemu, przed jakim stajemy, włączając komputery w nasze codzienne życie.

Specjaliści od komputerów rozróżniają sprzęt (rzeczywistą, fizyczną maszynę, wliczając w to obwody w układach scalonych) od oprogramowania (instrukcji udzielanych maszynie, gdy musi wykonać określone zadanie). Na przykład, piszę te słowa na komputerze osobistym (sprzęcie), w którym zainstalowałem program przetwarzania tekstów (oprogramowanie). Im bardziej złożone zadanie do wykonania, tym dłuższy i bardziej skomplikowany musi być zbiór instrukcji i tym więcej jest okazji, aby wkradły się do niego jakieś błędy.

I wkradają się. Port lotniczy w Denver jest jedynie jaskrawym przykładem systemu dotkniętego plagą problemów z oprogramowaniem. W 1993 roku Kalifornia wycofała się z projektu połączenia stanowych kartotek praw jazdy z kartotekami dowodów rejestracyjnych pojazdów mechanicznych. Koszt: 44 miliony dolarów i siedem lat. W 1992 roku linie lotnicze American Airlines, będące pionierem współczesnych komputerowych systemów rezerwacji biletów, zrezygnowały z prób połączenia swych systemów z systemami wypożyczania samochodów i rezerwacji hoteli. Koszt: 165 milionów dolarów. I nawet gdy praca została doprowadzona do końca, wady ukryte w programach mogą wyjść na jaw w najbardziej nieoczekiwany sposób. Oprogramowanie na próbniku kosmicznym Clementine, po bezbłędnym przeprowadzeniu badań powierzchni Księżyca, nagle zaczęło odpalać silniki sterujące statku, wyczerpując pozostałe zapasy paliwa w ciągu kilku minut. W rezultacie nie doszła do skutku druga część misji (podróż do pobliskiej asteroidy).

Dlaczego pisanie programów komputerowych, coś, co robimy już od pół wieku, nadal przyprawia nas o ból głowy? Po pierwsze, programy pisane są nadal przez pojedynczych fachowców i każdy nowy zbiór instrukcji jest w istocie pisany od nowa. Tak jak ręcznie wykonywane meble, każdy program powstaje w konkretnym celu. Oznacza to, że te same błędy mogą się pojawiać ciągle na nowo, ponieważ poprawienie ich w jednym systemie nie oznacza, że zostaną poprawione w drugim.

Innym powodem jest to, że zmienia się istota obliczeń za pomocą komputerów. Zamiast tworzyć programy dla pojedynczego gigantycznego systemu komputerowego, programiści robią to dla układów, które są szeroko rozpowszechnione. Na przykład system bagażowy lotniska w Denver miał 100 komputerów mających do czynienia z danymi z 5000 elektronicznych „oczu”, 400 odbiorników radiowych i 56 czytników kodów paskowych. Techniki odpowiednie dla jednego stylu programowania mogą nie być właściwe dla innego, tak jak cieśla mający wprawę w stawianiu domów jednorodzinnych może nie być najlepszym projektantem drapacza chmur.

I na koniec, programy komputerowe stają się coraz bardziej skomplikowane i wszechobecne. Zbiory instrukcji o długości wielu milionów linii nie są wcale rzadkością. Nawet współczesne samochodowe komputery pokładowe mogą zawierać 30000 linii kodu – długość, która jeszcze kilkadziesiąt lat temu uważana była za olbrzymią. Ponadto wtargnięcie „sprytnych” układów do zwykłej elektroniki użytkowej oznacza, że coraz ważniejsze staje się uzyskanie prawidłowego programu za pierwszym razem – nawet golarka elektryczna może mieć układ scalony wykonujący setki linii instrukcji.

Spodziewam się, że w ciągu następnych kilku lat przemysł amerykański skupi się na produkcji niezawodnego oprogramowania, działającego w naszych komputerach. Oto kilka linii ataku:

• Rozwój technik „produkcji masowej” – programiści będą rozwijać moduły wszechstronnie przetestowanych kodów, które mogą być używane na nowo w różnych programach.

• Programy będą się „rozrastać” – zamiast usiłować pisać wszystko naraz, rozwijać się będzie i testować niewielkie moduły, które następnie będzie się składać razem w końcową konfigurację; w ten proces można także włączyć „programowanie automatyczne” – takie programowanie komputerów, by same pisały kody programów.

• Uniwersytety zaoferują bardziej intensywne programy nauczania technik oprogramowania, tak aby było możliwe mówienie o państwowych wzorcach dla zawodu, podobnych do tych, jakie istnieją w innych rodzajach działalności inżynierskiej.

• Opracowane zostaną modele matematyczne, umożliwiające inżynierom oszacowanie niezawodności dużych kodów komputerowych, czego nie potrafimy jeszcze dzisiaj dobrze robić.

Lecz bez względu na nasze wysiłki, nigdy nie zrobimy komputerów i ich oprogramowania tak, by były wolne od błędów. Tak jak to jest ze wszystkimi dążeniami ludzkimi, będziemy po prostu działać najlepiej, jak potrafimy, i naprawiać błędy, gdy tylko je znajdziemy.