Hvorfor Go-sproget?
Indledning
Programmeringssprog er værktøjer til at skabe produkter. En udviklers færdigheder afgøres ikke blot af, hvilket sprog der bruges. Men valget af sprog og måden, det håndteres på, kan direkte påvirke en udviklers tankegang og vækstretning. Især det at sammenligne det sprog, man bruger nu, med andre sprog kan i høj grad udvide den tekniske horisont og udvikle en fornemmelse for essensen. I denne artikel vil jeg diskutere, hvorfor jeg valgte Go, og hvordan det hjælper en udviklers vækst, opdelt i fem aspekter.
1. Go er et sprog, der balancerer ydeevne og produktivitet.
Der findes utallige programmeringssprog i verden, og alle sprog har fordele og ulemper afhængigt af deres egenskaber.
- C tilbyder fremragende ydeevne og lavniveaustyring, men kræver manuel hukommelsesstyring af udvikleren og mangler højniveau-funktioner, hvilket resulterer i lav produktivitet og vanskelig vedligeholdelse.
- C++ og Rust understøtter forskellige avancerede funktioner som objektorientering, templates og metaprogrammering, men deres syntaks er kompleks, læringskurven er stejl, og langsomme kompileringstider gør dem uegnede til gentagen implementering.
- Java og C# er udbredt til store tjenester på grund af deres platformsuafhængighed og stabilitet, men de kører på tunge virtuelle maskiner, hvilket gør implementerings- og udførelsesmiljøerne komplekse og ressourcekravene høje.
- Python og Javascript er velegnede til hurtig udvikling takket være deres enkle syntaks og rige økosystem, men deres udførelsesydeevne er dårlig, og økosystemets pålidelighed er lav, hvilket afslører strukturelle begrænsninger i store systemer.
På den anden side er Golang et sprog, der opnår en fremragende balance mellem ydeevne og produktivitet. Go er et kompileret sprog som C, hvilket sikrer høj udførelsesydeevne, samtidig med at det tilbyder hurtig kompileringstid for implementeringsfleksibilitet på interpretatorniveau. Med andre ord er Go et velafbalanceret sprog, der kan bruges stabilt i de fleste miljøer uden væsentlige ulemper.
2. Go forhindrer Cargo Cult Programming.
Under Anden Verdenskrig byggede de allierede en luftbase på en stillehavs-ø for at hjælpe krigsindsatsen. Den store mængde forsyninger og militært udstyr ændrede soldaternes og de indfødtes liv betydeligt. Beboerne så for første gang fly bringe fremstillet tøj, konserves og andre varer. Da krigen sluttede, blev basen forladt, og der ankom ikke længere gods. Så øboerne klædte sig ud som flyveledere, soldater og sømænd for at efterligne soldaterne, skabte noget, der lignede en landingsbane, og brugte pinde til at sende landingssignaler til fly. De fortsatte med at marchere for at få gods til at falde ned med faldskærm fra flyene. Men de fly, de ventede på, kom ikke.
Cargo Cult Programming henviser til en udviklingsvane, hvor man efterligner udseendet af kode eller teknologi uden at forstå principperne bag den. Blandt moderne udviklere, især inden for webudvikling, er denne vane med at kopiere uden at forstå betydningen almindelig. Takket være frameworks som React, Next, Spring og Django er udvikling blevet mulig uden kendskab til den interne struktur, men det fører ofte til manglende evne til at håndtere selv små fejl korrekt. Med tilføjelsen af AI-kodegenereringsværktøjer er en udviklingsmetode, hvor man kopierer og indsætter resultater frem for direkte at skrive kode eller forstå principperne, blevet endnu mere udbredt.
Go modvirker fundamentalt disse problemer på sprogfilosofisk niveau. Go er et sprog designet med fokus på standardbiblioteker frem for frameworks. Udviklere kan opbygge en webserver på serviceniveau med kun grundlæggende biblioteker som net/http og database/sql, hvilket naturligt fremmer intuition og forståelse for lavniveaustrukturer som netværk, databaser og I/O. Denne struktur, der tillader en solid forståelse af grundlæggende principper uden afhængighed af frameworks, danner grundlaget for, at udviklere kan fortsætte med at vokse uden at miste essensen af teknologi.
3. Go tilbyder en stærk samtidighedsmodel.
Moderne CPU'er udvikler sig i retning af at forbedre ydeevnen ved at udnytte flere kerner parallelt frem for at øge hastigheden på en enkelt kerne. Som følge heraf er samtidighed, hvor et enkelt program kan behandle flere opgaver samtidigt, blevet en nødvendighed, og vigtigheden af sprog, der effektivt kan designe og implementere dette, vokser. Go er et sprog optimeret til dette miljø. Goroutines er letvægts-tråde leveret af Go, som kan oprettes med kun få KB stak, og selv tusindvis af dem, der kører samtidigt, forbruger næsten ingen systemressourcer. Go runtime distribuerer effektivt et stort antal goroutines til OS-tråde via sin egen M:N scheduler, og denne proces optimeres automatisk uden direkte indgriben fra udvikleren. Dette giver udviklere mulighed for at designe samtidighedslogik på en sikker og konsistent måde uden kompleks synkroniseringslogik eller tilpasset scheduling.
Derudover understøtter Go aktivt moderne samtidighedsdesign ved hjælp af synkroniseringsværktøjer som mutex og waitGroup, samt channel og context. Takket være disse strukturer kan udviklere naturligt opnå en praktisk forståelse af samtidighed og parallelisme uden at være bundet af kompleks teori, og de kan nå et højt niveau af brugbar abstraktion og designkapacitet ud af intet.
4. Go er et sprog skabt og styret af fremragende udviklere.
Go er et sprog, der blev skabt under ledelse af legendariske udviklere som Google, Robert Griesemer, Rob Pike og Ken Thompson. Især disse personer, grundlæggerne af Unix og C-sproget, samt mestre inden for compilere og systemsoftware, beviser i sig selv Gos tekniske pålidelighed. Med inddragelse af utallige Google-ingeniørers praktiske erfaring og knowhow inden for drift af store tjenester, har Go fra starten stræbt efter at løse virkelige problemer og har udviklet sig med en konsekvent filosofi og retning.
Andre sprog forårsager ofte forvirring i fællesskabet og blandt brugere på grund af brud på kompatibilitet, designændringer, ustabile licenser eller ustandardiserede økosystemer. For eksempel var Pythons økosystem i årevis opdelt på grund af brud på kompatibilitet mellem version 2 og 3, og efter Oracles opkøb af Java er der kommet flere tilfælde, hvor virksomheder tøver med at implementere det på grund af ustabile licenspolitikker. Desuden lever CJS og ESM stadig side om side i Node.js, hvilket forhindrer et ensartet modulsystem.
Go er derimod et sprog, der prioriterer konsistens og stabilitet. Go-teamet opretholder omhyggeligt bagudkompatibilitet og fastholder en gradvis integrationsmetode, selv når nye funktioner introduceres, for at undgå konflikter med eksisterende kode. Syntaksen undgår også unødvendige nøgleord og begrænser overdreven abstraktion for at forhindre, at sproget bliver unødvendigt komplekst. Desuden guider den konsistente officielle toolchain som go fmt, go mod, go build og go test alle Go-projekter til at have det samme udviklingsmiljø og struktur, og det robuste og praktiske standardbibliotek understøtter trofast de fleste funktioner, der er nødvendige for praktisk udvikling, såsom webservere, filbehandling og databaseintegration, uden behov for separate frameworks.