W tym obszernym artykule opisuję co ważniejsze rzeczy w kwestii rekrutacji na stanowisko DevOps Engineer, czyli nie zabraknie potencjalnych pytań rekrutacyjnych i wskazówek. Spróbuję odpowiedzieć czym takie stanowisko jest, ale nie będzie to definicja wiążąca w żadnym stopniu, bo różne firmy, różnie do tego podchodzą.

Dodatkowo pokażę wyniki mojej automatycznej analizy 2 największych portali z ofertami pracy, pod kątem tego jakie słowa kluczowe występują w ofertach pracy na DevOps Engineer najczęściej.

Spis treści



Wstęp, czyli kto to taki, ten DevOps Engineer

Zobacz na inny mój artykuł, który wyjaśnia kim lub czym jest DevOps Enginner.



Analiza ofert pracy na polskim rynku (7-14 Sierpnia 2019)

Automatycznej analizie poddałem oferty pracy dla DevOps Engineera na 2 polskich najpopularniejszych polskich job boardach z ofertami pracy w IT, w których można było wybrać kategorię DevOps. Serwisy poddane analizie wiedzą o tym fakcie, przynajmniej ich logi, jakoże bot przedstawiał im swoje User-Agent.

Metodologia była prosta: bot zbierał oferty pracy tylko dla DevOps Engineer poszukując wcześniej zdefiniowanych słów kluczowych (lista ich wystąpień jest tym najważniejszym parametrem na wykresach). To najprostszy sposób automatycznego zbierania słów kluczowych, jednak ma pewne wady.

Np AWS i Amazon Web Service są traktowane oddzielnie, bo w takich wersjach były właśnie umieszczane w ofertach pracy. Jedna oferta pracy zawierała AWS, druga Amazon Web Service przez to są dwie kategorie. Podobny problem występuje w przypadku GCP i Google Cloud Platform

Inna sytuacja: SQL (sam język) mógł być zaliczany na konto np. MySQL czy PostgreSQL, a to nie jest do końca poprawna klasyfikacja, niemniej nic tu nie poprawiałem, bo jakby nie było znajomość MySQL czy PostgreSQL wymaga znajomości SQL samego w sobie, stąd uważam to przekłamanie za nieznaczące.

Niektóre słowa kluczowe były w niektórych ofertach w ogóle źle napisane, np: Kubernates, co już w ogóle dyskwalifikowało znalezienie takiego słowa i klasyfikację jako Kubernetes - tu bez ML już by się nie obeszło, aby takie niedociągnięcia klasyfikować.

Inną ważną kwestią, na którą warto tutaj zwrócić uwagę - poszukiwane były słowa kluczowe w całej ofercie, bez związku z tym, jaki stopień ich znajomości jest wymagany. Zatem te technologie, które wylądowały na wykresach, mogły być wymagane lub mile widziane, dla crawlera to było bez znaczenia.


JobBoard 1 - lista wymaganych technologii na DevOps Engineer

Na pierwszym wykresie widzimy, że najczęściej w ofertach o pracę na DevOps Engineer na tym boardzie pojawiają się takie słowa kluczowe jak: Linux, Docker, Python, Git, Ansible, AWS, Jenkins, Terraform czy Kubernetes. Nie należy “lekceważyć” również mniej popularnych technologii, bo oferty pracy są właśnie mieszanką tych najpopularniejszych + kilku “ze środka stawki” lub nawet z końca.

To co się rzuca tutaj w oczy, to np. większy nacisk na umiejętność programowania w Pythonie niż np. w bash. Warto o tym pamiętać, ponieważ sporo przyszłych DevOps Engineerów/Sysadminów stroni od programowania, a to jak widać poważny błąd. Niestety na tym stanowisku nie da się od tego uciec. A wśród innych języków programowania pojawiają się Java, Ruby, Scala, JavaScript .NET czy Golang - jako języki stacku lub bezpośrednio w których ta rola będzie pracować.

Wysokie miejsca AWS, Azure czy GCP pokazują, że większość firm, przynajmniej część swojej infrastrukturzy posiada lub chce posiadać w Cloudzie. Na uwagę zasługuje również Windows+Powershell, co oznacza, że też mogą przewijać się oferty pracy dla DevOps Engineer w tym właśnie stacku.

JobBoard z serwisu 1, przedstawiający rozkład słów kluczowych z ogłoszeń o pracę na stanowisku DevOps


JobBoard 2 - lista wymaganych technologii na DevOps Engineer

Tutaj sprawa wygląda całkiem podobnie, pierwsze miejsca okupują: Linux, Docker, Ansible (zamiast Python), Git i dopiero Python. Następnie Kubernetes, AWS, SQL, Bash, Jenkins itp.

Również i tutaj widać większą popularność Pythona niż Basha w ofertach, wśród języków programowania pojawiają się dodatkowo Perl czy Lua. Z kolei oprócz Ansible i Puppet i Chef, pojawia się także Salt, o czym potencjalni devopsi nie powinni zapominać.

JobBoard z serwisu 2, przedstawiający rozkład słów kluczowych z ogłoszeń o pracę na stanowisku DevOps

Tematy rekrutacyjne, czyli co warto znać rekrutując się na stanowisko DevOps Engineer

Zaprezentowane tutaj pytania i zagadnienia oczywiście nie wyczerpują tematu rekrutacji na stanowiska typu DevOps Engineer. To zbiór zebranych tematów z moich rozmów rekrutacyjnych, z rekrutacyjnych z firm, w których dotychczas pracowałem, z opowiadań znajomych DevOpsów jak i z zebranych materiałów z sieci.

Oczywiście, warto tu nadmienić, że każda rekrutacja jest inna. I nawet jeżeli jesteś np. mistrzem Ansible, masz 5 lat doświadczenia w pisaniu zaawansowanych modułów i ról do niego, pękający od tychże profil na GitHubie (i podobnych), ale aplikujesz do firmy, która posiada Salta (z którym nie dane było Ci mieć do czynienia), to możesz z tego tytułu nie dostać zatrudnienia. Taka sama sytuacja może być np. gdy firma używa np. GCP zamiast AWS, podczas, gdy Ty posiadasz certyfikację AWS.

Zatem kluczowe jest wiedzieć, na co firma, do której aplikujesz, kładzie szczególny nacisk, bo zwyczajnie możesz mimo imponującego dorobku po prostu do niej nie pasować. I nie jest to nic złego, po prostu tak czasami bywa.

To co warto tu wspomnieć - część pytań tutaj zaprezentowanych jest podchwytliwa - mogą brzmieć błędnie, niedorzecznie lub niekompletnie, ale właśnie takie mają być, bo sprawdzają czy kandydat zorientuje się w materii. Ponadto pytania, które wyglądają na proste do odpowiedzi w 1 zdaniu, w rzeczywistości takimi być nie muszą.

Celowo nie daję linków do rozwiązań/odpowiedzi, gdyż bardzo ważną umiejętnością DevOps Engineera jest szukanie informacji. Mam nadzieję, że nie zostane za to zlinczowany. :)

Uwaga: te pytania dotyczą DevOps Engineer w firmach, które posiadają swoje aplikacje na instancjach Linux. Istnieją również DevOps Engineerzy, którzy zajmują się również instancjami na Windows - pytań z tego zakresu nie będę tutaj publikował, bo po prostu nie mam zbyt dużej wiedzy o rekrutacji na takie stanowiska.

Zagadnienia podstawowe i technologie, które należy znać jako DevOps Engineer

Zagadnienia podstawowe, to zagadnienia bez znajomości których, moim zdaniem, ciężko będzie w ogóle przejść pozytywnie rozmowę techniczną na DevOps Engineera. Dlatego warto na nie rzucić okiem, bo trochę ich jest.

Linux

Oczywiście, jak chodzi o pytania dot. Linux, to kwestia odpowiedzi tyczy się używania terminala oczywiście (a nie klikania w środowisku graficznym).

  • Jak sprawdzić aktualny adres IP instancji?
  • Jak sprawdzić domyślny routing instancji?
  • Co to jest proces i czym się różnią: proces, program i kod źródłowy?
  • Jakie są możliwe stany procesu?
  • Jak sprawdzić PID procesu w systemie?
  • Podstawowe operacje na plikach i katalogach (tworzenie/zmiana nazw/kopiowanie/przenoszenie/usuwanie)
  • Co robi polecenie kill?
  • Co to jest inode?
  • Co to jest load average i co znaczą poszczególne jego cyfry?
  • Czy load average=4 to jest dużo czy mało?
  • Jaki jest domyślny port serwera SSH?
  • Jak sprawdzić, który proces nasłuchuje na danym porcie?
  • W jaki sposób odpalić proces w “tło”?
  • Jak sprawdzić listę aktywnych połączeń sieciowych w systemie?
  • Co robi polecenie umask?
  • Logujesz się na jakiś serwer i stwierdzasz, że z poziomu użytkownika można odczytywać /etc/passwd i /etc/shadow, co to dla Ciebie może oznaczać?
  • W jaki sposób zablokować połączenia z konkretnego adresu IP na konkretny port w systemie?
  • Czym jest różni bufor od cache?
  • Co to jest chroot?
  • Wyjaśnij output z polecenia free, co znaczą poszczególne wartości?
  • Co to jest rsync i do czego służy?

Bash

  • Jaka jest różnica przy uruchamianiu między ./script.sh a . ./script.sh?
  • Napisać prosty skrypt w bash z instrukcją warunkową
  • Napisać prosty skrypt bash, który pobiera np. 2 parametry z linii komend i coś z nimi robi
  • Jakiś prosty jednolinijkowiec wykorzystujący np. grep
  • Sprawdzić prosty skrypt w bashu pod kątem błędów składniowych
  • Napisz FizzBuzz

Python

  • Jakiego rodzaju językiem programowania jest Python?
  • Masz listę numerów, przemnóż * 10 wszystkie numery tej listy podzielne przez 2
  • Masz listę numerów, wyciągnij X znaków w przód/tył, odwróć lub posortuj listę
  • Jak zainstalować zależności do jakiegoś programu/skryptu?
  • Co to jest virtualenv?
  • Napisz FizzBuzz

Cloud

  • Wymień znanych Ci dostawców rozwiązań w cloudzie
  • Wymień najbardziej podstawowe znane Ci serwisy oferowane w cloudzie
  • Co to jest on-premise i jaki ma związek z tematyką cloud?
  • Co wychodzi korzystniej kosztowo: Cloud czy własna infrastruktura i dlaczego?

Provisioning

  • Wymień znany Ci tool do provisiningu
  • Po co stosuje się tego typu oprogramowanie?
  • Czego Ansible wymaga na serwerze, na którym chcemy nim zarządzać?
  • Czy Puppet może działać bez agenta?

Sieci, protokoły

  • Co to jest ICMP?
  • Jak działa Traceroute?
  • Co to jest ARP?
  • Co to jest DHCP i jakiego protokołu używa?
  • Co to jest NNTP?
  • Co to jest HTTP i jakich portów używa?
  • Co to jest FTP i jakich portów używa?
  • Co to jest DNS i jakich portów używa i do czego?
  • Czym różni się protokół TCP i UDP?
  • Co to jest TCP Handoff?
  • Czy w sieciach jest broadcast, multicast, unicast oraz anycast?
  • Jaka jest różnica między segmentami, pakietami i ramkami?
  • Czy potrafisz opisać co zawiera nagłówek TCP?
  • Czym się różnią protokoły routingu od protokołów routowalnych?
  • W jaki sposób odpytać konkretny serwer DNS o konkretny rekord?
  • Co oznacza wartość TTL w rekordzie DNS?
  • Wymień znane Ci metody HTTP (przynajmniej te najpopularniejsze)?
  • Jaka jest różnica między metodami POST i GET w HTTP?
  • Jakie są różnice pomiędzy HTTP 1.* a HTTP 2?
  • Wymień znane Ci numery błędów (niekoniecznie konkretne), które może zwracać HTTP?
  • W jaki sposób możesz dowiedzieć się, która usługa standardowo na jakim porcie nasłuchuje?
  • Co to jest IPv6 i czym się różni od “standardowego”?
  • Do jakiej klasy IP należy adres IP X.X.X.X?

System kontroli wersji

  • Wymień znane Ci systemy kontroli wersji
  • Po co w ogóle stosuje się system kontroli wersji?
  • (git) czym różni się merge od rebase?
  • (git) co to jest gałąź (branch)?
  • (git) czym jest working directory, staging oraz repozytorium?
  • (git) co to jest konflikt?
  • (git) w jaki sposób we współdzielnym repozytorium cofnąć swój commit?

Kontenery i wirtualizacja

  • Jaka jest różnica pomiędzy wirtualną maszyną a kontenerem (Linux)?
  • Podaj przykłady rozwiązań wirtualizacyjnych
  • Podaj przykłady rozwiązań kontenerowych (Linux)
  • Czy można uruchamiać kontenery w wirtualnej maszynie i dlaczego?

CI/CD

  • Co to jest Jenkins i po co się go stosuje?
  • Co to jest job?
  • Czym jest pipeline?

Monitoring

  • Wymień znane Ci toole do monitoringu
  • Po co w ogóle stosuje się takie toole?

Logowanie

  • Czym są logi?
  • Jakie znasz programy logujące?
  • Dlaczego możemy chcieć logować coś w ogóle do zdalnej lokalizacji?

Security

  • Czym jest kryptografia?
  • Różnice między kryptografią symetryczną a asymetryczną?
  • Co to jest SQL Injection?
  • Czy wolno zapisywać hasła użytkowników do bazy, jeśli nie, to dlaczego?
  • Co jest bardziej bezpiecznym rozwiązanie (by default), kontenery czy wirtualizacja i dlaczego?

Bazy danych

  • Jakie znasz rodzaje baz danych?
  • Prosty SQL wyciągający jakieś dane, z prostymi warunkami, sortowaniem, kolejnością

Różne / Architektura / Pytania otwarte do dyskusji

  • Co to jest RAID, jakie znasz rodzaje i przykłady użycia?
  • Co to jest load balancing i do czego służy?
  • Czym jest High Availability?
  • Co to jest mock i po co się to stosuje?
  • Co to jest JSON i czy znasz jakieś alternatywy?
  • Czy Twoim zdaniem jest sens tworzenia kilku środowisk developerskich czy lepiej posiadać jedno?
  • Opisz w jaki sposób może wyglądać potencjalny flow rozwoju aplikacji, w systemie z kontrolą wersji, z toolem do provisingu, z toolem do CI/CD, w sytuacji gdy developerzy scalają lub próbują scalić swoje zmiany z główną gałęzią



Zagadnienia rozszerzone i technologie, które wypada trochę znać jako DevOps Engineer

Pod zagadnieniami rozszerzonymi rozumiem taką grupę trudniejszych pytań, które mają szansę się pojawić w każdej rozmowie nt. stanowiska DevOps, niezależnie czy dotyczy ona juniora czy seniora, ale tego typu pytania nie będą (raczej) pytaniami dominującymi.

Teoria

  • Co to jest Continous Delivery?
  • Co to jest Continous Integration?
  • Co to jest Continous Deployment?

Linux

  • Czym są namespaces i cgroups?
  • Co to jest deskryptor pliku?
  • W jaki sposób wymusić, aby pakiety sieciowe do jakieś sieci “szły” przez dany interfejs sieciowy?
  • Jak zabić proces tzw. “zombie”?
  • Jaka jest różnica między soft a hardlinkiem?
  • Czym się różni katalog od pliku “pod maską”?
  • Inny sposób usuwania pliku, aniżeli z użyciem jego nazwy?
  • Jak sprawdzić listę otwartych plików danego procesu?
  • Czy jest możliwe i jeśli tak to jak: zmniejszenie rozmiaru partycji podczas działania systemu?
  • Jak sprawdzić i ew. zmienić limit otwartych deskryptorów plików w systemie?
  • Co się stanie z kolejnymi procesami, jeśli w systemie istnieje się już process z najwyższym numerem PID (pid_max)?
  • Co można sprawdzić/zrobić, jeśli usunięto z filesystemu duży plik, ale zupełnie nie przywróciło to miejsca, które on zajmował?
  • Jaka jest różnica między linkowaniem statycznym a dynamicznym?
  • Co to jest SELinux/AppArmor i po co się to stosuje?
  • Jak można podłączyć się do działającego procesu i sprawdzić co on dokładnie robi?
  • W jaki sposób można wstrzyknąć procesowi coś do jego pamięci?
  • Jak zamknąć jedno konkretne połączenie TCP danego procesu?
  • W jaki sposób możemy wykryć tzw. memory leak (wyciek pamięci) danego procesu?
  • W jaki sposób możemy wstrzyknąć tekst do pakietu sieciowego?
  • Opisać ew. przykładowy output z polecenia strace
  • Opisz w uproszczeniu proces bootowania systemu opartego o kernel Linux
  • Co to jest systemd i co go charakteryzuje w porównaniu do rozwiązań “starszych”?
  • W jaki sposób w systemie z aktywnym SELinuksem można łatwo utworzyć politykę dla aplikacji, która jest przez niego blokowana w jakiś sposób?
  • Do czego stosujemy perf?
  • W jaki sposób możesz robić inspekcje plików wykonywalnych (binarnych)?
  • Jakie znasz sposoby ograniczenia uprawnień użytkownika root?
  • Jak odzyskać zapomniane hasło użytkownika root?
  • W jaki sposób sprawdzisz, czy dana instancja wysyła/odbiera requesty do/od innego hosta?
  • Co się dzieje, gdy w systemie kończy się pamięć operacyjna i czy można jakoś na to wpływać?

Bash

  • Bardziej zaawansowany skrypt, funkcje, pętle, kierowanie strumieni stder, stdout itp
  • Zmienne specjalne w bash (jakie znasz, jak ich używać, itp)
  • Jak debugować skrypt w bash?
  • Czym jest bultin set w bashu i czy znasz jakieś jego zastosowanie?
  • Jakiś zaawansowany jednolinijkowiec wyciągający coś z pliku, sortujący po kolumnach, sumujący wartości itp (umiejętność stosowania sed/awk/perl może być mile widziana)

Python

  • Jakie znasz narzędzia do automatycznej analizy kodu i co one dają?
  • Jakie są różnice między listą (list) a krotką (tuple)?
  • Czym są dekoratory?
  • Jakiś kod do napisania z map/filter/reduce, generatorami, funkcjami/klasami
  • Przykład z
  • Co to jest PEP8?

Dodatkowy język programowania (np. Perl, Ruby, Go, Java, Rust, Haskell)

  • Napisz FizzBuzz w tym dodatkowym języku

Cloud

  • co to jest immutable infrastructure, jakie ma zalety i wady?
  • (aws) jaki jest limit tzw. free tier lub jak go w ogóle sprawdzić?
  • (aws) co to jest lambda i kiedy to zastosować?
  • (aws) jakie znasz możliwości ograniczenia dostępu do obiektów S3?
  • (aws) jakie jest domyślne ustawienie bezpieczeństwa dla S3?
  • (aws) co to jest CloudFormation i czy znasz jakieś alternatywy?
  • (gcp) jak się nazywa usługa podobna do aws lambda?
  • Czym jest terraform, jak działa i po co go stosujemy?
  • Czym jest packer, jak działa i po co go stosujemy?
  • Czym jest consul, jak działa i po co go stosujemy?
  • Jakie znasz sposoby testowania infrastruktury?

Sieci, protokoły

  • Co to jest Ethernet
  • Co to jest Spanning Tree Protocol
  • Co to jest SMTP i jakich portów może używać
  • Co to jest websocket?
  • Jaka jest różnica między metodami HTTP PUT i PATCH?
  • Co to jest SNI?
  • Opisz 3 way handshake
  • Opisz TLS 3 way handshake
  • Wszelkie pytania o konkretne typy rekordów DNS i za co one odpowiadają (A/CNAME/SRV/TXT/NS/MX itp)
  • Co to jest kod authinfo?
  • Co to jest notacja CIDR?
  • W jaki sposób można sprawdzić czy jakiś port na UDP jest otwarty na zdalnym hoście?
  • Oblicz/powiedz ile możesz zaadresować hostów w sieci np. X.X.X.X/28?
  • Jaka jest różnica między modelem ISO/OSI oraz TCP/IP?
  • Wyjaśnij swoimi słowami jak przebiega proces routingu pakietów w uproszczeniu?

System kontroli wersji

  • (git) w jaki sposób możesz cofnąć zmiany (lokalne lub zdalne), gdy chcemy coś poprawić?
  • (git) czy istnieje sposób usunięcia dużego pliku, omyłkowo dodanego do repozytorium?
  • (git) czym są tagi i po co się je stosuje?
  • (git) co to jest reflog?
  • (git) czy potrafisz opisać jak git przechowuje informacje o plikach/katalogach w swoich “bebechach”?
  • (git) wymień sposoby ignorowania plików/katalogów?
  • (git) czy możesz mieć różne tożsamości, przy różnych repozytoriach, które są przechowywane w jednym katalogu (np ~/git/repo_a, ~/git/repo_b i ~/git/repo_c)
  • (git) czy znasz jakiś sposób poszukiwania commita, który wprowadził jakąś ważną zmianę lub coś zepsuł?
  • (git) co to jest fork i pullrequest i jak to jest w gicie zaimplementowane?

Kontenery i wirtualizacja

  • Czy aplikacja może “ucieć” z wirtualnej maszyny lub “zorientować się”, że jest wirtualizowana
  • Alternatywy dla dockera - czy są jakieś, jeśli tak to jakie
  • (docker) w jaki sposób można sprawdzić czy nasza aplikacja działa i nasłuchuje na danym porcie?
  • (docker) co robi przełącznik --priviledged?
  • (docker) jaka jest różnica pomiędzy docker exec a docker run?
  • (docker) jaka jest różnica pomiędzy entrypoint a cmd w Dockerfile?
  • (docker) czy da się “zapisać” kontener w aktualnym stanie i przenieść go w innej miejsce (np. inny serwer)?
  • Jaka jest różnica pomiędzy Docker a Kubernetes?
  • Wymień najważniejsze Twoim zdaniem elementy klastra Kubernetes
  • Po co stosujemy w ogóle Kubernetes i czy istnieją jakieś alternatywy?
  • Czym są pody i namespace w Kubernetes?
  • W jaki sposób używamy relacyjnych baz danych działających w Kubernetes?

Serwer HTTP

  • Jakie znasz serwery HTTP i czym się one charakteryzują?
  • Opisz jak z punktu widzenia serwera HTTP może działać aplikacja typu LAMP

CI/CD

  • Jakie znasz inne alternatywy dla Jenkinsa?
  • (jenkins) czym jest Jenkinsfile?
  • (jenkins) w jakiej architekturze może działać jenkins?
  • (jenkins) jaki znasz sposób konfiguracji jenkinsa inny niż poprzez jego interfejs webowy?
  • (jenkins) czy są jakieś defaultowe ustawienia świeżej instalacji jenkinsa, na które trzeba zwrócić szczególną uwagę?
  • (jenkins) czym są parametry joba i po co się je stosuje?

Monitoring

  • Czym jest zabbix?
  • Czym jest prometheus?
  • Przedstaw w jaki sposób można monitorować aplikację LAMP (Apache+MySQL+PHP)?
  • Do czego używa się się takiego multistacka: Logstash+Kibana+Sentry+Elasticsearch?

Security

  • Co to jest OSWASP?
  • Czym jest atak XSS?
  • Czym jest atak CSRF?
  • Co to jest CORS?
  • Czym jest atak DNS Aplification?
  • Co to jest ARP poisoning?
  • Co to jest atak typu DDoS?
  • Czym jest reverse engineering i po co się go stosuje?
  • Co może być potencjalnym źródłem ataku jeśli rozważamy prosty TCP 3 way handshake?
  • Co to jest Hashicorp Vault i do czego służy, znasz jakiś use case?
  • Czym jest fuzzing i po co się go stosuje?
  • Czym jest CloudFlare i po co się to stosuje?

Bazy danych

  • Jakie są główne różnice pomiędzy MyISAM a InnoDB w MySQL/MariaDB?
  • SQL z JOINami, funkcjami agregującymi, funkcjami wbudowanymi (np. min, max, avg), warunkami, możliwy też UNION?
  • Co to jest binary log w MySQL??
  • Czym jest VACUUM w PostgreSQL i po co się to stosuje?
  • W jaki sposób zmienić sposoby uwierzytelniania w PostgreSQL?
  • Wymień sposoby backupu baz/tabel w MySQL/PostgreSQL jakie znasz?
  • Czy potrafisz powiedzieć co znaczy ACID?
  • Czym są VIEW?
  • Czym są triggery?
  • Czym jest index? Jakie są jego zalety i wady?
  • Jakie znasz typy baz NoSQL?

Różne / Architektura / Pytania otwarte do dyskusji

  • Jeżeli stack firmy stoi np. na JVMie, to mogą paść pytania o debug aplikacji na JVM, jak to się robi, jakich narzędzi się do tego używa, itp.
  • Co to jest Chaos Monkey i po co się to stosuje?
  • Co to jest memcached, po co się to stosuje, jakie są alternatywy i jakie zagrożenia?
  • Jaka jest różnica między Kafką, RabbitMQ, ActiveMQ i ZeroMQ?
  • Masz w swojej architekturze tajemniczy serwer - czarną skrzynkę, na którą Ty, lub Twój team, nie macie w ogóle dostępu. Ten serwer jednak, obsługuje niektóre starsze requesty API aplikacji rozwijanej przez Twój team. Team programistów ma swoją aplikacje, która ma swoją odrębną funkcjonalność. Przedstaw swoją propozycję na to, czy jest sens utrzymywać taki serwer, a jeśli jest, w jaki sposób zadbać o to, by otrzymywał on właściwe dla niego requesty. Uzasadnij swoje podejście.
  • Masz w swojej architekturze serwer, na którym nie masz dostępu do użytkownika root. Serwer jest bardzo ważny i nie może być restartowany ani na moment, tym samym nie możesz “na szybko” tego problemu rozwiązać. Na serwerze tym ponadto, działa aplikacja z konta użytkownika, do którego akurat masz dostęp, a która jest napisana w C i obsługuje jakieś ważne requesty. Wszystkie zamontowane udziały na serwerze mają opcję noexec, a ponadto, na nim samym nie ma dostępnych żadnych kompilatorów lub bibliotek developerskich. Niestety, zaszła potrzeba pilnej aktualizacji jednej z współdzielonych bibliotek owej aplikacji, a których bez dostępu do konta root nie możesz zaktualizować systemowo. Jakie, Twoim zdaniem, podejście do tego problemu można tutaj zastosować?
  • Masz aplikacje, która działa na X serwerach, a która obsługuje różne requesty HTTP i korzysta z bazy danych MySQL, która to baza działa na klastrze Y serwerów z kolei. Ruch z/do tej aplikacji jest kierowany przez load balancer. Niestety, okazuje się, że aplikacja zaczyna momentami odpowiadać coraz wolniej na pewne requesty HTTP. Klienci zgłaszają Twojej firmie, że jest po prostu “wolna”. Przedstaw, w jaki sposób można spróbować dojść do tego, które to requesty są problematyczne, co to znaczy, że są “problematyczne” oraz jakie mogą być potencjalne problemy i rozwiązania w tej architekturze.
  • Masz jakiś serwer WWW działający na jakimś serwerze. Tylko port serwera www jest otwarty, cała reszta portów tego serwera “nie odpowiada”. Serwer ten serwuje tylko statyczne pliki. Wyjaśnij i uzasadnij, jakie ten serwer może mieć potencjalne problemy bezpieczeństwa w takim scenariuszu
  • Mikroserwisy czy monolit - uzasadnij swój wybór


Coding test, czyli test z programowania

W przypadku rekrutacji do niektórych firm, może się zdarzyć, że czeka Cie tzw. coding test (np. codility) - czyli najczęściej, otrzymasz specjalny link do jakieś specjalnego serwisu, w którym czeka na Ciebie proste (załóżmy) zadanie algorytmiczne z cyklu (najczęściej) “przefiltruj tablicę według zadanego algorytmu” i masz na to zadanie np. godzinę od momentu kliknięcia w START czy coś takiego.

W takich testach, najczęściej język programowania będzie można sobie wybrać. Polecam zrobić sobie przykładowy test na codility, aby zobaczyć jak to wygląda w praktyce. Oczywiście codility to niejedyna platforma do takich zadań.

Wśród potencjalnych języków programowania do wyboru w takim zadaniu, najczęściej pojawia się Python, Perl, Ruby czy Java. Bash może więc być niewystarczający. Także rekrutując lub szkoląc się na DevOps Engineera, warto być przygotowanym na coś takiego i nie należy unikać wychodzenia poza skrypty w bashu, bo później może być kłopot w trakcie rekrutacji, jeśli taki etap będzie miał miejsce.

W jaki sposób się do tego przygotować? Uczyć się programować w dodatkowym języku, np. w Pythonie i robić podobne przykładowe testy dla wprawy lub zadania na takich serwisach jak:

Trening czyni mistrza i robiąc dla wprawy tego typu zadania (nawet te proste) w tych serwisach, nie trzeba się później obawiać o ewentualny wynik coding testu podczas rekrutacji na DevOpsa.

Developer background, czyli czy developer może zostać DevOps Engineer

DevOps Engineerami często zostają byli programiści. To też nie jest bez znaczenia w kontekście tego stanowiska, gdyż zrozumienie problemów innych programistów jest jednym z ważniejszych czynników na tym stanowisku. Kto może lepiej rozumieć problemy developerów, jeżeli nie ktoś od nich?

I tak, programista Javy, ma większe szanse być znacznie bardziej efektywnym DevOps Engineerem (zakładamy, że posiada umiejętności potrzebne na DevOps Engineer) w projekcie, w którym pisze się aplikacje w Java lub działające na platformie JVM. Oczywiście mowa tutaj o jakimś ogarniętym programiście Javy, który miał okazję debugować i profilować swoją aplikację oraz zna kilka narzędzi i praktyk w tej kwestii.

Programista JavaScript też będzie świetnym kandydatem na DevOps Engineer w projekcie, gdzie np. cały stack jest oparty o ekosystem JavaScript, przy tym samym założeniu: że posiada również odpowiednie dla DevOps umiejętności. Argumenty te same jak dla programisty Javy.

Po prostu, wiedza developerska, sposoby debugowania i rozwiązania problemów z aplikacjami są często nieocenione na tym stanowisku i prędzej czy później się przydają. W projektach, gdzie DevOps Engineer to przysłowiowy człowiek-orkiestra, trzeba będzie wiedzieć, kiedy powiedzieć programistom, aby poprawili błąd w swojej aplikacji, który mylnie uznali za błąd np. w infrastrukturze.

Jeżeli zatem jesteś developerem, zwłaszcza jakiegoś popularnego techstacku i chcesz zostać DevOps Engineer - wiedz, że Twoje doświadczenie będzie mieć znaczenie na tym stanowisku.

Jeżeli nie masz jednak tego backgroundu developerskiego, ale interesuje Cie praca jako DevOps Engineer - warto nieco podszkolić się od strony developerskiej z techstacku, który przyjdzie Ci utrzymywać lub z 2-3 najpopularniejszych techstacków

Certyfikacja, warto czy nie?

Ostatnio popularne stały się certyfikaty w działce DevOps, zwłaszcza mowa tutaj o certyfikacji z AWS. To, czy warto taki certyfikat posiadać jest zależne od kilku czynników:

Warto robić certyfikację, jeśli:

  • Twoja firma zachęca do jego uzyskania, finansuje ścieżkę i nie warunkuje tego dodatkowymi obostrzeniami (np. lojalka)
  • Twoja firma oferuje jakieś bonusy za coś takiego (podwyżka, awans, itp)
  • chcesz “zmusić” się do większego pogłębienia wiedzy w danej działce (np: AWS)
  • chcesz mieć dodatkowe “możliwości” na rynku pracy - np. jakiś klient może wymagać, by jego infrastrukturą zarządzały wyłącznie osoby z certyfikacją
  • chcesz się “wyróżnić” na rynku pracy (ostatnio coraz słabszy argument przy bazowych certyfikatach)

Nie warto robić certyfikacji, jeśli:

  • Bardziej idziesz w kierunku programowania, aniżeli DevOps (prędzej sprawdzą Twoje skille programistyczne niż certyfikaty)
  • Nie planujesz się recertyfikować w przyszłości (większość takich certyfikatów jest ważna 2-3 lata)
  • Masz już doświadczenie w pracy z infrastrukturą kilku dostawców takich rozwiązań (nie tylko AWS) i nie narzekasz na brak ofert pracy
  • płacisz za to z własnych środków, a masz świadomość, że obecna firma, jeśli nie planujesz jej zmieniać, nie zaoferuje Ci żadnych bonusów z tego tytułu

Certyfikaty mające pewną stałą renomę to na pewno certyfikaty firmy RedHat, RHCE i wzwyż (aż do RHCA), ponieważ są to egzaminy wyłącznie praktyczne. Ale nawet posiadanie takich certyfikatów nie gwarantuje znalezienia wysoko płatnej pracy (w stosunku do “ogółu”), podwyżki w dotychczasowej firmie czy innych dodatkowych benefitów.

Także jak widać, nie ma tutaj jasnej i prostej odpowiedzi czy warto. Każdy musi sobie odpowiedzieć indywidualnie na to pytanie. To o czym warto wspomnieć, to fakt, że coraz więcej DevOps Engineerów, czy nawet developerów uzyskuje, przynajmniej te podstawowe (np. z AWS) certyfikaty, wobec czego wartość tych certyfikatów może się zwyczajnie dewaluować na rynku pracy. To prosta zasada: jeśli czegoś jest w dużej ilości, to traci to na wartości.

Przydatne linki

DevOps Roadmap gdzie można zobaczyć tzw. “mapę drogową” czego się uczyć chcąc być (lub nawet już będąc) DevOps Engineerem. W formie takiego diagramu może to być łatwiejsze do ogarnięcia.

Katakoda - tutaj można wypróbować za darmo niektóre technologie, które pojawiają się w wymaganiach

Podsumowanie

Jak więc widać działka DevOps jest dosyć rozległa i od razu uspokajam, że nie trzeba wszystkich wymienionych tutaj technologii i zagadnień umieć, ale oczywiście im więcej potrafisz, tym statycznie lepiej dla potencjalnego wyniku Twojego interview.