Współczesny inżynier DevOps stoi przed niezwykle skomplikowanym wyzwaniem z perspektywy technologicznej.
Wymaga się od niego biegłości w popularnych językach programowania, takich jak Node.js, Python czy skrypty powłoki. Dodatkowo, niezbędne jest zrozumienie, jak zintegrować automatyczne testy w procesach wdrażania oprogramowania.
Jako osoba integrująca kod w zautomatyzowanych potokach, inżynier DevOps musi posiadać przynajmniej podstawową wiedzę na temat różnorodnych usług chmurowych.
Jednakże, pomimo tej złożoności technologicznej, umiejętności techniczne nie zawsze stanowią największą przeszkodę dla inżynierów DevOps. Wbrew pozorom, kluczem do sukcesu nie jest tylko opanowanie twardych umiejętności, lecz także rozwinięcie kompetencji miękkich, jak potwierdzają doświadczenia praktyków DevOps.
Kluczowe kompetencje inżyniera DevOps
Źródło: devopsuniversity.org
Obserwacja pracy inżyniera DevOps w zespole Scrum to fascynujące doświadczenie. Zazwyczaj nie wnika on w szczegóły konkretnych zadań realizowanych przez zespół, skupiając się na aspektach technicznych i funkcjonalnych.
Jego zadaniem jest jednak połączenie wyników pracy zespołu w spójny proces wdrożenia, obejmujący także realizację i weryfikację różnorodnych testów automatycznych.
W tym kontekście, bycie wyłącznie ekspertem technicznym już nie wystarcza. Komunikacja staje się fundamentalnym elementem sukcesu. Przyjrzyjmy się zatem najważniejszym umiejętnościom, które powinien posiadać inżynier DevOps.
Umiejętności interpersonalne
Współpraca i dialog w zespole zwinnym są głównymi powodami, dla których brak umiejętności miękkich znalazł się na szczycie listy najważniejszych kompetencji DevOps. Jeśli wciąż zastanawiasz się dlaczego, oto kilka kluczowych argumentów:
- Inżynierowie DevOps nie osiągną sukcesu bez umiejętności adaptacji do potrzeb zespołu programistów, który tworzy fundamenty oprogramowania lub platformy. Ich zadaniem jest stworzenie środowiska produkcyjnego dla tego oprogramowania i zapewnienie jego prawidłowego działania.
- Poza synchronizacją z zespołem programistów, inżynierowie DevOps są kluczowym ogniwem łączącym zespół z zewnętrznymi interesariuszami, którzy chcą uzyskać dostęp do platformy. Muszą potrafić zrozumieć ich potrzeby i przełożyć skomplikowaną technologię zautomatyzowanego środowiska chmurowego na język zrozumiały dla osób nietechnicznych. Innymi słowy, są pomostem między zespołem programistów a resztą świata.
- Podczas gdy umiejętności techniczne można zdobyć poprzez systematyczną naukę, rozwój kompetencji miękkich wymaga głębszej refleksji nad własną postawą i osobowością. Trzeba nauczyć się patrzeć na siebie z innej perspektywy i identyfikować obszary do rozwoju. Nie jest to łatwe dla każdego.
Budowanie sieci kontaktów
W gąszczu technologii współczesnych platform chmurowych łatwo się zagubić. Trzeba poruszać się pośród usług systemów plików, różnorodnych baz danych, interfejsów API, architektur serwerowych i bezserwerowych, środowisk hybrydowych, wirtualnych sieci prywatnych, systemów równoważenia obciążenia, usług przesyłania strumieniowego i wielu innych.
Nie da się być ekspertem we wszystkim. Jednak inżynierowie DevOps muszą umieć łączyć te elementy w spójną i funkcjonalną platformę oprogramowania. Budowanie silnej sieci kontaktów jest więc nieodzowne.
Znalezienie optymalnej równowagi między prostotą a efektywnością komunikacji w systemach rozproszonych jest wyzwaniem, z którym muszą się zmierzyć i które powinni pomóc rozwiązać zespołowi.
Dojrzałość infrastruktury, którą tworzysz, staje się widoczna dopiero wtedy, gdy na poważnie podejmujesz tematy bezpieczeństwa i wyzwań stojących przed platformą. A to znowu domena inżyniera DevOps.
Zamiast polegać na starych, sprawdzonych kontaktach, trzeba nieustannie poszukiwać nowych, aby sprostać potrzebom wciąż rozwijającego się zespołu.
Testowanie oprogramowania
W świecie Agile, elastyczność w wydawaniu oprogramowania jest kluczowa. W konfiguracji scrumowej, z dwutygodniowymi sprintami, nowa wersja produkcyjna powinna pojawiać się co dwa tygodnie.
Biorąc pod uwagę cały cykl życia projektu, od planowania, przez szacowanie, tworzenie, testowanie, po wdrożenie, realizacja tych założeń nie jest możliwa bez automatyzacji większości etapów.
Kluczem do sukcesu w tej konfiguracji, umożliwiającym szybsze wdrożenia, jest nacisk na automatyzację testowania. Szybsze wdrożenia i automatyczne testy skracają czas potrzebny na feedback od użytkowników.
Dla inżyniera DevOps oznacza to integrację wyników pracy różnych zespołów testowych w potoku CI/CD:
- Włączenie wykonywania testów jednostkowych po każdej zmianie w repozytorium kodu. Jeśli takie testy nie istnieją, należy negocjować z programistami, aby je utworzyli.
- Zintegrowanie testów integracyjnych z potokiem CI/CD, który działa w spójnym środowisku testowym. Nie ma sensu uruchamiać testów integracyjnych na środowisku developerskim każdego programisty. Testy integracyjne muszą działać bez zarzutu w środowisku, w którym wszystkie usługi są zintegrowane, a dane są spójne.
- Włączenie kompleksowych testów odzwierciedlających rzeczywiste scenariusze do potoku CI/CD. Uczynienie tych testów obowiązkowymi przed każdym wdrożeniem głównej gałęzi kodu do środowiska testowego lub środowiska testów akceptacyjnych użytkownika. W ten sposób, wszystkie istotne procesy biznesowe będą działać bez zakłóceń.
Opracowanie skutecznych testów, które nie będą nadmierne, ale jednocześnie obejmą wszystkie krytyczne procesy, to kolejne wyzwanie. Inżynierowie DevOps nie muszą jednak robić tego sami.
Analitycy biznesowi czy menedżerowie ds. jakości mogą być częścią sieci (lub samego zespołu) i pomóc w określeniu dokładnych kroków. Rolą inżyniera DevOps jest przełożenie tych kroków na zautomatyzowany kod.
CI/CD i Infrastruktura jako kod
Już wspominaliśmy o tym wcześniej. Nie da się zaprzeczyć, że IaC (Infrastruktura jako kod) i jej realizacja za pomocą potoków CI/CD to jedne z najważniejszych osiągnięć inżynierów DevOps. W tym miejscu wszystkie elementy dostarczane przez zespół programistów, w postaci różnorodnych funkcjonalności usług, są łączone z rzeczywistym środowiskiem infrastrukturalnym. W efekcie powstaje oprogramowanie, które może być wielokrotnie wdrażane w różnych środowiskach.
Nic dziwnego, że to jedno z głównych wyzwań dla każdego inżyniera DevOps. Co więcej, jeśli wymagana jest niezależność od konkretnej chmury, oznacza to konieczność napisania IaC w języku Terraform i upewnienie się, że kod jest wolny od szczegółów specyficznych dla danego dostawcy. Praktyka pokazuje, że przejście na skrypty kodu niezależne od dostawcy może być trudne, nawet dla doświadczonych inżynierów.
Utrzymywanie infrastruktury chmurowej z wykorzystaniem wyłącznie ręcznych metod jest w dzisiejszych czasach po prostu niemożliwe. Choć w erze on-premise było to standardem, ten sam model pracy prowadził do kaskadowych procesów. Ręczne wdrożenia nie mają szans w środowisku Agile. Przejście na automatyzację jest koniecznością, choć niemal zawsze bywa bolesne.
Kiedy jednak ten proces zostanie poprawnie przeprowadzony, praca staje się znacznie łatwiejsza.
- Potrzebujesz wdrożenia produkcyjnego? Po prostu uruchom potok, który obejmuje wdrożenie kodu w środowisku produkcyjnym.
- Potrzebujesz dodatkowego środowiska developerskiego, aby nie kolidowało z pracą reszty zespołu? Uruchom potok, który automatycznie stworzy całą infrastrukturę developerską, włączając w to dane testowe.
- Gdy środowisko nie będzie już potrzebne, ten sam potok może wykonać polecenia usuwające wszystkie usługi, które były w nim wdrożone.
Dla skutecznego zespołu Agile, wdrożenie infrastruktury jako kodu i zintegrowanie jej z potokiem CI/CD jest nieuniknione. Inżynierowie DevOps są kluczowi w dostarczaniu tych rozwiązań.
Konteneryzacja
Źródło: aws.amazon.com
W dużych projektach, możliwość szybkiej replikacji ma fundamentalne znaczenie. Tworzenie setek kopii tych samych środowisk w krótkim czasie nie byłoby możliwe bez konteneryzacji. Konteneryzacja jest umiejętnością, która wymaga sporo nauki, dlatego nie wszystkie projekty korzystają z niej na pełną skalę.
Kontener to szablon, który można wykorzystywać wielokrotnie, a wynik pracy będzie zawsze taki sam. Identyczna infrastruktura i identyczne dane. Jest to cecha, którą inżynierowie DevOps budują dla swojego zespołu. Muszą opanować tworzenie kontenerów za pomocą różnorodnych narzędzi.
Kontenery są zaprojektowane tak, aby można było je łatwo tworzyć i usuwać. Inżynierowie DevOps powinni wdrożyć narzędzia do orkiestracji kontenerów, takie jak Kubernetes lub Docker Swarm, które potrafią automatycznie zarządzać wdrażaniem, skalowaniem i przywracaniem kontenerów do działania.
Kontenery korzystają z tego samego systemu operacyjnego. Jeśli jeden kontener zostanie naruszony, może stanowić zagrożenie dla innych na tym samym hoście. Ponadto, kontenery zbudowane z obrazów pochodzących od stron trzecich mogą zawierać luki w kodzie. Inżynierowie DevOps muszą zadbać o bezpieczeństwo, wdrażając funkcje izolacji kontenerów, kontroli dostępu i skanowania pod kątem luk.
Skalowalność to kolejna cecha kontenerów. Można je łatwo skalować w poziomie, aby dostosować do obciążenia. Jednak może to prowadzić do konfliktów o zasoby. Inżynierowie DevOps powinni wdrożyć narzędzia do zarządzania zasobami, takie jak cgroups czy przydziały zasobów Kubernetes.
Inżynierowie DevOps muszą podchodzić do konteneryzacji z myślą o bezpieczeństwie, skalowalności i odporności. Spośród wszystkich umiejętności technicznych, opanowanie konteneryzacji wymaga szczególnie dużego nakładu pracy. Złożoność tematu jest ogromna, dlatego tylko nieliczne projekty wykorzystują konteneryzację w pełni.
Podsumowanie
Inżynier DevOps to niezwykle ważny członek zespołu zwinnego. Nawet jeśli w projekcie jest tylko jeden lub dwóch inżynierów, ich rola jest fundamentalna dla powodzenia całego przedsięwzięcia.
Oczekiwania wobec inżynierów DevOps są bardzo wysokie, ponieważ muszą łączyć wiele ról w jedną:
- Muszą być silnymi programistami,
- Muszą umieć pracować w zespole, być empatycznymi i otwartymi na współpracę,
- Muszą być pomostem komunikacyjnym między zespołem programistów, a zewnętrznymi interesariuszami,
- Muszą integrować zespół w obszarze automatyzacji i weryfikacji testów kodu,
- Muszą zapewniać regularne wydania projektu,
- Muszą nieustannie budować sieć kontaktów.
Pomimo całej złożoności technologicznej, to czynnik ludzki odgrywa kluczową rolę w sukcesie inicjatyw DevOps. Jeśli aspirujesz do bycia inżynierem DevOps, możesz być dumny ze swojej decyzji i patrzeć na edukację z szerszej perspektywy, wykraczającej poza wiedzę techniczną.
Zachęcamy do zapoznania się z często zadawanymi pytaniami i odpowiedziami na rozmowach kwalifikacyjnych w obszarze DevOps.