Почему язык Go?
Введение
Языки программирования являются инструментами для создания продуктов. Простая приверженность определённому языку не определяет квалификацию разработчика. Однако выбор языка и способ его использования могут непосредственно влиять на мышление разработчика и направление его развития. В частности, сравнение используемого языка с другими языками существенно расширяет технический кругозор и способствует развитию интуитивного понимания сути вещей. В данной статье я намерен рассмотреть пять аспектов, объясняющих мой выбор 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 предоставляет мощную модель параллелизма.
Современные CPU развиваются в направлении увеличения производительности за счёт параллельного использования нескольких ядер, а не за счёт увеличения скорости одного ядра. В связи с этим параллелизм, позволяющий одной программе обрабатывать несколько задач одновременно, стал обязательным, и важность языков, способных эффективно проектировать и реализовывать его, постоянно растёт. 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 экосистема была разделена на несколько лет, а после приобретения Oracle лицензионная политика Java стала нестабильной, что привело к увеличению числа случаев, когда компании не желают внедрять её. Кроме того, Node.js до сих пор не может обеспечить согласованную модульную систему, поскольку CJS и ESM сосуществуют.
В отличие от них, Go — это язык, который ставит согласованность и стабильность во главу угла. Команда Go тщательно поддерживает обратную совместимость и при внедрении новых функций придерживается метода постепенной интеграции, чтобы избежать конфликтов с существующим кодом. Синтаксис также избегает ненужных ключевых слов и ограничивает чрезмерную абстракцию, предотвращая ненужное усложнение самого языка. Кроме того, согласованный официальный набор инструментов, такой как go fmt, go mod, go build, go test, побуждает все Go-проекты иметь одинаковую среду разработки и структуру, а мощная и практичная стандартная библиотека надёжно поддерживает большинство функций, необходимых для реальной разработки, таких как веб-серверы, обработка файлов, взаимодействие с базами данных, без необходимости в отдельных фреймворках.