Problemy z wydajnością aplikacji, czyli dlaczego Twoje oprogramowanie musi być gotowe na wszystko
Wyobraź sobie, że Twoja firma zainwestowała w dedykowane oprogramowanie. Poświęciliście wiele czasu i pieniędzy na to, żeby stworzyć system dopasowany do Waszych potrzeb. Partnerski Software House dołożył starań, żeby wdrożyć potrzebne funkcjonalności, dzięki czemu rozwiązanie miało być panaceum na problemy firmowe. I chociaż efekt rzeczywiście jest dobrze dopasowany, to wdrożona aplikacja bywa… zawodna. Problemy pojawiają się przy zwiększonym ruchu użytkowników. W praktyce oznacza to, że np. inwestujesz w dużą kampanię reklamową, a system (na skutek obciążenia) przestaje działać w kluczowym momencie. W efekcie zostajesz z teoretycznie dobrym rozwiązaniem, ale w praktyce spowalniającym lub uniemożliwiającym pracę Twojej firmy.
Domyślasz się już, gdzie Software House popełnił błąd?
Czym jest wydajność aplikacji i po co nam testy wydajnościowe?
Zróbmy krótki test. Pomyśl chwilę i odpowiedz sobie na pytanie: jakie powinno być oprogramowanie tworzone na zamówienie? W pierwszej chwili najczęściej myślimy o funkcjonalnościach. W końcu po to tworzymy spersonalizowane rozwiązanie, żeby działało tak, jak sobie zaplanowaliśmy. Później na myśl przychodzą tematy związane z bezpieczeństwem, integracją, łatwością w obsłudze itp. Rzadko kiedy na początku (w fazie projektowania) zahaczamy myślami o wydajność. Przyzwyczajeni jesteśmy do tego, że obecnie wszystko działa szybko i niezawodnie. W dobie rozwiniętych komputerów i dobrego Internetu praktycznie zapominamy, że coś może pracować wolno i niestabilnie.
Tymczasem problemy z wydajnością oprogramowania wcale nie są rzadkością i stanowią jedno z podstawowych ryzyk projektowych. Aby aplikacja działała niezawodnie, należy już na początku software developmentu mitygować wszystkie zagrożenia, jakie mogą w przyszłości obniżać jej wydajność.
Wydajność oprogramowania to ilość pracy, jaką to może wykonać w określonym czasie. Im więcej pracy wykona w danym przedziale czasu, tym jego wydajność jest większa. Tworząc i rozwijając aplikację, należy pamiętać, że każda zmiana może zmniejszać wydajność, a co za tym idzie sprawność, z jaką pracuje system. Z tego względu nie możemy zapominać o regularnych testach wydajnościowych, które zweryfikują:
- Szybkość i czas odpowiedzi tworzonego rozwiązania,
- Stabilność i niezawodność systemu,
- Skalowalność i wykorzystanie zasobów w zależności od obciążenia aplikacji.
Niemal każdy system będzie działał sprawnie, kiedy korzysta z niego 5 osób. Ale co w sytuacji, kiedy nagle będzie musiał obsłużyć kilka tysięcy użytkowników? Jak będzie znosił nagłe skoki obciążenia albo pracę pod zwiększonym obciążeniem przez dłuższy czas? Aby uniknąć przykrych niespodzianek, musimy być świadomi czy tworzony system posiada wąskie gardła w zakresie wydajności, które w przyszłości mogą negatywnie wpływać na pracę i wizerunek naszego biznesu.
Natomiast znajomość ograniczeń — bo każdy system ma swoją granicę wydajności, gdzie skalowanie już nie pomaga — pomoże podejmować świadome decyzje biznesowe.
Czym skutkują problemy z wydajnością systemu?
- Zmniejszonym dochodem. Jeżeli Twój system nie działa sprawnie, to pracownicy wolniej wykonują zadania, a klienci częściej rezygnują ze skorzystania z usługi (jeżeli pracujesz w e-commerce, jest to szczególnie ważne);
- Mniejszymi szansami na pozyskanie nowych klientów (znowu e-commerce!);
- Postrzeganiem Twojej firmy jako przestarzałej i bez potencjału. Klienci nie chcą współpracować z biznesem, który już na starcie wydaje się opóźniony, a pracownicy coraz częściej wybierają firmy rozwinięte technologicznie;
- Przestojami i brakiem dostępu do usług. Wpływa to negatywnie nie tylko na dochody, ale i wizerunek firmy. W przypadku branży bankowej czy ubezpieczeniowej przestoje mogą doprowadzić nawet do poważnego spadku zaufania ze strony klientów.
- Brakiem polecania usług. Nie od dzisiaj wiadomo, że nowi klienci często przychodzą z rekomendacji. Jeżeli obecni nie będą zadowoleni z pracy aplikacji, nie polecą Twoich usług dalej.
- Droższym kosztem wytworzenia oprogramowania. Niewydajne aplikacje wymagają większych nakładów pracy (testerów i programistów). A jeżeli od początku nie skupimy się na systematycznym testowaniu wydajności, to potem czekają nas drogie naprawy, żeby aplikacja działała sprawniej.
Jak uniknąć problemów z wydajnością oprogramowania?
Pierwszym krokiem jest jasne zdefiniowanie i przedstawienie rzeczywistych celów (a nie aspiracji managerów) związanych z wydajnością tworzonego rozwiązania. Pamiętajmy, że zawsze formułujemy je z perspektywy użytkownika końcowego oraz bierzemy pod uwagę potrzebę skalowalności oprogramowania w przyszłości.
Kolejną podstawą są testy wydajnościowe, które muszą m.in.:
- Symulować zachowanie produkcyjne (symulacja obciążenia musi odpowiadać obciążeniu, które przewidujemy na produkcji);
- Testować dane, które odpowiadają danym produkcyjnym;
- Obejmować funkcjonalności, które zużywają najwięcej zasobów, a także procesy krytyczne dla wydajności systemu;
- Testować oprogramowanie na różnych poziomach obciążenia i w różnych scenariuszach testowych;
- Być wykonywane regularnie (najlepiej wykonywać kilka rund testowania, żeby zapewnić spójne wyniki).
W trakcie rozwoju aplikacji i wypuszczania kolejnych wersji zawsze należy porównywać czasy odpowiedzi oraz wydajność systemu w odniesieniu do jego poprzednich wydań. Wyniki testów wydajnościowych stanowią podstawę podejmowania decyzji odnośnie architektury rozwiązania oraz jego dalszego rozwoju.
Chmura a wydajność systemu
Jeżeli masz problemy z wydajnością oprogramowania (lub trudno Ci przewidzieć pod jak dużym obciążeniem będzie pracował system), przyjrzyj się możliwościom chmury obliczeniowej. Jej potencjalnie nieograniczone zasoby pozwalają na skalowanie aplikacji dokładnie w taki sposób, w jaki aktualnie potrzebuje Twoja firma. Przeniesienie lub zbudowanie aplikacji w chmurze zapewnia szybkość, skalowalność i dostępność rozwiązania na poziomie, który trudno osiągnąć on-premise. Pamiętaj, że do chmury można przenieść również środowisko testowe!
Dlaczego Software House’y zapominają o testach wydajnościowych?
Być może nie zapominają, co nie wykonują ich w pełni rzetelnie lub w pełni świadomie. Testów wydajnościowych nie da się przeprowadzić w sposób manualny. Potrzeba do tego specjalnego oprogramowania, a także ludzi o odpowiednich technicznych kompetencjach i doświadczeniu w zakresie automatyzacji testów.
Brak doświadczenia i stosunkowo niska świadomość w zakresie wydajności oprogramowania powodują, że testy wydajnościowe prowadzone są dopiero na gotowym systemie. A jak pisaliśmy już w jednym z poprzednich artykułów, im później znaleziony błąd (w tym wypadku problem, który powoduje spadki wydajności), tym dłuższa i droższa naprawa. Z tego względu testy wydajnościowe powinny zostać poddane automatyzacji i stać się integralną częścią procesu CI/CD. Bez tego elementu nigdy do końca nie będziemy w stanie stwierdzić, jak tworzona aplikacja będzie zachowywać się w środowisku produkcyjnym.