Quando ho saputo per la prima volta di Go, il linguaggio di programmazione di Google, sono rimasto incuriosito. Progettato e rilasciato nel 2007, Go, a.k.a. Golang, era tra una folla di nuovi linguaggi – Rust, D, Nim, Scala, Clojure – che generavano fermento nella prima metà degli anni 2010: A quel tempo, i programmatori sembravano desiderosi di allontanarsi dal bagaglio verboso dei vecchi linguaggi di backend (Java, C++) così come l’inefficienza computazionale e la non sicurezza dei tipi dei linguaggi dinamici usati sul web (PHP, Ruby, Python). Volevano la sicurezza dei tipi, il che significava che volevano la tipizzazione statica. E volevano velocità.
Era facile trovare storie di startup, come IronMQ, che passavano da decine di server usati per ospitare Rails a un paio che potevano essere ospitati in un linguaggio come Go. E come qualcuno che era, all’epoca, immerso in PHP5 e in tutti i suoi problemi, mi sono annoverato tra la folla degli interessati.
Quando mi sono imbattuto per la prima volta in Go, nel mio vecchio lavoro come CTO di ActiveCampaign, ho provato a scrivere del codice in esso. E non mi piaceva. Mi dava problemi ogni volta che lasciavo una variabile inutilizzata o importavo un pacchetto inutilizzato. Go era particolarmente rigido sulla tipizzazione: avevo familiarità con la coercizione dei tipi di PHP, ma ero anche abituato a C e C++, che ti permettevano di mischiare interi firmati e non firmati, così come di mischiare dimensioni di interi (16-bit, 32-bit, 64-bit).
Go non aveva generici. Infatti, uno dei principali progettisti del linguaggio (Rob Pike) era piuttosto deciso riguardo a ciò che mancava al linguaggio. Come disse Pike, questa era una buona cosa, e buona per voi. Il linguaggio è stato progettato per gli ingegneri “medi” che lavoravano a Google, se così si può dire. In un certo senso, quello che si leggeva su Go a quel tempo sembrava un’offesa. E fino ad oggi, non è difficile trovare persone che continuano a condividere quella critica.
Quindi cosa mi ha fatto cambiare idea?
Go è semplice. Si distingue dagli altri linguaggi in questo senso. La semplicità è una virtù, e ogni complessità che si introduce nel linguaggio è attentamente considerata.
Per molto tempo – troppo a lungo, se si chiede ad alcuni – a Go è mancata una vera gestione dei pacchetti. È stato solo nel 2018 – dopo diversi cicli di impegno della comunità e un gestore di pacchetti sperimentale non ufficiale chiamato “dep” – che è stato aggiunto al linguaggio un supporto ufficiale per la loro soluzione (“moduli”).
Ma in questa semplicità si trova molto valore. Si possono facilmente scrivere alcuni one-liner in Ruby che fanno cose interessanti, ma nascosti in questi one-liner c’è molta magia: è difficile per lo sviluppatore senza pretese afferrare sempre il processo che avviene dietro le scene. Forse ci vogliono cinque righe di codice per scrivere la stessa cosa in Go, ma tu sai cosa stanno facendo quelle cinque righe.
Go toglie anche uno dei concetti classici dell’OOP: l’ereditarietà. Non puoi scrivere una classe base in Go e far ereditare un’altra classe da essa. In effetti, non si hanno affatto “classi”.
All’inizio, sembra una costrizione tremenda avere uno degli strumenti di base del riutilizzo del codice e dell’incapsulamento che ti viene tolto. Ed è naturale che la vostra prima inclinazione sia un sentimento di risentimento.
Ma, in questi giorni, spesso non usate l’ereditarietà, anche se potreste. Si usano interfacce, ci si concentra sul comportamento e sulle astrazioni, e questo si può fare facilmente in Go. In effetti, è tutto ciò che si può fare in Go. Dopo un po’, la mancanza di ereditarietà si sente bene perché si evita un livello di debito tecnico non dovendo rivisitare il pericoloso nido di relazioni che si era costruito usando l’ereditarietà. Forse Pike aveva scoperto qualcosa dopo tutto.
Oggi, Go si è ritagliato uno spazio definito nell’ecosfera del linguaggio. Non sta cercando di sostituire il C++, come si pensava (e si suggeriva) una volta. Mentre 10 anni fa avreste potuto pensare di aver bisogno di Java per un certo progetto, al giorno d’oggi, potreste fare meglio a scegliere Go.
Lingue da imparareI leader dell’ingegneria discutono Ruby on Rails, C#, Python e JavaScript