За свой ежедневный опыт разработки с Go чуть более года я научился трем вещам:

  1. Я могу полностью изменить свое представление о том, как работает программирование, даже после 12 с лишним лет работы в той или иной форме.
  2. Люди обвиняют Java во всех неправильных причинах
  3. Люди хвалят Go по всем неправильным причинам

Позволь мне объяснить. Этот пост не о том, что «язык А лучше языка Б» или наоборот. Речь идет о том, чтобы задать себе вопрос, почему вещи работают именно так, а не иначе, плохо или потенциально хорошо.

До прихода в лагерь Go я довольно много лет проработал Java-разработчиком со всеми стереотипами, которые эта роль могла вызвать в голове. Я участвовал в разработке систем обработки данных для различных отраслей. Тем не менее, большая часть кода, который я написал, была просто шаблонной: передача данных из одного формата в другой или разработка сложных абстракций за тем, что на самом деле должно было просто вызывать функцию и получать ее результат. Да, код было сложно понять, но я им гордился именно по этой причине. Чем больше обручей я создавал, тем в большей безопасности я чувствовал, что:

  1. Я делал то, что считал правильным
  2. Если люди не понимали код, им приходилось обращаться ко мне за советом, что еще больше повышало мое эго.

Язык в этом не виноват

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

Go тоже не серебряная пуля

По большей части из тех же соображений переход с корабля на Go только потому, что «это не Java», никого далеко не уведет. Еще до того, как я начал писать Go, я слышал и читал много историй о том, как просто и быстро он делал все, как мало в нем церемоний по сравнению с Java, как он в конечном итоге убьет все остальные языки и т. д. Все бла-бла. Несмотря на то, что все вышесказанное верно, вы должны открыть для себя истину в каждом из них. Если вы подходите к языку в отчаянии с вашим нынешним способом работы, вам предстоит трудный путь.

Видите ли, если бы вы хотели только ускорить работу (язык названия по выбору), вы, безусловно, могли бы это сделать. Тем не менее, держаться за мысленный багаж вашего предыдущего опыта будет трудно и грязно. Мой первый проект Go начинался как переписывание приложения Spring Boot, которое я начал ранее, поэтому я подумал, что просто организую его таким же образом. Чтобы не усложнять рассказ, скажем, что это была захватывающая катастрофа. Только после того, как я начал с нуля, он действительно начал взлетать.

Go — это язык без (меньше) идиом

Давайте проведем наивный математический эксперимент. Представьте, что вы можете создавать допустимые программные выражения, комбинируя любые 3 ключевых слова из словаря языка программирования. Таким образом, если в языке всего 10 ключевых слов, максимальное количество возможных выражений составляет 10 * 9 * 8 = 720. Напротив, язык, скажем, с 20 ключевыми словами, в конечном итоге будет иметь 20 * 19 * 18 = 6840 выражений. В два раза больше ключевых слов приведет почти в 10 раз больше выражений!

Языки, как правило, поощряют создание и использование идиом. С таким количеством возможных выражений для человека или группы людей является нормальным поведением начинать ассоциировать и использовать выражения для определенных вещей. Проблемы обычно возникают, когда другая группа высказывает то же самое по-своему. И то, и другое совершенно верно, но у каждой группы будут проблемы с пониманием другой.

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

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

Go — тест для старших инженеров

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

Видите ли, младшие программисты начинают с небольшого багажа и предубеждений, поэтому, по их мнению, все, что можно сделать с помощью кода, справедливо и оправдано. В том числе, сжечь ЦП или стереть диск из-за арифметической ошибки.

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

Проблема с принципами в том, что они хорошо работают только в 80% случаев. Именно оставшиеся 20% могут оказаться губительными для проекта или карьеры. Именно понимание, где применить принцип, а где намеренно отбросить его во имя прагматизма, превращает инженера-программиста в старшего инженера-программиста.

Чтобы по-настоящему оценить Go, нужно научиться различать, что отличает его и его сообщество от остальных. Нужно пройти фазу полнейшего отвращения к языку, ибо в нем «не хватает» определенной черты. Двигаться дальше, несмотря на желание вернуться на знакомую почву, может привести к одному из двух:

  1. Дайте понять, что действительно язык Go — это не то, что им нужно или чего они хотят.
  2. Научитесь ценить возвращение к истокам, а также то, когда отдавать предпочтение прагматизму, а не принципам.

В любом случае это будет интересный опыт.

Первоначально опубликовано на https://p5v.me 17 января 2020 г.