● Znajomość Go w stopniu podstawowym
● Znajomość innego języka (preferowane Java, C/C++, ewentualnie Nodejs/Python/PHP)
● Znajomość wzorców programowania współbieżnego
● Podstawowa znajomość zagadnień: wskaźnik, heap, stack, kompilator, scheduler, wątek, pass by value / pass by reference, rest api
Szkolenie podzielone jest na 3 dni po 8 godzin. Każdy dzień obejmuje odrębny temat użycia języka Go.
1.Filozofia Go, wzorce współbieżności w Go, zarządzanie alokacją
1.1. Historia Go i wprowadzenie
1.1.1. Filozofia pisania oprogramowania w Go
1.1.2. Opis składni języka
1.1.3. Typy danych
1.1.4. Pakiety, nazewnictwo, struktura projektu
1.1.5. Go modules
1.1.6. Zarządzanie zależnościami, pakiety z prywatnych repozytoriów
1.2. Współbieżność w Go
1.2.1. Wątki vs Goroutines (zielone wątki)
1.2.2. OS vs Go scheduler
1.2.3. Memory model - heap vs stack
1.2.4. Narzędzia programowania współbieżnego
1.2.4.1. Kanały
1.2.4.2. Select
1.2.4.3. Współdzielenie zmiennych / komunikacja
1.2.4.4. Pakiet sync: Mutexy, Pool, WaitGroup, Cond
1.2.4.5. Pakiet Atomic 1.2.4.6. fork / exec
1.2.5. Common pitfalls, race conditions, przerywanie, dead locks
1.3. Q&A
1.4. Ćwiczenie praktyczne: Uczestnicy warsztatów będa mieli za zadanie zbudowanie pakietu który ma działać jak KV cache.
1.4.1. Podstawowe operacje: Get, Set, Upsert, Delete, Scan
1.4.2. Wygasanie wpisów (expiration, eviction)
1.4.3. Uczestnicy warsztatów będą mieli za zadanie wykorzystać przedstawione danego dnia wzorce programowania współbieżnego wraz z dobrymi praktykami alokacji zmiennych oraz unikania GC. Pakiet ma być przystosowany do równoległego zapisu/odczytu.
1.4.4. Uczestnicy wykorzystają projekt w kolejnych dniach warsztatów do rozbudowy o dodatkowe funkcjonalności
Budowanie REST API - wzorce i dobre praktyki, współpraca z bazami danych (ORM), efektywna praca z JSON
2.1. REST w 15 minut
2.2. Biblioteki REST
2.2.1. Gorilla / gin / negroni / net/http
2.2.2. Middlewares - co to i po co?
2.3. Context (z HTTP)
2.4. Logowanie strukturalne / audit trail (Request ID)
2.5. Efektywna praca z JSON
2.6. Bazy danych
2.6.1. ORM czy (no)SQL?
2.6.2. Biblioteki 2.7. REST + JSON - walidacja danych
2.8. gRPC / protocol buffers
2.9. Dobre praktyki:
2.9.1. graceful shutdown, healthz/readyz
2.9.2. zero downtime depolyment
2.9.3. Prometheus, Statsd, Systemd
2.10. Q&A
2.11. Ćwiczenie praktyczne.
Uczestnicy warsztatów kontynuują pracę nad projektem z dnia poprzedniego.
2.11.1. Wariant 1. Zadaniem jest dodanie REST API do projektu wraz z walidacją schemy JSON. Należy pamiętać o czasie (de)serializacji JSON.
2.11.2. Wariant 2. Uczestnicy budują REST API które łączy się z bazą danych. Projekt cache z dnia poprzedniego zostanie wykorzystany jako mikroserwis.
Refleksje, testowanie, CLI, debugging, tooling, signal handling, bechmarking, profiling
3.1. Refleksje - po co i jak?
3.2. Testowanie
3.2.1. Opis pakietu testing z biblioteki standardowej
3.2.2. Biblioteki zewnętrzne
3.3. Pisanie pod CLI
3.4. Debugowanie z GDB
3.5. Go get / go mod / go generate
3.6. Graceful shutdown - signal handling
3.7. pkg errors, error wrapping
3.8. Ciekawe projekty Go
3.9. Benchmarking
3.10. Profilowanie i tracing - flamegraph (calltrees), pprof, http/pprof, cpu/memory profiling, mutex profiling, graphs
3.11. Runtime statistics
3.12. Q&A
3.13. Ćwiczenie praktyczne.
Uczestnicy warsztatów kontynuują prace nad projektem z dnia poprzedniego. Ich zadania na dzisiaj:
3.13.1. Dopisanie testów jednostkowych
3.13.2. Dopisanie testów integrujących (wykorzystanie REST API)
3.13.3. Inicjalizacja go modules
3.13.4. Dodanie graceful shutdown do każdego mikroserwisu
3.13.5. Benchmark projektu
3.13.6. Odnalezienie bottlenecków w projekcie przy użyciu profilowania