Go или не Go?

Цель этого поста попытаться ответить на ряд вопросов которые я получаю время от времени. Самый популярный это “стоит ли изучать?”, второй по популярности “а как это сделать?” и 3й - “это ведь отстой, как ты мог сказать про него хорошего?”

Давайте по пунктам. На вопрос “стоит ли его изучать”, я смело скажу - да, стоит. И этому есть пара весомых причин:

  • Это вполне практичный язык и умение писать на нем позволит вам сделать что-то. Это “что-то” можно сделать и на других языках, но можно и на Go. Если иметь ввиду небольшие домашние проекты, то тут по практичности и скорости достижения результата Go, для меня, примерно на одном уровне с Python. Однако, если проект не самый мелкий и/или его развитие и сопровождения может потребоваться, то тут я отдам предпочтение Go.

  • Go очень простой язык. T.e. совсем, совсем простой, простой как дверь, прямой как железная дорога. На его изучение может уйти от пары часов до пары недель, в зависимости от опыта изучающего. При этом сроки не фиктивные, как в случае с другими языками, которые сами по себе простые, но чтоб сделать в них что-то реальное надо изучить все вокруг, их экосистему, системы сборки, магию тестирования, минимальные фреймворки и библиотеки. С Go все это заметно проще и, что немаловажно, он не особо нагружает мозг.

Теперь попробую развернуть, обосновать и ответить за все.

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

  • бэкенд того, что делает news.radio-t.com. Это проект а не проектик, там на самом деле много всего за сценой.

  • система раздачи и баллансировки (этакий специальный CDN) для подкастов. Эта штука была написана много лет назад на java и вполне работала, пока не сломалась. Тронув ее чтоб починить, я увидел там много кода и его большая часть довольно низкоуровневая. Нет, код там неплохой, но лучший код это, как известно, код который не надо писать. В результате, я переписал эту штуку на Go за вечер и для того, чтоб добиться сравнимой производительности мне не пришлось даже задуматься. Все почти сразу заработало и работает сейчас.

  • бот для нашего гиттер чата. Он тоже был на java много лет и, честно говоря, его можно было бы переписать на чем угодно. Там с годами многие самые сложные вещи устарели, а то, что осталось – оно совсем простое. Но писать на Go его было просто и приятно.

  • идет неспешный процесс написание новой версии ukeeper v2 на Go. Тут все несколько сложнее. Это реально большой проект на java и он перерос себя и свою архитектуру. Я пару раз уже засучивал рукава и пытался раздробить его на мелкие части, убрать старый хлам и упростить все, что можно. Но задача это пугающе велика и по сути сводится к переписыванию многих частей с использованием современных методов и технологий, плюс к вдумчивому отсеканию лишнего. В виде эксперимента я попытался написать основной сервис, тот что делает главную магию, на Go и результат приятно удивил. Код простой и почти прямой, производительность более чем, масштабируемость в ассортименте. И на написание этого сервиса ушло всего пару выходных.

  • есть целый ряд мелких и средних проектов по работе, которые были либо написаны с нуля, либо как upgrade с их py версии, которая стала выходить из под контроля. Там много чего, начиная от диспетчера RMQ с хитрым форвардингом и до систем управления ресурсами в AWS. Есть и более традиционные системы для бизнес задач и вычислительные системы и разное другое.

В процессе столь тесного общения с Go я заметил целый ряд особенностей:

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

  • В Go проект гораздо проще ввести нового человека, даже если этот человек не самый продвинутый специалист и не имеет особого Go опыта. Это долгая и муторная тема которую я иногда затрагиваю в подкасте.

  • То, что свой код на Go легко читаем - это понятно и приятно. Но, что не менее важно, и чужой код читаем почти также легко как свой. Это, на самом деле, очень и очень важно, даже если вы работаете в одиночку над своими домашними проектиками то вам придется общаться с чужим кодом, как минимум в виде библиотек.

  • В процессе работы на Go я обратил внимание, что мне нет необходимости настолько часто искать ответы в интернетах как на python или java. Нет, ничего плохого в том, чтоб погуглить проблему нет, но если такой необходимости не возникает то это еще лучше. На python, который я использую не постоянно, мне часто приходилось искать вполне тривиальные вещи, которые можно сделать многими способами и которые я уже делал правильно, но забыл как. На java, который мой основной язык, искать приходиться строго противоположное - нетривиальные проблемы или проблемы с магией, которой в большой java (со всеми полезными enterprise фреймворками) немало.

  • По бесцеремонности Go для меня даже уделывает python. Я имею ввиду все эти предварительные … действия, которые надо совершить до того, как начнешь писать код.

Если к этому моменту я вас убедил и ваши рукава засучены, а пальцы зависли над клавиатурой в непреодолимом желании попробовать, то вот вам ответ на вопрос “как и что учить?”. Во первых, я бы не советовал читать книги по Go. Да, есть пара достойных книг которые может и стоит почитать со временем, но гораздо практичней будет просмотреть 3 ресурса:

  1. Go by Example – очень лаконично, и почти о всем, что надо для быстрого старта.
  2. Learn X in Y minutes – прелестный способ, мой личный фаворит.
  3. How to Write Go Code - тоже коротко и сердито.

Я не уверен, что этого хватит для тех, кто никогда до этого не программировал, но если до этого был хоть какой-то опыт на любом языке (даже опыт на JS и PHP подойдет), то должно хватить.

По поводу “это отстой, a не язык”. Тут мне трудно спорить и не только потому, что я это и сам говорил. Язык, для ценителей, на самом деле не самый … выразительный. И для беглого взгляда, программа на Go выглядит странно, а для многих неприятно. Однако, к тому, как оно выглядит привыкаешь быстро, ну и это “бее” можно выдать и о любом новом синтаксисе. Я помню, как меня доставал по началу питон со своими отступами и java с своими длинными конструкциями.

И про скудность языка тоже не поспоришь. Да, он такой. Да, там нет многого из того, что хотелось в том числе и мне. Однако, как и все практичное в нашей области, Go это компромисс. И этот компромисс действительно выглядит не особо привлекательно со стороны. Я вполне понимаю критиков языка и местами разделяю их позицию, за исключением их вывода - “это неподходящий язык, в топку его”. Из моего практического опыта эти компромиссы не настолько суровы как кажется со стороны. На Go можно писать код, можно читать код и оба эти процесса на удивление приятны. Тут есть какой-то особый феномен который я затрудняюсь описать. По всем признакам Go должен был оказаться провалом и ошибкой природы, но на практике это реально рабочий инструмент вполне подходящий к целому классу задач.

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

P.S. перечитав все, что я тут нанес, с удивлением обнаружил, что получилось с креном во “все хорошее”. Нет, у меня есть длинный список и “всего плохого”, и может я об этом отдельно напишу. И еще я собирался рассказать, как жить в Go на практике, т.е. в чем и как писать, что и как использовать. Может и до этого дойдут руки…