Największe wpadki związane z oprogramowaniem!

Paweł Dedio Programowanie 2019-03-16

Witajcie, dzisiejszy temat będzie dość luźny. Opowiemy sobie o różnych wpadkach, które są związane z programowaniem. Nie jest to lista najbardziej kosztownych wpadek. Postanowiłem wybrać te najciekawsze, z których można wyciągnąć pewną lekcję. Nie sugerujcie się też kolejnością, bo jest ona przypadkowa.

Skąd się biorą błędy?

Już kiedyś wspominałem, że w programowaniu każdy błąd ma swoją przyczynę w człowieku, ponieważ to my tworzymy oprogramowanie. Tutaj jednak chciałbym się skupić nad tym, co tak naprawdę sprawia, że programiści się mylą. Tak naprawdę pomyłki są czymś powszechnym. Rzadko zdarza się, żeby udało się napisać jakąś skomplikowaną funkcjonalność bez zrobienia żadnego błędu po drodze. Dlatego jest wiele osób oraz narzędzi, które pomagają nam te błędy wychwycić. Najważniejsze jest odpowiednie przetestowanie napisanych przez nas funkcjonalności. Większość pomyłek wychodzi jeszcze na etapie tworzenia aplikacji i zostają poprawione przed wydaniem jej na świat. Jednak jak dowiecie się w dalszych akapitach, nie zawsze tak się dzieje. Jakie są tego przyczyny? Przeważnie nie możemy wskazać jednej, konkretnej, bo w większości przypadków błąd jest wynikiem połączenia kilku niefortunnych zdarzeń oraz decyzji. Głównymi czynnikami mogącymi doprowadzić do powstania błędów są pośpiech, wywieranie presji na testerów, nieodpowiednia liczba testerów oraz bagatelizowanie wagi wprowadzanych zmian, czyli po co testować skoro to tylko drobna zmiana…

Czy błędy to coś złego?

Ransomware

Tutaj sprawa nie jest taka prosta. Oczywiście błędy nie powinny wystąpić, bo często prowadzą one do strat finansowych lub co gorsza, ludzkich. Jednak często mimo swoich beznadziejnych skutków, mają też pewien pozytywny oddźwięk, ponieważ często prowadzą do usprawnienia procedur i uniemożliwienia powstania podobnych błędów w przyszłości. Na pewno każdy z nas zna powiedzenie „uczyć się błędach”. Ważne, żebyśmy minimalizowali prawdopodobieństwo wystąpienia błędów, a jeśli już wystąpią, to wyciągali z nich jak najwięcej wniosków. To tyle słowem wstępu, przejdźmy więc do najbardziej interesujących wpadek programistów.

Katastrofa sondy Mars Climate Orbiter

Ta wpadka jest chyba moją ulubioną. Jest dość zabawna i na szczęście nie doprowadziła do niczyjej śmierci. 11 grudnia 1998 roku rozpoczęła się misja NASA, której celem było wyniesienie sondy badawczej na orbitę Marsa. Początkowo wszystko przebiegało bez żadnego zarzutu, 23 września 1999 roku około godziny 9:00 sonda rozpoczęła manewr osadzania się na orbicie. Kilka minut później znalazła się ona w cieniu radiowym marsa (docieranie sygnału na ziemię było niemożliwe). Co ciekawe stało się to prawie minutę wcześniej, niż przewidywali naukowcy. Obliczano, że kontakt z sondą będzie możliwy około godziny 9:30, jednak, mimo licznych prób, nigdy się to nie udało. 25 września 1999 roku, czyli dwa dni później NASA poinformowała o zniszczeniu sondy. Jak wykazało późniejsze śledztwo, spłonęła ona w atmosferze marsa.

Sonda zbliżyła się zbyt blisko czerwonej planety (różnica w wysokości wynosiła około 100 km). Skąd tak ogromna różnica w przemyśle, gdzie wszystko jest obliczane z ogromną dokładnością? Przyczyna była dość banalna. Programiści nie ustalili między sobą, czy będą używać systemu imperialnego (używany głównie w Wielkiej Brytanii i USA), czy może jednak metrycznego (praktycznie reszta świata). W rezultacie naukowcy z kontroli naziemnej do określenia siły używali imperialnych funtów na sekundy, a sonda interpretowała jako metryczne niutonosekundy.

Winą takiego zajścia była niedostateczna komunikacja NASA z firmą Lockheed Martin, która była autorem części systemu. NASA wzięła winę w całości na siebie, tłumacząc, że to oni byli odpowiedzialni za przeprowadzenie odpowiednich testów. Koszt sondy był szacowany na 125 milionów dolarów.

Krytyczny błąd w panamskim instytucie onkologicznym

Cała historia działa się pomiędzy sierpniem 2000 a marcem 2001 roku. Pacjenci chorzy na raka prostaty oraz raka szyjki macicy byli poddawani radioterapii. Po pewnym czasie u 28 pacjentów zaobserwowano objawy choroby popromiennej. W przypadku 8 osób choroba zakończyła się śmiercią.

W szpitalu tym podobnie jak w innych do obliczania dawek promieniowania wykorzystywano TPS — treatment planning system. Jest to system komputerowy do planowania terapii. W przypadku leczenia radiologicznego promieniowaniu poddawane są tylko chore tkanki, wobec czego reszta ciała pacjenta jest chroniona przez specjalne bloki osłonne, które nie przepuszczają niebezpiecznego promieniowania. TPS miał pewne ograniczenie. Pozwalał on na uwzględnienie jedynie czterech bloków ochronnych przy obliczaniu czasu terapii oraz dawek promieniowania.

Jeden z radiologów uważał, że w celu zapewnienia odpowiedniego poziomu bezpieczeństwa powinno się stosować pięć bloków ochronnych. Zdecydowano więc, że do TPS dodadzą zsumowane informacje o pięciu blokach, tak jakby to był tylko jeden blok. TPS co prawda przyjął dane, jednak wyniki obliczeń były błędne. Mianowicie obliczony okres trwania radioterapii był znacznie dłuższy, niż powinien. Co naraziło pacjentów na przyjmowanie zbyt dużych dawek promieniowania.

Po śledztwie okazało się, że nikt tak naprawdę nie sprawdził, czy nowa metoda podawania danych o blokach ochronnych jest poprawna. Nie wykonano żadnych testów ani nie skonfrontowano obliczeń TPS z obliczeniami ręcznymi. Winę za całe zajście ponosi więc jedynie personel szpitala, a nie twórcy oprogramowania. Jest to świetny przykład na to, że nie powinniśmy używać tak ważnych systemów komputerowych niezgodnie z ich instrukcjami.

Otwarcie 5 terminalu na lotnisku Heathrow

W 2008 roku wraz z otwarciem nowego terminala na lotnisku Heathrow wprowadzono do użytku nowy system obsługi bagażów. Jak zapewniają osoby odpowiedzialne za całą operację, system został poddany szczegółowym testom przed oddaniem go do użytku. Jednak rzeczywistość zweryfikowała te zapewnienia już pierwszego dnia. Występowały liczne problemy, system wskazywał mylące komunikaty obsłudze lotnika. Pojawiają się również informacje, że w przypadku ręcznego wyciągnięcia bagażu system całkowicie się wyłączał. W ciągu 10 dni 42 tys. bagażów nie mogło zostać nadanych oraz odwołano ponad 500 lotów, co doprowadziło do milionowych strat.

Nie wiadomo do końca, jakie były przyczyny błędów. Pojawiają się wypowiedzi pracowników, którzy już w czasie testów informowali przełożonych o problemach z systemem. Prawdopodobnie z powodu presji świadomie oddano nie do końca przetestowany system, byle by wyrobić się w terminie.

Awaria GitLab

Dla ludzi związanych z programowaniem GitLab jest dość znanym serwisem. Umożliwia on zarządzanie całym projektem w jednym miejscu, wliczając w to przechowywanie kodu źródłowego, budowanie aplikacji, utrzymywanie dokumentacji i wiele innych. Sama awaria jest dość świeżą sprawą, ponieważ wszystko wydarzyło się 31 stycznia 2017 roku.

Oryginalnie GitLab używał tylko jednego serwera bazy danych i właśnie na 31 stycznia zaplanowano testy rozwiązania używającego dwóch serwerów na testowym środowisku. W tym celu rozpoczęto kopiowanie danych ze środowiska produkcyjnego na testowe, co było standardową procedurą. W międzyczasie administratorzy zobaczyli wzmożoną ilość operacji na produkcyjnej bazie danych, co początkowo zidentyfikowali jako spam. Okazało się, że to automatyczne mechanizmy zaczęły usuwać z bazy konta zidentyfikowane jako niebezpieczne (na przykład spamerzy). W rezultacie wzmożonego ruchu cały proces kopiowania danych zaczął zwalniać, a później zatrzymał się całkowicie w wyniku rozbieżności danych (informacje z bazy produkcyjnej były usuwane w trakcie procesu kopiowania). Po kilku próbach wznowienia procesu jeden z pracowników postanowił usunąć bazę testową i rozpocząć proces od nowa. Niestety przez przypadek usunął bazę produkcyjną i zorientował się, gdy ponad 300 GB danych było już usunięte.

Takie sytuacje się zdarzają, więc pracownik po prostu zalogował się na zewnętrzny serwer, na który wysyłane były kopie zapasowe baz danych. Z przerażeniem odkrył, że katalog przechowujący kopie jest pusty. W późniejszym śledztwie okazało się, że kopie zapasowe z powodu błędu w konfiguracji nie wykonywały się już od dłuższego czasu. Normalnie wszystkie błędy wykonywania kopii zapasowych były wysyłane do pracowników na maile. Jednak po sprawdzeniu wyszło na jaw, że konfiguracja skryptów wysyłających maile również była błędna. Na szczęście zespół wykonywał też co 24 godziny zrzuty całych dysków, które uratowały całą firmę. Dodatkowo programista przygotowujący migrację danych również wykonał zrzut dysku przed całą operacją.

Po 18 godzinach udało się przywrócić aplikację, jednak do stanu sprzed 6 godzin od wystąpienia awarii. Firma szacuje, że przez to utracili dane o co najmniej 5000 nowych projektach, 5000 komentarzach oraz 700 użytkownikach. Na pochwałę zasługuje to, w jaki sposób firma podeszła do awarii. Nie było żadnego zamiatania pod dywan, cała procedura przywracania danych była transmitowana na żywo w serwisie YouTube (w pewnym momencie stream śledziło 5000 osób), po wszystkim wystosowano oświadczenie, w którym szczegółowo wyjaśniono, co się stało. Dodatkowo firma opublikowała listę usprawnień, które wdroży, aby taka sytuacja już nigdy się nie potwierdziła.

Koszmarny pierwszy dzień w pracy

Dość zabawna historia, która przydarzyła się jednemu z użytkowników Reddita. Użytkownik ten został zatrudniony jako młodszy programista. Po przyjściu do pracy dostał mini książkę z poradnikiem jak skonfigurować środowisko programistyczne na swoim komputerze. W pierwszym kroku musiał uruchomić skrypt, który tworzył na jego komputerze bazę danych z testowymi danymi. Na końcu skrypt pokazywał dane dostępowe do bazy, które należało potem używać przy programowaniu. Niestety pracownik zamiast użyć danych ze skryptu, skonfigurował swoje środowisko, korzystając z danych z książki.

Po skonfigurowaniu wszystkiego przyszła pora na uruchomienie testów. Przeważnie działają one tak, że przed każdym testem baza danych jest czyszczona i wypełniana konkretnymi danymi wymaganymi przez test (tak, aby każdy test był niezależny). Niestety dane wprowadzone przez młodego programistę (te, które znalazł w książce) okazały się danymi bazy produkcyjnej. Z relacji tego pracownika wynika, że firma nie miała prawidłowo skonfigurowanych kopii zapasowych i w rezultacie dane zostały bezpowrotnie utracone.

Bulwersująca jest reakcja szefa przedsiębiorstwa, który całą winę zrzucił na pracownika, straszył go konsekwencjami prawnymi, a na końcu kazał się wynosić i nigdy nie wracać. Oczywiście główną przyczyną tego problemu były wadliwe procedury w firmie. Przede wszystkim początkujący programista nie powinien mieć dostępu do produkcyjnej bazy, dodatkowo mechanizmy wykonywania kopii zapasowej powinny być prawidłowo skonfigurowane.

Na szczęście użytkownicy Reddita słusznie pocieszali autora wątku, ponieważ nie było w tym jego winy. Co ciekawe, wśród pocieszających był również pracownik GitLaba odpowiedzialny za skasowanie bazy danych, o której mówiłem w poprzednim akapicie.

Testy są ważne

coders lab logo

Jak widać, testerzy odgrywają ogromną rolę w procesie tworzenia oprogramowania. Jeśli myślisz o karierze testera, warto zapoznać się z ofertą intensywnych kursów Szkoły IT — Coders Lab. W tym miesiącu szkoła uruchomiła zdalny tryb kursu Tester Manualny, który możecie połączyć z pracą lub studiami (jest też dostępna 2-tygodniowa opcja stacjonarna, ale wtedy wzrasta intensywność nauki). Dla bardziej zaawansowanych dostępny jest też zdalny kurs Testera Automatycznego, na którym nauczycie się tworzyć testy automatyczne i poznacie dobre praktyki testerskie… żeby do podobnych wpadek związanych z oprogramowaniem już nigdy nie doszło ;).

Dzięki za dzisiaj i mam nadzieję, że się podobało. Za tydzień widzimy się w kolejnym odcinku, gdzie opowiem Wam o Scrumie oraz innych metodologiach pracy. Do zobaczenia!

Zapraszam również na największe w Polsce forum dla programistów Android. Jeśli macie pytania odnośnie do kariery programisty — zapraszam do działu Kariera programowanie. Zachęcam również do przejrzenia działu Praca oraz zlecenia dla programistów — być może to właśnie tam znajdziesz swoją pierwszą pracę.

Pozostałe odcinki serii o programowaniu.

Artykuł powstał we współpracy z Coders Lab

Źródła:
https://pl.wikipedia.org/wiki/Mars_Climate_Orbiter
https://en.wikipedia.org/wiki/Instituto_Oncol%C3%B3gico_Nacional
https://www.independent.co.uk/news/uk/home-news/disastrous-opening-day-for-terminal-5-801376.html
https://about.gitlab.com/2017/02/10/postmortem-of-database-outage-of-january-31/
https://www.reddit.com/r/cscareerquestions/comments/6ez8ag/accidentally_destroyed_production_database_on/



  • mozilla007

    Największą wpadka ludzkość jest Windows.

  • Outsider

    Zaczęło się fajnie dopóki nie doczytałem do końca o koderslab i ich wypocinach. Szkoda, że nie było podane na początku iż jest to chamska reklamówka.

    • Paweł Dedio

      Współpraca z CodersLab trwa już od dłuższego czasu, jest o tym informacja również na stronie głównej. Drobne wstawki reklamowe raczej nie wpływają na negatywny odbiór całego artykułu, a dodatkowo są wyraźnie oznaczone. Jednak dziękuję za krytykę, w przyszłości postaram się lepiej oznaczać artykuły, w których występują reklamy.

      • Tomasz Piątek

        Na innych serwisach wpis sponsorowany jest oznaczony odpowiednią labelką gdzieś na górze 🙂 Mimo, że tekst dość ciekawy to brak oznaczenia o reklamie psuje ogólny odbiór.

  • ksm123@geekhack

    W gdzie Therac-25?

  • Martina Neumayer
  • stark2991

    Co do pierwszego – jednostki imperialne powinny być raz na zawsze wyplenione z nauki i zapomniane. Jedyne co powodują, to chaos i dezorientację, jak zresztą widać na przykładzie.



x