Расскажу о том, какую пользу Go приносит бизнесу: упрощение эксплуатации, ускорение разработки и найма, а также хорошая производительность «из коробки».

TL;DR

Go — это не просто язык программирования, а бизнес-решение, которое помогает экономить деньги компании. Основные преимущества:

  • Низкий порог входа — разработчики могут начать продуктивно работать уже через две недели
  • Простота эксплуатации — один бинарный файл без зависимостей, простая доставка и обновление
  • Эффективное использование железа — встроенный планировщик задач позволяет загружать все ядра процессора
  • Производительность из коробки — компилируемый язык с маленьким runtime, хорошая производительность без сложных оптимизаций
  • Простота найма — не нужно искать узкоспециализированных разработчиков, подходят обычные инженеры

Вступление

Когда мы говорим о Go, обычно обсуждаем технические аспекты: синтаксис, производительность, экосистему. Но за выбором языка программирования стоит бизнес-решение, и важно понимать, какую реальную пользу он приносит компании.

Расскажу о практических преимуществах Go с точки зрения экономики разработки, основываясь на опыте работы в Integros, где мы делаем видео-платформу и используем Go для различных сервисов.

История создания Go: не для маленьких сервисов

Go был создан в Google в 2009 году командой выдающихся инженеров: Робертом Грисмером (Robert Griesemer), Робом Пайком (Rob Pike) и Кеном Томпсоном (Ken Thompson). Последний стоял у истоков Unix и языка C — это люди с огромным опытом в дизайне языков и систем.

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

Проблемы, которые решал Go

В начале 2000-х годов в Google столкнулись с несколькими критическими проблемами:

  1. Недостаточная загрузка железа — программы использовали только одно ядро процессора, хотя многоядерные процессоры уже стали нормой
  2. Сложность найма инженеров — требовались узкоспециализированные разработчики, которых было сложно найти
  3. Сложность эксплуатации — обновление зависимостей превращалось в кошмар, доставка приложений была сложной

Go был спроектирован как язык общего назначения, который решает эти проблемы на уровне дизайна языка и runtime.

Низкий порог входа: экономия на найме

Одно из главных преимуществ Go — низкий порог входа для разработчиков. Существует мнение, что через две недели на Go может нормально писать даже начинающий разработчик. Это, конечно, преувеличение, но в основе лежит правда: Go действительно прост в изучении.

Почему Go прост

Go был спроектирован с искусственными ограничениями, которые упрощают работу:

  • Единый стиль кода — форматирование кода стандартизировано инструментом gofmt
  • Множество проверок при сборке — компилятор ловит многие ошибки на этапе компиляции
  • Хорошая документация из коробки — встроенная система документации godoc
  • Тестирование из коробки — встроенная поддержка тестов
  • Богатая стандартная библиотека — для большинства задач хватает стандартной библиотеки

Экономика найма

Когда вы используете Go, вам не нужно искать узкоспециализированных разработчиков. Вы ищете не “гофера” (gopher), а обычного инженера, который умеет программировать. Таких людей гораздо больше на рынке.

Для сравнения: если вы возьмёте разработчика на C++ и попросите его писать на PHP, ему потребуется время на адаптацию. С Go всё проще — многие разработчики сами переходят на Go, потому что язык проще в поддержке и даёт хорошую производительность.

Компании вроде Autodesk переписывают части своих систем с C++ на Go именно из-за простоты поддержки. Это не значит, что C++ плохой язык — просто Go проще поддерживать, и для многих задач его производительности достаточно.

Спецификация Go занимает всего около 84 страниц. Это не шутка — язык действительно простой, и его можно изучить за разумное время. Для сравнения, спецификация C++ или Java занимает сотни страниц.

Эффективное использование железа

Одна из ключевых проблем, которую решал Go, — недостаточная загрузка многоядерных процессоров. В начале 2000-х программы часто использовали только одно ядро, хотя процессоры уже имели несколько ядер.

Встроенный планировщик задач

Go решает эту проблему на уровне runtime. В языке есть встроенный планировщик (scheduler), который распределяет горутины (goroutines) по доступным ядрам процессора. Вам не нужно вручную управлять потоками или процессами — всё работает из коробки.

Это позволяет эффективно использовать все ядра процессора и загружать железо на 80% и выше, что критично для экономики инфраструктуры.

Простота эксплуатации

Эксплуатация — это не только про мониторинг и алерты. Это про то, как легко обновлять приложения, доставлять их в продакшн и поддерживать в рабочем состоянии1.

Один бинарный файл

Go компилируется в один бинарный файл без зависимостей от платформы2. Это означает:

  • Простая доставка — один файл можно скопировать на сервер и запустить
  • Кроссплатформенность — можно собрать один и тот же код для Linux, macOS и Windows
  • Нет проблем с зависимостями — не нужно устанавливать интерпретаторы, библиотеки или виртуальные окружения

В мире, где все говорят про Docker, важно понимать: не все используют Docker. Дистрибуция — это очень важно, и Go решает эту проблему элегантно.

Практическое применение: подход «один бинарник — один сервис» позволяет строить простую и надёжную инфраструктуру на базе стандартных инструментов Linux (systemd, пакетные менеджеры) без необходимости в оркестраторах типа Kubernetes. Подробнее о том, как мы эксплуатируем production-инфраструктуру без Kubernetes, см. в статьях «Эксплуатация без K8s» и «Как мы не выбрали K8s».

Обновление зависимостей

В других языках обновление зависимостей может превратиться в кошмар. Представьте ситуацию: вы хотите обновить какую-то библиотеку, но она тянет за собой другие зависимости, которые конфликтуют с чем-то ещё, и начинается долгий процесс решения конфликтов.

В Go это решается одной командой go get или go mod. Обычно вопросы заканчиваются сразу — компилятор сам разберётся с зависимостями, и если что-то не так, вы узнаете об этом на этапе сборки, а не в runtime.

Мониторинг и отладка из коробки

Go runtime позволяет экспортировать метрики о работе приложения:

  • Работа garbage collector
  • Использование памяти
  • Количество запущенных горутин
  • Различные runtime-метрики

Вы можете подключить простой клиент Prometheus и получать множество метрик из коробки. Это очень упрощает мониторинг и диагностику проблем.

Профилирование

Go также позволяет делать профилирование (profiling) прямо в runtime. Если у вас есть проблемы с памятью или производительностью, вы можете посмотреть, что происходит внутри приложения. Это доступно из коробки, хотя и требует некоторой настройки.

Если приложение упало, а вы не собирали метрики заранее, вы ничего не узнаете. Поэтому нужно периодически собирать эти метрики и хранить их где-то, например, публиковать в систему мониторинга.

Пример: Zabbix

Хороший пример того, как Go упрощает эксплуатацию — это Zabbix. До недавнего времени Zabbix агент был написан на C, и добавление новых плагинов было очень сложным и долгим процессом. Команда Zabbix переписала агент на Go (Zabbix Agent 2), который был анонсирован в Zabbix 4.4 (2019 год) как экспериментальная фича, а с выходом Zabbix 5.0 получил статус production-ready.

Теперь написание плагина для агента занимает около 15 минут — у них есть простой интерфейс, и всё работает хорошо. Это показывает, как Go может упростить не только разработку, но и расширяемость систем.

Источник: Разработка плагинов для Zabbix Agent 2

Экономика: как Go экономит деньги

Всё вышеперечисленное в конечном счёте приводит к экономии денег компании.

Прогнозируемые расходы

Приложения на Go достаточно понятны и предсказуемы. Если вы умеете мониторить их работу, вы можете легко прогнозировать свои расходы:

  • Сколько денег нужно тратить на закупку железа
  • Сколько ресурсов потребуется для масштабирования
  • Как изменятся расходы при росте нагрузки

Это особенно важно, если вы используете облачные сервисы и умеете масштабироваться по требованию — тогда экономия становится ещё более заметной.

Эффективное использование ресурсов

Go позволяет эффективно утилизировать железо. Вместо того чтобы иметь простой на 80%, вы можете загружать процессор на 80% и выше. Это означает, что вам нужно меньше серверов для той же нагрузки.

Когда Go подходит, а когда нет

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

Go подходит для:

  • Бэкенд-сервисы и API
  • Микросервисы и распределённые системы
  • Инструменты командной строки
  • Системное программирование
  • Высоконагруженные приложения

Go может быть не лучшим выбором для:

  • Фронтенд-разработки (хотя есть попытки, например, GopherJS)
  • Задач, требующих сложных абстракций и метапрограммирования
  • Проектов, где критична экосистема других языков (например, Java в банковской сфере)

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

Вопросы и ответы

Про дженерики

Дженерики (generics) долгое время отсутствовали в Go, и это было осознанное решение. Сложность в том, что дженерики могут привести к очень сложному коду, если их реализовать неправильно. Go был спроектирован так, чтобы можно было не накосячить, а не чтобы было максимально удобно.

Например, система импортов в Go проверяет неиспользуемые импорты и переменные на этапе компиляции — это помогает избежать ошибок. С дженериками та же история: их можно было сделать, но это могло привести к очень сильному усложнению языка.

В Go 1.18 дженерики были добавлены, но с осторожностью — они не должны ломать простоту языка. Это показывает философию Go: лучше не добавлять фичу, чем добавить её неправильно.

Про большие проекты

Миф о том, что Go подходит только для микросервисов, не соответствует действительности. Go используется в больших проектах: Kubernetes, Docker, Prometheus — все эти проекты написаны на Go и успешно работают в продакшене.

Более того, на Go можно писать полноценные веб-приложения. Например, есть шаблонизаторы вроде quicktemplate, которые работают очень быстро.

Если вам нужно что-то написать, вы берёте Go и пишете. У вас есть всё необходимое: тестирование, сборка, бинарник, который можно положить куда угодно. Если вам нужно большего — можно написать самим. Например, для системных юнитов можно написать обёртку в 5 строк кода и запустить на порту 5000 — проблем не вижу.

Про сравнение с другими языками

Если сравнивать Go с Java или PHP, важно понимать контекст:

  • Java имеет огромную экосистему и поддержку вендоров, что критично для enterprise-проектов
  • PHP всё ещё очень популярен, но когда компании начинают считать деньги и оптимизировать расходы, они часто переходят на более эффективные решения

Go активно растёт: если посмотреть на GitHub, количество звёзд у проектов на Go растёт быстрее, чем у многих других языков. Через 5–10 лет Go может вытеснить PHP во многих компаниях, когда они начнут считать деньги и оптимизировать расходы на инфраструктуру.

Интернет вырос за последние 10 лет — количество трафика увеличилось в разы. И если у вас есть проект на PHP, который растёт, вы топите деньги в печку, покупая всё больше железа. Когда компании начнут считать деньги и понимать, что можно оптимизировать расходы, они будут переходить на более эффективные решения.

Заключение

Go — это не просто язык программирования. Это инструмент, который помогает компаниям экономить деньги через:

  1. Упрощение найма — низкий порог входа позволяет быстрее находить разработчиков
  2. Эффективное использование железа — встроенный планировщик позволяет загружать все ядра процессора
  3. Простоту эксплуатации — один бинарный файл, простая доставка и обновление
  4. Производительность из коробки — компилируемый язык с маленьким runtime
  5. Прогнозируемые расходы — понятные приложения легче мониторить и планировать

Выбор языка программирования — это бизнес-решение. И если ваша компания сталкивается с проблемами найма, эксплуатации или эффективности использования ресурсов, Go может быть хорошим решением.

Подходите к выбору с умом: понимайте, для каких задач Go подходит, а для каких — нет. Но если вы правильно используете Go и умеете писать код под задачу, он будет работать хорошо и быстро. И это касается не только Go — это касается любого языка. Проблема не в языке, а в разработчике, который сидит между стулом и клавиатурой.

Полезные материалы

Практическая заметка. Выбор языка программирования — это бизнес-решение, а не только техническое. Go экономит деньги компании через упрощение найма, эффективное использование железа и простоту эксплуатации. Но важно понимать: Go не серебряная пуля, и для некоторых задач лучше подходят другие инструменты. Источник: опыт использования Go в production на протяжении многих лет.

Сноски


  1. О практическом опыте эксплуатации инфраструктуры на Go без Kubernetes см. «Эксплуатация без K8s» и «Как мы не выбрали K8s»↩︎

  2. Go компилируется в статический бинарный файл, который включает все зависимости. Это упрощает доставку и развёртывание приложений. Подробнее о сборке и дистрибуции Go-приложений см. Go: Building and Distributing↩︎