Профит для компании от Go
Расскажу о том, какую пользу 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 столкнулись с несколькими критическими проблемами:
- Недостаточная загрузка железа — программы использовали только одно ядро процессора, хотя многоядерные процессоры уже стали нормой
- Сложность найма инженеров — требовались узкоспециализированные разработчики, которых было сложно найти
- Сложность эксплуатации — обновление зависимостей превращалось в кошмар, доставка приложений была сложной
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 — это не просто язык программирования. Это инструмент, который помогает компаниям экономить деньги через:
- Упрощение найма — низкий порог входа позволяет быстрее находить разработчиков
- Эффективное использование железа — встроенный планировщик позволяет загружать все ядра процессора
- Простоту эксплуатации — один бинарный файл, простая доставка и обновление
- Производительность из коробки — компилируемый язык с маленьким runtime
- Прогнозируемые расходы — понятные приложения легче мониторить и планировать
Выбор языка программирования — это бизнес-решение. И если ваша компания сталкивается с проблемами найма, эксплуатации или эффективности использования ресурсов, Go может быть хорошим решением.
Подходите к выбору с умом: понимайте, для каких задач Go подходит, а для каких — нет. Но если вы правильно используете Go и умеете писать код под задачу, он будет работать хорошо и быстро. И это касается не только Go — это касается любого языка. Проблема не в языке, а в разработчике, который сидит между стулом и клавиатурой.
Полезные материалы
- Go: официальная документация — полная документация языка, стандартной библиотеки и инструментов разработки
- Effective Go — руководство по написанию эффективного кода на Go, включая best practices
- Go: простота эксплуатации — как Go упрощает доставку и эксплуатацию приложений через один бинарный файл
- Go pprof: профилирование производительности — официальное руководство по использованию pprof для профилирования Go-приложений
- Работа с памятью в Go: GC и оптимизации — руководство по пониманию работы garbage collector и оптимизации использования памяти
- Go: тестирование из коробки — встроенная поддержка тестирования в Go и как её использовать
- Go modules: управление зависимостями — как Go решает проблемы с зависимостями через модули
- Go: планировщик и горутины — как работает планировщик Go и почему это важно для эффективного использования железа
- Zabbix Agent 2: пример перехода на Go — как переход на Go упростил разработку плагинов для Zabbix (на русском)
- Go: когда использовать, а когда нет — официальный FAQ о целях проекта Go и областях применения
Практическая заметка. Выбор языка программирования — это бизнес-решение, а не только техническое. Go экономит деньги компании через упрощение найма, эффективное использование железа и простоту эксплуатации. Но важно понимать: Go не серебряная пуля, и для некоторых задач лучше подходят другие инструменты. Источник: опыт использования Go в production на протяжении многих лет.
Сноски
О практическом опыте эксплуатации инфраструктуры на Go без Kubernetes см. «Эксплуатация без K8s» и «Как мы не выбрали K8s». ↩︎
Go компилируется в статический бинарный файл, который включает все зависимости. Это упрощает доставку и развёртывание приложений. Подробнее о сборке и дистрибуции Go-приложений см. Go: Building and Distributing. ↩︎