GoSuda

Fem designegenskaber ved Go-sproget set fra et system- og backend-ingeniørmæssigt perspektiv

By Rabbit Princess views ...

Indledning

Programmeringssprog er værktøjer til at skabe produkter. At bruge et bestemt sprog gør ikke i sig selv en udvikler dygtig. Men hvilket sprog man vælger og hvordan man anvender det, kan have en direkte indflydelse på en udviklers tankegang og udviklingsretning. Især er det en stor hjælp for den tekniske horisont og for udviklingen af en fornemmelse for essensen at træde ud over det sprog, man bruger i dag, og sammenligne det med andre sprog. I denne artikel vil jeg forsøge at fortælle, hvorfor jeg valgte Go, og hvordan det hjælper udvikleres vækst, opdelt i fem aspekter.

1. Go er et sprog, der balancerer ydeevne og produktivitet.

Der findes utallige programmeringssprog, og hvert sprog har fordele og ulemper afhængigt af sine egenskaber.

  • C giver fremragende ydeevne og lavniveaukontrol, men udvikleren skal selv håndtere hukommelsesstyring, og manglen på højniveaufunktioner gør produktiviteten lav og vedligeholdelsen vanskelig.
  • C++ og Rust understøtter avancerede funktioner såsom objektorientering, skabeloner og metaprogrammering, men syntaksen er kompleks, indlæringskurven er stejl, og den langsomme kompileringshastighed gør dem uegnede til hyppige udrulninger.
  • Java og C# leverer platformsuafhængighed og stabilitet og anvendes derfor udbredt i storskala-tjenester, men de køres i en tung virtuel maskine, hvilket gør udrulning og kørselsmiljøet komplekst og kræver mange ressourcer.
  • Python og JavaScript er velegnede til hurtig udvikling takket være en kortfattet syntaks og et rigt økosystem, men deres kørselsydeevne er lav, og økosystemets pålidelighed er begrænset, så der opstår strukturelle begrænsninger i systemer i stor skala.

Til gengæld er Golang et sprog, der opnår en fremragende balance mellem ydeevne og produktivitet. Go er et kompileret sprog ligesom C, hvilket garanterer høj kørselsydeevne, og takket være den hurtige kompilering tilbyder det en udrulningsfleksibilitet på linje med fortolkede sprog. Med andre ord er Go et afbalanceret sprog, der uden tydelige ulemper kan anvendes stabilt i de fleste miljøer.

2. Go forhindrer cargo cult-programmering.

Under Anden Verdenskrig byggede De Allierede en flyvebase på en stillehavsø for at støtte krigsindsatsen. De store mængder forsyninger og militært udstyr ændrede markant livet for soldater og lokale beboere. Beboerne så for første gang fly, der bragte tøj, konserveret mad og andre varer. Da krigen var forbi, blev basen forladt, og der kom ikke længere forsyninger. Så øboerne efterlignede soldaterne: De klædte sig ud som flyveledere, soldater og søfolk, anlagde noget, der lignede en landingsbane, og brugte stokke til at sende landingssignaler til flyene. De fortsatte med at marchere, så forsyningerne ville falde ned i faldskærm. Men de fly, de ventede på, kom aldrig.

Cargo cult-programmering henviser til en udviklingsvane, hvor man efterligner kodens eller teknologiens ydre form uden at forstå principperne bag. Blandt moderne udviklere, især inden for webudvikling, er vanen at følge mønstre uden at forstå betydningen særligt udbredt. Frameworks såsom React, Next, Spring og Django har gjort det muligt at udvikle uden kendskab til deres interne struktur, men mange udviklere står hjælpeløse over for selv små fejl. Nu, hvor AI-kodegenereringsværktøjer også er kommet til, bliver den udviklingsmetode, hvor man blot kopierer og indsætter resultater i stedet for at skrive koden selv eller forstå principperne, endnu mere udbredt.

Go tager fundamentalt afstand fra dette problem på sprogfilosofisk niveau. Go er et sprog designet med fokus på standardbiblioteket frem for frameworks. Udviklere kan opbygge webservere på serviceniveau med blot grundlæggende biblioteker såsom net/http og database/sql, og på den måde udvikler de naturligt intuition og forståelse for lavniveaustrukturer som netværk, databaser og I/O. En struktur, der gør det muligt at lære det grundlæggende solidt uden at være afhængig af frameworks, danner netop grundlaget for, at udviklere kan vokse konstant uden at miste øje med teknologiens essens.

3. Go tilbyder en kraftfuld samtidighedsmodel.

Moderne CPU'er udvikler sig snarere mod at forbedre ydeevnen ved at udnytte flere kerner parallelt end ved at øge hastigheden på en enkelt kerne. Derfor er samtidighed, hvor et program kan håndtere flere opgaver samtidig, blevet en nødvendighed, og betydningen af et sprog, der kan designe og implementere den effektivt, vokser også. Go er et sprog optimeret til dette miljø. En goroutine er en letvægtstråd, som Go tilbyder; den kan oprettes med blot nogle få KB stak, og selv tusindvis af samtidigt kørende goroutines forbruger næsten ingen systemressourcer. Go-runtime distribuerer effektivt mange goroutines på OS-tråde via sin egen M:N-scheduler, og denne proces optimeres automatisk uden udviklerens direkte indgriben. Takket være dette kan udvikleren designe samtidighedslogik på en sikker og konsistent måde uden komplekse synkroniseringsmekanismer eller brugerdefineret scheduling.

Go understøtter desuden aktivt moderne samtidighedsdesign ved hjælp af synkroniseringsværktøjer såsom mutex og waitGroup samt channel og context. Takket være denne struktur kan udviklere uden at blive bundet af komplekse teorier naturligt opnå en praktisk fornemmelse for samtidighed og parallelisme og nå et højt abstraktions- og designniveau, der kan anvendes i praksis.

4. Go er et sprog, skabt af fremragende udviklere med en klar retning.

Go blev til under ledelse af de legendariske udviklere Robert Griesemer, Rob Pike og Ken Thompson hos Google. Især er de skabere af Unix og C, og som mestre inden for compilere og systemsoftware beviser de selv Gos tekniske troværdighed. Dertil kommer, at Google-ingeniørers mange års praktiske erfaring og viden om drift af storskala-tjenester er indarbejdet. Derfor har Go fra starten været rettet mod at løse praktiske problemer og har udviklet sig med en konsistent filosofi og retning.

Andre sprog skaber ofte forvirring for fællesskaber og brugere på grund af brud på bagudkompatibilitet, designændringer, usikre licenser og et ustandardiseret økosystem. For eksempel har Python-økosystemet været delt i flere år på grund af det kompatibilitetsbrud mellem version 2 og 3, og Java har efter Oracles opkøb fået ustabile licenspolitikker, hvilket har fået flere virksomheder til at tøve med at tage det i brug. Node.js er desuden stadig præget af, at CJS og ESM sameksisterer, hvilket betyder, at det ikke tilbyder et konsistent modulsystem.

Go derimod er et sprog, der sætter konsistens og stabilitet øverst på listen over værdier. Go-teamet opretholder grundigt bagudkompatibilitet og holder fast i en gradvis integrationsmetode, så nye funktioner ikke kommer i konflikt med eksisterende kode. Syntaksen undgår også unødvendige nøgleord og begrænser overdreven abstraktion, hvilket forhindrer, at selve sproget bliver unødigt komplekst. Derudover sørger et konsistent officielt værktøjssæt, såsom go fmt, go mod, go build og go test, for, at alle Go-projekter har det samme udviklingsmiljø og den samme struktur. Og det kraftfulde og praktiske standardbibliotek understøtter pålideligt de fleste funktioner, der er nødvendige i praktisk udvikling, såsom webservere, filhåndtering og databaseintegration, uden behov for et separat framework.

5. Gopher er sød.

Gopher1

Gopher2

Gopher3