Blog

Podstawy Golang: wstępniaczek

Zagajenie tematu języka GO, który będzie bohaterem planowanego cyklu wpisów.

Podstawy Golang: wstępniaczek

Dzisiejszy wpis to typowy zapychacz blogowy, który ma wyłącznie za zadanie imitować, że autor ma coś ważnego do przekazania czytającym. Otóż nic z tych rzeczy. Będzie przede wszystkim krótko o tym, jak wygląda pomysł na planowaną serię wpisów o podstawach Go, czego można się w nich spodziewać, a na co liczyć zupełnie nie należy.

Zacząć jednak chciałbym od wyjaśnienia, dlaczego piszący te słowa wybrał właśnie GO na swoje pierwsze podejście do języków kompilowanych, miast pochylić się nad wciąż bardziej poważanymi rozwiązaniami w rodzaju Javy czy C++. Innymi słowy: mój wstępniaczek zacznę od wskazania tych faktycznych lub tylko rzekomych cech GO, które sprawiły, że zdecydowałem się pójść właśnie tą ścieżką.

  1. Wciąż stosunkowo niewielka popularność

Akurat ten punkt mniej odnosi się do samego języka GO, a znacznie więcej mówi o piszącym te słowa. Nieraz w moich wpisach wspominałem, że nie mam planów czy tym bardziej ambicji, by z klepania kodu uczynić główne źródło własnego utrzymania, zapewne w pierwszym rzędzie dlatego, że chyba już za stary jestem, by bez wyraźnej potrzeby - czy wręcz egzystencjalnej konieczności - dokonać takiej wolty w moim życiu zawodowym. Poza tym blog ten powołałem bynajmniej nie z myślą o programowaniu jako takim, ale po to, by ugruntować czy raczej uzupełnić wiedzę w zakresie przetwarzania oraz analizy danych. Tak naprawdę dopiero przygotowując się do startu tej strony złapałem “koderskiego” bakcyla, choć na początku bardzo konkretnie ukierunkowanego (chodziło o dość szeroko pojęty web development, która to tematyka dominuje cały czas na tej stronie, choć mam nadzieję, że to się powoli zacznie zmieniać).

Tym samym moje wpisy na tym blogu jak dotąd nie były i raczej nigdy nie będą kierowane do tych wszystkich wirtuozów klawiatury, którzy mogą z czystym sumieniem - patrząc co miesiąc na pasek płacowy - uważać się za programistów pełną gębą lub chociaż do takiego miana aspirują. Dlatego piszę tutaj głównie dla siebie i hobbystów do mnie podobnych. Mając to na uwadze nie powinno nikogo dziwić, iż myślenie kategoriami merkantylnymi przy wyborze języka programowania jest mi zupełnie obce. Czyli sprawę jasno stawiając: pytania o to jakie są perspektywy na rynku pracy dla programistów tego czy innego języka nie spędzają mi snu z powiek. W rezultacie finalny wybór GO podyktowany był wyłącznie cechami tego języka, którymi reklamują GO osoby w temacie dobrze obeznane, o czym piszę w dalszej części.

To wszystko co dotąd napisałem w tym punkcie nie bardzo rezonuje z jego nagłówkiem, tym niemniej uznałem za stosowne tych kilka uwag poczynić w tym miejscu, ponieważ do tego wątku jeszcze wrócę w końcowych fragmentach dzisiejszego tekstu. Teraz jednakże przechodząc wreszcie do istoty problemu w tytule tej części wyrażonej, czyli względnej niszowość GO. Akurat ta przypadłość GO była raczej swoistą wisienką na torcie niż głównym przyczynkiem do zainteresowania się tym językiem, wszak urodziłem się “kilka” lat za późno, by zostać pełnoetatowym hipsterem. Poczucie aspirowania do pewnej - urojonej wprawdzie - awangardy może trochę łechce moją próżność, ale zwracając uwagę na względnie małą popularność GO chodziło o rzecz znacznie bardziej przyziemną.

Po pierwsze, w polskojęzycznej blogosferze GO cały czas nie jest przesadnie eksponowany, dzięki czemu łatwiej takiemu koderskiemu laikowi uzasadnić zasadność podjęcia się takiej tematyki. Powiem szczerze: znacznie mniej komfortowo czułbym się w przypadku, gdybym pokusił się na przygotowanie wprowadzania do języka, dla którego jest dostępne całe mnóstwo lepszych lub gorszych poradników napisanych przez osoby, które są prawdziwymi fachowcami w tym obszarze. Po wtóre - choć trochę wiąże się to pierwszym punktem - koniec końców dzięki temu maleje też szansa, że w przypadku chociażby takiej Javy przez przypadek trafi na stronę tę jakiś fachowiec w tym zakresie. Niestety ze skromnego doświadczenia wyniesionego z pisania o linuksach na jednym z portali technologicznych wiem, że wiele osób komentowanie tekstów innych osób traktuje terapeutycznie, by czyimś kosztem poprawić sobie samopoczucie.

Oczywiście ta ostatnia kwestia przywołana była trochę na zasadzie żartu, ale wszystko to tak naprawdę sprowadzić można do tego, że nie chciałbym po prostu dołączyć do licznego grona stron poświęconych kodowaniu w Pythonie czy JavaScript, o ile rzecz jasna nie miałbym ciekawego pomysłu na cykl wpisów im poświęconych. Tyle i aż tyle w tym temacie.

2. Relatywnie niski poziom wejścia

Ponieważ - jak przed momentem wspominałem - jest to blog dla hobbystów (czy tam jak ktoś woli: dla koderskich amatorów i ignorantów), obietnica względnej prostoty Go, która podkreślana jest praktycznie przez każdego amatora tego języka, była jednym z najważniejszych argumentów na rzecz takiego a nie innego wyboru. Nie chodzi tutaj rzecz jasna wyłącznie o prostotę składni, ale również inne elementy, które uzasadniają taką opinię. O części z nich wspomnę w kolejnych punktach, teraz jednak chciałbym - na bazie cały czas skromnych doświadczeń - wspomnieć o kilku z nich, które rzuciły mi się w oczy.

Po pierwsze, wizualna przejrzystość kodu to coś, co spodobać powinno się każdemu użytkownikowi Pythona. Dla części osób z doświadczeniem programistycznym zabrzmi może to jak obraza świętości, ale zarzucenie wszędobylskich średników w miejsce właściwego sposobu tworzenia wcięć w kodzie, jest krokiem we właściwą stronę, jeśli chodzi o nowoczesne języki programowania. Dość jednoznaczne reguły formatowania w niezaprzeczalny sposób podnoszą czytelność kodu, a co więcej twórcy GO dostarczyli w ramach “zestawu obowiązkowego” narzędzie, które pozwala w łatwy sposób dbać o jeszcze większą jego przejrzystość. Dzięki temu studiowanie fragmentów programów innych autorów na potrzeby chociażby nauki właśnie, staje się po prostu dużo przyjemniejsze.

Kolejna rzecz, która od razu przywołuje miłe skojarzenia z Pythonem, to przejrzysty sposób importowania zewnętrznych bibliotek czy pakietów. Zasady w tym zakresie rządzące są dość podobne do Pythona, choć pod pewnymi względami są dużo bardziej restrykcyjne, ale myślę, że z korzyścią dla pisanego kodu (na ten przykład kompilator nie pozwoli na załadowanie jakiejś biblioteki, jeśli później faktycznie nie skorzystamy z niej w kodzie).

Ta cecha może się wydawać drugorzędna z punktu widzenia łatwości programowania, ale dzięki temu, że kompilator GO błyskawicznie kompiluje kod, a następnie - oczywiście jeśli tak wskażemy - go wykona (albo wyświetli listę błędów przez nas popełnionych), bardzo pomaga na wczesnych etapach nauki, zwłaszcza dla osób bez większego doświadczenia w programowaniu, kiedy to w sposób naturalny eksperymentujemy z różnymi instrukcjami czy strukturami danych. Z tej perspektywy obcując z GO miałem wrażenie, że tak naprawdę mam do czynienia z językiem interpretowanym. Oczywiście moje wprawki jaka dotąd liczą w najlepszym wypadku kilkadziesiąt wierszy, ale podobno w przypadku znacznie bardziej rozbudowanych programów wszystko dzieje się równie błyskawicznie.

3. Bogata biblioteka standardowa

Przyznam się, że nie spotkałem się jak dotąd z takim określeniem w kontekście języków programowania, co pewnie w dużej mierze jest efektem nader skromnej wiedzy i doświadczenia w tym zakresie, ale GO bywa określany jako narzędzie dostarczane z bateriami (batteries included), a to za sprawą biblioteki standardowej, która w sposób co najmniej satysfakcjonujący adresuje wiele centralnych dla informatyki obszarów jak przetwarzanie danych, tekstu czy grafiki, nadaje się do zastosowania w kryptografii czy pasuje znakomicie do różnych aspektów sieciowych.

Oczywiście w tym przypadku muszę zawierzyć tym wszystkim autorom, który zapewniają, że pod tym względem GO zasługuje na szczególne uznanie, natomiast powszechność tej opinii każe mi poważnie traktować za to poręczenie.

4. Współbieżność z ludzką twarzą

W pewnym sensie jest to kolejny kamyczek do ogródka, o którym pisałem w punkcie drugim, tym niemniej chciałem tę kwestię nagrodzić osobnym sekcją z dwóch powodów. Po pierwsze, jest to obszar zupełnie przeze mnie jak dotąd nie zapoznany. Z tego też powodu potencjalna możliwość liźnięcia tego zagadnienia wydawała mi się szczególnie atrakcyjna, nawet gdybym nie miał okazji w praktyczny sposób wykorzystać później wiedzy w tym zakresie. Język GO uchodzi zaś za szczególnie zoptymalizowany właśnie pod kątem równoległego wykonywania zadań. Co więcej - i to jest ten drugi a zarazem ważniejszy powód - w dość powszechnej opinii uchodzi za bardziej przyjazny, jeśli chodzi o ten sposób programowania, dzięki zastosowaniu funkcji goroutine, choć możliwe jest również tworzenie współbieżnych rozwiązań w bardziej “tradycyjny” sposób, czyli w modelu wielowątkowości pamięci współdzielonej (a przynajmniej tyle udało mi się w tym zakresie póki co wyczytać gdzieniegdzie).

Co dalej?

To się dopiero okaże rzecz jasna, ale w końcowych fragmentach tego wpisu chciałbym kilka słów poświęcić temu, jak na ten moment sobie ciąg dalszy wyobrażam. Zacznę od intensywności tego “kursu”, patrząc na początek od strony moich możliwości przerobowych. Otóż chciałbym zamieszczać na blogu minimum jeden tekst GO poświęcony w skali miesiąca kalendarzowego. Choć nie sądzę, by zdarzało się to zbyt często, to dopuszczam ewentualność, iż takich wpisów może pojawiać się więcej w danym okresie, choć znając życie pewnie większa jest szansa, że może nie powstanie żaden. Tym niemniej zakładam, że każdy taki tekst będzie omawiał jakiś cały większy obszar tematyczny bez dzielenia go na części i kolejne odsłony.

Nie będę przy tym ukrywał, że całość w dużej mierze będzie bazowała na książce autorstwa Nathana Youngmana oraz Rogera Peppe zatytułowanej “Zacznij programowanie w GO”, choć nie do końca odpowiada mi zaproponowana tam struktura prezentacji treści, więc chociażby w tym zakresie odstąpię od materiału źródłowego. Co więcej pewne tematy - nie jest to jednak zarzut do materiału źródłowego - postaram się pogłębić w oparciu o dodatkowe materiały treści, których być może zabrakło w książce, o której wspominam.

Tym niemniej głównym źródłem mądrości i ostateczną instancją odwoławczą w temacie języka GO jest ich książka, więc ewentualne pretensje o pewne nieścisłości proszę kierować przede wszystkim pod ich adresem. Tak jak już wspominałem wcześniej: nie jest to wprowadzenie napisane przez fachowca dla przyszłych fachowców, więc pewnie błędów nie uniknę, tym niemniej - mimo żartobliwej uwagi wyrażonej przed momentem - jeśli ktokolwiek zauważy jakiekolwiek nieścisłości lub co gorsza przekłamania, to serdeczne zapraszam do komentowania lub kontaktu ze mną.

Najważniejsze jednak jednak jest to, że wprowadzenie mojego autorstwa będzie czymś w rodzaju uproszczonego leksykonu dla języka GO. Tym samym nie będziemy w trakcie jego przechodzenia tworzyć jakiejś mniej lub bardziej złożonej aplikacji, ale na prostych przykładach omawiać poszczególne zagadnienia z danego obszaru. Natomiast - o ile moje zdolności w posługiwaniu GO na to pozwolą - w przyszłości, ale nie przed zakończeniem tego wprowadzenia, chciałbym podjąć się takiego projektu. W tej chwili mam dwa pomysły na praktyczne wykorzystanie GO w zakresie analizy danych. Ile z tego wyjdzie, to się okaże, na ten moment jedynie mogę zaprosić do pierwszego merytorycznego wpisu, który mam pojawi się już w kolejnym roku.