niedziela, 24 listopada 2024

EA - arc42: Efektywne Dokumentowanie Architektury Systemu

    Tworzenie i zarządzanie dokumentacją architektury oprogramowania bywa wyzwaniem, szczególnie w dużych, złożonych projektach. Brak jasno określonych zasad dokumentacji może prowadzić do nieporozumień, powtarzających się spotkań i problemów komunikacyjnych, co ostatecznie odbija się na jakości projektu. Tutaj na pomoc przychodzi arc42 – framework, który dostarcza struktury do efektywnego dokumentowania architektury systemu, zapewniając łatwą komunikację i zrozumienie między wszystkimi interesariuszami.

W artykule przedstawiamy, jak zastosować arc42, wykorzystując różne narzędzia wspierające kluczowe aspekty dokumentacji architektonicznej, od diagramów po rejestry ryzyk.



Czym jest arc42?

arc42 to framework stworzony specjalnie do dokumentowania architektury systemów. Zapewnia jasną strukturę, obejmującą zarówno wysokopoziomowe przeglądy, jak i szczegóły techniczne, dzięki czemu dokumentacja jest zrozumiała i łatwa do utrzymania. Składa się z 12 głównych sekcji, które opisują różne aspekty systemu, takie jak jego cele, funkcjonalność, komponenty i wymagania niefunkcjonalne.


Struktura arc42

Poniżej przedstawiam szczegółowy opis każdego punktu frameworka arc42 wraz z przykładami narzędzi, które można wykorzystać do ich efektywnego dokumentowania.

1. Wprowadzenie i Cele

Ta sekcja określa ogólne cele systemu i interesariuszy, co jest kluczowe dla zrozumienia, jakiego rodzaju rozwiązanie ma być dostarczone. Używanie OKR-ów (Objectives and Key Results) pozwala na sformułowanie klarownych celów, które są mierzalne i stanowią punkt odniesienia dla projektu.

  • Przykład: "Zwiększenie wydajności systemu do obsługi 5000 użytkowników jednocześnie".

2. Ograniczenia

W tej sekcji dokumentowane są wszelkie ograniczenia projektowe, takie jak regulacje, technologie, zasoby i budżet. Precyzyjne określenie ograniczeń projektowych na wczesnym etapie pozwala uniknąć późniejszych komplikacji.

  • Przykład: System musi być zgodny z RODO i działać w chmurze AWS.

3. Kontekst i Zakres

Określenie kontekstu i zakresu systemu obejmuje jego integracje z innymi systemami oraz granice. Diagramy C4 świetnie sprawdzają się w wizualizacji kontekstu na różnych poziomach szczegółowości.

  • Przykład: Diagram C4 na poziomie kontekstowym przedstawia interakcje między systemem e-commerce, systemem płatności oraz bazą danych użytkowników.

4. Widok Funkcjonalny

Opisuje główne funkcje i przypadki użycia systemu, kluczowe dla jego działania. Drivery architektoniczne pomagają zidentyfikować najważniejsze funkcje, które będą miały wpływ na decyzje architektoniczne.

  • Przykład: Wyszukiwanie produktów i proces płatności są kluczowymi driverami architektury systemu e-commerce.

5. Widok Bloków Budowlanych

Ta sekcja przedstawia kluczowe komponenty systemu oraz ich interakcje. Diagramy C4 i PlantUML są idealne do wizualizacji struktury modułowej.

  • Przykład: Diagram komponentów pokazuje, jak mikroserwisy w systemie e-commerce komunikują się między sobą.

6. Widok Runtime

Opis działania systemu w czasie rzeczywistym, w różnych scenariuszach, aby zobrazować jego przepływy sterowania. Diagramy sekwencji w PlantUML pomagają pokazać, jak system działa pod obciążeniem.

  • Przykład: Diagram sekwencji przedstawiający kroki logowania użytkownika.

7. Widok Wdrożenia

W tej sekcji opisano topologię wdrożenia systemu, czyli jak i gdzie są wdrażane poszczególne komponenty. Diagramy wdrożeniowe w PlantUML oraz rejestr ryzyk mogą przedstawiać potencjalne ryzyka związane z infrastrukturą.

  • Przykład: Diagram wdrożenia pokazuje, jak system e-commerce działa na klastrach Kubernetes w AWS, z potencjalnym ryzykiem awarii serwera.

8. Koncepcje Przekrojowe

Koncepcje przekrojowe obejmują mechanizmy, które wpływają na różne części systemu, takie jak bezpieczeństwo i monitorowanie. Konwencje dotyczące np. uwierzytelniania mogą pomóc zachować spójność i bezpieczeństwo.

  • Przykład: W systemie e-commerce stosowanie OAuth2 jako mechanizmu uwierzytelniania oraz ELK Stack do monitorowania.

9. Decyzje Projektowe

Zapis kluczowych decyzji projektowych, motywacji oraz rozważanych alternatyw w postaci ADR (Architecture Decision Records) pomaga w śledzeniu, dlaczego pewne rozwiązania zostały wybrane.

  • Przykład: Decyzja o zastosowaniu PostgreSQL jako bazy danych, udokumentowana w ADR.

10. Wymagania Jakościowe

Opis wymagań niefunkcjonalnych, takich jak wydajność, dostępność, i ich znaczenie dla systemu. OKR-y oraz rejestr ryzyk mogą wspierać dokumentowanie celów jakościowych i potencjalnych zagrożeń.

  • Przykład: Wymóg dostępności na poziomie 99,9% i ryzyko przeciążenia serwera w godzinach szczytu.

11. Ryzyka i Dług Techniczny

W tej sekcji znajduje się lista potencjalnych ryzyk oraz długu technicznego, które mogą wpłynąć na projekt. Rejestr ryzyk służy do dokumentowania zagrożeń i ich wpływu na projekt.

  • Przykład: Ryzyko związane z aktualizacją bibliotek zewnętrznych, które może wpłynąć na stabilność systemu.

12. Glosariusz

Sekcja ta definiuje terminologię używaną w dokumentacji, aby uniknąć nieporozumień. Konwencje pomagają utrzymać spójność języka.

  • Przykład: Definicja terminów takich jak „koszyk”, „zamówienie” i „płatność”.


Zastosowanie arc42 w Złożonych Projektach

arc42 może być stosowane w projektach o wysokiej dynamice zmian, ponieważ jego struktura jest elastyczna i ułatwia aktualizację dokumentacji w miarę rozwoju projektu. Integracja narzędzi takich jak diagramy C4, PlantUML, ADR i rejestr ryzyk z procesem CI/CD pozwala na automatyczne monitorowanie i dokumentowanie zmian, co jest szczególnie przydatne w dużych projektach o złożonej architekturze.

Podsumowanie

arc42 to potężne narzędzie do dokumentowania architektury systemu, które ułatwia zrozumienie struktury i funkcji systemu wszystkim interesariuszom. Dzięki zastosowaniu różnych narzędzi i technik w każdej sekcji, arc42 zapewnia kompleksowe podejście do dokumentacji, ułatwiając zarządzanie projektami w każdym etapie ich rozwoju.

niedziela, 17 listopada 2024

dev{ops}: Różnice między wersjami protokołu HTTP

    Protokół HTTP (Hypertext Transfer Protocol) jest kluczowy dla komunikacji w sieci, a jego różne wersje oferują różnorodne możliwości optymalizacji, bezpieczeństwa i wydajności. HTTP 1.1, HTTP/2 oraz HTTP/3 są najpopularniejszymi wersjami wykorzystywanymi przez współczesne aplikacje. W tym artykule przyjrzymy się, jak te wersje protokołu różnią się między sobą, a także które serwery aplikacyjne i języki programowania (PHP, C#, Java) wspierają poszczególne wersje HTTP.



Krótkie przypomnienie: różnice między wersjami HTTP


HTTP 1.1 – Każde żądanie wymaga osobnego połączenia. To najdłużej używana wersja, znana z problemu head-of-line blocking.

HTTP/2 – Umożliwia równoczesne przesyłanie wielu żądań i odpowiedzi przez jedno połączenie TCP, co poprawia wydajność. Obsługuje także kompresję nagłówków i serwerowy push.

HTTP/3 – Oparty na protokole QUIC działającym na UDP, oferuje jeszcze lepszą wydajność i odporność na zakłócenia sieciowe niż HTTP/2.


Najpopularniejsze serwery aplikacyjne i wsparcie dla wersji HTTP


Serwery Java:

1. Apache Tomcat
  • Wsparcie dla HTTP 1.1: Tak
  • Wsparcie dla HTTP/2: Tak (od Tomcat 8.5+ z odpowiednią konfiguracją)
  • Wsparcie dla HTTP/3: W planach dla przyszłych wersji (częściowo obsługiwany w eksperymentalnej formie w Tomcat 10)
2. Jetty
  • Wsparcie dla HTTP 1.1: Tak
  • Wsparcie dla HTTP/2: Tak (od Jetty 9.3)
  • Wsparcie dla HTTP/3: Tak (od Jetty 11)

3. WildFly (JBoss)

  • Wsparcie dla HTTP 1.1: Tak
  • Wsparcie dla HTTP/2: Tak (od WildFly 10)
  • Wsparcie dla HTTP/3: W fazie planowania, brak wsparcia natywnego

Serwery PHP

1. Apache HTTP Server (z mod_php)
  • Wsparcie dla HTTP 1.1: Tak
  • Wsparcie dla HTTP/2: Tak (od wersji 2.4.17)
  • Wsparcie dla HTTP/3: W planach dla przyszłych wersji (częściowo obsługiwany przez moduły w wersjach rozwojowych)

2. Nginx

  • Wsparcie dla HTTP 1.1: Tak
  • Wsparcie dla HTTP/2: Tak (od Nginx 1.9.5)
  • Wsparcie dla HTTP/3: Tak (od Nginx 1.19.0 z odpowiednią konfiguracją)

Serwery .NET (C#)

1. Kestrel (ASP.NET Core)
  • Wsparcie dla HTTP 1.1: Tak
  • Wsparcie dla HTTP/2: Tak (od ASP.NET Core 2.1)
  • Wsparcie dla HTTP/3: Tak (od .NET 6)


2. IIS (Internet Information Services)

  • Wsparcie dla HTTP 1.1: Tak
  • Wsparcie dla HTTP/2: Tak (od IIS 10 na Windows 10 i Windows Server 2016)
  • Wsparcie dla HTTP/3: W planach, dostępne jako opcja w Windows Server 2022 i Windows 11 z odpowiednią konfiguracją.


Wsparcie dla HTTP w językach programowania


Java
  • HTTP 1.1: Pełne wsparcie we wszystkich wersjach JDK od JDK 1.1.
  • HTTP/2: Wsparcie od JDK 9 (klasa HttpClient obsługuje HTTP/2 natywnie).
  • HTTP/3: Brak wsparcia natywnego w JDK na dzień dzisiejszy. Wsparcie HTTP/3 można dodać, korzystając z bibliotek zewnętrznych, takich jak Jetty lub Netty.


PHP

  • HTTP 1.1: Pełne wsparcie od początkowych wersji PHP, standardowo obsługiwane przez serwery takie jak Apache i Nginx.
  • HTTP/2: Wsparcie dostępne od PHP 7.x przy odpowiednim skonfigurowaniu serwera (np. Apache lub Nginx z HTTP/2).
  • HTTP/3: PHP natywnie nie obsługuje HTTP/3, ale serwery, takie jak Nginx lub Apache, mogą obsługiwać HTTP/3, co pozwala na jego użycie w aplikacjach PHP.


C# (.NET)
  • HTTP 1.1: Pełne wsparcie od .NET Framework i .NET Core.
  • HTTP/2: Wsparcie wprowadzone w ASP.NET Core 2.1 (w połączeniu z serwerem Kestrel).
  • HTTP/3: Wsparcie wprowadzone w .NET 6, umożliwiające korzystanie z HTTP/3 w aplikacjach ASP.NET Core.


Dlaczego wersje HTTP są ważne w DevOps?


W DevOps kluczową rolę odgrywa wydajność i skalowalność aplikacji. Zrozumienie, która wersja HTTP jest optymalna dla danej aplikacji i infrastruktury, może znacznie poprawić wydajność i niezawodność systemów. HTTP/2 i HTTP/3, dzięki swoim zaletom w zakresie multiplexingu, kompresji nagłówków i szybszego nawiązywania połączeń, są idealne do aplikacji o dużym obciążeniu oraz w środowiskach mobilnych.

Podsumowanie


Ewolucja protokołu HTTP, od wersji 1.1 do HTTP/3, przyniosła znaczące ulepszenia w zakresie wydajności i stabilności. Wybór odpowiedniej wersji HTTP dla swojej aplikacji może mieć istotny wpływ na doświadczenia użytkowników, zwłaszcza w przypadku aplikacji o dużej liczbie zasobów lub działających w niestabilnych środowiskach sieciowych. Serwery aplikacyjne, takie jak Apache, Nginx, Tomcat czy IIS, oferują różne poziomy wsparcia dla tych wersji, dlatego ważne jest, aby zrozumieć, które z nich najlepiej pasują do twojego środowiska.

Jeśli zależy ci na wydajności i responsywności aplikacji, warto rozważyć migrację na HTTP/2 lub HTTP/3, szczególnie jeśli twoja infrastruktura i serwery aplikacyjne obsługują te wersje.

niedziela, 10 listopada 2024

Team Leader - Impostor Syndrome – Jak sobie z nim radzić jako lider zespołu IT

    Impostor Syndrome, czyli syndrom oszusta, to stan, w którym osoba nieustannie czuje, że jej sukcesy są wynikiem przypadku, a nie kompetencji. Dotyka to wielu ludzi, a w świecie technologii, szczególnie w roli lidera zespołu, syndrom ten może być niezwykle szkodliwy. Zrozumienie, jak wpływa on na lidera i jego zespół, oraz nauczenie się, jak sobie z nim radzić, jest kluczowe dla zdrowia emocjonalnego i efektywności pracy.



Czym jest Impostor Syndrome?

Impostor Syndrome (syndrom oszusta) to psychologiczne zjawisko, w którym osoba odnosi wrażenie, że nie zasługuje na sukcesy, które osiągnęła. Osoby dotknięte tym syndromem często przypisują swoje osiągnięcia szczęściu, a nie umiejętnościom, oraz obawiają się, że zostaną „zdemaskowane” jako niekompetentne. Zjawisko to występuje szczególnie w wymagających środowiskach zawodowych, jak np. w IT, gdzie praca często wymaga ciągłego uczenia się nowych rzeczy i rozwiązywania trudnych problemów.


Jak Impostor Syndrome może wpłynąć na lidera zespołu IT?


1. Nadmierne wymagania wobec siebie: Lider z syndromem oszusta może stale czuć, że musi udowadniać swoją wartość, co prowadzi do nadmiernego zaangażowania, stresu i wypalenia.

2. Unikanie pochwał: Osoby z Impostor Syndrome często ignorują lub deprecjonują swoje sukcesy, co prowadzi do niskiej samooceny, nawet gdy obiektywnie radzą sobie doskonale.

3. Unikanie wyzwań: Paradoksalnie, obawa przed „zdemaskowaniem” może sprawić, że lider unika podejmowania trudniejszych zadań czy wyzwań, które mogą przynieść nowe możliwości rozwoju zarówno dla niego, jak i dla zespołu.

4. Przekłada się na zespół: Gdy lider nie ufa swoim umiejętnościom, może to prowadzić do niestabilności w zespole. Niski poziom pewności siebie lidera może wpłynąć na motywację i zaufanie całego zespołu.


Jak radzić sobie z syndromem oszustajako lider?


1. Rozpoznaj problem

Pierwszym krokiem w walce z Impostor Syndrome jest jego zrozumienie i rozpoznanie, że to zjawisko może dotyczyć ciebie. Wielu liderów IT doświadcza podobnych wątpliwości, co oznacza, że nie jesteś w tym sam.

2. Skoncentruj się na faktach

Zamiast ulegać emocjom, skoncentruj się na swoich rzeczywistych osiągnięciach. Zobacz, jakie konkretne sukcesy masz na swoim koncie i jaką wartość wniosłeś do zespołu lub firmy. Możesz również prosić o regularny feedback od swojego zespołu lub przełożonych, aby uzyskać bardziej obiektywny obraz swoich umiejętności.

3. Zaakceptuj, że nie musisz wiedzieć wszystkiego

Świat IT jest ogromny i zmienia się dynamicznie. Nawet najbardziej doświadczeni liderzy nie wiedzą wszystkiego. Kluczowe jest przyznanie się do tego, że wciąż się uczysz, i zachęcanie swojego zespołu do wspólnego rozwoju. Umiejętność delegowania i korzystania z wiedzy zespołu to oznaka siły, a nie słabości.

4. Zadbaj o swoje zdrowie psychiczne

Jako lider, oprócz zarządzania zespołem, musisz dbać o swoje zdrowie psychiczne. Regularne ćwiczenia, hobby poza pracą i rozmowy z mentorem lub terapeutą mogą pomóc w radzeniu sobie ze stresem i wątpliwościami, które pojawiają się w związku z syndromem oszusta.

5. Podziel się swoimi wątpliwościami

Otwarta rozmowa o swoich obawach z innymi liderami czy członkami zespołu może przynieść ulgę. Bardzo często inni liderzy IT mają podobne odczucia, a dzielenie się swoimi doświadczeniami pomaga w budowaniu wsparcia i wzajemnego zrozumienia.


Dlaczego ważne jest, aby lider radził sobie z syndromem oszusta?


Jako lider zespołu IT, masz ogromny wpływ na kulturę pracy i morale zespołu. Jeśli samodzielnie zmagasz się z niską samooceną i niepewnością, może to wpływać na jakość twoich decyzji i na atmosferę w zespole. Zespoły, które widzą pewnych siebie liderów, lepiej radzą sobie z wyzwaniami i są bardziej zmotywowane.


Lider, który umie rozpoznać swoje mocne strony i nie boi się przyznać do błędów, staje się wzorem dla swojego zespołu. Impostor Syndrome może blokować ten proces, dlatego ważne jest, aby świadomie go rozpoznawać i stosować odpowiednie techniki zaradcze.


Podsumowanie

Impostor Syndrome to powszechne zjawisko, szczególnie w środowiskach technologicznych, gdzie oczekiwania i tempo zmian są ogromne. Jako lider zespołu IT, kluczowe jest zrozumienie tego syndromu i nauczenie się, jak radzić sobie z jego negatywnymi skutkami. Dzięki otwartości, skupieniu na faktach i poszukiwaniu wsparcia, liderzy mogą przełamać wewnętrzne wątpliwości i skutecznie kierować swoimi zespołami, stając się inspiracją dla innych.


niedziela, 3 listopada 2024

dev{ops}: Poziomy dojrzałości REST

Jednym z kluczowych elementów nowoczesnych aplikacji jest budowanie interfejsów API zgodnych z architekturą REST (Representational State Transfer). Ale nie wszystkie API są równie "RESTful" – mogą różnić się pod względem dojrzałości i zgodności z zasadami REST. Aby ułatwić ocenę, Richardson Maturity Model (RMM) definiuje cztery poziomy dojrzałości API REST, które pokazują, jak dobrze dane API spełnia wymagania REST. W tym artykule omówimy każdy poziom, wyjaśniając, czym charakteryzuje się każdy z nich i jak może wpływać na wydajność oraz elastyczność API w środowiskach DevOps.


Czym jest model dojrzałości REST?

Model dojrzałości REST stworzony przez Leonarda Richardsona dzieli API na cztery poziomy. Każdy poziom zwiększa stopień zgodności z zasadami REST, co przekłada się na lepszą strukturę, łatwość utrzymania i większą wydajność API.



Poziomy dojrzałości REST według Richardson Maturity Model

Poziom 0: Połączenie zdalne (Remote Procedure Call)

Na tym poziomie API nie jest tak naprawdę RESTful – przypomina bardziej tradycyjne RPC (Remote Procedure Call). Wszystkie interakcje są obsługiwane przez jeden endpoint, a metody są wywoływane bez względu na ich kontekst.

Przykład: API ma jeden punkt końcowy /api, który obsługuje wszystkie żądania, niezależnie od ich rodzaju. Komunikacja odbywa się za pomocą POST, a różne akcje są definiowane przez przekazywane dane, np. {"action": "getUser", "id": 123}.


Wady: Tego typu API jest trudne do utrzymania, nie skaluje się dobrze i nie wykorzystuje standardów HTTP, takich jak różne metody (GET, POST, PUT, DELETE).


Poziom 1: Zasoby (Resources)

Na poziomie pierwszym API zaczyna korzystać z zasobów, co oznacza, że różne elementy są identyfikowane za pomocą unikalnych URI. Każdy zasób (np. użytkownicy, zamówienia) ma swoje własne ścieżki.

Przykład:

GET /users/123 – pobiera dane użytkownika o ID 123.

POST /users – tworzy nowego użytkownika.


Zalety: Wprowadzenie zasobów sprawia, że API jest bardziej zorganizowane i łatwiejsze w użyciu. Dzięki unikalnym URI, zasoby są łatwe do identyfikacji i zarządzania.


Poziom 2: Operacje HTTP (Verbs)

Na poziomie drugim API zaczyna w pełni wykorzystywać metody HTTP (takie jak GET, POST, PUT, DELETE) zgodnie z ich przeznaczeniem. Każda metoda jest odpowiednio dopasowana do operacji, którą wykonuje.

Przykład:

GET /users/123 – pobiera dane użytkownika.

POST /users – tworzy nowego użytkownika.

PUT /users/123 – aktualizuje dane użytkownika o ID 123.

DELETE /users/123 – usuwa użytkownika o ID 123.



Zalety: Zastosowanie odpowiednich metod HTTP poprawia przejrzystość i intuicyjność API. Zgodność z metodologią HTTP sprawia, że łatwiej integrować się z innymi systemami, które wspierają te standardy.


Poziom 3: HATEOAS (Hypermedia As The Engine Of Application State)

Najwyższy poziom dojrzałości REST charakteryzuje się wykorzystaniem HATEOAS, co oznacza, że API nie tylko zwraca dane, ale również dostarcza linki do innych zasobów, które klient może odwiedzić. Dzięki temu API staje się samowystarczalne, a klient może odkrywać dostępne operacje na podstawie odpowiedzi.


Przykład: Żądanie GET /users/123 zwraca dane użytkownika, a także linki do innych akcji:


{

  "id": 123,

  "name": "John Doe",

  "links": [

    {"rel": "update", "href": "/users/123", "method": "PUT"},

    {"rel": "delete", "href": "/users/123", "method": "DELETE"}

  ]

}


Zalety: Dzięki HATEOAS klient może automatycznie dowiedzieć się, jakie operacje są dostępne, bez potrzeby dodatkowej dokumentacji. API jest bardziej dynamiczne i elastyczne, co ułatwia jego rozbudowę i zarządzanie.


Dlaczego poziomy dojrzałości REST są ważne w DevOps?

Dla zespołów DevOps, które zarządzają aplikacjami w szybkim cyklu wydawniczym, ważne jest, aby API były skalowalne, łatwe w integracji i zgodne z nowoczesnymi standardami. Wyższe poziomy dojrzałości REST, takie jak pełne wykorzystanie metod HTTP i HATEOAS, pozwalają na:


1. Zwiększoną automatyzację – API, które jest w pełni zgodne z metodologią REST, jest łatwiejsze do automatyzacji i integracji z innymi systemami.

2. Łatwiejsze zarządzanie – dzięki standaryzacji i odpowiedniemu wykorzystaniu HTTP, zespoły DevOps mogą łatwiej monitorować, testować i wdrażać API.

3. Większą elastyczność – dzięki HATEOAS API może się dynamicznie adaptować do nowych funkcji i rozszerzeń bez potrzeby przepisywania logiki po stronie klienta.


Podsumowanie


Każdy poziom dojrzałości w modelu Richardson Maturity Model wprowadza nowe zasady, które zbliżają API do pełnej zgodności z REST. Dla zespołów DevOps kluczowe jest, aby dążyć do wyższych poziomów dojrzałości, ponieważ poprawia to skalowalność, elastyczność i łatwość zarządzania API. Choć nie każde API musi osiągnąć poziom HATEOAS, korzystanie z zasobów i odpowiednich metod HTTP powinno być standardem w nowoczesnych aplikacjach.


Dążenie do wyższej dojrzałości REST pomoże zespołom DevOps tworzyć bardziej wydajne i łatwiejsze w utrzymaniu interfejsy API, co przekłada się na lepszą jakość i szybsze wdrażanie nowych funkcji.