Защо Go език?
Въведение
Езиците за програмиране са инструменти за създаване на продукти. Уменията на разработчика не се определят просто от това какъв език използва. Въпреки това, изборът на език и начинът, по който се работи с него, могат пряко да повлияят на начина на мислене и посоката на развитие на разработчика. По-специално, сравняването на езика, който се използва в момента, с други езици е от голяма полза за разширяване на техническия хоризонт и развиване на усещане за същността. В този текст ще обсъдим защо избрах Go и как той подпомага развитието на разработчика, разделяйки го на пет аспекта.
1. Go е език, който балансира производителността и продуктивността.
Съществуват множество езици за програмиране, като всеки от тях притежава своите предимства и недостатъци в зависимост от характеристиките си.
- C предлага отлична производителност и контрол на ниско ниво, но изисква ръчно управление на паметта от разработчика и му липсват функции на високо ниво, което води до ниска продуктивност и трудна поддръжка.
- C++ и Rust поддържат различни напреднали функции като обектно-ориентирано програмиране, шаблони и метапрограмиране, но синтаксисът им е сложен, кривата на обучение е стръмна, а бавната скорост на компилиране ги прави неподходящи за повтарящи се разгръщания.
- Java и C# осигуряват независимост от платформата и стабилност, поради което са широко използвани за мащабни услуги, но се изпълняват на тежка виртуална машина, което прави разгръщането и средата за изпълнение сложни, а изискванията за ресурси са високи.
- Python и Javascript са подходящи за бързо разработване благодарение на ясния синтаксис и богатата екосистема, но производителността на изпълнение е ниска, а надеждността на екосистемата е ниска, което разкрива структурни ограничения в мащабни системи.
От друга страна, Golang е език, който поддържа отличен баланс между производителност и продуктивност. Go, като компилиран език, подобно на C, гарантира висока производителност на изпълнение, като същевременно осигурява гъвкавост на разгръщане на ниво интерпретатор с бърза скорост на компилиране. С други думи, Go е балансиран език, който може да се използва стабилно в повечето среди без явни недостатъци.
2. Go предотвратява програмирането тип Cargo Cult.
По време на Втората световна война съюзниците построили военновъздушни бази на тихоокеанските острови, за да подпомогнат военните действия. Големи количества доставки и военно оборудване променили живота на войниците и местните жители. За първи път жителите видели самолети, носещи произведени дрехи, консервирани храни и други стоки. След края на войната базите били изоставени и стоки вече не пристигали. Затова жителите на острова, за да имитират войниците, се обличали като авиодиспечери, войници и моряци, построили нещо като писта и използвали пръчки, за да подават сигнали за кацане на самолети. Те продължили да извършват маршове, за да накарат самолетите да пускат стоки с парашути. Но самолетите, които чакали, не пристигнали.
Карго култовото програмиране се отнася до навика на разработка да се имитира външният вид на код или технология, без да се разбират основните принципи. При съвременните разработчици, особено в областта на уеб разработката, този навик на имитация без разбиране на значението е често срещан. Благодарение на фреймуърци като React, Next, Spring и Django, разработката стана възможна без познаване на вътрешната структура, но често не може да се реагира адекватно дори на малка грешка. С добавянето на инструменти за генериране на AI код, начинът на разработка, при който се копират и поставят резултати, вместо да се пише код директно или да се разбират принципите, става все по-разпространен.
Go фундаментално се въздържа от тези проблеми на нивото на философията на езика. Go е език, проектиран около стандартната библиотека, а не около фреймуърци. Разработчиците могат да изградят уеб сървър на ниво реална услуга само с основни библиотеки като net/http и database/sql, като по този начин естествено развиват интуиция и разбиране на нисконивови структури като мрежи, бази данни и I/O. Тази структура, която позволява да се овладеят основите без зависимост от фреймуърци, служи като основа за разработчиците да продължават да се развиват, без да губят същността на технологията.
3. Go предлага мощен модел за конкурентност.
Съвременните процесори се развиват в посока на подобряване на производителността чрез паралелно използване на множество ядра, вместо да увеличават скоростта на едно ядро. В резултат на това конкурентността, при която една програма може да обработва множество задачи едновременно, стана задължителна, а значението на езиците, които могат ефективно да проектират и имплементират това, нараства. Go е език, оптимизиран за тази среда. Goroutine е лека нишка, предоставена от Go, която може да бъде създадена само с няколко KB стек и консумира минимални системни ресурси, дори когато хиляди от тях работят едновременно. Go runtime ефективно разпределя множество goroutine към OS нишки чрез собствения си M:N планировчик, като този процес се оптимизира автоматично, без пряка намеса от страна на разработчика. Това позволява на разработчиците да проектират конкурентна логика по безопасен и последователен начин, без сложна логика за синхронизация или персонализирано планиране.
Освен това, Go активно поддържа съвременни конкурентни проекти, използващи инструменти за синхронизация като mutex, waitGroup, channel и context. Благодарение на тази структура, разработчиците могат естествено да придобият практическо усещане за конкурентност и паралелизъм, без да се обвързват със сложни теории, и да достигнат до високо ниво на абстракция и умения за проектиране, приложими от нулата.
4. Go е език, създаден от изключителни разработчици, които поддържат баланс.
Go е език, създаден под ръководството на Google и легендарни разработчици като Робърт Грийсмър, Роб Пайк и Кен Томпсън. По-специално, те са създателите на Unix и езика C, както и майстори в областта на компилаторите и системния софтуер, което само по себе си доказва техническата надеждност на Go. С интегрирането на практическия опит и ноу-хау за управление на мащабни услуги на множество инженери от Google, Go от самото начало се стреми към решаване на реални проблеми и се развива с последователна философия и посока.
Други езици често предизвикват объркване в общността и сред потребителите поради прекъсване на съвместимостта, промени в дизайна, нестабилни лицензи и нестандартизирани екосистеми. Например, Python претърпя дългогодишно разделение на екосистемата поради прекъсване на съвместимостта между версии 2 и 3, а Java, след придобиването от Oracle, стана по-малко предпочитана от компаниите поради нестабилната си лицензионна политика. Освен това, Node.js все още не предоставя последователна модулна система, тъй като CJS и ESM съществуват едновременно.
От друга страна, Go е език, който поставя последователността и стабилността като основни ценности. Екипът на Go стриктно поддържа обратна съвместимост и при въвеждането на нови функции се придържа към постепенен подход на интегриране, за да избегне конфликти със съществуващия код. Синтаксисът също така избягва ненужни ключови думи и ограничава прекомерната абстракция, предотвратявайки ненужното усложняване на самия език. Освен това, последователният официален набор от инструменти като go fmt, go mod, go build, go test насочва всички Go проекти към една и съща среда за разработка и структура, а мощната и практична стандартна библиотека поддържа повечето функции, необходими за реална разработка като уеб сървъри, обработка на файлове и свързване с бази данни, без нужда от отделни фреймуърци.