Programista jest tylko człowiekiem, czyli skąd się biorą błędy w oprogramowaniu

Zawieszający się smartfon, niedający się uruchomić program komputerowy czy koszmarnie wolno działający tablet – to tylko niektóre z objawów, jakie mogą ze sobą nieść błędy pojawiające się w aplikacjach lub systemach operacyjnych. A co jeśli poważny błąd w oprogramowaniu przytrafi się w elektrowni atomowej?


"Ilu programistów trzeba...", czyli 7 błędów w programach, które łatano latami

Postęp technologiczny sprzyja powstawaniu ogromnych ilości nowego oprogramowania. Coraz częściej za ów postęp odpowiada nie tyle szeroko rozumiany sprzęt, ale właśnie software. Wyśrubowane możliwości współczesnych silników montowanych w najnowszych samochodach, zadziwiająca funkcjonalność pralek, lodówek czy telewizorów a nawet niesamowite możliwości współczesnych maszyn budowlanych nie byłyby możliwe do osiągnięcia, gdyby nie oprogramowanie.

Przyzwyczailiśmy się też do wszechobecności internetu, możliwości korzystania z bankowości mobilnej, zakupów online, portali społecznościowych, streamingu muzyki i materiałów wideo. To wszystko również by nie istniało gdyby nie software. Specjaliści coraz częściej podkreślają, że w dziś software wręcz dominuje, spychając nowoczesne materiały czy oryginalne koncepcje konstrukcyjne na drugi plan. Co więcej, od oprogramowania zależy już nie tylko funkcjonalność, ale również jakość nowoczesnych urządzeń.

Skąd się biorą błędy w oprogramowaniu. Problemy programisty

Współczesne programy składają się z setek tysięcy a nawet, coraz częściej, milionów linii kodu. Zdarza się, że po to, aby osiągnąć nawet prosty efekt trzeba napisać setki linijek kodu – najczęściej dzieje się tak w wypadku generowania zdarzeń graficznych na ekranie, dla których z jakichś powodów nie można skorzystać ze standardowych bibliotek graficznych. Piszący oprogramowanie programiści nie są jednak robotami. Każdemu z nich może się zdarzyć gorszy dzień, czy chwila nieuwagi. Czynnik ludzki wpływa na to, że nie da się uniknąć błędów w programach – zwłaszcza, jeśli oprogramowanie powstaje pod presją czasu w nie zawsze sprzyjającym otoczeniu i okolicznościach. Błędy są obecne w każdym produkcie programistycznym, a im więcej linii kodu i im więcej oprogramowania jest tworzonego tym więcej błędów. W inżynierii oprogramowania zjawisko to nazywa się piramidą propagacji błędów.

Powstawanie i powielanie się błędów w oprogramowaniu wynika też z przyjętych we wczesnych latach rozwoju informatyki sposobach projektowania oprogramowania. Początkowo zarówno systemy operacyjne, jak i aplikacje nie były projektowane jako bezpieczne – miały po prostu sprawnie i możliwie jak najszybciej wykonywać swoje zadania. Nie było też potrzeby, aby zastanawiać się nad separowaniem między sobą programów czy danych. Pierwsze komputery wykorzystywane były przez naukowców i inżynierów w ośrodkach badawczych i na uczelniach, a ich obsługą zajmowali się ich twórcy, który dokładnie wiedzieli co można, a czego nie można robić z danym komputerem.

Z czasem z komputerami zaczęli pracować zwykli, ale wciąż bardzo doświadczeni użytkownicy. Przy konstruowaniu pierwszych komputerów typu mainframe zdecydowano się na wprowadzenie mechanizmów bezpieczeństwa. Miały one jednak na celu separację użytkowników systemu pomiędzy sobą, ale już nie separację i izolację programów wykonywanych przez jednego użytkownika. Podobny założenia towarzyszyły twórcom pierwszych systemów operacyjnych na pecety. Dość szybko okazało się, że programy, nawet jeśli nie były uruchamiane jednocześnie, potrafią się wzajemnie zakłócać powodując awarie systemu (np. po zakończeniu działania nie czyszcząc używanego przed chwilą obszaru pamięci).

Co więcej, powstały na ówczesne potrzeby model systemu operacyjnego zakładał istnienie dużego jądra systemu z działającego z najwyższymi uprawnieniami oraz przyznanie bardzo wysokich uprawnień dla programów. Taki model działania środowiska IT stwarzał problemy ze stabilnością. Często zdarzało się, że awaria jednego programu powodowała awarię całego systemu operacyjnego –wszyscy na pewno pamiętają słynne niebieskie ekrany w Windows. Obecnie odchodzi się od tego modelu, dobrze izolując programy od siebie, odchudzając jądra czyniąc je modułowymi, ale pewne wypracowane przez lata mechanizmy działania systemów oraz sposoby pisania aplikacji pozostały, sprawiając że błędy związane z interakcją pomiędzy programami i systemem nadal się zdarzają i są bardzo trudne do wykrycia.

Walka z błędami

Nie da się napisać skomplikowanego oprogramowania, które nie zawierałoby błędów. Dlatego firmy zajmujące się tworzeniem oprogramowania oprócz programistów zatrudniają tez całe zespoły ludzi zajmujących się testowaniem i usuwaniem znalezionych w oprogramowaniu błędów. Znalezienie i diagnoza błędów jest czasochłonnym zajęciem. Wymaga ona wielokrotnego uruchamiania aplikacji w różnych określonych warunkach, na różnych platformach sprzętowych i pod kontrolą różnych wersji systemów operacyjnych.

Do diagnozy używa się specjalnego oprogramowania, które pozwala podglądać wewnętrzne działanie aplikacji. Taki software często umożliwia też dokonywanie zmian w kodzie „w locie”, dzięki czemu łatwiej stwierdzić czy naprawa danego błędu nie spowoduje wystąpienia kolejnych.

Oprócz testowania oprogramowania w warunkach normalnej pracy wykonuje się również testy przeciążeniowe (tzw. stress testing). Mają one na celu wychwycenie błędów związanych z pracą programu w warunkach przeciążenia, czyli np. gdy do aplikacji zaloguje się zbyt wielu użytkowników, dostarcza do niej lub pobiera zbyt dużo danych bądź w sytuacji niewystarczających zasobów systemowych.