Так вышло, что последнии 2 года я довольно плотно работаю не только с давно привычными мне C++ и Python, но и Go. Как мне кажется, 2 года довольно приличный срок для того чтобы сформировать свое мнение о каком-либо инструменте, так что, пора им поделиться. Так же, по моим ощущениям, про Go обычно пишут люди из небольших компаний и стартапов, я же буду писать с точки зрения разработчика из матерой корпорации специализирующейся на разработке ПО.
Когда Go не нужен и не полезен
Начнем с самого важного: при каких условиях этот язык скорее вреден.
- У вас есть высококлассная команда C++ разработчиков и толковый архитектор. В C++ есть всё что есть в Go и на много больше. При наличии действительно высококлассной C++ команды (я в живую за 17 лет работы с C++ такой команды не видел, отдельные разработчики – да, команда – нет) Go банально не нужен так как более дорог с точки зрения производительности разработчика.
- Необходим быстрый и отзывчивый UI и/или Electron-подобные UI-решения не устраивают. Так как язык задумывался как серверный, то никто всерьёз биндингами к существующим UI-библиотекам не занимается. В итоге, что-то есть, но рассматривать не Web-UI для Go приложения было бы довольно большой промашкой.
- У вас очень серьезные требования к производительности приложения и микросекунды имеют значение. Хотя Go и компилируемый язык, у него есть не только автоматическое управление памятью, но и очень некачественный генератор кода. В этом довольно просто убедится даже на примитивных примерах сходив на godbolt.org.
- У вас дремучий энтерпрайз с Oracle с сопутствующими технологиями. Go имеет относительно хорошую поддержку SQLite, MySQL, Postgres и… и всё.
- Вы занимаетесь разработками связанными с машинным обучением. Тут почти все заточено под Python с низкоуровневыми оптимизациями на C/C++ и CUDA, Go просто бесполезен так как сильно проигрывает Python в гибкости языка с одной стороны, и C++ в качестве сгенерированного машинного кода с другой стороны.
- У вас имеется много кода на C++, с которым необходимо состыковаться. В Go, конечно, есть интеграция с C и она очень даже хороша, но это никак не упрощает жизнь при условии наличия большой кодовой базы на C++, с которой нужно явно линковаться.
- Драйвера. Тут я думаю всё довольно очевидно.
Я уверен что если основательно подумать, то можно еще пунктов будет добавить, но в качестве некого списка “тут Go точно не подойдет” вполне сойдет.
Для чего нужен и полезен Go
На Go отлично можно писать практически всё за исключением перечисленного в “Когда Go не нужен и не полезен”. На Go можно и нужно писать Web-сервисы. У Go нет тяжелого рантайма по сравнению с JVM-языками и нет необходимости отдавать исходники пользователю, как это будет в случае с Python, поэтому на нём довольно удобно писать приложения для конечного пользователя начиная от демонов, заканчивая UI, заниматься кроссплатформенной разработкой.
У нас на Go написано сейчас практически всё: кроссплатформенный демон/сервис работающий на Windows, Linux, macOS. Набор не менее кроссплатформенных утилит командной строки ну и конечно сервис в облаке. Так как мы попадаем под пункт (6) из моего списка, то у нас есть вспомогательное приложение на C++ для интеграции всего, что нельзя дешево и/или эффективно затащить в Go и отображение Web-UI.
Общаясь с коллегами из других компаний замечаю что Go бодрыми шагами покоряет не только стартапы, но и матерые корпорации и банки. Сервисы заказа такси (азиатский аналог Uber), блокчейны, обработка и фильтрация трафика, внутреннии порталы и многие другие задачи отлично ложатся на этот язык.
Для кого нужен и полезен Go
Несмотря на довольно жуткий синтаксис и отсутствие как макросов так и шаблонов, Go очень простой язык с большим количеством искусственных ограничений на варианты написания кода. На первый взгляд это плохо, например я именно так подумал когда только столкнулся с языком, но это только на первый взгляд. Дело в том, что примитивность языка дает возможность автоматизировать контроль качества кода, возможность легко писать генераторы кода, статистические анализаторы, юнит-тесты. Язык имеет довольно хорошую встроенную защиту от дурака и запрещает всё потенциально опасное: циклические зависимости, неиспользуемые импорты и переменные, имеется единственно верный стиль форматирования кода и т.д. Практически недостижимое для C++ разработчика 90% покрытие кода юнит-тестами становятся чем-то банальным при работе с Go.
Довольно легко можно добиться эффекта когда приходящий на ревью код гарантированно а) покрыт тестами, б) откомментирован, в) написан в том же стиле что и вся остальная кодовая база, г) не содержит серьезных ошибок кодирования. В итоге на ревью можно думать не о качестве кода, как это постоянно бывает с другими языками, а о решаемой кодом проблеме.
Всё это вкупе позволяет сильно снизить планку требований к разработчикам и при этом продолжая получать качественный продукт без падения скорости разработки. А при том взрывном росте IT что наблюдается на данный момент, это очень многого стоит. Лично я бы и дальше ожидал значительного увеличения количества проектов на Go.
Почему выбираете для решения своих задач golang а не java se?
Потому что приложение на Go не требует вообще никакого рантайма. Потому что Go сильно проще Java, на Go даже мартышка после недельного тренинга начнет не плохо так писать.
https://sysdev.me/how-to-select-programming-language/ Где тогда находится Go в этой градации?
4 года – это всё же очень много по меркам IT индустрии. На данный момент я бы вообще не стал думать ни о Java, ни о Rust, так как C++17 и уж тем паче C++20 изумительны. Так что сейчас я бы думал о где-то такой последовательности: Python -> Go -> C++17/20.
с++ 20 может и изумителен, сам по себе, но что делать с миллионом тех фич, которые уже в нем есть? Как не сломать мозг?
Тренировать его