Trudno dyskutować z tym, jak istotna jest kwestia wydajności w programowaniu. To często poruszany temat, mający wpływ na podejmowanie decyzji przy rozwoju oprogramowania oraz samym pisaniu kodu. Jest z tym jednak jeden problem - myślenie o wydajności obniża wydajność.
Kontekst
Zanim zaczniemy chciałbym tylko zwrócić uwagę na fakt, że to co za chwilę napiszę opiera się o doświadczenie oparte o budowanie aplikacji webowych w branży startupowej. Miej to proszę na uwadze, ponieważ nie wszystkie zasady obowiązują wszędzie i mam tego świadomość.
Gdy problem wydajności to nie problem
Praktycznie nie mam wątpliwości że z tematem wydajności spotkałeś się już niejednokrotnie. Jestem też prawie pewien że tylko w pojedynczych przypadkach były to spotkania z realnym problemem, który JUŻ ISTNIAŁ. \*Znacznie częściej wydajność wydaje się być problemem zanim .. rzeczywiście jest problemem. \*
Mam na myśli to, że wielu programistów zastanawia się nad wykorzystaniem jednej lub drugiej technologii i poświęca mnóstwo czasu na analizę różnych benchmarków. Tak jakby kwestią życia i śmierci była oszczędność czasu na poziomie nanosekund przy obsłudze żądań.
I wiesz co? Czasem jest. Ale odpowiedz sobie na pytanie czy w Twoim przypadku również. Ja sam przez 10 lat pracy nie spotkałem się z taką sytuacją. Przy czym do oceny warto tutaj odsunąć swoje ego, które często sugeruje nam zupełnie coś innego.
Podobnie wygląda to przy znacznie mniejszych decyzjach, podejmowanych w codziennej pracy. Czy lepiej wykorzystać pętlę for czy metodę map? Czy warto sięgać po redisa już teraz, czy lepiej poczekać?
I wiesz co? Takie pytania zwykle tylko obniżają wydajność. Twoją. Stajesz się mniej skutecznym programistą, ponieważ odrywasz się od rzeczywistych problemów które są przed Tobą, tworząc takie których jeszcze nie masz.
Nie zgadzasz się? OK! Wróć proszę do tego myślami za kilka godzin i w oderwaniu od emocji zastanów się raz jeszcze. Tak jak podkreśliłem na początku - takie pytania mają mnóstwo sensu ale sytuacji w których tak faktycznie jest, jest wyjątkowo mało, szczególnie jeżeli pracujesz jako web developer.
Podsumowując:
- zwykle wydajność nie jest Twoim problemem
- gdy wydajność JEST Twoim problemem z pewnością będziesz o tym wiedział
- gdy staje się Twoim problemem masz szereg opcji aby go zaadresować
- myślenie o wydajności obniża Twoją wydajność
Wydajność to nie problem ale...
Nie myśl sobie, że jestem ignorantem. Podchodzę do rozwiązywania problemów z uwzględnieniem tego, co jest rzeczywiste a nie tego co wydaje mi się że jest. Z tego powodu to, co napisałem wyżej to nie wymówka do tego aby kwestię wydajnego kodu całkowicie pomijać.
Posiadanie świadomości o dobrych praktykach oraz o działaniach które mogą mieć krytyczny wpływ na obniżenie szybkości Twojej aplikacji jest kluczowe. Mowa tutaj o rzeczach prostych, takich jak optymalizacja wyświetlanych obrazków, przez optymalizację rozmiaru bundle'a aplikacji po kwestię wykorzystania indeksów w relacyjnych bazach danych i tworzenia efektywnych zapytań SQL.
Natomiast takie aktywności należy podejmować bez zastanawiania się czy mają sens, \*czy warto i czy mają zastosowanie w naszym przypadku. Bo mają. \*
Może warto tutaj tylko wykluczyć sytuacje związane z optymalizacją zapytania SQL, które wykonywane jest rzadko a na jego optymalizacji zaoszczędzimy kolejne bezcenne nanosekundy. No .. sam widzisz jak to wygląda.
Podsumowując:
- poszerzaj swoją wiedzę na temat dobrych praktyk
- dowiedz się o krytycznych czynnikach wpływających na wydajność
- cały czas zachowuj dystans i szybko podejmuj decyzję czy optymalizacja ma sens
- nie pozwól by myślenie o wydajności obniżało Twoją wydajność
Perspektywa biznesowa
Podczas rozwoju aplikacji pamiętaj o szerokim kontekście biznesowym bo to pomoże Ci szybciej i dokładniej oceniać to, co jest istotne a co nie jest.
Przykładowo rozwój aplikacji działającej na rynku konsumenckim (tzw. B2C - Business to Customer) charakteryzuje się większym ruchem i aktywnością użytkowników niż w przypadku rynku biznesowego (tzw. B2B - Business to Business).
Np. aplikacja dla B2C może wymagać optymalizacji czasu wczytywania w celu zwiększenia konwersji (% wykonanych akcji docelowych). Tam utrata nawet jednej sekundy może wiązać się z realnym obniżeniem przychodów firmy. Ale znowu warto uwzględnić tutaj skalę działania biznesu. Wielokrotnie widziałem projekty, które realizowały wybitny wynik finansowy a optymalizacji szybkości wczytywania strony nikt nie słyszał.
W innych przypadkach kwestia optymalizacji strony ma wpływ na biznes w perspektywie długoterminowej. Obecnie Google zaprezentował wskaźniki Core Web Vitals i uwzględnia je w kontekście pozycjonowania naszej strony w wyszukiwarce. Zatem wyobraź sobie teraz biznes który opiera swoje funkcjonowanie o ruch organiczny i zaniedba kwestię wydajności, które negatywnie wpłyną na pozycje.
Jednocześnie wyobraź sobie sytuację w której jako programista wskazujesz istotę optymalizacji w kontekście SEO i sugerujesz tę zmianę do biznesu. Trudno mi sobie wyobrazić sytuację w której taka inicjatywa nie zostanie doceniona.
No i przechodząc dalej mamy aplikacje działające na rynku B2B. Może to być chociażby platforma wykorzystywana przez pracowników biurowych do obsługi wewnętrznych procesów. W takiej sytuacji konieczność obsłużenia dużej skali użytkowników ma zupełnie inny wymiar. Chodzi o to że tam pojęcie "dużej skali" jest odpowiednio mniejsze w porównaniu do "dużej skali" na rynku B2B. W przypadku takich aplikacji ciężar Twojej uwagi powinien spoczywać gdzieś indziej, np. w obszarze odpowiedniego zabezpieczenia danych.
Podsumowując:
- patrz przez wydajność przez pryzmat biznesowy
- perspektywa biznesowa pomoże Ci ocenić sytuację w której jesteś
- pamiętaj że rozwijasz aplikację działającą w szerokim kontekście a nie oderwaniu od rzeczywistości
To jak jest w końcu z tą wydajnością?
Można powiedzieć że "wydajność nie jest Twoim problemem dopóki nie staje się Twoim problemem". Natomiast jest to zbyt duże uproszczenie, ponieważ nie może być to wymówka do ignorowania optymalizacji. Jednocześnie w pojedynczych przypadkach lub określonych kontekstach, wydajność po prostu jest krytyczna.
Ten wpis powstał przede wszystkim po to aby podkreślić to, jak ważny jest BALANS. To dzięki niemu jesteśmy w stanie efektywnie pracować i jednocześnie mieć na uwadze ewentualne problemy wydajności naszego kodu czy całej aplikacji. Często jednak widzę problem zarówno u początkujących jak i doświadczonych programistów, którzy zwyczajnie poświęcają więcej energii i uwagi na rozważanie sytuacji które nigdy nie będą mieć miejsca lub szansa ich wystąpienia jest minimalna.
Klasycznym przykładem jest zastanawianie się nad tym jak obsłużymy ogromny ruch użytkowników w naszej nowej aplikacji, podczas gdy ta jeszcze nie istnieje. Tutaj mam złą i dobrą wiadomość. Zła jest taka że tylko pojedyncze biznesy dochodzą do takiego problemu (i Tobie również tego życzę) a dobra taka, że gdy już będziesz mieć taki problem, z dużym prawdopodobieństwem będziesz też mieć narzędzia i zasoby do tego aby go zaadresować.
Mam nadzieję, że ten wpis pomógł Ci zauważyć pewną pułapkę w którą bardzo łatwo wpaść. Ja również nadal przyłapuję się na tym, że próbuję rozwiązać problemy których jeszcze nie mam. Przewidywanie i przygotowanie jest okey, tak długo jak nie powstrzymuje nas przed działaniem.