Spis treści:

Naucz się: Inżynier DevOps Zawód
Dowiedz się więcejZnana historia o błędzie oprogramowania, który doprowadził do tragicznych konsekwencji, dotyczy amerykańskiego systemu obrony przeciwrakietowej Patriot. System ten został zaprojektowany do śledzenia obiektów poruszających się po z góry określonej trajektorii. Jednak z powodu błędu w kodzie błąd obliczeniowy wzrastał z każdą minutą działania systemu. W jednej z baz system był aktywny przez 100 godzin, co ostatecznie doprowadziło do całkowitej awarii. Nieprawidłowo obliczony kurs atakującego pocisku spowodował uderzenie w bazę, zabijając 28 osób. Poprawka naprawiająca błąd została wydana dopiero następnego dnia. Ta sytuacja podkreśla wagę dokładnego testowania oprogramowania i regularnych aktualizacji zabezpieczeń.
NASA również napotkała problemy spowodowane błędami oprogramowania. Jeden z najsłynniejszych incydentów dotyczył satelity Mars Climate Orbiter, który został utracony w kosmosie. Przyczyną był prosty, ale krytyczny błąd: wykonawca nie przeliczył stóp i funtów na system metryczny. Centrum sterowania wysyłało polecenia określające siły w niutonach, a oprogramowanie interpretowało te dane jako funty-siła. W rezultacie wart 125 milionów dolarów aparat przeleciał zbyt blisko powierzchni Marsa i uległ awarii. Misja zakończyła się niepowodzeniem, co podkreśla wagę precyzji w projektach inżynieryjnych i programowaniu.
Zebraliśmy pomocne historie profesjonalnych programistów i przygotowaliśmy krótki poradnik, który pomoże Ci zminimalizować prawdopodobieństwo wystąpienia błędów w kodzie i zabezpieczyć się przed ich potencjalnymi konsekwencjami. Stosując najlepsze praktyki i wskazówki, możesz poprawić jakość swojego oprogramowania i poprawić jego stabilność.
Jak skomplikować kod, aby nikt go nie zrozumiał

Aleksiej Niekrasow jest dyrektorem programu Python w MTS i dyrektorem programu Python w Skillbox. Dzięki swojemu doświadczeniu i wiedzy odgrywa kluczową rolę w rozwoju Pythona jako jednego z najbardziej pożądanych języków programowania we współczesnym sektorze IT. Aleksiej aktywnie uczestniczy w szkoleniach i wspieraniu profesjonalistów dążących do opanowania Pythona, co przyczynia się do rozwoju zawodowego i ekspansji studentów i specjalistów w tej dziedzinie.
Na początku mojej kariery zafascynowało mnie programowanie funkcyjne i postanowiłem zastosować ten paradygmat do rozwiązania nowego problemu. W tamtym czasie w projekcie zaimplementowano już model obiektowy. Problem, z którym się zetknąłem, był następujący:
Podczas opracowywania rozwiązania wszystko wydawało się jasne. Jednak miesiąc później mój menedżer poprosił mnie o przejrzenie kodu. Poświęciliśmy około 30 minut na zrozumienie jego logiki i zidentyfikowanie błędu. Komentarze w kodzie znacznie ułatwiłyby ten proces, ponieważ szybciej zapamiętałbym swoje intencje. Niestety, nie było ich wcale. Ostatecznie musiałem przepisać cały kod.
Oto kilka wskazówek, które mogą być przydatne. Po pierwsze, ważne jest, aby zawsze wyznaczać jasne cele i zadania. To pomoże Ci skupić się na najważniejszym i uniknąć rozproszenia uwagi. Po drugie, regularnie analizuj swoje działania i wyniki, aby zrozumieć, co działa, a co nie. Pozwoli Ci to wprowadzić niezbędne zmiany i ulepszyć strategie. Nie zapominaj również o znaczeniu samokształcenia. Ciągły rozwój umiejętności i wiedzy pomoże Ci utrzymać konkurencyjność w dynamicznie zmieniającym się świecie. Wreszcie, otaczaj się ludźmi, którzy Cię inspirują i wspierają. Stworzy to pozytywną atmosferę i pomoże Ci osiągnąć Twoje cele.
- Staraj się zachować spójny styl, w przeciwnym razie Twój projekt w końcu zamieni się w bałagan.
- Nie popisuj się opanowaniem, stosując skomplikowane rozwiązania – po pewnym czasie nie będziesz w stanie odczytać własnego kodu. A jeśli w pobliżu są inni programiści, to będzie to zupełnie niefajne.
- Nie angażuj się w przedwczesną optymalizację.
- Nadaj zmiennym jasne nazwy: po trzech miesiącach trudno zapamiętać, co dokładnie dana zmienna ma robić.
Jak zmarnować dwa dni na szukanie błędu z powodu pośpiechu

Michaił Kornejew jest liderem zespołu w BestDoctor i autorem popularnego kanału YouTube „Cunning Python”. Dzieli się swoim doświadczeniem w tworzeniu oprogramowania i uczy widzów podstaw programowania w Pythonie. Jego kanał oferuje liczne przydatne samouczki wideo, które pomogą zarówno początkującym, jak i doświadczonym programistom w doskonaleniu umiejętności. Michaił aktywnie dzieli się swoją wiedzą i najlepszymi praktykami, dzięki czemu jego treści są cennym źródłem informacji dla każdego, kto interesuje się IT i programowaniem.
Tworzyłem prototyp projektu i popełniłem literówkę w niewidocznym miejscu. Ten drobny błąd doprowadził do dwóch dni intensywnego debugowania, ponieważ moja aplikacja zaczęła się okresowo rozłączać. Musiałem dokładnie przeanalizować kod Pythona i ustawienia serwera nginx, aby zidentyfikować i rozwiązać problem.
Aby skrócić czas rozwiązywania problemów, rozsądnym rozwiązaniem byłoby podzielenie kodu na mniejsze bloki i przetestowanie każdego z nich przed wdrożeniem. Nie był to jednak mój główny cel i zależało mi na jak najszybszym stworzeniu prototypu. W rezultacie musiałem poświęcić dużo czasu na identyfikację źródła błędu, ponieważ ujawniał się on na styku kilku różnych systemów.
Jak chronić się przed takimi problemami:
- Pamiętaj, że błędy zawsze się pojawią, dlatego musisz pisać kod w sposób, który ułatwi późniejsze znalezienie obszarów problemowych.
- Zrozum testowanie i koniecznie pisz testy.
- Sprawdź, jak działa kod: na przykład, czy się uruchamia, czy nie. Większość błędów to literówki. Jeśli masz testy, zobaczysz je. Ale jeśli ich nie masz i mimo to uruchomisz sprawdzanie, z pewnością znajdziesz inne problemy. Wielokrotnie widziałem, jak początkujący programista zamykał zadanie bez sprawdzenia kodu – ostatecznie po prostu nie działało.
- Pamiętaj, aby przesłać projekt do recenzji kodu. To przydatna praktyka.
- Jeśli programujesz w Pythonie, powinieneś rozumieć pisanie. I pamiętaj, że jawne jest lepsze od niejawnego. Pozwoli ci to wychwycić pewne błędy podczas pisania kodu.
- Twórz kopie zapasowe bazy danych i różnych wersji kodu na wypadek, gdyby wszystko się zepsuło. I to się zdarza dość często. Jeśli coś pójdzie nie tak, ale masz kopię zapasową, nic złego się nie stanie. Plan odzyskiwania jest niezbędny w przypadku każdego projektu.
Jak ponieść duże straty w firmie bez zabierania głosu

Alexey Firsov jest szefem działu Python w S7 TechLab. Na tym stanowisku odpowiada za wdrażanie i rozwój technologii Python w projektach firmy. Alexey posiada bogate doświadczenie w programowaniu w Pythonie i aktywnie dzieli się swoją wiedzą z zespołem, co przyczynia się do poprawy jakości oprogramowania i wdrażania nowoczesnych rozwiązań. Pod jego kierownictwem S7 TechLab wykorzystuje Pythona do tworzenia wydajnych i skalowalnych aplikacji, co pozwala firmie utrzymać konkurencyjność na rynku technologicznym.
Pracowałem w dziale rozliczeń w znanej firmie, gdzie jednym z zadań było stworzenie programu do obliczania procentów premii. Omówiliśmy możliwe rozwiązanie, a programista rozpoczął jego wdrażanie. Jednak podczas wykonywania zadania wprowadził zmianę w jednym z modułów starego kodu bez powiadomienia zespołu. W rezultacie testerzy skupili się wyłącznie na sprawdzaniu nowego kodu, co doprowadziło do nieoczekiwanych błędów i luk w systemie. Ten przypadek podkreśla wagę komunikacji w zespole i ostrożnego podejścia do zmian w kodzie, ponieważ nawet drobne zmiany mogą znacząco wpłynąć na funkcjonalność produktu.
Podczas edycji starego modułu programista popełnił błąd, używając typu danych float. Używanie arytmetyki zmiennoprzecinkowej do obliczeń pieniężnych jest niedopuszczalne i prowadzi do wyższych niż zwykle premii, a w konsekwencji do znacznych strat finansowych dla firmy. Za tę sytuację odpowiadają dwie osoby: programista, który nie powiadomił zespołu o zmianach w kodzie, oraz menedżer, który zaniedbał proces weryfikacji. Aby zmniejszyć ryzyko wystąpienia takich błędów, programiści powinni dokumentować zmiany w kodzie, aby zespół ds. zapewnienia jakości mógł w pełni przetestować wszystkie nowe komponenty systemu. To nie tylko poprawi jakość kodu, ale także pomoże uniknąć niepotrzebnych strat w przyszłości.
Niebezpieczne błędy wynikają z dwóch głównych czynników. Pierwszy z nich wynika z niedociągnięć w procesie rozwoju oprogramowania, gdy programiści nie uwzględniają wszystkich możliwych przypadków jego użycia. Drugim czynnikiem jest niewystarczające testowanie, co może prowadzić do tego, że niektóre błędy pozostają niewykryte, dopóki nie zaczną powodować poważnych problemów. Błędy te mogą negatywnie wpływać na funkcjonalność produktu, bezpieczeństwo danych i komfort użytkowania. Aby zmniejszyć ryzyko wystąpienia niebezpiecznych błędów, konieczne jest wdrożenie wysokiej jakości procesów rozwoju i testowania, a także regularne aktualizowanie oprogramowania.
Wśród powszechnych, choć mniej krytycznych, błędów często występują problemy związane z nagłymi przerwami w działaniu sieci. Na przykład, dział bezpieczeństwa wyłączył kiedyś dostęp do internetu bez powiadomienia zespołu. W rezultacie wymagana usługa nie mogła zostać uruchomiona w zaplanowanym czasie. Takie błędy są zazwyczaj szybko identyfikowane i łatwo rozwiązywane. Takie incydenty podkreślają wagę jasnej komunikacji w zespole i regularnego monitorowania infrastruktury sieciowej. Błędy w systemach często pojawiają się podczas procesu integracji i można je łatwo naprawić, wycofując lub modyfikując kod. Na przykład, integrując naszą usługę z systemami płatności, które nie zapewniają środowiska testowego, nie mogliśmy przetestować kodu z wyprzedzeniem. W rezultacie testy przeprowadzono bezpośrednio w środowisku produkcyjnym. W takich sytuacjach ważne jest, aby z wyprzedzeniem opracować strategię, aby uniknąć wstrzykiwania ruchu do systemu podczas testów, co pomoże zminimalizować ryzyko i zapewnić stabilne działanie usługi. Błędy architektoniczne mogą pojawić się podczas tworzenia oprogramowania. W jednym z moich projektów — startupie bez dedykowanego zespołu ds. zapewnienia jakości — stworzyliśmy bota, który wykonywał czynności zgodnie z predefiniowanym skryptem. Po każdym kroku należało określić kolejny krok. Po uruchomieniu projektu w środowisku produkcyjnym okazało się, że skrypt odwoływał się do samego siebie, co prowadziło do nieskończonej pętli. W rezultacie system przestał działać. Takie błędy architektoniczne podkreślają znaczenie dokładnego testowania i przeglądu logiki skryptów przed uruchomieniem projektu.
Zawód inżyniera DevOps
Nauczysz się administrować systemem Linux, konfigurować serwery WWW i opanujesz metodologię DevOps: zautomatyzujesz rozwój złożonych produktów IT. Skorzystaj ze wsparcia Centrum Kariery i zostań Młodszym Specjalistą w 7 miesięcy. Ten kurs jest dla Ciebie odpowiedni, nawet jeśli nigdy nie pracowałeś w administracji systemami ani programowaniu.
Dowiedz się więcej
