Waarom de Go-taal?
Inleiding
Een programmeertaal is een hulpmiddel voor het creëren van producten. De vaardigheid van een ontwikkelaar wordt niet simpelweg bepaald door de taal die hij gebruikt. Echter, de keuze en hantering van een taal kunnen een directe invloed hebben op de denkwijze en groeirichting van een ontwikkelaar. In het bijzonder kan het vergelijken van de huidige taal met andere talen de technische horizon verbreden en het gevoel voor de essentie bevorderen. In dit artikel zal ik uiteenzetten waarom ik voor Go heb gekozen en hoe dit de groei van een ontwikkelaar kan ondersteunen, verdeeld over vijf aspecten.
1. Go is een taal die prestaties en productiviteit in evenwicht brengt.
Er bestaan talloze programmeertalen, en elke taal heeft, afhankelijk van zijn eigenschappen, voor- en nadelen.
- C biedt uitstekende prestaties en controle op laag niveau, maar vereist handmatig geheugenbeheer, mist functies op hoog niveau, wat resulteert in lage productiviteit en moeilijk onderhoud.
- C++ en Rust ondersteunen diverse geavanceerde functies zoals objectgeoriënteerd programmeren, templates en metaprogrammeren, maar de syntaxis is complex, de leercurve is steil en de trage compilatiesnelheid maakt ze ongeschikt voor frequente implementaties.
- Java en C# bieden platformonafhankelijkheid en stabiliteit en worden veel gebruikt voor grootschalige services, maar ze draaien op zware virtuele machines, wat de implementatie- en uitvoeringsomgeving complex maakt en hoge resourcevereisten met zich meebrengt.
- Python en Javascript zijn geschikt voor snelle ontwikkeling dankzij hun beknopte syntaxis en rijke ecosysteem, maar hun uitvoeringsprestaties zijn laag en de betrouwbaarheid van het ecosysteem is onvoldoende, waardoor structurele beperkingen in grootschalige systemen duidelijk worden.
Daarentegen is Golang een taal die een uitstekend evenwicht biedt tussen prestaties en productiviteit. Go is, net als C, een gecompileerde taal, wat hoge uitvoeringsprestaties garandeert, terwijl de snelle compilatiesnelheid een implementatieflexibiliteit op interpreterniveau biedt. Dit betekent dat Go een evenwichtige taal is die stabiel kan worden gebruikt in de meeste omgevingen, zonder duidelijke nadelen.
2. Go voorkomt Cargo Cult Programming.
Tijdens de Tweede Wereldoorlog bouwden de geallieerden luchtmachtbases op Pacifische eilanden om de oorlog te ondersteunen. De grote hoeveelheden voorraden en militaire uitrusting die werden geleverd, veranderden het leven van soldaten en inheemse bevolking aanzienlijk. De bewoners zagen voor het eerst vliegtuigen die gefabriceerde kleding, ingeblikt voedsel en andere goederen meebrachten. Na de oorlog werden de bases verlaten en arriveerde er geen vracht meer. Daarom verkleedden de eilandbewoners zich als luchtverkeersleiders, soldaten en zeelieden om de militairen na te bootsen, bouwden ze iets wat leek op een landingsbaan en gebruikten ze stokken om landingssignalen naar vliegtuigen te zenden. Ze bleven marcheren om vracht uit vliegtuigen te laten vallen via parachutes. De vliegtuigen waarop ze wachtten, kwamen echter niet.
Cargo Cult Programming verwijst naar een ontwikkelingsgewoonte waarbij men de uiterlijke vorm van code of technologie nabootst zonder de onderliggende principes te begrijpen. Onder moderne ontwikkelaars, met name in webdevelopment, komt deze gewoonte van het blindelings volgen zonder begrip vaak voor. Frameworks zoals React, Next, Spring en Django hebben ontwikkeling mogelijk gemaakt zonder de interne structuur te kennen, maar dit leidt er vaak toe dat men niet adequaat kan reageren op zelfs kleine fouten. Met de recente toevoeging van AI-codegeneratie-tools wordt deze ontwikkelingsmethode, waarbij men resultaten kopieert en plakt in plaats van code zelf te schrijven of principes te begrijpen, nog wijdverspreider.
Go vermijdt dit probleem fundamenteel op het niveau van de taalfilosofie. Go is een taal die is ontworpen rondom de standaardbibliotheek, niet rondom frameworks. Ontwikkelaars kunnen met alleen basisbibliotheken zoals net/http en database/sql een webserver van serviceniveau bouwen, en ontwikkelen zo op natuurlijke wijze een intuïtie en begrip van structuren op laag niveau, zoals netwerken, databases en I/O. Deze structuur, die het mogelijk maakt om een solide basis te leggen zonder afhankelijk te zijn van frameworks, vormt de basis voor ontwikkelaars om de essentie van technologie niet uit het oog te verliezen en voortdurend te groeien.
3. Go biedt een krachtig concurrency-model.
Moderne CPU's ontwikkelen zich in de richting van prestatieverbetering door het parallel benutten van meerdere cores, in plaats van het verhogen van de snelheid van een enkele core. Hierdoor is concurrency, waarbij één programma meerdere taken gelijktijdig kan verwerken, essentieel geworden, en het belang van talen die dit efficiënt kunnen ontwerpen en implementeren neemt toe. Go is een taal die geoptimaliseerd is voor deze omgeving. Goroutines zijn lichtgewicht threads die door Go worden aangeboden, die met slechts enkele KB's aan stack kunnen worden gecreëerd en nauwelijks systeemresources verbruiken, zelfs bij duizenden gelijktijdige uitvoeringen. De Go runtime verdeelt talloze goroutines efficiënt over OS-threads via een eigen M:N scheduler, en dit proces wordt automatisch geoptimaliseerd zonder directe tussenkomst van de ontwikkelaar. Hierdoor kan de ontwikkelaar concurrency-logica op een veilige en consistente manier ontwerpen, zonder complexe synchronisatielogica of aangepaste scheduling.
Bovendien ondersteunt Go actief modern concurrency-design met behulp van synchronisatietools zoals mutex en waitGroup, en channel en context. Dankzij deze structuur kan de ontwikkelaar op natuurlijke wijze een praktisch gevoel voor concurrency en parallelisme verwerven, zonder zich te binden aan complexe theorieën, en kan hij een hoog niveau van bruikbare abstractie en ontwerpmogelijkheden bereiken.
4. Go is een taal die is gecreëerd en geleid door uitmuntende ontwikkelaars.
Go is een taal die tot stand is gekomen onder leiding van Google en de legendarische ontwikkelaars Robert Griesemer, Rob Pike en Ken Thompson. Met name zij zijn de grondleggers van Unix en de C-taal, en grootmeesters op het gebied van compilers en systeemsoftware, wat op zichzelf de technische betrouwbaarheid van Go bewijst. Daarbij zijn de praktijkervaringen en operationele expertise van talloze Google-engineers met grootschalige services in Go verwerkt, waardoor Go vanaf het begin gericht is op het oplossen van realistische problemen en zich heeft ontwikkeld met een consistente filosofie en richting.
Andere talen zorgen vaak voor verwarring binnen de community en onder gebruikers door incompatibiliteit, wijzigingen in het ontwerp, instabiele licenties en niet-gestandaardiseerde ecosystemen. Zo werd het ecosysteem van Python jarenlang gesplitst door de incompatibiliteit tussen versie 2 en 3, en na de overname door Oracle nam het aantal bedrijven dat Java vermeed toe vanwege de instabiele licentiepolitiek. Bovendien biedt Node.js, met de co-existentie van CJS en ESM, nog steeds geen consistent modulesysteem.
Go daarentegen is een taal die consistentie en stabiliteit als hoogste waarden beschouwt. Het Go-team handhaaft strikt achterwaartse compatibiliteit en hanteert bij de introductie van nieuwe functies een geleidelijke integratiemethode om conflicten met bestaande code te voorkomen. De syntaxis vermijdt ook onnodige trefwoorden en beperkt overmatige abstractie, waardoor de taal zelf niet onnodig complex wordt. Bovendien zorgt de consistente officiële toolchain, zoals go fmt, go mod, go build en go test, ervoor dat alle Go-projecten dezelfde ontwikkelomgeving en -structuur hebben, en de krachtige en praktische standaardbibliotheek ondersteunt getrouw de meeste functies die nodig zijn voor praktische ontwikkeling, zoals webservers, bestandsverwerking en database-integratie, zonder de noodzaak van afzonderlijke frameworks.