Jak zostać Senior Software Engineerem. Lista kursów i książek
Większość programistów na poziomie Regular ma ambicje, by zostać Senior Software Engineerem. Polecam im wzorować się na modelu T-shaped Skills, co oznacza, że powinni być ekspertem w jednej dziedzinie, ale potrafić także nawiązać współpracę z ekspertami z innych dziedzin.
Tomasz Lelek. Senior Software Engineer w DataStax. Ma doświadczenie w Big data i systemach streamingowych. Spędził 4 lata na tworzeniu systemów w Allegro używając narzędzi do analizy danych takich jak Apache Spark. Budował systemy streamingowe oparte na Apache Kafka. Łączył obowiązki DevOps przy tworzeniu i utrzymywaniu wielu mikroserwisów na produkcji napisanych w Spring Boot. Obecnie w DataStax – firmie, która stoi za bazą danych Apache Cassandra.
Wśród dziedzin, które powinieneś znać chociaż w podstawowym stopniu znajdą się big data, mikroserwisy, core języka programowania, który używasz w tym concurrency i wiele innych. W tym artykule postaram się przybliżyć każdą z tych dziedzin. Przybliżę pozycję w postaci książek, które pomogły mi osiągnąć tytuł Senior Software Engineera. Na liście znajdą się także moje kursy online, które są zbiorem wiedzy nabytej przez wiele lat nauki i pracy. Kursy polecam osobom nie mającym czasu na czytanie książek.
Artykuł skupiłem na ekosystemie JVM – będę polecał również moje artykuły z jednego z najbardziej czytanych blogów, dla którego pisałem – baeldung.com. Przez lata byłem również trenerem w Bottega IT Minds, gdzie prowadziłem szkolenia z tematów Java High Performance i Big data. Postaram się podzielić kilkoma szkoleniami, które mogą wynieść grupę Regular Engineerów na poziom Senior.
Spis treści
1. Big data
Świat Big data przez lata był zdominowany przez ekosystem Hadoop. Wokół niego powstało wiele narzędzi open source, które pozwalają na przetwarzanie olbrzymich ilości danych. Dla tych co chcą stać się ekspertami w Big data pierwszym źródłem powinna być książka pt. Hadoop: The Definite Guide.
Ekosystem Hadoop jest bardzo rozbudowany, ale technologia, która zyskała na znaczeniu jest Apache Spark. Framework ten pozwala na przetwarzanie terabajtów danych dużo szybciej niż Hadoop, ponieważ obliczenia dzieją się w pamięci RAM.
Książka doskonale tłumacząca Apache Spark i ideę przetwarzań w paradygmacie Map Reduce to Advanced Analytics with Spark: Patterns for Learning from Data at Scale. Książka o Hadoop może lekko przytłoczyć z uwagi na rozmiar, dlatego wiedzę o ekosystemie Hadoop udało mi się zawrzeć w kursie Solving 10 Hadoop’able Problems, który podchodzi do ekosystemu Hadoop w formie hands on i praktycznych use case’ów.
Jeśli chodzi o Apache Spark to jest to dość skomplikowane narzędzie, które na początku może zaskoczyć dziwnymi błędami i innym podejściem do programowania (Programowanie Funkcyjne). Aby zaadresować te problemy stworzyłem dwa kursy z Apache Spark, które tłumaczą i rozwiązują te problemy:
Jeśli Ty lub Twoja firma szuka kursu o tematyce Big data dla większej grupy osób, to zachęcam do kursów, które prowadzę w imieniu firmy Bottega.
2. Mikroserwisy
Większość dzisiejszych systemów powstało w architekturze mikroserwisów. Takie podejście przyśpiesza cykl wytwarzania oprogramowania i testowalność aplikacji, ale wiąże się z utrudnieniami, jeśli chodzi o wdrażanie i koordynowanie architektury składającej się z wielu mikroserwisów. Aby zrozumieć za i przeciw tego rozwiązania polecam książkę Building Microservices: Designing Fine-Grained Systems.
W ekosystemie JVM w większości przypadków mikroserwisów używa się Spring Framework. Jest bogaty w wiele rozszerzeń, które świetne integrują się z podejściem mikroserwisowym do tworzenia architektury. Aby poszerzyć swoją wiedzę na ten temat polecam kurs Spring 5.0 Project: Building a Travel Website, który krok po kroku tworzy mikroserwis zgodnie z dobrymi praktykami. Dla bardziej zaawansowanych tematów polecam:
Jeśli potrzebujesz informacji na konkretny temat związany ze Spring API polecam post o wersjonowaniu API albo o rozróżnieniu między metodami HTTP.
3. Przechowywanie danych (Persistence)
Obecnie architektura przechowywania danych musi pozwalać na przetwarzanie olbrzymiej ilości danych (high throughput) w low latency. Idealnie, aby takie źródło było tanie w utrzymaniu (tj. powinno działać na commodity hardware) oraz zapewniało high availability i consistency. W ten sposób powstał nowy typ baz danych zwanych NoSql. Bazy tego typu działają na wielu nodach i posiadają wyżej wymienione właściwości. Jeśl jesteś nowy w świecie NoSql polecam książkę, która robi przegląd takich rozwiązań NoSQL Distilled.
Budowanie rozproszonych baz danych to bardzo ciężkie zadanie – zaawansowane tematy i problemy związane z tym są tłumaczone w książce Designing Data-Intensive Applications. Jeśli zdecydujesz się przeczytać tylko jedną książkę z tego artykułu, to polecam właśnie tą.
Z mojego doświadczenia uczenie się o bazach NoSql najlepiej sprawdza się, jeśli uczymy się na konkretnym przykładzie bazy danych. Polecam np. książkę o Apache Cassandra Cassandra: The Definitive Guide. Jeśli chcesz nauczyć się o przesyłaniu danych i komunikacji między mikroserwisami to polecam książkę Kafka: The Definitive Guide: Real-Time Data and Stream Processing at Scale.
Jeśli zamiast czytać wiele książek chcesz od razu przejść do działania, polecam kurs online: Build scalable applications with Apache Kafka i Learning Apache Cassandra – drugi z tych kursów zahacza również o tematykę Big data i Apache Spark. Ekosystem kafka jest bardzo bogaty, np. API Kafka Streams jest bardzo ciekawym rozwiązaniem. Aby zacząć eksperymenty polecam ten tekst.
4. Core Java
Jedną z najważniejszych umięjętności Senior Software Engineera, w której należy zadbać o swój poziom ekspercki jest znajomość języka Java. Dlatego uważam, że tę pozycję powinien przeczytać każdy programista Java – Effective Java. Tłumaczy ona bardziej problematyczne obszary języka i jest to zbiór dobrych praktyk.
Jeśli Twój kod działa w środowisku wielowątkowym (jest to niemal pewne, jeśli piszesz oprogramowanie dla wielu osób) to znajomość Java Concurrency API jest niezbędna, aby pisać kod bez bugów manifestujących się, gdy kod jest używany przez wiele wątków równocześnie. Jeśli używasz biblioteki, która ma wątki pod spodem (np. Spring) również musisz rozumieć Java Concurrency. Książka, która jest zbiorem tej wiedzy to Java Concurrency in Practice.
Pisanie wydajnego kodu nie jest łatwe, a istotną częścią procesu jest testowanie. Stworzyłem kurs, który używa narzędzia JMH do testowania kodu napisanego w sposób wielowątkowy używający Concurrecy API, ten kurs to Java High Performance.
Java to nie tylko concurrency. Samo core JDK posiada wiele API, które są bardzo użyteczne – jedno z najbardziej niedocenionych to wyrażenia regularne. Jeśli ktoś chce poszerzyć wiedzę z tego tematu to polecam: Hands-On Java Regular Expressions.
Ostatnią bardzo istotną kwestią, o której często zapominają programiści jest poszerzanie i utrwalanie wiedzy o strukturach danych i algorytmach na nich operujących dostępnych w języku Java. Jeśli potrzebujesz poszerzyć wiedzę o HashMapach, kolejkach i innych strukturach lub algorytmach polecam: Learn Algorithms and Data Structures in Java for Day-to-Day Applications.
5. Reactive Programming
Po tym jak poszerzysz wiedzę z Java Concurrency na pewno zauważysz, że jest to bardzo trudny model wielowątkowości. Aby rozwiązać te problemy i stworzyć API, które jest funkcyjne i wielowątkowe powstał paradygmat Reactive Programming. W świecie JVM są dwie biblioteki, które zyskały bardzo dużą popularność: RxJava i Reactor. Obie implementują te same zasady Reactive Programming, a ich API różni się nieznacznie. Jeśli używasz Spring i chcesz dołożyć do tego programowanie reaktywne, polecam kurs Hands-On Reactive Programming with Spring 5.0.
Jeśli bardziej interesuje Cię RxJava i jej zastosowania to świetna książka, która tłumaczy wszystko używając tego API to Reactive Programming with RxJava: Creating Asynchronous, Event-Based Applications. Jeśli chcesz podobną wiedzę w formacie kursu online polecam:
- Reactive Programming in 7 Steps. Testowanie kodu napisanego w sposób reaktywny jest ciężkie bez odpowiednich narzędzi i znajomości API. Jeśli lubisz uczyć się technologii w sposób Test Driven Development to polecam ten tekst.
6. Cloud i DevOps
Ostatnim tematem, który poruszę jest Cloud i DevOps. DevOps jest idealnym odzwierciedleniem idei T-shaped skills wspomnianej na początku tego postu. Ideą tego podejścia jest to, że programista jest w stanie wdrażać i utrzymywać kod na produkcji. Aby to utrzymanie było efektywne, kod powinien być monitorowany używając metryk, jak i również czujek, które sprawdzają stan aplikacji.
DevOps mocno łączy się z Cloud – nasze aplikacje coraz częściej działają w chmurze i nierzadko są wdrażane na wiele instancji jednocześnie. W takiej architekturze automatyzacja jest niezbędna. Aby dowiedzieć się jakie były początki DevOps polecam książkę: Site Reliability Engineering: How Google Runs Production Systems, napisaną przez pracowników Google. Jeśli chcesz nauczyć się bardziej praktycznego podejścia używając narzędzi sprawdzonych produkcyjnie, polecam Enterprise Automation with Python, gdyż wiele narzędzi automatyzujących jest napisanych w języku Python.
Jeśli znasz już ideę DevOps i odpowiedzialność inżyniera, który mianuje się jako DevOps to kolejnym krokiem jest nauka dwóch najbardziej używanych narzędzi do automatyzacji.
Pierwszym z nich jest Docker. Jego API dość często się zmieniało, dlatego ciężko o jedną książkę godną polecenia. Zamiast tego polecam dokumentację Dockera, jak i kurs przygotowany dla programistów Java chcących poszerzyć swoją wiedzę z tej technologii Docker for Java Developers.
Kiedy poznasz tę technologię następnym krokiem jest Kubernetes. Jest to narzędzie, które używa Dockera pod spodem, ale daje możliwość koordynacji i wdrażania naszych serwisów na wiele nodów. Mechanizmy takie jak auto-scaling czy rolling deployment są w nim zaimplementowane i jedyne co musimy zrobić to poznać API. Książka, która świetnie tłumaczy krok po kroku jak zautomatyzować swoje wdrażania to Kubernetes: Up & Running.
Jeśli i tym razem wolisz podejście z kursem video online polecam Containers for Microservices: Kubernetes and Docker Recipes.
Podsumowanie
Jak widzisz droga od Regular Engineera do Senior Software Engineera zgodnie z ideą T shaped skills nie jest ani krótka, ani prosta. Pierwszym krokiem będzie wybranie którejś z sześciu dziedzin, które opisałem i zgłębienie ich tak, aby nabyć w niej wiedzę ekspercką. Będąc na takim poziomie będziesz miał również wiedzę jak się uczyć i jak podchodzić do nowych technologii i obszarów nauki. Kolejne tematy, które wybierzesz nie muszą być przez Ciebie już tak głęboko zgłębiane, jednak ważne jest, abyś wiedział jak działają narzędzia, których używasz.
Oznacza to, że jesteś w stanie ocenić przydatność danego rozwiązania w Twoim problemie (np. Apache Cassandra), ponieważ znasz mocne i słabe strony jak i również API – nie musisz jednak wnikać w to, jak jest zaimplementowany mechanizm zapisywania plików przez bazę danych na dysk (chyba, że to jest Twój obszar ekspercki).
Zdjęcie główne artykułu pochodzi z unsplash.com.