Spis treści:

Bezpłatny kurs Pythona ➞ Mini kurs dla początkujących i doświadczonych programistów. 4 świetne projekty portfolio, czat na żywo z prelegentem. Kliknij i dowiedz się, czego możesz nauczyć się na kursie.
Dowiedz się więcejCzy zauważyłeś kiedyś, że układ YouTube jest niestabilny? Albo jak VKontakte i Facebook czasami się zacinają? Jeśli jesteś wieloletnim fanem Apple, prawdopodobnie pamiętasz trudności związane z iOS 11. Te problemy z wydajnością i wyświetlaniem treści mogą znacznie pogorszyć komfort użytkowania. Zrozumienie przyczyn takich usterek może pomóc programistom w tworzeniu bardziej stabilnych i wydajnych platform.
Stereotypowe żarty często twierdzą, że błędy popełniają tylko nowicjusze w niskobudżetowych startupach. Jednak w praktyce nawet doświadczeni programiści z Doliny Krzemowej nie są odporni na wpadki. Główną przyczyną tego zjawiska jest czynnik ludzki. Błędy mogą zdarzyć się każdemu, niezależnie od poziomu umiejętności czy doświadczenia. Doświadczeni programiści średniego i wyższego szczebla podzielili się swoimi poważnymi błędami i udzielili wskazówek, jak zmniejszyć ich liczbę w kodzie. Te zalecenia pomogą poprawić jakość oprogramowania i zwiększyć efektywność rozwoju. Stosowanie najlepszych praktyk, takich jak regularne przeglądy kodu, testowanie i korzystanie z narzędzi do analizy statycznej, może znacząco zmniejszyć prawdopodobieństwo wystąpienia awarii. Doświadczenie pokazuje, że dbałość o szczegóły i ciągłe samokształcenie odgrywają kluczową rolę w ograniczaniu liczby błędów w procesie programowania.
Nie uwzględniono wstecznej kompatybilności i udostępniono produkt do produkcji zbyt wcześnie

Konstantin jest programistą Java klasy średniej pracującym w jednym z wiodących rosyjskich banków. Jego doświadczenie w tworzeniu oprogramowania i dogłębna znajomość Javy pozwalają mu skutecznie rozwiązywać złożone problemy i wdrażać innowacyjne rozwiązania. Konstantin aktywnie uczestniczy w projektowaniu i rozwoju aplikacji bankowych, co przyczynia się do poprawy jakości obsługi klienta i poprawy jakości usług. W swojej pracy wykorzystuje nowoczesne technologie i metodologie programistyczne, co czyni go niezbędnym członkiem zespołu. Konstantin dąży do ciągłego rozwoju zawodowego i opanowywania nowych narzędzi, co pozwala mu być na bieżąco z dynamicznie zmieniającym się światem technologii finansowych.
Obecnie rozwijamy system przetwarzania transakcji płatniczych. Jednym z zadań była zmiana sposobu przechowywania informacji o kwocie transakcji, w tym zarówno kwoty, jak i waluty. Stworzyłem nowy typ danych „Kwota” i zaimplementowałem go we wszystkich niezbędnych częściach systemu. Proces wdrażania przebiega pomyślnie.
Zaktualizowałem jeden z obiektów, dodając nowy typ i usuwając przestarzałe pola służące do przesyłania danych między modułami. Testowanie zakończyło się sukcesem, ale wszystkie moduły zostały zainstalowane jednocześnie w środowisku laboratoryjnym, co nie odzwierciedla rzeczywistej sytuacji. Pojawiły się problemy w środowisku produkcyjnym, a funkcjonalność systemu została zakłócona.
Uwaga: zaktualizowani klienci wysyłają teraz obiekty w nowym formacie, który zawiera pole kwoty i wyklucza stare pola. Jednocześnie żądania były przetwarzane przez starsze usługi, które nie były świadome nowego pola, co uniemożliwiło deserializację odebranych obiektów. Podczas wycofywania aktualizacji w tej usłudze utracono kilkaset transakcji.
Ważne jest, aby pamiętać o potrzebie wstecznej kompatybilności i emulować warunki produkcyjne podczas testowania. Pomoże to zapewnić niezawodność i stabilność produktu w warunkach rzeczywistych. Testowanie w warunkach jak najbardziej zbliżonych do produkcyjnych pozwala na wczesne identyfikowanie potencjalnych problemów i zapobieganie ich wystąpieniu w przyszłości. Skuteczne testowanie wstecznej kompatybilności gwarantuje, że nowe zmiany nie zakłócą istniejącej funkcjonalności. Dlatego przestrzeganie tych zasad jest kluczem do udanego rozwoju i utrzymania oprogramowania.
Skończyła mi się kawa — przeglądałem stary kod

Ivan Ponomarev jest liderem zespołu i starszym programistą JavaScript w przeglądarce antywykrywczej GoLogin. Aktywnie przyczynia się do rozwoju i optymalizacji funkcjonalności produktu, zapewniając użytkownikom wysoki poziom bezpieczeństwa i anonimowości. W swojej pracy Ivan wykorzystuje zaawansowane technologie JavaScript, które poprawiają wydajność przeglądarki i rozszerzają jej możliwości. Dzięki jego doświadczeniu i przywództwu zespół GoLogin z powodzeniem stawia czoła wyzwaniom związanym z ochroną danych osobowych i prywatności w Internecie.
Pierwszy komentarz postaci dotyczy kliniki.
Drugi komentarz postaci: Serio, to przejaw banalnej niedbałości. W pośpiechu, aby dodać nowy kod, nie zauważyłem, że niewielka część starego kodu pozostała. To typowy błąd, który może prowadzić do niepożądanych konsekwencji w działaniu programu. Ważne jest, aby zwracać uwagę na szczegóły i testować zmiany, aby uniknąć takich sytuacji.
W wyniku generowania obiektu konfiguracyjnego do uruchomienia przeglądarki, doszło do sytuacji, w której czcionki zostały dodane, a następnie natychmiast usunięte. Nawet doświadczony programista może popełnić taki błąd. Problemy często pojawiają się podczas złożonych zadań i w warunkach dużego stresu, na przykład gdy terminy są napięte lub gdy narastają inne zadania. Błąd okazał się tak absurdalny, że mój mózg nie chciał zaakceptować jego istnienia. Dlatego początkowo uparcie zapewniałem wszystkich, że wszystko jest w porządku.
Morał: błędy wynikające z nieuwagi lub braku koncentracji mogą się zdarzyć nawet doświadczonym profesjonalistom. Nie jest to jednak powód, aby się relaksować i zaniedbywać pracę. Wręcz przeciwnie, należy zwiększyć swoją uważność, jasno zorganizować procesy pracy i zdyscyplinować się, jeśli chodzi o sen i odpoczynek. Tylko wtedy można znacznie zmniejszyć liczbę nieprzemyślanych błędów i poprawić jakość swojej pracy.
Zapomniałem, że ciągi znaków są porównywane leksykograficznie.

Ismail Chamitow zajmuje stanowisko Analityka Produktu (środek). Ismail jest analitykiem danych w Yandex. Na tym stanowisku odpowiada za analizę danych, która pomaga optymalizować produkty i poprawiać doświadczenia użytkowników. Ismail wykorzystuje nowoczesne narzędzia i metody, aby wydobywać cenne spostrzeżenia z dużych wolumenów danych. Jego wiedza specjalistyczna w dziedzinie analityki pomaga zespołowi opracowywać skuteczniejsze strategie i podejmować świadome decyzje ukierunkowane na rozwój produktów Yandex.
Kiedyś natknąłem się na poważny błąd, gdy zapytano mnie: „Jak ograniczyłeś wersję w tym raporcie?”. Podczas przetwarzania danych użyłem warunku wersja >= «12.0» do filtrowania rekordów z określoną wersją. Jednak to porównanie ciągów znaków ma charakter leksykograficzny, co prowadzi do nieprawidłowych wyników: na przykład wersja 2.0 jest wyższa niż 12.0. Aby uniknąć takich błędów, ważne jest używanie formatów, które są poprawnie obsługiwane podczas porównywania, takich jak daty ISO 8601. Formaty te umożliwiają dokładne i obiektywne porównania leksykograficzne, co jest szczególnie ważne podczas pracy z różnymi wersjami oprogramowania.
Ostatnio, omawiając raport półroczny z menedżerem produktu, napotkaliśmy problem: niektóre dane były niepoprawne. Oznaczało to, że mogliśmy z dumą prezentować znaczący wzrost w dziesiątkach procent, który w rzeczywistości nie istniał, lub mogliśmy przeoczyć rzeczywisty wzrost w obszarach, w których faktycznie występował. Błąd polegał na tym, że użyłem nieaktualnego wykresu i danych, które obejmowały nie tylko Rosję, ale także rynek globalny. Takie błędy pojawiają się zawsze, gdy przeceniam swoją wiedzę i doświadczenie w tym obszarze. Należy pamiętać, że dokładna weryfikacja danych i dbałość o szczegóły są kluczem do uzyskania dokładnych i rzetelnych raportów.
Błędy naturalnie budzą strach, a chęć ich minimalizacji jest w pełni uzasadniona. Jednak, jak zauważa dyrektor zarządzający Yandex, Tigran Khudaverdyan, tworzenie udanych produktów wymaga umiejętności radzenia sobie z wyzwaniami, a czasem poświęcania snu. Liderzy branży nie boją się błędów, a wręcz popełniają je regularnie. Pozwala im to znaleźć rozwiązania problemów, które wcześniej wydawały się nierozwiązywalne. Każdy błąd i każde doświadczenie z wpadkami w produkt staje się kamieniem milowym do skuteczniejszych rozwiązań. Dlatego ważne jest nie tylko dążenie do perfekcji, ale także akceptowanie błędów jako elementu procesu innowacji.
Morał: nie bój się błędów, ale bądź ostrożny wobec nierozwiązanych problemów. Podchodź do każdego projektu z pełną odpowiedzialnością i traktuj go jak swój własny biznes.
Ważne jest, aby zachować poczucie, że wciąż jesteś początkującym i rozwijasz się jako specjalista. Nadmierna pewność siebie może prowadzić do błędów i zawężania perspektywy. Ciągła chęć uczenia się i samodoskonalenia pomoże uniknąć stagnacji i poprawić umiejętności zawodowe. Otwartość na nową wiedzę i doświadczenia przyczynia się do głębszego zrozumienia danej dziedziny i poszerza horyzonty.
Nie napisałem najlepszego kodu.


Egor Volokitin zajmuje stanowisko dyrektora technicznego w przeglądarce GoLogin, chroniącej przed wykryciem. Na swoim stanowisku odpowiada za rozwój i wdrażanie innowacyjnych technologii zapewniających użytkownikom wysoki poziom anonimowości i bezpieczeństwa w sieci. Pod jego kierownictwem zespół GoLogin aktywnie pracuje nad poprawą funkcjonalności i wydajności przeglądarki, czyniąc ją liderem na rynku technologii antywykrywalnych. Egor aktywnie dzieli się swoim doświadczeniem i wiedzą w dziedzinie ochrony danych osobowych, przyczyniając się do popularyzacji bezpiecznego przeglądania stron internetowych.
Pierwsza wersja kodu ma złożoność kwadratową ze względu na użycie operatora rozproszenia (elipsy). Funkcja reduce iteruje już po tablicy, podczas gdy operator rozproszenia w tym przypadku po prostu ją kopiuje. Sekwencyjnie iteruje po oryginalnej tablicy i dodaje każdy z jej elementów do bieżącej tablicy. Zatem ogólna złożoność algorytmu wynosi O(n). Prowadzi to do wydłużenia czasu wykonania, co jest niepożądane dla optymalizacji wydajności kodu. Dlatego warto rozważyć alternatywne metody, które mogą zmniejszyć złożoność i poprawić wydajność.
Funkcja Reduce również przetwarza oryginalną tablicę sekwencyjnie, a jej złożoność czasowa wynosi O(n). Użycie operatora rozproszenia prowadzi do powtarzania iteracji tablicy, co oznacza, że przy każdej iteracji pętli zewnętrznej wykonywany jest pełny cykl iteracji na tablicy wewnętrznej. Może to negatywnie wpłynąć na wydajność, szczególnie podczas pracy z dużymi ilościami danych. Optymalizacja tej operacji może znacznie poprawić wydajność kodu i skrócić czas wykonania.
Podczas przetwarzania tablicy o długości 10 elementów, pierwsza wersja kodu jest wykonywana 100 razy. Na pierwszy rzut oka wydaje się to nieznaczącą liczbą, ale jeśli tablica rozrośnie się do 1000 elementów, liczba iteracji wzrośnie do 1 miliona. To już stanowi znaczne obciążenie systemu. Optymalizacja kodu i zmniejszenie liczby iteracji może znacznie poprawić wydajność i zmniejszyć intensywność zasobów podczas operacji na dużych tablicach.
Druga wersja kodu rzadko jest tworzona od razu, ponieważ obecnie poświęca się mniej uwagi wydajności aplikacji. Nie uważam tego za błąd, więc oznaczyłem ją jako zarówno zły, jak i dobry kod. Dlaczego nie oznaczyłem jej jako dobrej? Po prostu nie zdawałem sobie sprawy, że można ją ulepszyć.
Morał: regularnie rozwijaj swoje umiejętności i staraj się wybierać optymalny kod do rozwiązywania problemów. Wpływa to nie tylko na czytelność kodu, ale także na ogólną wydajność aplikacji. Nie zapominaj o znaczeniu wydajności swojej aplikacji, ponieważ może ona znacząco wpłynąć na komfort użytkowania i produktywność.
Czy należy bać się błędów?
Doświadczeni programiści otwarcie i bez skrępowania mówią o swoich błędach i chętnie dzielą się swoim doświadczeniem i radami. Jeśli dążysz do osiągnięcia takiego samego sukcesu jak bohaterowie tej kolekcji, nie ignoruj swoich porażek. Ucz się na nich, analizuj je i wykorzystuj zdobyte doświadczenia, aby się rozwijać. Przyznawanie się do błędów to ważny krok w kierunku rozwoju zawodowego i doskonalenia umiejętności programowania.

