Cinci caracteristici de proiectare ale limbajului Go din perspectiva ingineriei sistemelor și a backend-ului

Introducere
Limbajele de programare sunt instrumente pentru crearea de produse. Simplul fapt că folosești un anumit limbaj nu determină nivelul de competență al unui dezvoltator. Totuși, alegerea unui limbaj și modul în care îl utilizezi pot influența în mod direct gândirea și direcția de dezvoltare profesională a dezvoltatorului. În special, compararea limbajului pe care îl folosești în prezent cu alte limbaje contribuie în mare măsură la extinderea perspectivei tehnice și la cultivarea unei intuiții asupra esenței lucrurilor. În acest articol, intenționez să prezint, în cinci aspecte, motivul pentru care am ales Go și modul în care acesta contribuie la dezvoltarea profesională a programatorilor.
1. Go este un limbaj care echilibrează performanța și productivitatea.
Există numeroase limbaje de programare în lume, iar fiecare dintre ele are avantaje și dezavantaje determinate de caracteristicile sale.
- C oferă performanță excelentă și control la nivel scăzut, dar dezvoltatorul trebuie să gestioneze singur memoria, iar lipsa funcționalităților de nivel înalt face productivitatea scăzută și întreținerea dificilă.
- C++ și Rust oferă o gamă largă de funcționalități avansate, precum programarea orientată pe obiecte, șabloanele și metaprogramarea, însă sintaxa este complexă, curba de învățare este abruptă, iar timpii lungi de compilare fac ca acestea să nu fie potrivite pentru implementări frecvente.
- Java și C# oferă independență față de platformă și stabilitate, fiind utilizate pe scară largă în servicii de mare amploare, dar rulează pe o mașină virtuală greoaie, ceea ce complică implementarea și mediul de execuție și crește cerințele de resurse.
- Python și JavaScript sunt potrivite pentru dezvoltare rapidă datorită sintaxei concise și ecosistemului bogat, însă performanța de execuție este redusă, iar fiabilitatea ecosistemului este scăzută, ceea ce face ca limitările structurale să apară în sisteme de mari dimensiuni.
În schimb, Golang este un limbaj care dispune de un echilibru remarcabil între performanță și productivitate. Go, fiind un limbaj compilat precum C, garantează o performanță ridicată la execuție, iar timpul rapid de compilare oferă o flexibilitate de implementare comparabilă cu cea a limbajelor interpretate. Cu alte cuvinte, Go este un limbaj echilibrat, care poate fi utilizat în mod fiabil în majoritatea mediilor, fără dezavantaje evidente.
2. Go previne programarea de tip cargo cult.
În timpul celui de-al Doilea Război Mondial, forțele aliate au construit baze aeriene pe insulele din Pacific pentru a sprijini războiul. Marea cantitate de provizii și echipamente militare a schimbat în mod considerabil viața militarilor și a localnicilor. Locuitorii au văzut pentru prima dată avioane care aduceau haine confecționate, conserve alimentare și alte bunuri. Când războiul s-a încheiat, baza a fost abandonată, iar încărcăturile nu mai ajungeau. Astfel, locuitorii insulelor, imitând militarii, s-au îmbrăcat ca controlori de trafic aerian, militari și marinari, au construit zone asemănătoare pistelor de aterizare și au trimis semnale de aterizare către aeronave folosind bețe. Au continuat să defileze, sperând ca avioanele să lase încărcăturile să coboare cu parașuta. Totuși, avionul pe care îl așteptau nu a mai sosit.
Programarea de tip cargo cult se referă la obiceiul de dezvoltare prin care cineva imită aparența codului sau a tehnologiei fără a înțelege principiile care stau la baza lor. Dezvoltatorii contemporani, în special în domeniul dezvoltării web, adoptă frecvent acest obicei fără a-i cunoaște semnificația. Framework-uri precum React, Next, Spring și Django au făcut posibilă dezvoltarea fără cunoașterea structurii interne, dar mulți dezvoltatori nu reușesc să reacționeze corespunzător nici la cele mai mici erori. Odată cu apariția recentă a instrumentelor de generare a codului bazate pe inteligență artificială, modul de dezvoltare care constă în copierea și lipirea rezultatelor, în loc de scrierea directă a codului sau înțelegerea principiilor, se răspândește tot mai mult.
Go înlătură fundamental această problemă la nivelul filozofiei limbajului. Go este un limbaj proiectat în jurul bibliotecii standard, nu al framework-urilor. Dezvoltatorii pot construi un server web de nivel real de producție folosind doar biblioteci de bază precum net/http și database/sql, iar astfel dezvoltă în mod natural intuiție și înțelegere a structurilor de nivel scăzut, precum rețelele, bazele de date și I/O. Această structură, care permite învățarea solidă a fundamentelor fără dependența de framework-uri, devine baza care le permite dezvoltatorilor să își mențină creșterea continuă, fără a pierde din vedere esența tehnologiei.
3. Go oferă un model puternic de concurență.
Procesoarele moderne se dezvoltă mai degrabă prin utilizarea paralelă a mai multor nuclee pentru a spori performanța, decât prin creșterea vitezei unui singur nucleu. Ca urmare, concurența, adică posibilitatea ca un program să proceseze mai multe sarcini simultan, a devenit indispensabilă, iar importanța limbajelor care permit proiectarea și implementarea eficientă a acesteia crește constant. Go este un limbaj optimizat pentru acest mediu. Goroutine este firul de execuție ușor oferit de Go, care poate fi creat cu o stivă de doar câțiva KB și care, chiar dacă rulează mii de goroutine simultan, consumă aproape deloc resursele sistemului. Runtime-ul Go distribuie eficient numeroase goroutine pe firele de execuție ale sistemului de operare, printr-un planificator propriu de tip M:N, iar acest proces este optimizat automat, fără intervenția directă a dezvoltatorului. Astfel, dezvoltatorul poate proiecta logica de concurență într-un mod sigur și coerent, fără logică complexă de sincronizare sau planificare personalizată.
De asemenea, Go susține activ proiectarea modernă a concurenței, bazată pe instrumente de sincronizare precum mutex și waitGroup, pe channel și pe context. Datorită acestei structuri, dezvoltatorul poate dobândi, în mod natural, o înțelegere practică a concurenței și paralelismului fără a fi constrâns de teorii complexe, iar astfel poate ajunge la un nivel ridicat de abstractizare și capacitate de proiectare, utilizabil din start.
4. Go este un limbaj creat de dezvoltatori excelenți care au menținut un echilibru.
Go a luat naștere sub conducerea unor dezvoltatori legendari, Google, Robert Griesemer, Rob Pike și Ken Thompson. În special, aceștia sunt creatorii sistemului Unix și ai limbajului C, precum și maeștri în domeniul compilatoarelor și al software-ului de sistem, iar acest fapt demonstrează, prin sine, fiabilitatea tehnică a Go. La aceasta se adaugă experiența practică a numeroși ingineri Google și know-how-ul operării serviciilor de mare amploare, ceea ce face ca Go, încă de la început, să urmărească rezolvarea unor probleme reale și să evolueze cu o filozofie și o direcție coerente.
Alte limbaje generează adesea confuzie în rândul comunității și al utilizatorilor, din cauza ruperilor de compatibilitate, a modificărilor de proiectare, a licențelor instabile și a ecosistemelor nestandardizate. De exemplu, Python a avut ecosistemul divizat timp de mai mulți ani din cauza ruperii de compatibilitate dintre versiunile 2 și 3, iar Java, după achiziția de către Oracle, a determinat un număr tot mai mare de companii să ezite în adoptarea sa, din cauza politicii de licențiere instabile. De asemenea, Node.js nu oferă încă un sistem de module consecvent, deoarece CJS și ESM coexistă.
În schimb, Go este un limbaj care consideră coerența și stabilitatea drept valori prioritare. Echipa Go menține cu strictețe compatibilitatea retroactivă și, la introducerea de noi funcționalități, aderă la o abordare de integrare treptată, pentru a evita conflictele cu codul existent. În ceea ce privește sintaxa, Go evită cuvintele cheie inutile și limitează abstractizarea excesivă, prevenind astfel complicarea inutilă a limbajului. De asemenea, un set coerent de instrumente oficiale, precum go fmt, go mod, go build și go test, încurajează toate proiectele Go să aibă același mediu de dezvoltare și aceeași structură, iar biblioteca standard puternică și practică susține fidel, fără framework-uri suplimentare, cea mai mare parte a funcționalităților necesare dezvoltării reale, precum serverele web, procesarea fișierelor și conectarea la baze de date.
5. Gopher este drăguț.


