27 wrz 20229 min czytania
Dawid Karczewski
Senior full stack developer i CTO w Ideamotive.
Tworząc produkt, warto pomyśleć o tym, jak będzie utrzymywany w przyszłości. Trzeba przemyśleć specyfikę wprowadzania zmian i edytowania funkcji. Ważne jest też zrozumienie, jak zewnętrzne elementy interfejsu współdziałają z procesami wewnętrznymi i według jakich zasad architektury użytkownicy będą korzystać z programu.
Pomagają w tym opisane niżej dobre praktyki projektowania architektury oprogramowania. Najpierw jednak ustalmy, czym jest architektura oprogramowania, jak działa i po co się ją projektuje.
Architektura oprogramowania to zaprojektowana struktura programu, obejmująca zdefiniowanie interakcji komponentów interfejsu z wewnętrznymi procesami programu. Mówiąc prosto, to podejście określające, które funkcje za co odpowiadają i jak się ze sobą komunikują.
Nie ma jednego precyzyjnego rozumienia ani jasnej definicji tego procesu. Głównym zadaniem jest stworzenie logicznej struktury programu i uproszczenie współpracy między programistami. W ten sposób osiągniemy wysoki poziom skalowalności architektury. To z kolei pozwala w przyszłości wprowadzać zmiany w programie, pracując nad konkretnymi aspektami, zamiast przeprojektowywać całe oprogramowanie.
Dobre praktyki projektowania architektury oprogramowania sprawiają, że aplikacja wykona zadania i spełni cel określony na początkowych etapach prac.
Architektura aplikacji spełnia szereg ważnych zadań:
To główne zadania, które spełnia architektura oprogramowania. Stosując dobre praktyki jej projektowania, znacznie upraszczasz wytwarzanie i dokładnie wiesz, jaki będzie efekt i jak zadziałają wszystkie funkcje.
Architektura projektu programistycznego pozwala tworzyć wysokiej jakości oprogramowanie i dodatkowo obniżyć koszty jego utrzymania oraz serwisu.
Architekt oprogramowania (architekt systemów, architekt IT) to specjalista, który buduje złożone systemy IT rozwiązujące problemy biznesowe. Architekt systemów dobrze zna procesy biznesowe i widzi, jak problem biznesowy można rozwiązać przy użyciu różnych technologii informatycznych. Odgrywa ważną rolę w projektowaniu architektury systemu i definiowaniu produktu programistycznego.

Ta dobra praktyka projektowania architektury oprogramowania działa na zasadzie rozdzielenia odpowiedzialności. Oprogramowanie dzieli się na warstwy leżące jedna na drugiej, a każda z nich pełni określone zadanie.
Architektura dzieli oprogramowanie na następujące warstwy:
Dane i sterowanie przepływają w tym projekcie przez każdą warstwę i są przekazywane z jednej do następnej. Ten system podnosi też poziom abstrakcji, a do pewnego stopnia nawet stabilność oprogramowania.
Znany przykład z życia: Gmail.

Firmy takie jak Uber, Twitter czy LinkedIn żyją aktualizacjami w czasie rzeczywistym: powiadomienia o przejazdach Ubera, tweety znajomych i przydatne wskazówki ekspertów branżowych, które można odebrać i udostępnić w kilka sekund.
Gdy tylko informacja trafia do sieci, natychmiast staje się dostępna dla wszystkich dookoła. Użytkownicy zawsze pokochają tę prostą i szybką dostępność informacji - stale wypatrują podobnych ułatwień w swoim życiu.
Żeby sprostać stale rosnącym oczekiwaniom konsumentów, wiele firm musi porzucić tradycyjne struktury żądanie-odpowiedź na rzecz architektur sterowanych zdarzeniami.
W przeciwieństwie do systemów żądanie-odpowiedź w architekturze sterowanej zdarzeniami zgłaszający wysyła zdarzenie (zwykle wiadomość z [nagłówkiem] i [ładunkiem]) do warstwy dystrybucji. Wiadomość może następnie odebrać usługa nasłuchująca konkretnego tematu. Usługa może potem w jakiś sposób wykorzystać ładunek wiadomości albo przekazać ją dalej do innej usługi.
Znane przykłady z życia: Netflix, Unilever, SAP, Amazon, LinkedIn i Federalna Administracja Lotnictwa.

Architektura mikrojądra to alternatywa dla klasycznego sposobu budowania systemu operacyjnego. Klasyczna architektura oznacza w tym przypadku taką organizację strukturalną systemu operacyjnego, w której wszystkie główne funkcje systemu tworzące wielowarstwowe jądro wykonywane są w trybie uprzywilejowanym.
Istota tej dobrej praktyki projektowania architektury oprogramowania jest następująca. W trybie uprzywilejowanym działa tylko bardzo mała część systemu operacyjnego, zwana mikrojądrem.
Mikrojądro jest chronione przed resztą systemu i aplikacjami. Zwykle obejmuje moduły zależne od maszyny, a także moduły realizujące podstawowe (ale nie wszystkie) funkcje jądra: zarządzanie procesami, obsługę przerwań, zarządzanie pamięcią wirtualną, przekazywanie komunikatów oraz zarządzanie urządzeniami wejścia-wyjścia związane z ładowaniem lub odczytem rejestrów urządzeń. Wszystkie pozostałe, wyższego poziomu funkcje jądra są pakowane jako aplikacje trybu użytkownika.
Te zalety mają swoją cenę w postaci niższej wydajności i to główna wada architektury mikrojądra. Przy klasycznej organizacji systemu operacyjnego wykonanie wywołania systemowego wiąże się z dwoma przełączeniami trybu, a przy organizacji mikrojądrowej - z czterema.
Dlatego system operacyjny oparty na mikrojądrze, przy pozostałych warunkach równych, zawsze będzie mniej wydajny niż system z klasycznym jądrem. Właśnie z tego powodu podejście mikrojądrowe nie przyjęło się tak szeroko, jak przewidywano.
Znane przykłady z życia: Mac OS X, Windows NT, Eclipse IDE.

W tym podejściu aplikację tworzy się jako zestaw małych usług, z których każda działa we własnym procesie i komunikuje się lekkimi mechanizmami - zwykle API dla zasobu HTTP.
Usługi te opierają się na możliwościach biznesowych i mogą być wdrażane niezależnie, w pełni zautomatyzowanym mechanizmem.
Scentralizowane zarządzanie między usługami jest minimalne. Można je pisać w różnych językach i korzystać z różnych technologii przechowywania danych.
Architektura działa na zasadzie komponentyzacji przez usługi. Dzieli oprogramowanie na odizolowane komponenty (usługi), z których każdy ma jedną odpowiedzialność. Zmiany w jednej usłudze nie powinny wpływać na pozostałe.
Jedna z najpopularniejszych dobrych praktyk projektowania architektury oprogramowania to budowanie mikroserwisów w .NET.
Architektura składa się z odizolowanych, kompaktowych mikroserwisów, które mogą rozwijać się niezależnie od siebie. Obejmuje następujących 5 komponentów:
Architektura mikroserwisowa powinna mieć następujące cechy:
Każdy mikroserwis warto rozwijać osobno, pod kontrolą innego zespołu. Ponieważ dane przesyła się standardowym protokołem i w standardowym formacie, struktura jednej usługi nie wpłynie na działanie usług powiązanych.
Znane przykłady z życia: Uber, Netflix, Amazon, eBay i SoundCloud.

Serverless computing (albo technologie serverless, jak się je czasem nazywa) to obiecujący model chmury obliczeniowej, który pojawił się w ostatnich latach na horyzoncie tworzenia aplikacji i architektury. To właśnie chęć wykorzystania ogromnego potencjału frameworków serverless sprawiła, że wielu dużych graczy rynkowych dało się porwać ogólnemu boomowi na usługi chmurowe.
Giganci branży, tacy jak Google, Microsoft, IBM i Amazon, już proponują swoim klientom stosowanie dobrych praktyk projektowania architektury oprogramowania. Dzięki nim przeniesiesz lokalne procesy biznesowe i osiągniesz efektywność operacyjną na flagowych platformach serverless, takich jak AWS Lambda czy Azure Functions.
Mówiąc prosto, architektura serverless to rozwiązanie sterowane zdarzeniami i zapytaniami, które pozwala twórcom aplikacji tworzyć wydajne środowiska chmurowe ze wszystkimi zasobami obliczeniowymi potrzebnymi do płynnej pracy. Takie frameworki są bardzo wygodne, zwłaszcza przy napiętych terminach i zadaniach zasobożernych.
Co więcej, wybór usług serverless pozwala usprawnić procesy wytwarzania aplikacji, a przez to zwiększyć skuteczność innych praktyk optymalizacji procesów biznesowych, w tym DevOps i Agile.
Gdy porównamy architekturę serverless z mikroserwisami, ta pierwsza wygląda dla twórców aplikacji znacznie obiecująco, bo daje przestrzenie chmurowe na żądanie. Oznacza to, że funkcje serverless uruchamiają się dopiero po zaistnieniu określonego zdarzenia. Potem funkcje wykonują sekwencję operacji zależnie od poleceń otrzymanych od użytkowników. Platforma serverless stosuje wtedy zestaw wcześniej przygotowanych algorytmów i reguł, wykonuje obliczenia i dostarcza aktualne wyniki.
Z drugiej strony przekazanie kontroli nad częścią systemów podmiotowi trzeciemu rodzi też wady. Może to na przykład oznaczać pewną utratę kontroli i choćby niespodziewane aktualizacje API. Poza tym podzielenie jednej aplikacji na kilka części z wplecionymi w strukturę różnymi usługami zwiększa „liczbę punktów przegięcia”, co potrafi skomplikować testowanie.
Znane przykłady z życia: Netflix, Codepen, Zalora, Coca-Cola i Nordstrom.

To podejście uchodzi za najlepsze przy budowaniu produktów w startupach. Wiele nowoczesnych firm wybiera architekturę monolityczną, bo ten zestaw dobrych praktyk projektowania architektury oprogramowania jest wygodny przy pracy z małymi grupami programistów.
Przy jego stosowaniu wszystkie komponenty programu są ze sobą powiązane i wymienne - pomaga to rozwijać program jako autonomiczny i samowystarczalny. Architektura monolityczna uchodzi w tworzeniu aplikacji za tradycyjną i sprawdzoną, ale jednocześnie wielu programistów uważa to podejście za staroświeckie i już do niczego nieprzydatne.
Aby zrozumieć, czy lepszy będzie dla Ciebie monolit czy mikroserwisy - musisz rozważyć zalety i wady architektury monolitycznej.
Znane przykłady z życia: SalesForce i Hubspot
Aby zbudować przyzwoitą architekturę oprogramowania, wystarczy zatrudnić zespół inżynierów i projektantów UX/UI. W zależności od technologii możesz potrzebować:
Przy bardziej szczegółowej strukturze zespołu warto rozważyć pozyskanie programistów o różnym poziomie doświadczenia.
Początkujący architekt IT z mniej niż rocznym doświadczeniem w zawodzie powinien mieć już następujące umiejętności:
Do obowiązków specjalisty z 1-3-letnim doświadczeniem dochodzi więcej odpowiedzialności i samodzielności. Architekt oprogramowania na poziomie mid ma też elastyczne kompetencje, które w przyszłości pomogą mu kierować zespołem programistycznym.
Programista musi więc:
Specjalista z ponad trzyletnim doświadczeniem kieruje już zespołem. Ma rozwinięte umiejętności menedżerskie i negocjacyjne w kontakcie z klientem, a przy tym zna dobre praktyki projektowania architektury oprogramowania.
Wymagania zawodowe wyglądają następująco:
Głównym celem architektury jest zdefiniowanie wymagań, które wpływają na strukturę aplikacji. Dobrze przemyślana architektura zmniejsza ryzyko biznesowe związane z budową rozwiązania technicznego i buduje most między wymaganiami biznesowymi a technicznymi.
Choć stosowanie dobrych praktyk projektowania architektury oprogramowania może wydawać się dla konkretnej firmy kosztowne, utrzymanie aplikacji i zapewnienie działania funkcji będzie znacznie droższe.
Dlatego od pierwszego dnia warto pracować z doświadczonymi specjalistami (czy to programistami Flutter czy inżynierami JavaScript) od pierwszego dnia.
Dawid jest full stack developerem. Tworzy aplikacje w Ruby on Rails i React Native od pierwszego pomysłu aż po wdrożenie. Buduje dla naszych klientów rozwiązania, które pomagają im rosnąć.
Zobacz wszystkie wpisy autoraPrzewodnik dla startupów i cyfrowych przedsiębiorców
Czytaj terazPopularne artykuły
21 inspirujących projektów UI aplikacji mobilnych na 2023 rok
Michał Pruciak 7 min czytania
MedTech vs HealthTech vs BioTech: jakie są różnice?
Michał Pruciak 7 min czytania
10 biznesowych zastosowań sieci neuronowych (z przykładami!)
Michał Pruciak 4 min czytania
10 przykładów dobrych praktyk w web designie na 2023 rok
Adam Kozłowski 7 min czytania
28 znanych aplikacji webowych napisanych w PHP
Dawid Karczewski 14 min czytania
Jakich usług programistycznych szukasz?
Dane rejestrowe:
Firma
Usługi
Najczęściej poszukiwani specjaliści
Ocena 4,8 / 5,0 od klientów z różnych branż i lokalizacji.