GoSuda

A Go nyelv öt tervezési jellemzője rendszer- és backend-mérnöki szemszögből

By Rabbit Princess views ...

Bevezetés

A programozási nyelvek olyan eszközök, amelyekkel termékeket készítünk. Egy adott nyelv használata önmagában nem határozza meg a fejlesztő szakmai képességeit. Ugyanakkor az, hogy melyik nyelvet választjuk és hogyan használjuk, közvetlen hatással lehet a fejlesztő gondolkodásmódjára és fejlődési irányára. Különösen hasznos, ha a jelenleg használt nyelvből kilépve más nyelvekkel vetjük össze, mert ez tágítja a technikai látókört és fejleszti a lényeglátás képességét. Ebben a cikkben arról szeretnék beszélni, miért választottam a Go nyelvet, és hogy milyen szempontokból segíti a fejlesztő szakmai fejlődését, öt szempontra bontva.

1. A Go a teljesítmény és a produktivitás egyensúlyát megteremtő nyelv.

A világban rengeteg programozási nyelv létezik, és mindegyiknek megvannak a maga erősségei és gyengeségei a sajátosságai alapján.

  • A C kiemelkedő teljesítményt és alacsony szintű vezérlést tesz lehetővé, ugyanakkor a memóriakezelést a fejlesztőnek kell közvetlenül elvégeznie, magas szintű funkciók híján pedig alacsony a produktivitása, és nehezen karbantartható.
  • A C++ és a Rust objektumorientált programozást, sablonokat, metaprogramozást és egyéb fejlett funkciókat támogat, azonban szintaxisa összetett, tanulási görbéje meredek, lassú fordítási sebessége pedig nem teszi alkalmassá gyakori telepítésekre.
  • A Java és a C# platformfüggetlenséget és stabilitást biztosít, így széles körben használják nagy léptékű szolgáltatásoknál, ám nehéz virtuális gépen futnak, ezért telepítésük és futtatási környezetük bonyolult, erőforrásigényük pedig magas.
  • A Python és a JavaScript egyszerű szintaxisának és gazdag ökoszisztémájának köszönhetően gyors fejlesztésre alkalmas, ugyanakkor futási teljesítményük gyenge, az ökoszisztéma megbízhatósága pedig alacsony, ezért nagy rendszerekben szerkezeti korlátaik megmutatkoznak.

Ezzel szemben a Go kiváló egyensúlyt teremt a teljesítmény és a produktivitás között. A Go a C-hez hasonló fordított nyelv, ezért magas futási teljesítményt garantál, miközben gyors fordítási sebessége révén az értelmező nyelvekre jellemző telepítési rugalmasságot nyújt. Vagyis a Go nyilvánvaló hátrányok nélkül, a legtöbb környezetben megbízhatóan használható, kiegyensúlyozott nyelv.

2. A Go megakadályozza a kultikus (cargo cult) programozást.

A második világháború idején a szövetségesek légitámaszpontot építettek a Csendes-óceán egyik szigetén, hogy segítsék a háborút. A nagy mennyiségű utánpótlás és a katonai felszerelés támogatása jelentősen megváltoztatta a katonák és a helyi lakosok életét. A szigetlakók először láttak olyan repülőgépeket, amelyek gyártott ruhákat, konzervdobozokat és egyéb árukat szállítottak. A háború végeztével a támaszpontot elhagyták, és az áruszállítmányok megszűntek. Ezért a szigetlakók a katonákat utánozva légiforgalmi irányítóknak, katonáknak és tengerészeknek öltöztek, kifutópályához hasonló területet alakítottak ki, és botokkal jeleztek a repülőgépeknek a leszállásra. Menetelést folytattak, hogy a repülőgépekből ejtőernyővel lehulló áruk megérkezzenek. Azonban a várt repülőgépek nem érkeztek meg.

A kultikus (cargo cult) programozás olyan fejlesztési szokást jelent, amikor a fejlesztő a kód vagy a technológia működésének megértése nélkül csak a külsőségeket utánozza. A mai fejlesztők, különösen a webfejlesztés területén, gyakran követnek olyan szokásokat, amelyek értelmét nem ismerik. A React, a Next, a Spring és a Django típusú keretrendszereknek köszönhetően lehetséges a fejlesztés a belső működés ismerete nélkül is, azonban sok esetben egyetlen apró hibára sem tudnak megfelelően reagálni. Ehhez csatlakoztak a legújabb MI-alapú kódgeneráló eszközök, ezért egyre elterjedtebb az a fejlesztési mód, amelyben a kódot nem írják meg vagy nem értik meg, hanem csak az eredményt másolják és illesztik be.

A Go ezt a problémát nyelvi filozófiai szinten alapvetően elutasítja. A Go nem keretrendszer-központú, hanem a standard könyvtárra épülő nyelv. A fejlesztő a net/http és a database/sql alapvető csomagjaival is valódi szolgáltatási szintű webszervert építhet, és ezáltal természetesen fejleszti intuícióját és megértését a hálózat, az adatbázis, a bemenet/kimenet és más alacsony szintű struktúrák iránt. Az ilyen felépítés, amely lehetővé teszi, hogy a keretrendszerektől függetlenül, az alapoktól kezdve szilárdan sajátítsuk el a tudnivalókat, olyan alapot ad, amely segítségével a fejlesztő a technológia lényegét szem elől nem tévesztve folyamatosan fejlődhet.

3. A Go erőteljes konkurenciamodellt biztosít.

A mai processzorok az egyetlen mag sebességének növelése helyett inkább több mag párhuzamos kihasználásával fokozzák a teljesítményt. Ennek következtében a több feladat egyidejű kezelésére alkalmas konkurencia alapvetővé vált, és egyre fontosabb, hogy olyan nyelvet használjunk, amellyel ez hatékonyan tervezhető és megvalósítható. A Go ehhez a környezethez optimalizált nyelv. A goroutine a Go által biztosított könnyűsúlyú szál, amely néhány kilobájtnyi veremmel is létrehozható, és több ezer példánya futtatása közben is alig emészt fel rendszererőforrást. A Go futtatókörnyezete saját M:N ütemezőjén keresztül hatékonyan osztja szét a számos goroutine-t az OS-szálak között, és ez a folyamat a fejlesztő közreműködése nélkül automatikusan optimalizálódik. Ennek köszönhetően a fejlesztő összetett szinkronizációs logika vagy egyedi ütemezés nélkül is biztonságos és egységes módon tervezhet konkurens logikát.

A Go emellett aktívan támogatja a mutex, a WaitGroup típusú szinkronizációs eszközöket, valamint a channel és a context használatán alapuló modern konkurenciatervezést. Ezeknek a megoldásoknak köszönhetően a fejlesztő a bonyolult elméletbe való elmerülés nélkül is természetesen szerezhet gyakorlati érzéket a konkurencia és a párhuzamosság iránt, és eljuthat a magas szintű absztrakció és tervezési képesség olyan szintjére, amely a semmiből is hasznosítható.

4. A Go olyan kiváló fejlesztők által központosítva létrehozott nyelv, akik stabil irányt szabtak neki.

A Go a Google égisze alatt, Robert Griesemer, Rob Pike és Ken Thompson legendás fejlesztők vezetésével született. Különösen igaz ez, mivel ők a UNIX és a C nyelv megalkotói, illetve a fordítóprogramok és a rendszerszoftverek területének mesterei, így már önmagukban is igazolják a Go technikai megbízhatóságát. Mindehhez a számtalan Google-mérnök gyakorlati tapasztalata és nagy léptékű szolgáltatások üzemeltetési tudása is hozzáadódott, így a Go kezdettől fogva a valós problémák megoldására törekszik, és következetes szemlélettel és irányvonallal fejlődött.

Más nyelvek gyakran okoznak zavart a közösség és a felhasználók számára olyan okok miatt, mint a kompatibilitási törések, a tervezési változtatások, a bizonytalan licencelés vagy a nem szabványosított ökoszisztéma. Például a Python 2-es és 3-as verziói közötti kompatibilitási törés évekre kettéosztotta az ökoszisztémát, a Java esetében pedig az Oracle általi felvásárlás után a licencpolitika bizonytalanná vált, ami miatt egyre több vállalat idegenkedett a bevezetéstől. A Node.js esetében pedig a CJS és az ESM továbbra is egymás mellett létezik, így nem képes egységes modulrendszert biztosítani.

Ezzel szemben a Go a következetességet és a stabilitást tekinti legfontosabb értéknek. A Go csapata szigorúan fenntartja a visszafelé kompatibilitást, és új funkciók bevezetésekor is a fokozatos integráció módszeréhez ragaszkodik, hogy azok ne ütközzenek a meglévő kóddal. A szintaxis is kerüli a felesleges kulcsszavakat, és a túlzott absztrakciót korlátozza, így megakadályozza, hogy maga a nyelv szükségtelenül bonyolulttá váljon. Emellett az olyan egységes, hivatalos eszközkészlet, mint a go fmt, go mod, go build és go test, arra ösztönzi a Go projekteket, hogy mindegyik azonos fejlesztési környezettel és szerkezettel rendelkezzen, a erőteljes és gyakorlatias standard könyvtár pedig külön keretrendszer nélkül is maradéktalanul támogatja a gyakorlati fejlesztéshez szükséges funkciók többségét, így a webszerverek, a fájlkezelés és az adatbázis-kapcsolatok területén is.

5. A Gopher aranyos.

Gopher1

Gopher2

Gopher3