Хочу сразу пояснить, что я лично пишу на Go уже около 10 лет и уходить от него не планирую (и я не пиарю Rust). Но тем не менее мне интересно мнение других разработчиков, которые работают или работали с Go на больших проектах. Во многом я согласен с недостатками Go, описанными ниже, так как сам сталкиваюсь с этими проблемами и на не самых больших проектах. Вот мой перевод статьи.
1. Простота Go не справляется со сложностью
Главное достоинство Go — его простота. Отсутствие сложных функций, сюрпризов и магии. Для небольших сервисов или инструментов это идеально.
Однако крупные компании не создают только маленькие сервисы. Они разрабатывают масштабные, многоуровневые, распределенные архитектуры. И в таких случаях простота Go становится ограничением.
Без таких возможностей, как:
Мощные дженерики (добавленные только в 2022 году и всё ещё несовершенные)
Продвинутые конструкции функционального программирования
Безопасность типов и сопоставление с образцом
… Go начинает отставать. Такие языки, как Rust и Kotlin, предлагают более богатые абстракции, которые помогают управлять сложностью без ущерба для производительности или надежности.
2. Обработка ошибок на большом масштабе — кошмар
Обработка ошибок в Go — явная и многословная — отлично подходит для новичков. Но на большом масштабе? Она становится невыносимой.
Представьте себе обработку тысяч ошибок вручную через сотни микросервисов. Это превращает код в шумное пространство повторяющихся блоков if err != nil
. Инженеры в крупных компаниях хотят структурированной, композируемой и централизованной обработки ошибок.
Система Result
в Rust с оператором ?
, или иерархии исключений в Java/Kotlin, предлагают более масштабируемое и поддерживаемое решение. Крупные компании переходят на языки, которые уважают время разработчика и уменьшают шаблонный код.
3. Конкурентность хороша — пока это не становится опасным
Горутины и каналы стали революционными. Но ими слишком легко злоупотребить.
На малом масштабе модель конкурентности Go кажется изящной. Но когда крупные компании запускают тысячи конкурентных сервисов по всей глобальной инфраструктуре, недостаток перил безопасности становится проблемой. Утечки памяти, дэдлок каналов, взрывы горутин — это происходит чаще, чем можно представить.
Rust, напротив, обеспечивает гарантии на уровне компиляции против гонок данных. Даже Java со своей моделью потоков и структурированной конкурентностью в новых версиях предлагает более безопасные шаблоны.
Крупным компаниям нужна предсказуемая конкурентность, а не просто "лёгкая" конкурентность.
4. Узкие места в производительности в критических системах
Go быстр. Но он не детерминированно быстр.
Его сборщик мусора (GC) хоть и оптимизирован, всё равно вносит непредсказуемые задержки. В областях, критически важных для производительности, таких как:
Высокочастотный трейдинг
Игровые движки
Аналитика в реальном времени
Встраиваемые системы
... паузы GC неприемлемы. Именно поэтому крупные компании всё чаще выбирают Rust (или даже C++) в этих средах. Модель нулевой стоимости абстракций и отсутствие GC в Rust означают лучший контроль над памятью и производительностью.
5. Эргономика разработки имеет значение на масштабе
Go был задуман как скучный язык — и для некоторых команд это отлично. Но для команд высшего уровня инженерии, особенно в R&D или инфраструктуре, производительность и удовольствие разработчика являются приоритетом.
Go недостаёт:
Мощной поддержки IDE (особенно по сравнению с Rust, Kotlin или даже TypeScript)
Богатых возможностей языка, которые помогают сократить шаблонный код
Продвинутых фреймворков для тестирования и моделирования
Инструменты Rust (cargo
, clippy
, rust-analyzer
) считаются лучшими в отрасли. Экосистема TypeScript обширна и интуитивно понятна. Kotlin — это мечта в плане эргономики.
Крупные компании хотят довольных, быстро работающих инженеров. Go просто не справляется.
6. Рост Rust, TypeScript и WASM
Go когда-то доминировал в инструментах для серверной части, CLI и DevOps. Но Rust завоёвывает это пространство — особенно для инструментов, требующих производительности, безопасности и надёжности.
Тем временем, TypeScript доминирует в современных интерфейсах и полнофункциональных приложениях, благодаря глубокой интеграции с вебом и Node.js. Даже в таких крупных компаниях, как AWS и Cloudflare, TypeScript проникает в инфраструктурные инструменты и приложения на основе WASM.
С распространением WASM (WebAssembly) Rust и TypeScript занимают идеальные позиции. А Go? Всё ещё пытается доказать свою полезность в этом пространстве.
Ключевые слова: Rust заменяет Go, TypeScript против Go в серверной части, язык Go и WebAssembly
7. Внутренние миграции говорят громче слов
Посмотрите за кулисами:
Cloudflare заменил ключевые системы, требующие высокой производительности, на Rust.
Dropbox перешёл с Python и Go на Rust для повышения производительности.
Amazon разрабатывает всё больше инструментов на Rust.
Meta и Google инвестируют в Rust внутренне — ради безопасности, производительности и управления конкурентностью.
Это не публичные отказы от Go. Но смена тихая, постоянная и красноречивая.
Заключительные мысли: Go не умер — но его время на вершине может закончиться
Давайте проясним: Go никуда не исчезает. Это по-прежнему один из лучших инструментов для:
Написания простых серверных сервисов
Быстрого запуска микросервисов
Автоматизации DevOps и облачной инфраструктуры
Но эпоха, когда Go был будущим программирования? Она угасает.
А что вы думаете по этому поводу? Какой ваш личный опыт?