GoSuda

Пет проектни характеристики на езика Go от гледна точка на системното и бекенд инженерство

By Rabbit Princess views ...

Въведение

Програмните езици са инструменти за създаване на продукти. Самото използване на определен език не определя нивото на разработчика. Въпреки това изборът на език и начинът, по който той се използва, могат пряко да повлияят на мисленето и посоката на развитие на разработчика. По-специално, сравняването на езика, който използвате в момента, с други езици е от голяма полза за разширяване на техническия кругозор и за развиване на усещане за същността на нещата. В тази статия ще разгледам защо избрах Go и в какво отношение той подпомага растежа на разработчика, като разделя темата на пет аспекта.

1. Go е език, който постига баланс между производителност и продуктивност.

Съществуват множество програмни езици и всеки от тях има предимства и недостатъци в зависимост от своите характеристики.

  • C предлага изключителна производителност и възможност за контрол на ниско ниво, но разработчикът трябва сам да управлява паметта, а липсата на високо ниво на абстракция води до ниска продуктивност и затруднена поддръжка.
  • C++ и Rust поддържат разнообразни усъвършенствани функции, като обектно-ориентирано програмиране, шаблони и метапрограмиране, но синтаксисът им е сложен, кривата на обучение е стръмна, а бавното компилиране ги прави неподходящи за често внедряване.
  • Java и C# осигуряват независимост от платформата и стабилност, поради което се използват широко в мащабни услуги, но работят въвftyжка виртуална машина, което усложнява внедряването и изпълнителната среда и повишава изискванията към ресурсите.
  • Python и JavaScript се отличават с кратък синтаксис и богата екосистема, което ги прави подходящи за бърза разработка, но производителността им при изпълнение е по-ниска, а доверието в екосистемата е ограничено, поради което в мащабни системи се появяват структурни ограничения.

За разлика от тях Golang е език, който постига отлична балансираност между производителност и продуктивност. Go е компилиран език като C, което гарантира висока производителност при изпълнение, а бързото компилиране осигурява гъвкавост при внедряване, сравнима с тази на интерпретираните езици. С други думи, Go е балансиран език, който може стабилно да се използва в повечето среди без очевидни недостатъци.

2. Go предотвратява карго културното програмиране.

По време на Втората световна война съюзниците изградиха военновъздушна база на тихоокеански остров, за да подпомогнат военните действия. Големите количества доставки и военно оборудване драстично промениха живота на военнослужещите и местното население. Жителите за първи път видяха как самолетите носят дрехи, консерви и други стоки. След края на войната базата беше изоставена и товарите вече не пристигаха. Затова островитяните се опитаха да подражават на военните: облякоха се като авиодиспечери, военнослужещи и моряци, направиха нещо, наподобяващо писта, и с пръчки подаваха сигнали за кацане на самолетите. Продължиха да маршируват, за да могат товарите да пристигнат с парашути. Но самолетите, които чакаха, не дойдоха.

Карго културното програмиране е навик при разработката, при който се имитира външният вид на кода или технологиите, без да се разбира техният принцип. В съвременната разработка, особено в уеб разработката, този навик често се проявява като следване на примери без осмисляне на тяхното значение. Фреймуърци като React, Next, Spring и Django позволиха разработката да се извършва без познаване на вътрешната им структура, но много често разработчиците не успяват да се справят дори с незначителна грешка. Към това се добавят и инструментите за генериране на код с изкуствен интелект, които още повече засилват практиката да се копират и поставят резултати, вместо да се пишe код самостоятелно или да се разбира неговият принцип.

Go принципно избягва този проблем на ниво езикова философия. Go е проектиран около стандартната библиотека, а не около фреймуърк. Разработчикът може да изгради уеб сървър на ниво реална услуга единствено с основни библиотеки като net/http и database/sql, и по този начин естествено развива интуиция и разбиране за ниско ниво структури като мрежата, базите данни и входно-изходните операции. Такава структура, в която можете да овладеете основите, без да разчитате на фреймуърци, е основа, върху която разработчикът може да расте устойчиво, без да губи същността на технологиите.

3. Go предоставя мощен модел за конкурентност.

Съвременните процесори развиват производителността си не толкова чрез увеличаване на скоростта на едно ядро, колкото чрез паралелно използване на множество ядра. Във връзка с това способността една програма да обработва едновременно няколко задачи, т.е. конкурентността, стана задължителна, а значението на езика, който позволява тя да бъде ефективно проектирана и реализирана, нараства. Go е оптимизиран за тази среда. Горутината (goroutine) е лек thread, предоставен от Go, който може да се създава със стек от няколко KB и който, дори при изпълнение на хиляди едновременно, почти не изразходва системни ресурси. Runtime средата на Go използва собствен M:N планировчик, който ефективно разпределя многобройни горутини върху OS threads, като този процес се оптимизира автоматично, без разработчикът да се намесва директно. Благодарение на това разработчикът може да проектира конкурентна логика по сигурен и последователен начин, без сложна синхронизация или персонализирано планиране.

Освен това Go активно поддържа съвременно проектиране на конкурентността чрез инструменти за синхронизация като mutex и waitGroup, както и чрез channel и context. Благодарение на тази структура разработчикът може да придобие практическо усещане за конкурентност и паралелизъм, без да се ограничава от сложна теория, и да достигне високо ниво на абстракция и умения за проектиране, които могат да се прилагат на практика.

4. Go е език, създаден от отлични разработчици, които държат на баланса.

Go е създаден от Google и легендарни разработчици като Robert Griesemer, Rob Pike и Ken Thompson. По-специално, те са създатели на Unix и C и майстори в областта на компилаторите и системния софтуер, което само по себе си доказва техническата надеждност на Go. Към това се добавят практическият опит и know-how за експлоатация на мащабни услуги на множество инженери от Google, поради което Go от самото начало е насочен към решаване на реални проблеми и се развива със стабилна философия и ясна посока.

Други езици често създават объркване у общността и потребителите чрез прекъсване на съвместимостта, промени в дизайна, нестабилни лицензи и нестандартизирана екосистема. Например Python разделя екосистемата си в продължение на години заради прекъсването на съвместимостта между версии 2 и 3, а Java, след придобиването от Oracle, стана нестабилна по отношение на лицензионната политика, което доведе до увеличаване на случаите, в които компаниите се въздържат от внедряването ѝ. Освен това Node.js все още съчетава CJS и ESM, без да предлага последователна модулна система.

За разлика от тях Go поставя съгласуваността и стабилността като най-висша ценност. Екипът на Go поддържа стриктно обратната съвместимост и при въвеждането на нови функции следва постепенен подход на интеграция, за да не влизат те в конфликт със съществуващия код. Синтаксисът също избягва ненужните ключови думи и ограничава прекомерната абстракция, като по този начин предотвратява излишното усложняване на самия език. Освен това последователните официални инструменти, като go fmt, go mod, go build и go test, насърчават всички Go проекти да имат еднаква среда за разработка и структура, а мощната и практична стандартна библиотека подпомага без отделни фреймуърци повечето от функциите, необходими за реална разработка, като уеб сървъри, обработка на файлове и работа с бази данни.

5. Gopher е сладък.

Gopher1

Gopher2

Gopher3