Etyka w Informatyce i nie tylko…

etyka1Od kiedy tylko Człowiek nauczył się odróżniać dobro od zła zadawał sobie pytania mające na celu określenie zasad co jest dobre (poprawne), a co złe (błędne), zaczął tworzyć i badać systemy myślowe które miały na celu pomóc ludziom w byciu dobrymi. Tak powstały pierwsze kodeksy. Z biegiem lat zaczęły tworzyć się rozbudowane instytucje religijne które narzucały ludziom jedyny słuszny wzór postępowania określony w dogmatach. Przez całe stulecia pobocznym nurtem rozwijały się też świeckie kodeksy postępowań np. dla poszczególnych zawodów. Chyba najbardziej znana jest etyka lekarzy ze słynnym „nie szkodzić” Hipokratesa, ale inne zawody np. prawnicy, elektrycy też mają swoje kodeksy i zasady.

W obecnym świecie uzależnionym od technologii cyfrowych informatycy wpływają na coraz więcej dziedzin życia, mamy coraz większe możliwości zmiany świata, ale z dużymi możliwościami wiąże się też duża odpowiedzialność. W związku z tym nasuwa się pytanie gdzie w naszej pracy przebiega granica między dobrem a złem? Kiedy należy zacząć zastanawiać się nad swoim postępowaniem? Postaram się przedstawić te problemy w tym artykule.

Problem programisty

Wyobraźmy sobie następujący problem: „Programista proszony jest o dokonanie zmiany w aplikacji wykorzystywanej przez międzynarodowy bank. Wykonał wszystkie zaplanowane testy. Po ich wykonaniu wpadł na pomysł wykonania jeszcze jednego dodatkowego testu. Test ten się nie powiódł. Ponieważ nie miał czasu na wykrycie błędu, jaki go spowodował, oddał swoją pracę z podsumowaniem, że wszystkie tety przebiegły pomyślnie”

Czy taka sytuacja jest rzadkością? Wręcz przeciwnie. Pomijając na chwilę etykę zastanówmy się czy widzieliśmy kiedykolwiek oprogramowanie bez błędów? Weźmy na przykład systemy Windows. Ilość poprawek jakie możemy znaleźć w Windows Update Microsoftu jest przeogromna, a jest tylko wierzchołek góry lodowej, czyli łatki np. na kluczowe błędy związane z bezpieczeństwem i stabilnością których niezałatanie powodowałoby milionowe straty. Jeśli chodzi o mniej ważne, choć nadal uciążliwe dla użytkowników błędy to sprawa wygląda gorzej. Nawiasem mówiąc można uznać że cały Windows 8 i 8.1 i polityka pchania się firmy na siłę w wizję której ludzie po prostu nie chcą (Modern UI) to jeden wielki błąd, co widać po obecnych wynikach finansowych firmy, ale pomijam to. W systemach Microsoftu istnieją czasami błędy które nie są naprawiane od lat np. problem z dwoma skrótami które jeśli będą wskazywały na siebie nawzajem zawieszą powłokę systemową, lub nieścisłości w kodowaniu plików zapisanych z użyciem systemowego Notatnika. Czasami jednak można pochwalić Microsoft za prace jaką wykonuje. Bardzo fajnym projektem był pomysł na ustabilizowanie przyszłych wersji Windows po XP i wyeliminowanie częstych „niebieskich ekranów śmierci”. Badacze z Microsoft Research Lab w Cambridge opowiedzieli o tym kilka miesięcy temu[1]. Mimo wszystko postawienie tezy że w Windows nie ma błędów natychmiast zakończyłoby się jej obaleniem po kilku minutach pracy w dowolnym systemie z tej serii.

A dedykowane systemy dla innych specjalnych odbiorców np. wojska, policji, medycyny i wszelkie systemy bankowe? Tam oprogramowanie testowane jest setki, jeśli nie tysiące razy gdyż nierzadko od takiego oprogramowania zależy nasze życie lub bezpieczeństwo finansowe (dla wielu na jedno wychodzi). Mimo wszystko nie można mieć nigdy pewności że oprogramowanie będzie bezbłędne, a przypadki takich błędów które kończyły się katastrofami są często przytaczane[2]. Mimo pozornej[3] doskonałości sprzętu zawsze pozostaje czynnik ludzki projektanta oprogramowania. Informatyka mimo swojej teoretycznej doskonałości potwierdzonej żelaznymi zasadami matematyki jest w praktyce tak urzekająco niedoskonała że nie da się jej nie kochać 🙂

Czy fakt że ludzie zawsze mogą popełniać błędy usprawiedliwia naszego programistę? Zależy to od rodzaju błędu. Jeśli inżynier przeprowadził wszystkie zaplanowane testy i zakończyły się pomyślnie, a dopiero dodatkowy test wymyślony przez niego się nie powiódł to może to oznaczać że kluczowe funkcje systemu odpowiedzialne za operacje finansowe działają poprawnie, a błąd jest w jakiejś pobocznej funkcji, występuje tylko w bardzo szczególnych przypadkach i są małe szanse że zostałby w ogóle wykryty podczas pracy systemu. Może być też zupełnie inaczej, że dodatkowy test wykrył jakaś zupełnie nieprzewidzianą sytuację, która może mieć wpływ na funkcjonowanie całego systemu. Zauważmy że błąd ten nie musiał wynikać z pracy tegoż programisty i mógł od lat tkwić w tym systemie bankowym pozostając nieuchwytnym.

Co powinien zrobić ten programista? Jak można ocenić słuszność jego decyzji? Z logicznego punktu widzenia dobrą oceną sytuacji jest wyśledzenie bilansu zysków i strat po stronie programisty i zleceniodawcy. Podzieliłem ocenę na 3 scenariusze zależne od typu błędu:

  1. Jeśli błąd nie wynikałby z pracy tego programisty to według mnie dobrym rozwiązaniem byłoby poinformowanie zleceniodawcy że w systemie może tkwić błąd popełniony przez jakiegoś innego dawnego pracownika. Poważna instytucja bankowa odpowiedzialna za pieniądze setek tysięcy ludzi zapewne poważnie wzięłaby wszelkie ryzyko błędów. Jeśli taki błąd byłby faktycznie poważny to zapewne programista zostałby dodatkowo nagrodzony, płacenie informatykom za wykrywanie błędów w systemach nie jest niczym nowym ani niczym niezwykłym[4]. Oddanie projektu jako w pełni „bezbłędnego” w takim przypadku sprawiło że koło nosa przeszłaby mu premia, ale nic by nie stracił. Zleceniodawca miałby nadal niezauważony błąd co narażałoby go na straty w przyszłości.
  2. Jeśli błąd wynikałby z pracy tego programisty, ale byłby drobny (np. dotyczył jakiejś pobocznej funkcjonalności i występował tylko w bardzo szczególnych przypadkach) to możliwe że nigdy nie zostanie wykryty. W tym przypadku programista nic by nie zyskał i nic nie stracił w wyniku nieinformowania o błędzie, a zleceniodawca także nic by nie stracił ani nie zyskał.
  3. Jeśli błąd miałby poważne konsekwencje i wynikał z pracy tego programisty to mógłby doprowadzić do niemałej katastrofy, awaria takiego systemu nawet na kilka godzin to straty idące w kwoty rzędu miliardów dolarów. Zleceniodawca straciłby bardzo dużo, a  programista zostałby dotkliwie ukarany. Dobrym wyjściem z tej sytuacji byłoby powiadomienie zleceniodawcy o błędzie i jak najszybsze wydanie poprawki do systemu.

Jak uznać która opcja opłaci się najbardziej? Według mnie to kwestia doświadczenia i odpowiedniej oceny sytuacji, a trochę także intuicji. Nic nie jest tutaj zupełnie białe i zupełnie czarne. Nie istnieje jedna słuszna droga jaką można postąpić.

Podsumowanie

Na pewno każdy kto ma okazje pracować w IT miał przypadek w którym musiał zastanowić się nad tym co ma zrobić w sensie etyki. W swoim środowisku zetknąłem się z wieloma takimi sytuacjami wśród których najciekawsza była propozycja zlecenia odzyskiwania danych z dysku twardego w celu odnalezienia przez zazdrosnego męża dowodów zdrady usuniętych przez jego żonę. Pozornie wydaje się że zlecenie to jest zgodne z prawem, a nawet słuszne bo można odnaleźć prawdę itd., jednak ręka potrafi zawahać się kiedy zdajemy sobie sprawę że przyłożymy rękę do rozpadu pewnego małżeństwa i np. pomyślimy sobie o cierpiących z tego powodu dzieciach…

W 2011 roku po ponad 10 latach starań Polskiemu Towarzystwu Informatycznemu udało się uchwalić kodeks zawodowy.[5] Zawiera on 12 punktów będących zaleceniami właściwych zachowań w informatyce. Jest to bardzo dobry spis zasad który wspiera informatyków w byciu rzetelnymi, szczerymi i uczciwymi pracownikami żyjącymi w zgodzie ze swoją pasją i sumieniem. Czy należy jednak traktować te 12 zasad jako „żelazne reguły”? Jak dowodzi przykład naszego programisty wszystko zależne jest od sytuacji. Czy wobec tego istnieją jakieś uniwersalne zasady jakimi trzeba kierować się w naszej pracy? Według mnie tak. Fundamentem libertarianizmu jest zasada nieograniczonej swobody dysponowania sobą o ile ta swoboda nie ogranicza wolności innego człowieka[6]. Według mnie świetnie pasuje to do idei jaką powinniśmy się kierować, przede wszystkim nie przeszkadzać i nie ograniczać innych dziedzin życia dla których technologia jest tylko narzędziem, ale także pokazywać ludziom wolność jaką niesie poznanie technologii.