Язык Go был выпущен в 2012 году компанией Google.
У меня двоякое отношение к Google. С одной стороны они большие молодцы, они создали самую лучшую в истории поисковую систему и много другого классного софта. Но у Google есть одна неприятная особенность — они любят закрывать свои разработки по непонятным никому причинам.
Вспомните Google Web Toolkit (GWT). Это была очень болезненная история для большинства энтерпрайз разработчиков ибо GWT использовался во многих энтерпрайз проектах. Но Google просто на ровном месте, без каких-либо предпосылок просто взяли и закрыли его. Без поддержки, без отдачи в Open Source. А многие проекты, которые тогда создавались на GWT, так и живут, ибо не переписывать же весь проект. Поэтому ко всему, что производит Google, я отношусь с легким опасением. Нужно всегда держать в голове, что Google может это закрыть. Однако ситуация с языком Go немного проще. Изначально Go был разработан гуглом для собственных нужд, но в скором времени он был передан в Open Source сообщество.
Концепция языка Go
В чем суть языка Go и чем он отличается от большинства современных языков? Он сфокусирован на той нише, в которой фактически нет конкурентов. Гуглу нужен был очень компактный, компилируемый язык, который бы очень быстро работал и был многопоточным. Фактически на сегодняшний момент языков с такими же характеристиками очень мало. Разве что C и Rust.
При этом нельзя сказать, что С++ маленький язык, у него море возможностей и на изучение уходит очень много времени. У языка C есть свои неудобства: он очень старый, в нем нет никакой безопасности. Rust же сфокусирован на работе с низким уровнем. Также оба эти языка имеют одно неприятное свойство с точки зрения скорости разработки — в них нет garbage collection, т.е. сборщика мусора. Поэтому разработчики, которые пишут на C или Rust, вынуждены следить за всеми объектами, которые создают, и прибрать весь мусор вручную.
Google же нуждался в языке, на котором можно быстро разрабатывать. А вы не можете быстро разрабатывать на языке без garbage collection. В итоге Go получился маленьким, с простым синтаксисом, многопоточным и компилируемым. Он идеально подходит для короткого и быстрого выполнения кода.
Изначально Google использовал Go для своих внутренних целей, но когда компания выложила язык на всеобщее рассмотрение, люди начали задумываться, для чего же его можно применять.
Где используется Go
Go используется в качестве «ускорителя» для более медленных языков: PHP, Python, Ruby. Его используют в тех местах, где требуется сделать очень быстрый кусок кода, но писать его на С++ долго, дорого и геморно. К примеру, у вас весь проект разработан на PHP, но вам нужно ускорить какой-то кусок. Этот кусочек как раз удобно сделать на Go. Это довольно распространенное решение для компаний, которые пишут серьезный софт на перечисленных выше языках. Поэтому Go часто используется именно в качестве заплаток для критически важной скоростной инфраструктуры.
Но более популярное использование Go — в качестве основного языка для программирования микросервисной архитектуры. Потому что в концепцию микросервисов язык Go ложится идеально. В этом случае Go является прямым конкурентом Node.js. Node.js тоже идеально подходит за счет быстрой обработки многопоточных обращений.
Еще один вариант использования языка — для того, чтобы сделать что-то быстро работающее. Как говорится, если вам нужно что-то быстро написано, но не важно, с какой скорость это работает — вы выбираете Python. Если же вам нужна быстрая скорость работы кода, при этом чтобы писалось просто — то это Go. Поэтому на Go часто пишут телеграм-боты и различные системные утилиты, которые должны быть быстрые и многопоточные.
На сегодняшний момент в Украине спрос на разработчиков Go довольно ощутимо превышает предложения на рынке. Причем поскольку язык сам по себе достаточно новый, вы не можете встретить синьорного разработчика Go с 15 годами стажа, многие становятся синьорами Go через 2-3 года работы на этом языке.
Особенности языка
Если вам нужно сделать простой с точки зрения технологий прототип, у которого нет требований по скорости, то отлично подойдет Python или PHP. Быстро написали, показали и работаем дальше. Go подходит, если к вашему проекту предъявляются нефункциональные требования: он должен работать быстро, с огромным количеством потоков и пр. Поэтому очень много стартапов начинаются или на Node.js, или на Go. Писать большие системы на нем не удобно, а вот микросервисы можно. Поэтому можно быстро начать разрабатывать time to market на Go, а потом масштабировать систему на микросервисах до достаточно больших размеров. На рынке технологичных стартапов, где требуется высокая производительность, Go и Node.js занимают первенство.
Если вы программист, например, на Java или C#, и вы устали от огромных энтерпрайз систем, вам хочется стартапов и более активной разработки — вы можете посмотреть в сторону Go. Но тут нужно понимать, что стартап — вещь достаточно болезненная для work-life balance. С другой стороны — это интересно. Вы можете поучаствовать в каком-то крутом стартапе, который выстрелит и станет очень популярным, а вы сможете похвастаться, что работали над ним.
Порог входа
У Go довольно своеобразный порог входа. С одной стороны, язык достаточно простой. Как Java была сделана из С++ методом урезания всех возможностей, которые только можно урезать, точно также и Go был сделан из современных языков путем еще большего урезания. Фактически, там нет нормального ООП, нет наследования, нет перегрузки функций, нет переопределения функций. Есть только имплементация интерфейсов и есть еще загадочная штука, так называемая утиная типизация. Если что-то летает как утка, крякает как утка и плавает как утка, то это утка. Таким образом можно в неявном виде имплементировать интерфейс и ваш класс будет считаться имплементацией интерфейса даже если вы не объявили это в явном виде. Т.е если вы имплементировали все методы, значит вы имплементировали интерфейс.
В Go на уровне самого языка есть так называемая Go-рутина — та самая штуковина, которая поддерживает многопоточное выполнение. Потоки выполнения занимают довольно большой кусок памяти. Стандартно поток занимает примерно 1 мб памяти. Соответственно, вы не можете поднять больше потоков, чем есть памяти на сервере. Gо-рутины используют существенно меньше памяти и очень хитро выполняются. В результате писать многопоточные приложения на Go гораздо проще чем на большинстве других языков.
Вернемся к порогу входа. Порог входа достаточно низкий, так как язык простой, максимально урезаны возможности, простой С-подобный синтаксис. Но поскольку многопоточность встроена прямо в ядро языка, не понимая многопоточности писать на Go будет очень сложно. А многопоточность — действительно сложная тема. Поэтому если вы переходите с другого языка, порог входа практически отсутствует, нужно выучить только синтаксис. Но вот если вы никогда не программировали, то выучить Go будет в разы сложнее, чем большинство других языков типа Python или PHP.
Зарплаты на Go
Поскольку на Go часто пишутся стартапы, а стартапы — вообще не надежная штука, полностью плюющая на ваше личное время, все это компенсируется достаточно высокими зарплатами. Поэтому в этом направлении можно хорошо заработать.
Будущее Go
Go занял довольно стойкие позиции в нише разработки микросервисных проектов, наравне с Node.js. Сейчас очень много проектов, которые стартуют в этой архитектуре, поэтому для разработчиков Go всегда есть работа.
Что выбрать — Node.js или Go? Если вы были программистом на языке строгой типизации, то без вопросов выбирайте Go, потому что он тоже с жесткой типизацией. Если же вы были front-end разработчиком или нормально относитесь к Java Script, то для вас, вероятно, лучше подойдет Node.js. А по возможностям Node.js и Go достаточно близки. При этом спрос на Gо разработчиков достаточно высокий.
Всегда ваш Сергей Немчинский.