Pierwszy weekend z językiem Go

Pierwszy weekend z językiem Go

Ostatnie kilka miesięcy mojego programistycznego życia to pełne skupienie na front-endzie. JavaScript – bo akurat na tej części skupiam się najbardziej – jest przed moimi oczami przez większość czasu poświęcanego na pracę i naukę. Pomimo tego, że spędzanie czasu z tym językiem i obserwowanie jego rozwoju nadal sprawia mi ogromną przyjemność, to od pewnego czasu czułem silną potrzebę spróbowania czegoś nowego – ot tak, dla rozrywki.

Jednym z języków który już od dłuższego czasu chodził mi po głowie był Go, który przewijał się gdzieś w tle w trakcie niejednej rozmowy w pracy i którego wychwalanie wiele razy widziałem na Hacker News oraz Twitterze.

No i w końcu stało się – weekend, Go i ja – co z tego wyszło? Zapraszam do przeczytania!

Nie jest to język z najlepszą stroną główną

Tak, to z pewnością. Jeśli chodzi o umiejętności sprzedaży swojego języka to twórcy Go zapewne nie należą do czołówki. Tak to już jest z tymi programistami, że wszystko co dla nich istotne to schemat kolorów w konsoli, a nie na „jakichśtampaniestronach”. Strona główna, czyli https://golang.org/,  prezentuje się bowiem tak:

Chińskie znaczki, chomik i video z Google I/O z 2012 roku. Eee… to z tym mam spędzić najbliższe godziny? No ale nic – nie ocenia się książki po okładce, tak jak nie ocenia się języka programowania po jego stronie głównej.

Zobaczymy, co będzie dalej….

…a wygląda na to, że będzie nieźle

Zastanawiam się czasami jakby to było, gdyby połączyć wybrane cechy takiego np. C, JavaScriptu oraz C# bądź Javy. Swoboda języka dynamicznie typowanego, bezpieczeństwo typowanego statycznie, szybkie działanie, wysokopoziomowa składnia, niska ilość pożeranych zasobów…

Do tej pory sytuacja wyglądała tak jak z tym popularnym sposobem wykonywania zleceń – jak ma być tanio, szybko i dobrze to wybierz dwa. Jak ma być wysoki poziom składni, to nie będzie szybko. Jak ma być typowanie dynamiczne, to czasami dostaniesz RuntimeException. Jak ma być szybko, to musisz pogrzebać przy wskaźnikach.

No ale nic, takie życie, co?

Tak, o ile nie programowałeś w Go. Tak przynajmniej stwierdzam czytając pierwsze fragmenty dokumentacji tego języka:

Programming had become too difficult and the choice of languages was partly to blame. One had to choose either efficient compilation, efficient execution, or ease of programming; all three were not available in the same mainstream language.

Go is an attempt to combine the ease of programming of an interpreted, dynamically typed language with the efficiency and safety of a statically typed, compiled language. It also aims to be modern, with support for networked and multicore computing.

It should take at most a few seconds to build a large executable on a single computer.

Ma być więc szybko, przyjemnie, a do tego lekko. Macie moją uwagę, panowie.

Zainstalujmy Go

Przygodę z Go zaczynałem pracując na Macu, a w planach miałem przeskakiwanie w międzyczasie na Windowsa. Jak Go radzi sobie z pracą na dwóch różnych platformach? Radzi sobie… bezproblemowo.

Zarówno na Macu jak i na Windowsie zacząłem od przeskoczenia przez kolejne kroki lekkiego instalatora. Po zakończeniu instalacji w konsoli miałem już dostępną zmienną globalną go, która reprezentuje coś co nazywa się go tool. Za pomocą tego narzędzia będziemy kompilować nasze projekty, testować je oraz pobierać do naszych projektów zewnętrzne zależności.

Go ma ściśle określony pomysł na organizację środowiska pracy – wszystko zaczyna się od zdefiniowania zmiennej środowiskowej GOPATH która wskazuje na katalog w którym będziemy umieszczać cały nasz kod pisany w tym języku. Na Windowsie będzie to C:\go a na Macu /usr/local/go.

Niezależnie od platformy na której pracujemy, katalog przypisany do GOPATH zawiera trzy podkatalogi:

  • src – zawierający kod źródłowy Go (rozszerzenie .go)
  • pkg – zawierający tzw. „package objects” skompilowane w sposób właściwy dla danej platformy (rozszerzenie .a)
  • bin – pliki wykonywalne w formacie właściwym dla danej platformy (na Windowsie z rozszerzeniem .exe, na Macu bin’y)

Dzięki wykorzystaniu takiej konwencji i określeniu zmiennej GOPATH narzędzie go tool może w łatwy sposób odnajdywać nasze paczki, kompilować je i umieszczać w formie wykonywalnej w katalogu bin – niezależnie od platformy wszystko działa tak samo.

Sprawdźmy, czy działa

Podążając za dokumentacją, po szybkiej konfiguracji środowiska przyszedł czas na uruchomienie przykładowego programu w Go.

Otwarłem więc VS Code i sprawdziłem najpierw, czy edytor ten posiada jakieś wsparcie dla języka z którym przyszło mi spędzać weekend. Coś jest – do tego ma ponad 470tys. pobrań i wygląda naprawdę nieźle!

Pobrałem więc wtyczkę do Go, wróciłem do widoku folderu i utworzyłem pierwszy plik (src/github.com/psmyrdek/hello/hello.go) którego będę chciał zaraz uruchomić. Po przejściu do pliku hello.go VS Code przywitał mnie sugestią, że fajnie byłoby pobrać kilka paczek które ułatwią mi pracę w tym języku – podpowiadanie składni, kolorowanie, formatowanie, itd. – no dobra, wierzę ci kolego.

Instalacja, chwila nerwów i jedziemy – zaraz stworzymy najlepsze hello world na świecie.

Aby uruchomić ten kawałek kodu przeszedłem w konsoli do lokalizacji określonej jako GOPATH/bin, a następnie uruchomiłem następujące polecenie:

go install github.com/psmyrdek/hello && hello.exe

Po wykonaniu tego polecenia na konsoli wyświetlił się napis Hello world, from PoznajProgramowanie.pl

Poczekajcie z brawami – to dopiero początek 😉

Od czego zacząć naukę Go?

Po uruchomieniu pierwszego programu miałem już gwarancję działającego środowiska, ale co dalej? Wymyślić jakiś projekt i obijać się od pytania do pytania na StackOverflow? Kupić książkę? Wejść na YouTube i poszukać czegoś o Go (btw, wyszukiwanego jako Golang)?

Przez to, że cały eksperyment z Go to dla mnie nic zobowiązującego, to zamiast przykładów postanowiłem pobieżnie zapoznać się z teorią która stoi za tym językiem – pokażcie mi na czym ten Go właściwie polega.

W tym celu na kilka godzin zagłębiłem się w oficjalny interaktywny tutorial – A Tour of Go:

Tutorial jest napisany w bardzo przystępny dla nowych programistów sposób. Zaczynamy od absolutnych podstaw takich jak typy i funkcje, robimy ćwiczenia z instrukcji warunkowych, a kończymy na wielowątkowości. Po kilku godzinach z małymi przerwami jesteśmy już w stanie pisać proste skrypty operujące na plikach czy realizujące proste operacje wielowątkowe.

Co ciekawego w Go?

Skoro zdecydowałem się na napisanie tego posta to łatwo się domyślić, że Go mnie po prostu zaciekawił.

Czytając i wykonując ćwiczenia z „A Tour of Go” w wielu momentach uśmiechnąłem się pod nosem na widok rozwiązań które zaimplementowano w tym języku. Nawet w najprostszych instrukcjach można znaleźć coś, co chciało by się zobaczyć w innych językach z którymi pracuję na co dzień.

Kilka najciekawszych wg mnie przykładów wybrałem i opisałem dla was poniżej.

Jedna pętla – for

W Go pętlą for można zrealizować kilka pętli znanych z innych języków:

If

W podstawowej instrukcji warunkowej można za jednym zamachem stworzyć zmienną i sprawdzić na niej warunek:

Switch

W przypadku instrukcji switch program wykonuje tylko jeden pasujący blok casenie przeskakuje do kolejnych. Jeśli chcesz, żeby to zrobił, musisz w jawny sposób na koniec danego „kejsa” dodać instrukcję fallthrough.

Logiczne. Bez niespodzianek. Lubię to.

Lekkie OOP

Programowanie obiektowe w Go realizowane jest w dość specyficzny sposób, ponieważ… nie ma tam klas. Są za to struktury i typy, które mogą otrzymywać dodatkowe metody poprzez mechanizm przypominający extension methods znane np. z C#:

Praca na strukturach wygląda podobnie:

Przede wszystkim prostota.

Lekkie OOP widać też chociażby w pracy z interfejsami, które Go posiada – dany typ nie musi być jawnie zadeklarowany jako implements XYZ żeby implementować dany interfejs. Wystarczy, że będzie spełniał „przepis” na ten interfejs, czyli np. posiadał wszystkie wymagane metody. W ten sposób nie musimy modyfikować typów i struktur z paczek które nie należą do nas, a które mogłyby spełniać wymagania danego interfejsu. Jeśli spełniają, to bez jakiejkolwiek modyfikacji i robienia adapterów po prostu wszystko zadziała.

Wielowątkowość – channels & goroutines

Temat rzeka – dla wielu killer feature tego języka. Co prawda nie wgryzałem się jeszcze zbyt dokładnie co siedzi pod spodem tego co zaraz zobaczycie, ale prostota z jaką zaimplementowano wielowątkowość w tym języku naprawdę robi wrażenie.

Czego efektem jest:

Koncepty goroutines i channels przypadną do gustu wszystkim tym, dla których wielowątkowość była zawsze potworem nie do ogarnięcia. Go, jako język projektowany z myślą o programowaniu systemów, dostarcza wiele tego typu rozwiązań out-of-the-box. Podobnie intuicyjnie rozwiązany jest chociażby dostęp do zasobów współdzielonych – okazuje się, że od mutexów głowa wcale nie musi boleć 🙂

 

Nie wszystkie konstrukcje w Go przypadną Wam jednak od razu do gustu. Pierwszym z brzegu „przerażającym” ficzerem są chociażby wskaźniki. Trzeba pamiętać, że Go to język zdecydowanie niższego poziomu niż JavaScript, C# czy Java. Inne są też jego zastosowania. Na szczęście posługiwanie się wskaźnikami w Go nie przypomina C++98 i konstrukcji spędzających sen z powiek studentom informatyki. Wskaźniki w Go da się po prostu przeżyć.

Podobnie będzie też z brakiem klas czy funkcjami zwracającymi kilka rezultatów jednocześnie – Go, jako język zaprojektowany od zera posiada pewne specyficzne dla siebie konstrukcje które przede wszystkim miały pasować twórcom. Oni sami tak piszą o tym języku:

Go is a programming language designed by Google to help solve Google’s problems, and Google has big problems.

Go’s purpose is therefore not to do research into programming language design; it is to improve the working environment for its designers and their coworkers. Go is more about software engineering than programming language research. Or to rephrase, it is about language design in the service of software engineering.

Nic dodać, nic ująć.

Dokumentacja nie psuje dobrego wrażenia

Na koniec o jeszcze jednej kwestii która często potrafi zepsuć dobre pierwsze wrażenie związane z wybraną technologią – mowa tutaj o dokumentacji.

Chciałbym, żeby wszystkie języki z którymi się spotkałem miały tak dobrą dokumentację jak ta którą ma Go. Specyfikacja języka i jego biblioteki standardowej jest bardzo dokładnie opisana – przez ostatnie kilka dni miałem dopiero jeden czy dwa momenty, kiedy chcąc dowiedzieć się czegoś więcej użyłem wyszukiwarki Google. A to wynika tylko z mojej ciekawości – wszystko to, czego potrzebuje początkujący programista Go znajduje się na oficjalnej stronie tego języka.

Strona główna docsów znajduje się tutaj – https://golang.org/doc/. Znajdziecie tam już wspominane instrukcje dotyczące instalacji i konfiguracji środowiska, tutorial „A Tour of Go”, tutoriale autorów z innych stron dotyczące Go czy chociażby Wiki.

Z dokumentacji szczególnie polecam jednak trzy strony:

  • FAQ – wyczerpująca lista pytań i odpowiedź, gdzie znajdziecie wyjaśnienia wszystkich kwestii które interesują szczególnie tych bardziej doświadczonych programistów – co siedzi pod spodem, dlaczego zaimplementowano X, dlaczego brakuje Y – to wszystko tam jest i na was czeka
  • Effective Go – oficjalne guidelines’y – jak pisać kod wg dobrych praktyk, czego unikać, na co zwracać uwagę – prawdziwa ściąga z dobrego Go
  • Go at Google – jakie problemy stara się rozwiązać Go i co stoi za jego powstaniem

Co dalej?

Przez mocne zaangażowanie we front-end nie chcę i nie mogę teraz rzucić wszystkiego i postawić na Go. Wiem jednak, że w wolnych chwilach będę jeszcze nie raz wracał do tego języka.

Odświeżenie mojej programistycznej głowy zakończyło się powodzeniem – zobaczyłem język z konkretnie opisanymi założeniami, którego składnia i sposób działania oddają to, o czym twórcy piszą w dokumentacji. Dokumentacji, która jest naprawdę dobra, spójna i obszerna. Na pewno rozważę wybór Go jeśli przyjdzie mi kiedyś pobawić się w microservice’y czy tworzyć narzędzia automatyzujące moją pracę. Patrzę na Go jak na takiego lepszego C++ z którym mógłbym wytrzymać w jednym pokoju – odpowiednio szybki, multiplatformowy, z przyjazną dla programisty składnią i łatwością tworzenia kodu, a także sprzątający za mnie (Go posiada wbudowany GC).

Nauka z opisywanego weekendu i kilku kolejnych dni jest jednak taka – świat poza JavaScriptem istnieje i zdecydowanie warto się nim zainteresować. A jakie jest wasze zdanie – chcielibyście zobaczyć więcej Go na naszej stronie?

  • Michał

    „Przez mocne zaangażowanie we front-end nie chcę i nie mogę teraz rzucić wszystkiego i postawić na Go.” i „…chcielibyście zobaczyć więcej Go na naszej stronie?” Jedno zdanie wyklucza drugie. No i najważniejsze pytanie. W jaki sposób (do czego) chcecie wykorzystać golang w projektach front endowych. Bo chyba nie chcecie rozmieniać się na drobne i pokazywać wszystkie możliwe języki w których można pisać np strony? Tym bardziej, że zapowiedziany jest już kurs ASP.NET Core & React

    • Przemek Smyrdek

      Dzięki za komentarz!

      Moim zdaniem dwa wymienione przez ciebie fragmenty się nie wykluczają. Ja – tak jak napisałem – nie rzucę teraz wszystkiego aby zająć się Go, ale nie znaczy to, że nie będę się nim zajmował wcale. A jeśli wy, czytelnicy, będziecie chcieli poczytać o nim coś więcej to dodatkowo z mojego czasu spędzonego przy tym języku powstaną co jakiś czas posty.

      Go nie jest częścią postów związanych z front-endem, bo my nie tworzymy strony wyłącznie dla front-endowców. Tworzymy ją dla programistów. Pomimo tego, że uwielbiam front-end, to jako programista straciłbym ogromnie dużo możliwości rozwoju zamykając się w jednym obszarze. Teraz Go, w przyszłości może coś z programowania funkcyjnego, a może kiedyś machine learning. Wszystko po to, żeby poszerzać swoje i wasze horyzonty. Jeśli spróbujesz takiego podejścia to szybko przekonasz się jak wiele dobrego możesz wyciągnąć z innych obszarów tej branży.

      Każdy taki wyskok poza ramy pomaga mi w codziennej pracy – za każdym razem wybierając X zamiast Y robię to bardziej świadomie.

      No i nie uważam też, że rozmieniamy się na drobne pisząc o tym czym szczerze żyjemy na codzień. Nic nie stoi na przeszkodzie żeby zainteresowani naszym kursem śledzili wyłącznie posty o ASP.NET Core + React, chociaż zachęcam do zdecydowanie częstszych wizyt 🙂

      A na dokładkę polecam jeszcze ten post:

      https://magenta.as/a-month-of-hello-world-496a92b6cec3

      Zwróć szczególną uwagę na wnioski dotyczące frameworków JSowych.

      • Michał

        Noo… chyba się nie zgodzę z tobą… Słaby jestem z angielskiego ale z tego co zrozumiałem to jego krąg zainteresowania języków wciąż ograniczał się do front-endu. Fakt stwierdził, że dobrze jest znać parę sposobów, które w gruncie rzeczy prowadzą do tego samego „…there are hundreds if not thousands of ways to do the same thing.”. Także podtrzymuję to co powiedziałem, czy jest sens na to żeby rozmieniać się na drobne?. Ale z racji wieku (zdjęcie) rozumiem twoje podejście ja z racji wieku i zajęcia nie mogę sobie pozwolić na to żeby godzinami poznawać kolejne języki i sposoby na to samo. I z tego co obserwuję w informatyce jest coś takiego jak wąska specjalizacja. Nie da się być dobrym front-ednowcem i równocześnie back-endowcem. Przykład, was dwóch chociażby ma różne specjalizacje. A pracując w dziale IT można w tej chwili być kimkolwiek (programista, admin, …). Bardzo podoba mi się wasz pomysł i nie zniechęcajcie się. Ale jeśli chcecie czegoś nauczyć to jednak trzeba wybrać jakąś konkretną ścieżkę i nią podążać.

        • Przemek Smyrdek

          Sposobów przechodzenia przez drogę jest tysiąc. Jedni przechodzą przez pasy na zielonym, jedni na czerwonym, jedni tyłem, jedni zatrzymując się co dwa metry. Załóżmy, że jesteś tym, który od wieków przechodzi na czerwonym – no niby dostajesz co jakiś czas ten mandat, niby coś tam cię zdenerwuje, raz czy dwa potrąci samochód, ale przechodzisz – może nawet jesteś ekspertem w takim przechodzeniu.

          Kiedyś w końcu zauważasz, że istnieje grupa ludzi która czeka na zielone światło. Co zrobić z taką wiedzą? Jedni zaczną mówić, że są już w wieku który nie pozwala im przechodzić na zielonym – mają swój sposób i będą się go trzymać. To nic, że można byłoby daną rzecz robić bardziej efektywnie – nauczyli się no to robią. Drudzy jednak sprawdzą jak ten sposób z czystej ciekawości – nie muszą od razu wywracać życia do góry nogami. Być może nauczą się czegoś nowego, no a jeśli nie to spoko – zawsze mogą wrócić do przechodzenia na czerwonym.

          Drugi sposób to nauka i pisanie o Go kiedy specjalizujesz się we front-endzie. Kosztuje mnie to relatywnie mało, ledwie kilka dni, a wystarczy do tego, żeby rozwinąć się jako programista. No i tyle 🙂