Utrzymanie i rozwój systemów

Zachowanie ciągłości pracy systemu w trakcie jego nieustannego rozwoju stanowi duże wyzwanie zarówno od strony technicznej, jak i organizacyjnej.

 
 
 

Prawdziwe życie systemu zaczyna się dopiero w czasie jego wdrożenia produkcyjnego, czyli momencie, gdy większość dostawców oprogramowania uważa, że powinna zakończyć swoją pracę dla Klienta. Przypomina to studenckie podejście 3 razy Z, które w tym wydaniu oznacza Zainstalować, Zainkasować, Zakończyć.

My działamy inaczej. Uważamy, że dopiero w momencie uruchomienia produkcyjnego zaczyna się prawdziwa odpowiedzialność za stworzone rozwiązanie. Dlatego zbudowane przez nas systemy obejmujemy szeroką opieką, w zakres której wchodzi:

  • obsługa zgłoszeń błędów,
  • wprowadzanie drobnych zmian i poprawek (optymalizacje wyglądu, wydajności itp.),
  • wprowadzanie większych zmian funkcjonalnych (rozwój),
  • nadzór nad pracą systemu i jego pielęgnacja.

W naszej firmie nie stosujemy podziału zespołów na takie, które zajmują się tylko tworzeniem nowych aplikacji i takie które zajmują się wyłącznie ich utrzymaniem. Zamiast tego stosujemy podejście, w którym zespół wytworzający aplikację następnie ją utrzymuje. Zapewnia to, poza konieczną wiedzą „biznesową” dotyczącą projektu, bardzo wartościowe sprzężenie zwrotne. Dzięki niemu programiści na podstawie znalezionych błędów bądź konieczności wprowadzania optymalizacji, uczą się jak tworzyć lepsze systemy.

Obsługa zgłoszeń błędów aplikacji

Jako że nie ma aplikacji działających bezbłędnie, wytworzyliśmy proces i narzędzia mające na celu sprawne usuwanie pojawiających się problemów. Proces ten obejmuje następujące elementy:

  • analiza zgłoszeń problemów,
  • wprowadzanie poprawek,
  • testowanie - łącznie z testami regresji całej aplikacji,
  • akceptowanie poprawek przez Klienta,
  • instalowanie nowej wersji na środowisku produkcyjnym.

Duże znaczenie ma pierwsza linia, czyli pracownicy przyjmujący zgłoszenia błędów. Niezależnie od tego czy odbywa się to za pomocą dedykowanego systemu (u nas JIRA), SMS'owo czy telefonicznie, to wstępna analiza oraz sposób komunikacji ze zgłaszającym decyduje o tym czy problem zostanie szybko rozwiązany, czy wręcz przeciwnie – jest eskalowany, wywołując niechęć i frustracje końcowych użytkowników.

Na tym etapie zostają odrzucone zgłoszenia, które:

  • nie dotyczącą naszej aplikacji,
  • wynikają z niepoprawności działania systemów zewnętrznych,
  • wynikające z niepoprawności działania oprogramowania zgłaszającego (np. wirusy czy dodatki w przeglądarce internetowej, problemy sieciowe),
  • wymagają zmian w aplikacji niezgodych z aktualną specyfikacją (są to zazwyczaj rozbudowy systemu, które obsługujemy innym procesem),
  • problemy zgłoszone wcześniej (duplikaty).

Potwierdzony, dobrze sprecyzowany i odtwarzalny błąd jest przekazywany programistom do analizy. Dla programisty znającego kod poprawka dobrze zgłoszonego błędu jest sprawą stosunkowo prostą. Automatyczne testy jednostkowe oraz funkcjonalne dbają o to, aby wprowadzone przez niego zmiany nie wprowadziły innych błędów.

Po zakończeniu prac przez programistę poprawka jest sprawdzana przez naszych testerów, a następnie, z grupą innych poprawek, przedstawiana do akceptacji Klientowi. W ostatnim etapie nowa wersja aplikacji jest instalowana w środowisku produkcyjnym.

Obsługi drobnych zmian i poprawek

Duże aplikacje internetowe wymagają wprowadzania drobnych zmian oraz świadczenia pomocy przy kwestiach nie będących błędami systemu. Najczęściej są to prace webmasterskie, poprawianie tłumaczeń napisów, przygotowanie elementów graficznych itp.

Obsługa większych zmian

Dynamicznie zmieniające się wymagania biznesowe, uwarunkowania prawne oraz oczekiwania użytkowników sprawiają, że w działającej aplikacji trzeba dodawać nowe funkcje lub modyfikować istniejące. Każda z takich zmian żyje własnym życiem od momentu określenia wymagań funkcjonalnych, poprzez projektowanie, implementacje, testy aż do wdrożenia w środowisku produkcyjnym. Dostępność zespołu znającego system od podszewki pozwala na wprowadzanie ich w sposób sprawny oraz niekonfliktujący z innymi zmianami czy poprawkami.

Zarządzanie strumieniami zmian

Wszystkie opisane wyżej zmiany mogą być przeprowadzane równolegle przez różnych programistów i różne zespoły zgłaszające, zarządzające, testujące i akceptujące. Jednak wynikiem pracy ma być jedna wersja aplikacji, która zawiera zmiany zaakceptowane przez wszystkich zainteresowanych i zostanie zainstalowana w środowisku produkcyjnym. Praktyka pokazuje, że nierzadkie są sytuacje, kiedy jedna z kilku zmian obecnych w „już prawie” gotowej wersji musi być z jakichś względów wycofana.

Aby sprostać temu wymaganiu stosujemy model zarządzania, w którym wszystkie zmiany są implementowane na osobnych gałęziach, z których do finalnych testów tworzony jest „kandydat do instalacji” (ang. release candidate). Konieczność wycofania jednej ze zmian powoduje konieczność zbudowania kolejnego kandydata z innym zakresem zmian. Złożoność tego procesu prezentuje poniższy schemat:

Przy zarządzaniu zmianami w kodzie doskonale pomaga nam GIT, który pozwala na łatwe i skuteczne przenoszenie zmian pomiędzy poszczególnymi gałęziami, tworzenie nowych, łączenie ich itp. Konwencje nazewnictwa gałęzi, opisywania commitów, zarządzania wersjami oraz skrupulatne ewidencjonowanie zmian w systemie zarządzania (JIRA) zapewniają, że nic nie dzieje się przez przypadek, żadna ze zmian nie jest gubiona, a dla każdej linii kodu jesteśmy w stanie ustalić pełen kontekst: programistę, przesłanki oraz zgłaszającego (źródło wymagań).

Pielęgnacja aplikacji

Generalnym celem pielęgnacji aplikacji jest zapobieganie błędom i awariom zanim się wydarzą. Jest to wpisane w politykę e-point SA, która zakłada współpracę z Klientem w roli partnera biznesowego - wiemy że w wielu przypadkach awaria i czasowa niedostępność systemu pociąga za sobą wymierne straty. Potrafimy z wyprzedzeniem zapobiegać takim sytuacjom.

Dlatego, poza pracami zleconymi przez Klienta oraz błędami zgłoszonymi przez użytkowników, zespół zajmujący się utrzymaniem aplikacji zajmuje się okresowymi przeglądami systemu. Przeglądy te obejmują następujące aspekty:

  • sprawdzenie parametrów pracy baz danych, serwerów aplikacji, zajętości zasobów itp.,
  • przeglądy logów – pozwalają na znajdowanie błędów, które są na tyle rzadkie, że nie są zgłaszane przez użytkowników,
  • analiza wydajności aplikacji – pozwala ustalić czy nowe wersje aplikacji nie pogarszają zachowania aplikacji pod obciążeniem oraz czy jest ona w stanie obsłużyć zwiększającą się liczbę odsłon.

Efektem przeglądów jest wprowadzanie optymalizacji kodu oraz drobnych poprawek, które są testowane, a następnie instalowane w środowisku produkcyjnym razem z nową wersją aplikacji.

Monitorowanie pracy systemu

Kluczowym elementem pielęgnacji systemu jest monitorowanie oraz rejestracja parametrów jego pracy w środowisku produkcyjnym. Jeśli chcemy prowadzić sensowną analizę pracy systemu musimy zebrać jak najwięcej informacji o każdym z jego elementów.

Po co monitorować pracę systemu?

Dla nas głównym celem monitorowania systemu jest uniknięcie awarii. Posiadając właściwy monitoring bardzo często jesteśmy w stanie zaobserwować pierwsze symptomy zbliżających się problemów i odpowiednio wcześnie podjąć działania zapobiegawcze. Jeśli mimo to dojdzie do awarii to na podstawie danych z monitoringu łatwiej jest nam postawić diagnozę i wdrożyć działania naprawcze.

Dzięki monitorowaniu systemu jesteśmy w stanie stwierdzić, czy kolejna wersja aplikacji zachowuje się podobnie jak poprzednia pod względem stabilności i wydajności (wykorzystania zasobów). To samo dotyczy zmian prowadzonych podczas rekonfiguracji czy rozbudowy infrastruktury hostingowej. Bez monitoringu nie bylibyśmy w stanie stwierdzić, czy zmiana w aplikacji, konfiguracji czy sprzęcie przyniosła pożądany skutek.

Obserwując zmiany parametrów pracy systemu w długim okresie czasu (miesięcznym, kwartalnym czy rocznym) możemy zaplanować działania optymalizacyjne w aplikacji, zmiany w konfiguracji systemu lub podjąć decyzję o rozbudowie bazy sprzętowej.

Jakie elementy monitorujemy?

Nie wszyscy zdają sobie sprawę jak bardzo złożone jest środowisko pracy współczesnego systemu internetowego. Zazwyczaj na to środowisko składają się:

  • klastry serwerów HTTP, aplikacji oraz baz danych,
  • serwery, na których te klastry są uruchomione,
  • systemy operacyjne,
  • urządzenia sieciowe (przełączniki, rutery, firewall'e),
  • systemy pamięci masowych,
  • systemy backupu.

Dodatkowo wszystkie te elementy prowadzą ze sobą dość złożoną konwersację. To wszystko powoduje, że w typowym systemie zbieramy dane o kilkuset różnych parametrach obrazujących jego bieżący stan. Jeśli infrastruktura jest złożona, to z tych kilkuset parametrów robi się kilka, czasem kilkanaście tysięcy.

Narzędzia

Aby efektywnie monitorować złożone środowisko pracy systemu potrzebne są dobre narzędzia. Wbrew pozorom komercyjne narzędzia nie są tu najlepszym wyborem (cena oraz brak odpowiedniej elastyczności). Dlatego wypracowaliśmy odpowiednio dobraną mieszankę własnych narzędzi oraz kilku rozwiązań Open Source.

Ilość danych zbieranych podczas monitoringu systemu jest tak ogromna, że niemożliwa jest ich ręczna analiza. Dlatego korzystamy z pakietu statystycznego R, który pozwala nam szybko wykonywać podstawowe badania (analiza korelacji, rozkłady parametrów itp.), jak również również oprogramować bardziej złożone analizy. Szczególną wagę przykładamy do odpowiedniej wizualizacji danych - jeden wykres wart jest więcej niż tysiące linii logów.

Kilkanaście lat doświadczeń nauczyło nas wybierać właściwe parametry do obserwacji. W tej chwili wystarczy nam jeden rzut oka na właściwie dobrane wykresy, aby ocenić stan pracy systemu.

Automatyzacja instalacji aplikacji

W środowisku klastrowym ręczny proces instalacji aplikacji składającej się z wielu modułów (EAR'ów) odnoszących się do wielu zasobów JNDI jest złożony, długotrwały i podatny na błędy. Na potrzeby zarządzanych przez nas środowisk przygotowaliśmy biblioteki i skrypty, które całkowicie automatyzowały ten proces, jest on realizowany jednym poleceniem.
 

Zarządzanie wersjami językowymi

W aplikacjach działających w środowisku międzynarodowym konieczne jest prezentowanie treści w językach specyficznych dla danego kraju. W naszej największej aplikacji istnieje aż 36 wersji językowych! Sprawne zarządzanie tłumaczeniami jest możliwe dzięki sprawdzonemu procesowi organizacyjnemu oraz opracowanymi przez nas narzędziami ułatwiającymi przepływ zmian pomiędzy tłumaczami, klientem a repozytorium kodu.
 
 

Oglądaj nasz kanał na YouTube

 
 

Masz pytanie?

 
 
 
Jarosław Błąd
 
Jarosław Błąd

Dyrektor Pionu Produktów

jaroslaw.blad at e-point dot pl