Go è un linguaggio open source creato da Google nel 2007 e fortemente tipizzato. Di recente è stato inserito dall’IEEE nella sua top 10 del 2022 e viene impiegato in Docker e Kubernetes, oltre che in strumenti DevOps ampiamente utilizzati come Terraform e Red Hat OpenShift. È quindi fondamentale apprenderlo per poter scrivere implementazioni e plugin personalizzati, contribuendo allo stesso tempo al progetto open source che rappresenta.
“Go sta diventando sempre di più il linguaggio del web e del cloud. La maggior parte dei sistemi che si trovano in questi ambienti sono costruiti proprio attraverso il suo utilizzo” spiega Teiva Harsanyi, software engineer senior di Docker e autore del libro “100 Go Mistakes and How to Avoid them”.
Harsanyi ha iniziato a lavorare con Go sei anni fa, quando con il suo team si è trovato a dover compiere la migrazione di una grande applicazione monolitica scritta in C++. Una sfida non banale ma inevitabile, a fronte della scelta della sua azienda di modernizzare un progetto, rendendolo più granulare e affidabile. Nel suo libro, affronta i principali errori che vede compiere agli sviluppatori di Go e condivide consigli per ottenere il massimo da questo linguaggio. Sfogliando tutti e 12 i capitoli, il lettore vi trova gli sbagli più comuni, suddivisi per categorie (tipi di dati, stringhe e ottimizzazione) e accompagnati da esempi di codice che illustrano problemi e soluzioni.
Linguaggio “stabile” e semplice anche per le new entry
Nonostante nel suo libro abbia dedicato ampio spazio ai 100 modi in cui gli sviluppatori di Go possono sbagliare, Harsanyi si dice un sostenitore di questo linguaggio. Rispetto a Python e Java è molto meno popolare ma presenta indubbi vantaggi quali la stabilità, la semplicità e la velocità.
Negli ultimi anni il panorama di Go non è cambiato, l’introduzione dei generici di marzo 2022 può essere considerata il primo vero cambiamento attuato da quando Harsanyi ha iniziato a lavorarci. Questa bassa frequenza di aggiornamenti, insieme alla sua natura espressiva, rendono Go stabile e leggibile. Chi si affaccia per la prima volta ai progetti di sviluppo software più moderni, spesso viene accolto da centinaia o migliaia di righe di codice. In queste situazioni, Go rende tutto più facile: la sua curva di apprendimento ridotta è un vantaggio negli ambienti DevOps che richiedono codebase concisi e manutenibili.
La leggibilità di Go deriva in gran parte dalla sua sintassi semplice e dal suo design standardizzato. Linguaggi come Python e Java offrono invece più modi per svolgere lo stesso compito: ciascun programmatore può usare un metodo diverso per raggiungere lo stesso obiettivo. Questa ampia gamma di alternative a disposizione, per certi versi, può risultare interessante ma rischia di diventare un incubo, soprattutto quando l’adozione di massa di librerie e framework esterni rende i progetti molto più complessi e con troppe dipendenze da gestire.
Go si basa principalmente su librerie standard integrate. Nell’implementazione di un nuovo servizio HTTP, per esempio, gli sviluppatori Python possono scegliere tra decine di librerie e framework, mentre Go ha una libreria di servizi HTTP standard come parte del linguaggio principale. Ciò significa che, con Go, diventa molto meno probabile che ai nuovi programmatori sia richiesto di imparare un approccio diverso. Essendo tipizzato staticamente e compilabile direttamente in codice macchina, Go presenta inoltre programmi veloci e leggeri, adatti alla rapidità di distribuzione e alle elevate prestazioni richieste dai flussi di lavoro DevOps.
Dopo aver lavorato con vari linguaggi, tra cui Java, Scala, Rust e Python, Harsanyi ritiene che Go sia il più efficiente per le applicazioni back-end. “Quando ho dovuto di recente tornare a Java, ho avuto la conferma che si tratta di un ecosistema molto più complesso da capire: ci sono librerie ovunque. Trovo quindi naturale che sempre più sviluppatori back-end scelgano Go” racconta.
Alert per gli sviluppatori che utilizzano Go
Una delle complessità più significative che gli sviluppatori Go devono affrontare riguarda la scrittura di programmi paralleli, secondo Harsanyi. Nella programmazione si mira a migliorare le prestazioni eseguendo più operazioni contemporaneamente, spesso gli ingegneri DevOps sono anche chiamati a eseguire processi e funzioni indipendenti contemporaneamente.
Mentre alcuni linguaggi, come Rust, richiedono librerie esterne per scrivere programmi paralleli, Go come parte di linguaggio include “librerie primitive di concorrenza” (goroutine), e canali ad hoc. Tuttavia, la loro corretta implementazione resta complessa per chi sceglie Go. Secondo uno studio condotto dalla Pennsylvania State University e dalla Purdue University, più della metà dei bug legati a processi paralleli riscontrati in repository popolari come Docker e Kubernetes derivano da problemi specifici di Go.
Secondo Harsanyi, la semplicità di Go non elimina la necessità di costruire una comprensione profonda del funzionamento del linguaggio. “Semplice non significa necessariamente facile. Si può avere qualcosa di semplice da scrivere come linguaggio, ma non è detto che sarà facile da implementare. Invece di guardare ai diversi linguaggi come concorrenti, gli sviluppatori dovrebbero iniziare a comprendere come farli lavorare assieme” ha precisato Harsanyi. Come esempio riporta Go e Rust, utilizzabili nel DevOps in modo complementare: Go per l’implementazione di applicazioni cloud veloci, efficienti e affidabili, e Rust per sistemi a bassa latenza in cui le prestazioni sono fondamentali. “Come ingegnere back-end, vedo questi due linguaggi come il futuro. Mi piace molto il fatto che non sembrino in conflitto tra loro”.