Course Code: golang
Duration: 24 hours
Prerequisites:

● 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

Overview:

Szkolenie podzielone jest na 3 dni po 8 godzin. Każdy dzień obejmuje odrębny temat użycia języka Go.

Course Outline:

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