Co to jest DevOps? | Przewodnik po kulturze i narzędziach | nFlo

Co to jest DevOps? Kompletny przewodnik po transformacji kulturowej i technologicznej w IT

Napisz do nas

W tradycyjnym modelu zarządzania IT, przez dekady funkcjonował niewidzialny, ale niezwykle solidny mur. Po jednej jego stronie znajdował się dział Rozwoju Oprogramowania (Development), którego głównym celem było jak najszybsze tworzenie i dostarczanie nowych funkcji biznesowych. Po drugiej stronie stał dział Operacji (Operations), którego nadrzędną misją było utrzymanie stabilności i niezawodności systemów produkcyjnych. Ta fundamentalna sprzeczność celów prowadziła do nieustannego konfliktu, wzajemnej nieufności i powstania tzw. „ściany chaosu” (wall of confusion), przez którą przerzucano sobie kod, problemy i odpowiedzialność.

Deweloperzy narzekali, że konserwatywny dział operacyjny blokuje innowacje i spowalnia wdrożenia. Dział operacyjny odpowiadał, że deweloperzy dostarczają niestabilny, nieprzetestowany kod, który zagraża ciągłości działania firmy. Konsekwencją tego konfliktu były długie, wielomiesięczne cykle wydawnicze, niska jakość oprogramowania, frustracja w zespołach i, co najważniejsze, ograniczona zdolność całej organizacji do szybkiego reagowania na zmiany rynkowe.

W odpowiedzi na ten dysfunkcyjny model, narodziła się DevOps – filozofia, ruch kulturowy i zbiór praktyk, których celem jest zburzenie tego muru. To podejście, które promuje ścisłą współpracę, wspólną odpowiedzialność, empatię i automatyzację w całym cyklu życia oprogramowania. Ten przewodnik to kompleksowe wprowadzenie do świata DevOps, które wyjaśni Państwu, czym jest ta koncepcja, na jakich filarach się opiera, jakie przynosi korzyści i jak w sposób strategiczny przeprowadzić taką transformację we własnej organizacji.

Czym jest DevOps i dlaczego to więcej niż tylko narzędzia i technologia?

Jednym z największych nieporozumień dotyczących DevOps jest postrzeganie go wyłącznie przez pryzmat narzędzi. Wiele firm uważa, że wdrożenie DevOps polega na zakupieniu platformy do automatyzacji CI/CD i zatrudnieniu „inżyniera DevOps”. To błąd, który niemal zawsze prowadzi do porażki. Narzędzia są oczywiście niezwykle ważne, ale są one jedynie środkiem do celu, a nie celem samym w sobie.

W swojej istocie, DevOps to przede wszystkim kultura organizacyjna. To zmiana sposobu myślenia i pracy, która stawia na pierwszym miejscu współpracę i wspólną odpowiedzialność za cały produkt – od pomysłu, przez kod, aż po jego stabilne działanie na produkcji. W kulturze DevOps nie ma już podziału na „my” (deweloperzy) i „oni” (operacje). Istnieje jeden, zintegrowany zespół, którego wspólnym celem jest jak najszybsze i jak najbezpieczniejsze dostarczanie wartości dla klienta końcowego.

Oznacza to przełamanie tradycyjnych silosów kompetencyjnych. Deweloperzy zaczynają myśleć o stabilności i monitorowaniu, a inżynierowie operacyjni są włączani w proces deweloperski od samego początku, pomagając w projektowaniu systemów, które będą łatwe w utrzymaniu i skalowaniu. Kluczowe stają się takie wartości jak zaufanie, transparentność i psychologiczne bezpieczeństwo, które pozwala zespołom na eksperymentowanie i uczenie się na błędach bez obawy o wzajemne oskarżenia. Dopiero na fundamencie takiej kultury można skutecznie budować procesy i wdrażać technologie, które tę współpracę wspierają.

Jak konflikt między działami rozwoju (Dev) i operacji (Ops) spowalnia rozwój Twojej firmy?

Aby w pełni docenić wartość, jaką przynosi DevOps, trzeba najpierw zrozumieć, jak destrukcyjny dla biznesu jest tradycyjny, silosowy model współpracy między tymi dwoma kluczowymi działami.

W tym modelu, zespół deweloperski (Dev) jest mierzony i nagradzany za szybkość i liczbę dostarczanych zmian. Ich celem jest jak najszybsze wdrażanie nowych funkcji, których domaga się biznes. Każda nowa linijka kodu i każda nowa funkcjonalność jest postrzegana jako sukces.

Z drugiej strony, zespół operacyjny (Ops) jest mierzony i nagradzany za stabilność, dostępność i niezawodność systemów produkcyjnych. Ich celem jest utrzymanie wskaźników dostępności (SLA) na poziomie 99,99% i minimalizowanie liczby incydentów. Z ich perspektywy, każda nowa zmiana wprowadzana przez deweloperów jest potencjalnym zagrożeniem dla stabilności – źródłem nowych błędów, problemów z wydajnością i nieplanowanych przestojów.

Te dwa zestawy celów są ze sobą fundamentalnie sprzeczne. Prowadzi to do powstania „ściany chaosu”. Deweloperzy „przerzucają przez mur” gotowy kod do działu operacyjnego, nie biorąc dalszej odpowiedzialności za jego działanie. Dział operacyjny, nie rozumiejąc w pełni tego kodu i bojąc się ryzyka, tworzy długie i skomplikowane procedury wdrożeniowe, które drastycznie spowalniają cały proces.

Konsekwencje tego konfliktu dla biznesu są opłakane. Cykle wydawnicze trwają miesiącami, co uniemożliwia szybkie reagowanie na potrzeby rynku. Wdrożenia są ryzykowne i często kończą się awariami, co prowadzi do frustracji klientów. Wewnątrz organizacji panuje atmosfera wzajemnego obwiniania się („blame game”), która niszczy morale i zaufanie. W rezultacie, cała machina technologiczna firmy, zamiast być motorem napędowym innowacji, staje się powolnym i nieefektywnym hamulcem.

Na jakich filarach (kultura, automatyzacja, pomiar) opiera się skuteczna transformacja DevOps?

Skuteczna transformacja w kierunku DevOps opiera się na kilku wzajemnie powiązanych filarach. W branży często opisuje się je za pomocą akronimu CALMS, który idealnie oddaje ich istotę.

  • Kultura (Culture): To najważniejszy filar, od którego wszystko się zaczyna. Obejmuje on budowanie wspomnianej już współpracy, zaufania i wspólnej odpowiedzialności. To także stworzenie kultury „braku winy” (blameless culture), w której awarie i błędy nie są powodem do szukania winnych, ale okazją do wspólnej analizy (tzw. post-mortem) i systemowego usprawnienia procesów, aby zapobiec ich powtórzeniu w przyszłości.
  • Automatyzacja (Automation): To technologiczne serce DevOps. Filozofia ta dąży do zautomatyzowania każdego powtarzalnego i podatnego na błędy ludzkie zadania w cyklu życia oprogramowania. Obejmuje to automatyczne budowanie kodu, automatyczne testy (jednostkowe, integracyjne, bezpieczeństwa), automatyczne wdrażanie na kolejne środowiska, a nawet automatyczne provisionowanie i konfigurowanie infrastruktury.
  • Podejście „Lean”: DevOps czerpie inspirację z filozofii „lean manufacturing”, promując pracę w małych partiach, eliminację marnotrawstwa (np. czasu spędzonego na czekaniu) i ciągłe dążenie do optymalizacji przepływu wartości od pomysłu do klienta.
  • Pomiar (Measurement): Nie da się ulepszyć czegoś, czego się nie mierzy. Skuteczny DevOps wymaga zbierania danych i metryk na każdym etapie procesu. Pozwala to na identyfikację wąskich gardeł, mierzenie efektywności wprowadzanych zmian i podejmowanie decyzji w oparciu o twarde dane, a nie o intuicję.
  • Dzielenie się (Sharing): Ostatni filar to kultura dzielenia się wiedzą, narzędziami i odpowiedzialnością. Zespoły wspólnie pracują nad rozwiązaniami, dokumentują swoją pracę i dbają o to, aby wiedza nie była zamknięta w głowach pojedynczych osób.

Jakie konkretne korzyści biznesowe przynosi wdrożenie kultury DevOps?

Wdrożenie DevOps to nie jest tylko wewnętrzna optymalizacja pracy działu IT. To strategiczna transformacja, która przynosi bardzo konkretne i mierzalne korzyści dla całego biznesu.

  • Znaczące przyspieszenie czasu dostarczania na rynek (Time-to-Market): Dzięki automatyzacji i współpracy, czas od powstania pomysłu biznesowego do wdrożenia go na produkcję skraca się z miesięcy do tygodni, a w dojrzałych organizacjach nawet do dni lub godzin. Pozwala to na znacznie szybsze reagowanie na potrzeby klientów i ruchy konkurencji.
  • Poprawa jakości i niezawodności produktów: Automatyzacja testów na każdym etapie oraz praca w modelu małych, częstych wdrożeń znacząco redukują liczbę błędów trafiających na produkcję. Awarie, choć wciąż możliwe, są łatwiejsze do zdiagnozowania i szybsze do naprawienia, co przekłada się na wyższą stabilność i dostępność usług.
  • Zwiększona produktywność i efektywność zespołów: Automatyzacja uwalnia deweloperów i administratorów od powtarzalnych, manualnych zadań, pozwalając im skupić się na pracy o wyższej wartości. Lepsza współpraca eliminuje czas tracony na nieporozumienia i konflikty.
  • Wzrost innowacyjności: Skrócenie cyklu wydawniczego i zmniejszenie ryzyka związanego z wdrożeniami zachęca do eksperymentowania i testowania nowych pomysłów, co jest siłą napędową innowacji.
  • Większa satysfakcja i zaangażowanie pracowników: Praca w kulturze opartej na zaufaniu, autonomii i wspólnej odpowiedzialności, z wykorzystaniem nowoczesnych narzędzi, jest po prostu bardziej satysfakcjonująca. Prowadzi to do mniejszej rotacji i łatwiejszego przyciągania największych talentów z rynku.

Jaką rolę w DevOps odgrywa bezpieczeństwo, czyli czym jest koncepcja DevSecOps?

We wczesnej fazie rozwoju DevOps, bezpieczeństwo było często pomijanym elementem. Skupiano się głównie na współpracy między Dev i Ops. Szybko jednak okazało się, że tradycyjny, „bramkowy” model bezpieczeństwa, w którym zespół security pojawia się na samym końcu procesu, aby przeprowadzić audyt i zablokować wdrożenie, jest całkowicie niekompatybilny z nową, zwinną filozofią.

Tak narodził się DevSecOps, czyli naturalna ewolucja DevOps, która włącza bezpieczeństwo jako integralną część całego cyklu. Filozofia DevSecOps opiera się na założeniu, że bezpieczeństwo jest wspólną odpowiedzialnością wszystkich członków zespołu, a nie tylko zadaniem wyizolowanego działu bezpieczeństwa. To realizacja w praktyce koncepcji „Shift-Left Security”, czyli przesuwania działań związanych z bezpieczeństwem jak najwcześniej w lewo na osi czasu projektu.

W modelu DevSecOps, testowanie bezpieczeństwa jest wbudowywane i automatyzowane w potoku CI/CD, na równi z testami funkcjonalnymi. Analiza bezpieczeństwa kodu (SAST), testowanie aplikacji w trakcie działania (DAST) czy, jak w przypadku RidgeBot®, automatyczne testy penetracyjne, stają się automatycznymi bramkami jakości. Dzięki temu deweloperzy otrzymują natychmiastową informację zwrotną o ewentualnych lukach, co pozwala im na ich szybką naprawę, a zespół bezpieczeństwa, zamiast być „hamulcowym”, staje się mentorem i architektem, który dostarcza zespołom deweloperskim odpowiednie, zautomatyzowane narzędzia.

Jakie są kluczowe praktyki DevOps, takie jak CI/CD?

DevOps to zbiór konkretnych praktyk technicznych i procesowych, które umożliwiają realizację tej filozofii. Do najważniejszych należą:

  • Ciągła Integracja (Continuous Integration, CI): To praktyka, w której deweloperzy bardzo często (nawet kilka razy dziennie) integrują swoje zmiany w kodzie z głównym, centralnym repozytorium. Każda taka integracja automatycznie uruchamia proces budowania aplikacji i zestaw testów jednostkowych, co pozwala na natychmiastowe wykrycie ewentualnych konfliktów i błędów.
  • Ciągłe Dostarczanie/Wdrażanie (Continuous Delivery/Deployment, CD): To naturalne rozszerzenie CI. Polega na tym, że każda zmiana, która pomyślnie przejdzie wszystkie zautomatyzowane etapy testowania w potoku, jest automatycznie wdrażana na kolejne środowiska – najpierw na środowisko testowe, a w najbardziej dojrzałych organizacjach (Continuous Deployment) – nawet bezpośrednio na produkcję.
  • Infrastruktura jako Kod (Infrastructure as Code, IaC): To praktyka zarządzania i provisionowania całej infrastruktury (serwerów, sieci, baz danych) za pomocą kodu i plików konfiguracyjnych, a nie manualnych operacji. Umożliwia to pełną automatyzację, powtarzalność i kontrolę wersji nad środowiskiem, na którym działa aplikacja.
  • Monitorowanie i Obserwowalność (Monitoring & Observability): To praktyka zbierania szczegółowych danych telemetrycznych (logi, metryki, ślady) z działającej aplikacji i infrastruktury, co pozwala na szybkie wykrywanie problemów, analizę ich przyczyn i uzyskiwanie informacji zwrotnej do dalszego doskonalenia produktu.

Od czego zacząć wprowadzanie zmian kulturowych i procesowych w organizacji?

Transformacja w kierunku DevOps to przede wszystkim zmiana organizacyjna i kulturowa, dlatego musi być prowadzona w sposób przemyślany. Nagła, odgórna rewolucja zazwyczaj kończy się porażką. Znacznie skuteczniejsze jest podejście ewolucyjne.

Niezbędne jest uzyskanie poparcia i zrozumienia na najwyższym szczeblu zarządczym. Liderzy muszą zrozumieć, jakie korzyści biznesowe przyniesie ta transformacja i aktywnie ją wspierać.

Najlepszą strategią jest rozpoczęcie od projektu pilotażowego. Należy wybrać jeden, ważny, ale nie najbardziej krytyczny produkt lub usługę i powołać wokół niego pierwszy, prawdziwie interdyscyplinarny zespół, składający się z deweloperów, administratorów, testerów i specjalistów od bezpieczeństwa. Należy dać temu zespołowi autonomię, odpowiednie narzędzia i jasne cele.

Kluczowe jest mierzenie i komunikowanie sukcesów zespołu pilotażowego. Pokazanie całej organizacji, że nowy sposób pracy pozwala na dostarczanie oprogramowania pięć razy szybciej i z o połowę mniejszą liczbą błędów, jest najlepszym argumentem za rozszerzeniem transformacji na kolejne obszary. Równie ważne jest stworzenie kultury „braku winy” (blameless post-mortems), w której każda awaria jest traktowana jako okazja do nauki dla całego zespołu, a nie do szukania winnych.

Jakie narzędzia wspierają automatyzację procesów w metodyce DevOps?

Choć narzędzia nie są celem samym w sobie, są one niezbędnym elementem, który umożliwia wdrożenie praktyk DevOps. Ekosystem narzędziowy jest ogromny i dynamiczny, ale można go podzielić na kilka kluczowych kategorii:

  • Kontrola wersji kodu: Absolutnym standardem jest tutaj Git, a najpopularniejszymi platformami do hostowania repozytoriów są GitHub, GitLab i Bitbucket.
  • Automatyzacja budowania i CI/CD: To serce automatyzacji. Do najpopularniejszych narzędzi należą Jenkins (open-source’owy standard), GitLab CI/CD (ściśle zintegrowany z repozytorium), Azure DevOps czy CircleCI.
  • Konteneryzacja: Technologią, która zrewolucjonizowała DevOps, jest Docker. Pozwala on na „pakowanie” aplikacji wraz ze wszystkimi jej zależnościami w lekkie, przenośne kontenery.
  • Orkiestracja kontenerów: Do zarządzania aplikacjami składającymi się z setek kontenerów na dużą skalę, standardem stał się Kubernetes.
  • Infrastruktura jako Kod: Do definiowania infrastruktury w formie kodu służą narzędzia takie jak Terraform i Ansible.
  • Monitorowanie: W tym obszarze królują rozwiązania open-source, takie jak Prometheus (do zbierania metryk) i Grafana (do ich wizualizacji).
  • Bezpieczeństwo (DevSecOps): Potoki CI/CD integruje się z narzędziami do statycznej analizy bezpieczeństwa kodu (SAST), dynamicznej analizy aplikacji (DAST) oraz, w dojrzałych organizacjach, z platformami do automatycznej walidacji bezpieczeństwa, takimi jak RidgeBot.

Jak mierzyć sukces wdrożenia DevOps i jakie metryki są najważniejsze?

Sukces transformacji DevOps musi być mierzony za pomocą konkretnych, obiektywnych wskaźników. Branżowym standardem stały się tzw. metryki DORA (DevOps Research and Assessment), które koncentrują się na dwóch kluczowych obszarach: szybkości i stabilności.

  • Metryki szybkości (Velocity):
    • Częstotliwość wdrożeń (Deployment Frequency): Jak często organizacja jest w stanie skutecznie wdrożyć zmiany na produkcję? Elitarne zespoły robią to wielokrotnie w ciągu dnia.
    • Czas realizacji zmiany (Lead Time for Changes): Ile czasu upływa od momentu zatwierdzenia zmiany w kodzie do momentu jej wdrożenia na produkcję? Dla najlepszych, jest to kwestia godzin.
  • Metryki stabilności (Stability):
    • Wskaźnik nieudanych zmian (Change Failure Rate): Jaki procent wdrożeń powoduje awarię lub wymaga natychmiastowej interwencji? U najlepszych, wskaźnik ten jest poniżej 15%.
    • Czas przywrócenia usługi (Time to Restore Service, MTTR): Jak szybko organizacja jest w stanie przywrócić działanie usługi po wystąpieniu awarii? Elitarne zespoły potrafią to zrobić w ciągu godziny.

Te cztery metryki dają doskonały, oparty na danych obraz dojrzałości i efektywności procesów DevOps w organizacji.

Jakie są najczęstsze wyzwania i błędy podczas transformacji w kierunku DevOps?

Droga do dojrzałego DevOps jest trudna i wiele organizacji popełnia na niej podobne błędy. Najczęstszym z nich jest skupienie się wyłącznie na narzędziach, przy jednoczesnym zignorowaniu aspektu kulturowego. Zakup licencji na najnowocześniejszą platformę CI/CD nic nie da, jeśli zespoły wciąż będą działały w silosach i nie będą ze sobą współpracować.

Inne częste pułapki to brak cierpliwości i oczekiwanie natychmiastowych rezultatów. DevOps to maraton, a nie sprint, a realne zmiany kulturowe wymagają czasu. Poważnym błędem jest również opór przed zmianą ze strony menedżerów i inżynierów przyzwyczajonych do starych, ugruntowanych sposobów pracy. Nie można również zapominać o ignorowaniu aspektu bezpieczeństwa i wdrażaniu „Dev” i „Ops” bez uwzględnienia „Sec”.

Jak Kubernetes i konteneryzacja wspierają realizację celów DevOps?

Technologie konteneryzacji, na czele z Dockerem, oraz orkiestracji, gdzie standardem stał się Kubernetes, są często postrzegane jako technologiczny fundament nowoczesnego DevOps. Dzieje się tak, ponieważ idealnie rozwiązują one niektóre z największych problemów w tradycyjnym cyklu życia oprogramowania.

Konteneryzacja rozwiązuje fundamentalny problem „ale u mnie na komputerze działało”. Docker pozwala na spakowanie aplikacji wraz z całym jej środowiskiem – bibliotekami, plikami konfiguracyjnymi, zależnościami – w jeden, lekki, przenośny obraz (kontener). Taki kontener będzie działał identycznie, niezależnie od tego, czy zostanie uruchomiony na laptopie dewelopera, na serwerze testowym, czy na produkcji. Zapewnia to niespotykaną dotąd spójność i powtarzalność środowisk.

Z kolei Kubernetes jest odpowiedzią na pytanie, co zrobić, gdy mamy do zarządzania nie jednym, ale setkami lub tysiącami takich kontenerów. Jest to potężna platforma do orkiestracji, która automatyzuje proces wdrażania, skalowania, monitorowania i zarządzania aplikacjami skonteneryzowanymi na dużą skalę. Kubernetes potrafi automatycznie restartować kontenery w przypadku awarii, skalować aplikację w górę i w dół w zależności od obciążenia i zarządzać złożonymi zależnościami sieciowymi. Te technologie są naturalnym i niezwykle potężnym sprzymierzeńcem filozofii DevOps, ponieważ dostarczają narzędzi do budowy zautomatyzowanych, skalowalnych i odpornych na awarie systemów.

Jak usługi doradcze i wdrożeniowe nFlo mogą pomóc Twojej organizacji?

Transformacja w kierunku DevOps to złożona podróż, która dotyka każdego aspektu działania działu IT – od kultury i procesów, po architekturę i narzędzia. Wymaga ona nie tylko wiedzy technicznej, ale również doświadczenia w zarządzaniu zmianą organizacyjną.

W nFlo rozumiemy, że każda firma jest inna i nie istnieje jedno, uniwersalne rozwiązanie. Dlatego podchodzimy do transformacji DevOps w sposób partnerski i ewolucyjny. Nasze usługi doradcze i wdrożeniowe są zaprojektowane tak, aby wspierać Państwa na każdym etapie tej drogi.

  • Doradztwo strategiczne: Pomagamy zdiagnozować obecny stan dojrzałości Państwa procesów, zidentyfikować największe wąskie gardła i stworzyć realistyczną, dostosowaną do Państwa możliwości mapę drogową transformacji DevOps.
  • Wdrożenie narzędzi CI/CD i DevSecOps: Posiadamy głębokie kompetencje w zakresie projektowania i wdrażania nowoczesnych potoków CI/CD, włączając w to narzędzia do kontroli wersji, automatyzacji budowania i testowania, a także zintegrowane platformy do walidacji bezpieczeństwa, takie jak RidgeBot.
  • Infrastruktura oparta na kontenerach: Specjalizujemy się w projektowaniu i zarządzaniu skalowalną infrastrukturą opartą o kontenery Docker i orkiestrację Kubernetes, która jest fundamentem nowoczesnego DevOps.

Transformacja DevOps to podróż, która może zrewolucjonizować sposób, w jaki Twoja firma tworzy i dostarcza wartość. Jest to jednak podróż wymagająca doświadczonego przewodnika. Skontaktuj się z ekspertami nFlo, aby omówić, jak możemy wesprzeć Państwa na każdym etapie tej transformacji – od zmiany kulturowej, przez dobór i wdrożenie narzędzi, aż po osiągnięcie mierzalnych rezultatów biznesowych.

Masz pytania do artykułu? Skontaktuj się z ekspertem

Skontaktuj się z nami, aby odkryć, jak nasze kompleksowe rozwiązania IT mogą zrewolucjonizować Twoją firmę, zwiększając bezpieczeństwo i efektywność działania w każdej sytuacji.

?
?
Zapoznałem/łam się i akceptuję  politykę prywatności.

O autorze:
Grzegorz Gnych

Grzegorz to doświadczony profesjonalista z ponad 20-letnim stażem w branży IT i telekomunikacji. Specjalizuje się w zarządzaniu sprzedażą, budowaniu strategicznych relacji z klientami oraz rozwijaniu innowacyjnych strategii sprzedażowych i marketingowych. Jego wszechstronne kompetencje potwierdza szereg certyfikatów branżowych, w tym z zakresu zarządzania usługami IT oraz technologii wiodących producentów.

W swojej pracy Grzegorz kieruje się zasadami przywództwa, ciągłego rozwoju wiedzy i proaktywnego działania. Jego podejście do sprzedaży opiera się na głębokim zrozumieniu potrzeb klientów i dostarczaniu rozwiązań, które realnie zwiększają ich konkurencyjność na rynku. Jest znany z umiejętności budowania długotrwałych relacji biznesowych i pozycjonowania się jako zaufany doradca.

Grzegorz szczególnie interesuje się integracją zaawansowanych technologii w strategiach sprzedażowych. Skupia się na wykorzystaniu sztucznej inteligencji i automatyzacji w procesach sprzedażowych, a także na rozwoju kompleksowych rozwiązań IT wspierających transformację cyfrową klientów.

Aktywnie dzieli się swoją wiedzą i doświadczeniem poprzez mentoring, wystąpienia na konferencjach branżowych i publikacje. Wierzy, że kluczem do sukcesu w dynamicznym świecie IT jest łączenie głębokiej wiedzy technicznej z umiejętnościami biznesowymi i nieustanne dostosowywanie się do zmieniających się potrzeb rynku.