GoSuda

5 проектных особенностей языка Go с точки зрения системного и backend-инжиниринга

By Rabbit Princess views ...

Введение

Язык программирования является инструментом для создания продуктов. Одно только использование определённого языка не определяет уровень мастерства разработчика. Однако выбор языка и способ работы с ним могут напрямую влиять на образ мышления разработчика и направление его профессионального роста. В частности, сопоставление языка, который вы используете сейчас, с другими языками существенно расширяет технический кругозор и помогает развить понимание сути вещей. В этой статье я попытаюсь рассказать, почему я выбрал Go и в каких аспектах он способствует профессиональному росту разработчика, разделив рассмотрение на пять направлений.

1. Go является языком, сбалансировавшим производительность и продуктивность.

Существует множество языков программирования, и каждый из них обладает своими достоинствами и недостатками в зависимости от своих характеристик.

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

В отличие от них, Golang обладает превосходным балансом между производительностью и продуктивностью. Go, как и C, является компилируемым языком, поэтому гарантирует высокую скорость выполнения, а благодаря быстрой компиляции обеспечивает гибкость развёртывания, сравнимую с интерпретируемыми языками. Иными словами, Go является сбалансированным языком, который без явных недостатков может стабильно использоваться в большинстве сред.

2. Go препятствует карго-культ программированию.

Во время Второй мировой войны союзники построили авиабазу на тихоокеанском острове, чтобы поддержать военные действия. Большие объёмы снабжения и военной техники сильно изменили жизнь военнослужащих и местных жителей. Жители впервые увидели, как самолёты привозят одежду, консервы и другие товары. Когда война закончилась, база была заброшена, и грузы перестали поступать. Тогда островитяне, подражая военным, наряжались в авиадиспетчеров, солдат и моряков, создавали нечто похожее на взлётно-посадочную полосу и с помощью палок подавали сигналы посадки самолётам. Они продолжали устраивать марши, чтобы грузы с самолётов падали на парашютах. Однако ожидаемые самолёты так и не прилетели.

Карго-культ программирования означает привычку разработчиков копировать внешние формы кода или технологий без понимания их принципов. В современной разработке, особенно в веб-разработке, нередко встречается подобная привычка слепо следовать образцам без понимания их смысла. Такие фреймворки, как React, Next, Spring и Django, позволили вести разработку, не зная их внутреннего устройства, однако многие разработчики не способны адекватно реагировать даже на небольшую ошибку. К этому добавились современные инструменты генерации кода на основе ИИ, и подход, при котором результат просто копируется и вставляется без написания кода или понимания принципов работы, становится всё более распространённым.

Go принципиально противостоит этой проблеме на уровне философии языка. Go является языком, ориентированным не на фреймворки, а на стандартную библиотеку. Разработчик может создать веб-сервер производственного уровня, используя лишь базовые библиотеки, такие как net/http и database/sql, и благодаря этому естественным образом формирует интуицию и понимание низкоуровневых структур, таких как сеть, база данных и I/O. Именно структура, позволяющая освоить основы без зависимости от фреймворков, становится фундаментом, благодаря которому разработчик может непрерывно расти, не упуская суть технологий.

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

Современные процессоры развиваются не столько за счёт повышения скорости одного ядра, сколько за счёт параллельного использования нескольких ядер для повышения производительности. В связи с этим способность программы одновременно обрабатывать несколько задач, то есть конкурентность, стала обязательной, и значение языков, позволяющих эффективно проектировать и реализовывать её, неуклонно возрастает. Go является языком, оптимизированным для такой среды. Goroutine представляет собой легковесный поток, создаваемый Go, требующий стека размером всего в несколько килобайт, и даже при одновременном запуске тысяч goroutine практически не расходует системные ресурсы. Среда выполнения Go распределяет множество goroutine по потокам ОС эффективно, используя собственный планировщик 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 имеют одинаковую среду разработки и структуру, а мощная и практичная стандартная библиотека полноценно поддерживает большинство функций, необходимых для реальной разработки, таких как веб-серверы, обработка файлов и работа с базами данных, без необходимости в отдельных фреймворках.

5. Gopher очарователен.

Gopher1

Gopher2

Gopher3