Dlaczego język Go?
Wprowadzenie
Języki programowania są narzędziami do tworzenia produktów. Sama znajomość danego języka nie determinuje umiejętności programisty. Jednakże, wybór języka i sposób jego użycia mogą mieć bezpośredni wpływ na sposób myślenia programisty i kierunek jego rozwoju. W szczególności, porównywanie obecnie używanego języka z innymi językami może znacząco poszerzyć horyzonty techniczne i rozwinąć intuicję w zakresie istoty rzeczy. W tym artykule zamierzam omówić, dlaczego wybrałem Go i w jaki sposób przyczynia się to do rozwoju programisty, dzieląc to na pięć aspektów.
1. Go to język, który równoważy wydajność i produktywność.
Istnieje wiele języków programowania, a każdy z nich ma swoje zalety i wady, zależnie od ich specyfiki.
- C oferuje doskonałą wydajność i niskopoziomową kontrolę, ale wymaga od programisty ręcznego zarządzania pamięcią, brakuje mu wysokopoziomowych funkcji, co skutkuje niską produktywnością i trudnościami w utrzymaniu.
- C++ i Rust wspierają różnorodne zaawansowane funkcje, takie jak programowanie obiektowe, szablony i metaprogramowanie, ale ich składnia jest skomplikowana, krzywa uczenia się stroma, a wolne czasy kompilacji sprawiają, że nie nadają się do częstych wdrożeń.
- Java i C# zapewniają niezależność platformową i stabilność, dzięki czemu są szeroko stosowane w dużych usługach, ale działają na ciężkich maszynach wirtualnych, co komplikuje środowisko wdrożeniowe i wykonawcze oraz wymaga wysokich zasobów.
- Python i Javascript są odpowiednie do szybkiego rozwoju dzięki zwięzłej składni i bogatemu ekosystemowi, ale ich wydajność wykonawcza jest niska, a wiarygodność ekosystemu słaba, co ujawnia ich strukturalne ograniczenia w dużych systemach.
Z drugiej strony, Golang to język, który doskonale równoważy wydajność i produktywność. Go, jako język kompilowany, podobnie jak C, zapewnia wysoką wydajność wykonawczą, a jednocześnie oferuje szybkość kompilacji porównywalną z językami interpretowanymi, co przekłada się na elastyczność wdrożeń. Oznacza to, że Go jest zrównoważonym językiem, który można stabilnie wykorzystywać w większości środowisk, bez wyraźnych wad.
2. Go zapobiega programowaniu Cargo Cult.
Podczas II wojny światowej siły alianckie zbudowały bazy lotnicze na wyspach Pacyfiku, aby wspomóc działania wojenne. Duże dostawy zaopatrzenia i sprzętu wojskowego znacząco zmieniły życie żołnierzy i rdzennych mieszkańców. Mieszkańcy po raz pierwszy zobaczyli samoloty przewożące produkowaną odzież, żywność w puszkach i inne towary. Po zakończeniu wojny bazy zostały porzucone, a dostawy przestały docierać. Wówczas mieszkańcy wysp, naśladując żołnierzy, ubierali się jak kontrolerzy ruchu lotniczego, żołnierze i marynarze, tworzyli coś na kształt pasów startowych i za pomocą patyków wysyłali sygnały lądowania do samolotów. Kontynuowali parady, mając nadzieję, że ładunek spadnie na spadochronach z samolotów. Jednak samoloty, na które czekali, nigdy nie przyleciały.
Programowanie Cargo Cult odnosi się do nawyku programowania, polegającego na naśladowaniu wyglądu kodu lub technologii bez zrozumienia ich zasad. Wśród współczesnych programistów, zwłaszcza w dziedzinie tworzenia stron internetowych, często zdarza się takie naśladowanie bez zrozumienia znaczenia. Dzięki frameworkom takim jak React, Next, Spring, Django, możliwe stało się tworzenie oprogramowania bez znajomości wewnętrznej struktury, jednak w przypadku drobnych błędów często brakuje odpowiedniej reakcji. Dodatkowo, wraz z pojawieniem się narzędzi do generowania kodu AI, coraz bardziej rozpowszechnia się metoda rozwoju polegająca na kopiowaniu i wklejaniu wyników, zamiast samodzielnego pisania kodu lub rozumienia jego zasad.
Go zasadniczo unika tego problemu na poziomie filozofii języka. Go to język zaprojektowany w oparciu o standardowe biblioteki, a nie frameworki. Programiści mogą budować serwery internetowe na poziomie rzeczywistych usług, używając jedynie podstawowych bibliotek, takich jak net/http i database/sql, co naturalnie rozwija ich intuicję i zrozumienie niskopoziomowych struktur, takich jak sieć, bazy danych i I/O. Taka struktura, która umożliwia solidne opanowanie podstaw bez zależności od frameworków, stanowi podstawę dla programisty do ciągłego rozwoju, nie tracąc z oczu istoty technologii.
3. Go oferuje potężny model współbieżności.
Współczesne procesory rozwijają się w kierunku zwiększania wydajności poprzez równoległe wykorzystanie wielu rdzeni, zamiast zwiększania prędkości pojedynczego rdzenia. W związku z tym współbieżność, czyli zdolność programu do jednoczesnego przetwarzania wielu zadań, stała się koniecznością, a znaczenie języków umożliwiających efektywne projektowanie i implementację tej funkcji stale rośnie. Go jest językiem zoptymalizowanym pod kątem takiego środowiska. Goroutine to lekki wątek dostarczany przez Go, który można utworzyć z zaledwie kilkoma KB stosu, a uruchomienie tysięcy goroutine jednocześnie praktycznie nie zużywa zasobów systemowych. Środowisko uruchomieniowe Go efektywnie rozkłada liczne goroutine na wątki OS za pośrednictwem własnego harmonogramu M:N, a proces ten jest automatycznie optymalizowany bez bezpośredniej interwencji programisty. Dzięki temu programiści mogą projektować logikę współbieżności w sposób bezpieczny i spójny, bez skomplikowanej logiki synchronizacji czy niestandardowego harmonogramowania.
Ponadto, Go aktywnie wspiera nowoczesne projektowanie współbieżności, wykorzystując narzędzia synchronizacji takie jak mutex, waitGroup, a także channel i context. Dzięki tej strukturze programiści mogą naturalnie nabywać praktyczne wyczucie współbieżności i równoległości, bez uwikłania w skomplikowane teorie, i osiągnąć wysoki poziom abstrakcji i umiejętności projektowania, które można wykorzystać od podstaw.
4. Go to język stworzony przez wybitnych programistów, którzy zachowali równowagę.
Go to język, który powstał dzięki inicjatywie Google oraz legendarnych programistów: Roberta Griesemera, Roba Pike'a i Kena Thompsona. W szczególności, są to twórcy systemu Unix i języka C, a także mistrzowie w dziedzinie kompilatorów i oprogramowania systemowego, co samo w sobie świadczy o technicznej wiarygodności Go. Dodatkowo, dzięki odzwierciedleniu praktycznego doświadczenia i wiedzy operacyjnej na dużą skalę wielu inżynierów Google, Go od samego początku dążył do rozwiązywania rzeczywistych problemów i rozwijał się z konsekwentną filozofią i kierunkiem.
Inne języki często powodują zamieszanie w społeczności i wśród użytkowników z powodu zerwania kompatybilności, zmian w projekcie, niestabilnych licencji czy niestandarodowego ekosystemu. Na przykład, Python doświadczył wieloletniego podziału ekosystemu z powodu zerwania kompatybilności między wersjami 2 i 3, a Java, po przejęciu przez Oracle, stała się mniej chętnie wdrażana przez firmy z powodu niestabilnej polityki licencyjnej. Ponadto, Node.js nadal nie zapewnia spójnego systemu modułów, z powodu współistnienia CJS i ESM.
Z kolei Go to język, dla którego spójność i stabilność są wartościami nadrzędnymi. Zespół Go ściśle utrzymuje kompatybilność wsteczną i, wprowadzając nowe funkcje, konsekwentnie stosuje stopniową integrację, aby uniknąć konfliktów z istniejącym kodem. Składnia również unika zbędnych słów kluczowych i ogranicza nadmierną abstrakcję, zapobiegając w ten sposób niepotrzebnemu skomplikowaniu samego języka. Ponadto, spójny oficjalny zestaw narzędzi, taki jak go fmt, go mod, go build, go test, zachęca wszystkie projekty Go do posiadania identycznego środowiska programistycznego i struktury, a potężna i praktyczna standardowa biblioteka wiernie wspiera większość funkcji potrzebnych w praktycznym rozwoju, takich jak serwer WWW, przetwarzanie plików, integracja z bazami danych, bez potrzeby osobnego frameworka.