GoSuda

Fem designegenskaper hos Go-språket ur ett system- och backendutvecklingsperspektiv

By Rabbit Princess views ...

Inledning

Programmeringsspråk är verktyg för att skapa produkter. Att enbart använda ett visst språk avgör inte en utvecklares skicklighet. Men vilket språk man väljer och hur man använder det kan ha en direkt inverkan på en utvecklares tankesätt och utvecklingsriktning. Särskilt att lämna det språk man använder just nu och jämföra det med andra språk hjälper i hög grad till att vidga den tekniska horisonten och att utveckla en känsla för kärnan i saker och ting. I den här texten vill jag berätta om varför jag valde Go och på vilka fem sätt det bidrar till utvecklarens tillväxt.

1. Go är ett språk som balanserar prestanda och produktivitet.

Det finns otaliga programmeringsspråk i världen, och varje språk har sina för- och nackdelar beroende på sina egenskaper.

  • C erbjuder utmärkt prestanda och låg nivå av kontroll, men utvecklaren måste hantera minnet själv, och bristen på högnivåfunktioner gör produktiviteten låg och underhållet svårt.
  • C++ och Rust stödjer olika avancerade funktioner såsom objektorientering, mallar och metaprogrammering, men syntaxen är komplex, inlärningskurvan brant, och de långsamma kompileringstiderna gör dem mindre lämpade för frekventa driftsättningar.
  • Java och C# erbjuder plattformsoberoende och stabilitet och används därför i stor utsträckning i storskaliga tjänster, men de körs på tunga virtuella maskiner, vilket gör driftsättning och exekveringsmiljön komplex och kräver mycket resurser.
  • Python och JavaScript är lämpliga för snabb utveckling tack vare sin koncisa syntax och rika ekosystem, men exekveringsprestandan är låg och ekosystemets tillförlitlighet är bristfällig, vilket gör att strukturella begränsningar framträder i storskaliga system.

Golang å andra sidan är ett språk som uppvisar en utmärkt balans mellan prestanda och produktivitet. Eftersom Go, likt C, är ett kompilerat språk garanterar det hög exekveringsprestanda, samtidigt som de snabba kompileringstiderna ger en driftsättningsflexibilitet på nivå med interpreterade språk. Med andra ord är Go ett balanserat språk som utan tydliga nackdelar kan användas stabilt i de flesta miljöer.

2. Go förhindrar cargo cult-programmering.

Under andra världskriget byggde de allierade en flygbas på en Stillahavsö för att stödja krigsinsatsen. Det stora tillflödet av förnödenheter och militär utrustning förändrade i hög grad livet för soldater och lokalbefolkning. Invånarna fick för första gången se flygplan som bar kläder tillverkade i fabriker, konserverad mat och andra varor. När kriget var över övergavs basen, och lasten anlände inte längre. Därför klädde sig öborna ut som flygledare, soldater och sjömän för att härma soldaterna, byggde något som liknade en landningsbana och använde pinnar för att skicka landningssignaler till flygplanen. De fortsatte att marschera i hopp om att lasten skulle sjunka ner med fallskärm. Men de flygplan de väntade på kom aldrig.

Cargo cult-programmering avser utvecklingsvanor där man endast härmar ytan av kod eller teknik utan att förstå dess principer. Inom modern utveckling, särskilt inom webbutveckling, uppstår ofta vanan att följa mönster utan att förstå innebörden. Ramverk som React, Next, Spring och Django har gjort det möjligt att utveckla utan kunskap om deras interna struktur, men många utvecklare klarar sig dåligt när även ett litet fel uppstår. Nu när AI-verktyg för kodgenerering dessutom har tillkommit, sprider sig utvecklingsmetoden att kopiera och klistra in resultat i stället för att skriva koden själv eller förstå principerna i allt större utsträckning.

Go motverkar dessa problem grundläggande på språkfilosofins nivå. Go är ett språk som är utformat kring standardbiblioteket snarare än kring ramverk. Utvecklaren kan bygga en webbserver på produktionsnivå enbart med grundläggande bibliotek som net/http och database/sql, och på så sätt utvecklas naturligt en intuition och förståelse för lågnivåstrukturer såsom nätverk, databaser och I/O. En struktur som gör det möjligt att bygga en solid grund utan att förlita sig på ramverk utgör därmed en bas för att utvecklaren ska kunna växa kontinuerligt utan att förlora sig i teknikens kärna.

3. Go erbjuder en kraftfull concurrency-modell.

Moderna processorer utvecklas snarare genom att använda flera kärnor parallellt för att öka prestandan än genom att höja hastigheten på en enskild kärna. Därför har concurrency, det vill säga förmågan hos ett program att hantera flera uppgifter samtidigt, blivit nödvändigt, och betydelsen av ett språk som kan designa och implementera detta effektivt växer allt mer. Go är ett språk som är optimerat för denna miljö. En goroutine är en lättviktstråd som tillhandahålls av Go, kan skapas med en stack på endast några KB och förbrukar nästan inga systemresurser även när tusentals körs samtidigt. Go-runtimen fördelar effektivt otaliga goroutines över OS-trådar genom en egen M:N-schemaläggare, och denna process optimeras automatiskt utan att utvecklaren behöver ingripa. Tack vare detta kan utvecklaren utforma concurrency-logik på ett säkert och konsekvent sätt utan komplex synkroniseringslogik eller anpassad schemaläggning.

Dessutom stödjer Go aktivt modern concurrency-design med synkroniseringsverktyg såsom mutex och waitGroup, samt channel och context. Tack vare denna struktur kan utvecklaren naturligt utveckla en praktisk känsla för concurrency och parallellitet utan att fastna i komplex teori, och kan nå en hög nivå av abstraktion och designförmåga som är användbar i praktiken.

4. Go är ett språk som skapats av utmärkta utvecklare med en tydlig inriktning.

Go har tagit form under ledning av de legendariska utvecklarna Robert Griesemer, Rob Pike och Ken Thompson vid Google. I synnerhet är de skaparna av Unix och C, och de är mästare inom kompilatorer och systemprogramvara, vilket i sig bevisar Gos tekniska tillförlitlighet. Dessutom har Google-ingenjörers praktiska erfarenhet och kunskap om drift av storskaliga tjänster format språket, och Go har sedan starten strävat efter att lösa verkliga problem och har utvecklats med en konsekvent filosofi och riktning.

Andra språk orsakar ofta förvirring för gemenskapen och användarna genom brytande kompatibilitet, designförändringar, instabila licenser och ostandardiserade ekosystem. Till exempel har Python delat upp sitt ekosystem i flera år på grund av den bristande kompatibiliteten mellan version 2 och 3, och efter Oracles förvärv av Java har instabila licenspolicyer lett till att företag blivit mer tveksamma till att införa språket. Dessutom saknar Node.js fortfarande ett konsekvent modulsystem eftersom CJS och ESM samexisterar.

Go, däremot, är ett språk som sätter konsekvens och stabilitet främst. Go-teamet upprätthåller strikt bakåtkompatibilitet och håller fast vid en stegvis integrationsmetod så att nya funktioner inte står i konflikt med befintlig kod. Språket undviker onödiga nyckelord och begränsar överdriven abstraktion, vilket förhindrar att språket i sig blir onödigt komplext. Dessutom leder en konsekvent officiell verktygskedja, med go fmt, go mod, go build och go test, till att alla Go-projekt får samma utvecklingsmiljö och struktur, och det kraftfulla och praktiska standardbiblioteket stödjer på ett tillförlitligt sätt det mesta som behövs i praktisk utveckling, såsom webbservrar, filhantering och databasintegration, utan något separat ramverk.

5. Gopher är söt.

Gopher1

Gopher2

Gopher3