Go-kielen viisi suunnitteluominaisuutta järjestelmä- ja taustajärjestelmäinsinöörin näkökulmasta

Johdanto
Ohjelmointikielet ovat työkaluja tuotteiden rakentamiseen. Pelkkä kielen käyttö ei yksinään määritä kehittäjän osaamistasoa. Kuitenkin se, mitä kieltä valitaan ja miten sitä käytetään, voi vaikuttaa suoraan kehittäjän ajattelutapaan ja kasvusuuntaan. Erityisesti nykyisen kielen ulkopuolelle katsominen ja muiden kielten kanssa vertaileminen auttaa laajentamaan teknistä näkökulmaa ja kehittämään tajua perusasioista. Tässä kirjoituksessa kerron, miksi valitsin Go:n ja miten se tukee kehittäjän kasvua viidestä eri näkökulmasta.
1. Go on kieli, joka tasapainottaa suorituskyvyn ja tuottavuuden.
Maailmassa on lukuisia ohjelmointikieliä, ja jokaisella kielellä on ominaisuuksistaan johtuvia etuja ja haittoja.
- C tarjoaa erinomaisen suorituskyvyn ja matalan tason hallinnan, mutta muistinhallinta on kehittäjän vastuulla, ja korkean tason ominaisuuksien puute heikentää tuottavuutta ja tekee ylläpidosta vaikeaa.
- C++ ja Rust tukevat monipuolisia edistyneitä ominaisuuksia, kuten olio-ohjelmointia, malleja (templates) ja metaohjelmointia, mutta niiden syntaksi on monimutkainen, oppimiskäyrä on jyrkkä, ja hitaat käännösnopeudet tekevät toistuvista julkaisuista epäkäytännöllisiä.
- Java ja C# tarjoavat alustariippumattomuutta ja vakautta, minkä vuoksi niitä käytetään laajasti suurissa palveluissa, mutta ne suoritetaan raskaassa virtuaalikoneessa, jolloin julkaisu- ja suoritusympäristöt ovat monimutkaisia ja resurssitarve on suuri.
- Python ja Javascript soveltuvat nopeaan kehitykseen ytimekkään syntaksinsa ja rikkaan ekosysteeminsä ansiosta, mutta niiden suorituskyky on heikompi ja ekosysteemin luotettavuus vaihtelee, minkä vuoksi rakenteelliset rajoitteet tulevat esiin suurissa järjestelmissä.
Go on sen sijaan kieli, joka on onnistunut tasapainottamaan suorituskyvyn ja tuottavuuden erinomaisesti. Koska Go on C:n tapaan käännettävä kieli, se takaa korkean suoritusnopeuden, ja nopea käännösaika tarjoaa samalla tulkkikielten kaltaisen joustavuuden julkaisussa. Toisin sanoen Go on tasapainoinen kieli, jolla ei ole selkeitä heikkouksia ja jota voi käyttää luotettavasti useimmissa ympäristöissä.
2. Go estää cargo cult -ohjelmoinnin.
Toisen maailmansodan aikana liittoutuneet rakensivat lentotukikohdan Tyynenmeren saarelle sodan tukemiseksi. Suuret määrät tarvikkeita ja sotilasvarusteita muuttivat merkittävästi sotilaiden ja paikallisten asukkaiden elämää. Saaren asukkaat näkivät ensimmäistä kertaa lentokoneiden tuovan mukanaan valmistettuja vaatteita, säilykeruokia ja muita tavaroita. Kun sota päättyi, tukikohta hylättiin, eikä rahtia enää saapunut. Niinpä saaren asukkaat pukeutuivat sotilaiden, lennonjohtajien ja merimiesten tapaan, rakensivat kiitotien kaltaisen alueen ja lähettivät lentokoneille laskeutumismerkkejä keppien avulla. He jatkoivat marssimista, jotta rahti putoaisi lentokoneesta laskuvarjolla. Lentokoneita ei kuitenkaan koskaan tullut.
Cargo cult -ohjelmointi tarkoittaa kehitystapaa, jossa koodin tai teknologian periaatteita ei ymmärretä, ja pelkkää ulkoasua jäljitellään. Nykyaikaisilla kehittäjillä, erityisesti verkkokehityksen alalla, esiintyy usein tällaista tapaa toimia ilman merkityksen ymmärtämistä. React, Next, Spring ja Django kaltaiset kehykset ovat mahdollistaneet kehityksen ilman sisäisen rakenteen tuntemista, mutta monet kehittäjät eivät osaa reagoida edes pieneen virheeseen. Kun tähän lisätään viimeaikaiset tekoälyavusteiset koodigeneraattorit, kehitystapa, jossa koodia ei kirjoiteta itse eikä periaatteita ymmärretä, vaan tulosta kopioidaan ja liitetään, yleistyy entisestään.
Go torjuu tämän ongelman perusteellisesti kielifilosofian tasolla. Go on suunniteltu keskittymällä standardikirjastoon kehysten sijaan. Kehittäjä voi rakentaa todellisen palvelutason verkkopalvelimen pelkästään net/http- ja database/sql-kaltaisilla perustavanlaatuisilla kirjastoilla, ja näin hän luonnollisesti kehittää intuitiota ja ymmärrystä verkon, tietokantojen ja I/O:n kaltaisista matalan tason rakenteista. Tällainen rakenne, jossa kehykseen ei tarvitse nojata ja perusteet opitaan kunnolla, muodostaa perustan sille, että kehittäjä voi kasvaa jatkuvasti huomaamatta teknologian ydintä.
3. Go tarjoaa vahvan samanaikaisuusmallin.
Nykyiset suorittimet kehittyvät siten, että suorituskykyä parannetaan hyödyntämällä useita ytimiä rinnakkain yksittäisen ytimen nopeuden kasvattamisen sijaan. Tämän vuoksi samanaikaisuus, eli kyky käsitellä useita tehtäviä yhtä aikaa yhdessä ohjelmassa, on muodostunut välttämättömäksi, ja kielen merkitys, joka mahdollistaa samanaikaisuuden tehokkaan suunnittelun ja toteutuksen, kasvaa jatkuvasti. Go on kieli, joka on optimoitu tähän ympäristöön. Goroutine on Go:n tarjoama kevyt säie, jonka voi luoda pelkällä muutaman kilotavun pinolla, ja tuhansienkin samanaikainen suoritus kuluttaa järjestelmäresursseja lähes olematta. Go-ajoympäristö jakaa lukuisat goroutinet tehokkaasti käyttöjärjestelmän säikeille oman M:N-ajastimensa avulla, ja tämä prosessi optimoituu automaattisesti ilman kehittäjän suoraa puuttumista. Näin kehittäjä voi suunnitella samanaikaisuuslogiikkaa turvallisella ja johdonmukaisella tavalla ilman monimutkaista synkronointilogiikkaa tai mukautettua ajastusta.
Lisäksi Go tukee aktiivisesti nykyaikaista samanaikaisuussuunnittelua mutex- ja waitGroup-kaltaisilla synkronointityökaluilla sekä channelin ja contextin avulla. Tämän rakenteen ansiosta kehittäjä voi omaksua samanaikaisuuden ja rinnakkaisuuden käytännön tajun ilman monimutkaisiin teorioihin takertumista, ja hän voi saavuttaa korkean tason abstraktio- ja suunnittelukyvyn, jota voi hyödyntää käytännössä.
4. Go on kieli, jonka ovat muovanneet erinomaiset kehittäjät keskittyen olennaiseen.
Go on Googlen ja Robert Griesemerin, Rob Piken ja Ken Thompsonin, legendaaristen kehittäjien, johtama kieli. Erityisesti he ovat Unixin ja C-kielen luojia sekä kääntäjien ja järjestelmäohjelmistojen alan mestareita, ja tämä itsessään todistaa Go:n teknisen luotettavuuden. Tähän on yhdistynyt lukuisten Google-insinöörien käytännön kokemus ja suurten palveluiden ylläpidon osaaminen, minkä ansiosta Go on alusta alkaen pyrkinyt käytännön ongelmien ratkaisuun ja kehittynyt johdonmukaisen filosofian ja suunnan mukaisesti.
Muut kielet aiheuttavat usein yhteisölle ja käyttäjille sekavuutta taaksepäin yhteensopimattomuuden, suunnittelumuutosten, epävakaiden lisenssien ja standardoimattoman ekosysteemin vuoksi. Esimerkiksi Python-kielen versioiden 2 ja 3 yhteensopimattomuus jakoi ekosysteemin useiksi vuosiksi, ja Javan lisenssikäytännöt muuttuivat epävakaiksi Oraclen oston jälkeen, mikä on lisännyt yritysten haluttomuutta ottaa sitä käyttöön. Lisäksi Node.js:ssä CJS ja ESM ovat yhä rinnakkain, eikä se tarjoa johdonmukaista moduulijärjestelmää.
Go sen sijaan asettaa johdonmukaisuuden ja vakauden ensisijaisiksi arvoikseen. Go-tiimi ylläpitää taaksepäin yhteensopivuutta huolellisesti, ja uusia ominaisuuksia otettaessa se noudattaa asteittaista integrointitapaa, joka estää ristiriidat olemassa olevan koodin kanssa. Myös syntaksi välttää tarpeettomia avainsanoja ja rajoittaa liiallista abstrahointia, mikä estää kielen itsensä tarpeettoman monimutkaistumisen. Lisäksi go fmt, go mod, go build ja go test -kaltaiset yhtenäiset viralliset työkaluketjut ohjaavat kaikki Go-projektit samaan kehitysympäristöön ja rakenteeseen, ja tehokas, käytännöllinen standardikirjasto tukee ilman erillisiä kehyksiä verkkopalvelimia, tiedostokäsittelyä, tietokantayhteyksiä ja useimpia muita käytännön kehitystehtäviin tarvittavia toimintoja.
5. Gopher on söpö.


