GrabDuck

Почему Go обречён на успех (обновлено)

:

TL;DR Golang был разработан специально для того, чтобы расцвести в больших проектах, которые пишут большие группы программистов разных уровней, и в мире нет такой группы больше, чем open-source сообщество.

Абсолютно всё в жизни основано на компромиссах — первый закон термодинамики доказывает это, и языки программирования тут не исключение. Компромиссы в Go не уникальны, но именно благодаря их удачному сочетанию, Go и случился. Законы физики также утверждают, что каждое действие порождает противодействие, и, с ростом популярности, также возрастает количество критики в адрес языка, иногда обоснованной, иногда не очень. Позвольте мне объяснить, почему я считаю, что эта критика не важна, и Go обречён на успех несмотря ни на что.

Raison d’être


Чтобы понять, почему Go таков, каким является, прежде всего вы должны понимать причину его появления.
Целью проекта Go было устранить медленность и неуклюжесть разработки ПО в Google, и таким образом сделать процесс более продуктивным и масштабируемым. Язык был разработан людьми и для людей, которые пишут — и читают, и дебажат и поддерживают — большие программные системы.
( источник)

Это и есть единственная причина создания Go, и никакой больше. Это не был 20% проект для развлечения, который случайно попал в струю, это не была попытка достичь чего-то, чего не было сделано раньше. Он просто был создан от разочарования той сложностью, которая неизбежно создавалась большими командами, работающими над большими кусками кода, написанными на языках с большим наборов фич. И каждый компромисс был выбран потому что он следует этим интересам. И если вы недовольны этими компромиссами, скорее всего ваши интересы просто не совпадают и вам не нужно использовать Go.

Хотя одними из наиболее значимых особенностей Go является скорость компиляции или легкая конкурентность (concurrency), всё же главной чертой, которая делает Go особенным является его невероятная простота. Go стремится уменьшить сложность больших проектов Google всеми способами, и делает это жертвуя какими-то вещами — многими вещами — иногда даже принципами, которые вы всегда считали незыблемыми, вроде DRY. Go не такой, как Python или Ruby, которые «позволяют» вам писать понятный код. В Go у вас просто нет другого выбора.

Попробую изобразить на примере. Go — это ваш друг, но не тот друг, который просит вас после вечеринки не садиться за руль, а вызвать такси, Go — это друг, который прерывает вашу вечеринку, говоря вам, что он выбросил весь ваш алкоголь в окно. Go не позволяет вам абстрагировать себя в ногу ( abstract yourself in the foot. — orig)

Остальные компромиссы ортогональны. Да, Go не всегда вас сохранит от «состояний гонки», как это сделает Erlang, но Erlang даёт вам эту сохранность ценой постоянного копирования ваших данных, значительно теряя в скорости — TANSTAAFL.

Я, критик


Когда вы читаете критиков, и это касается многих других тематик, вы, как правило, можете их разделить на две категории:
  1. Жалуется, что Go не оптимально решает задачи, которые ставились перед Go
  2. Жалуется, что Go не оптимально решает личные цели

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

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

Очень простой способ обнаружить эти несовпадения интересов — это проанализировать использования слова «Я». Критик, как правило разочарован, потому что «Я» не могу сделать то, что «Я» хочу, «Я» не могу выразить это так, как «Я» хочу. Очень редко вы услышите жалобы на то, что «мы» делаем.

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

Open-source


Но оставим в стороне личные предпочтения, есть одна группа, которая тут бесспорно выигрывает гораздо больше Google от простоты и дружелюбности Go — это сообщество open-source.

Open-source проекты существуют благодаря вкладу сообщества. Очень малое количество успешных проектов созданы одним разработчиком. В мире open-source вы не нанимаете ваших разработчиков, они сами должны прийти к вам, и, хотя вы и можете выбирать, какие пулл-реквесты/патчи принимать, чем больше вы получаете, тем быстрее вы растёте.

И это то, где Go нет равных.

Go блистает, в частности, в трёх аспектах:

Он поощряет изучать чужой код

Если мы с вами похожи, то вы достаточно часто будете заглядывать в исходники чужих проектов на Github. Просто из любопытства или по надобности, но вы регулярно будете изучать чужой код, чтобы понять, как там всё работает. Иногда вы будете находить простой и понятный код, иногда придется забираться глубже уровень за уровнем, чтобы дешифровать код. Проекты на Go преимущественно будут в первой группе.

Даже если я не собираюсь трогать код, я всегда предпочитаю определенный open-source софт другому просто потому что факт того, что он написан на Go даёт мне чувство гораздо большего контроля над ним. Я чувствую, что в случае каких-то проблем, я не завишу полностью от его автора, который единолично может их решить. И у меня нет такого же чувства с проектами, написанными на языках, которые я знаю гораздо дольше. Для open-source проектов быть написанным на Go — это уже преимущество само по себе.

Go делает легче вклады сообщества

Равные правила игры также дают особенный выигрыш, если вы автор open-source проекта. Go делает процесс ревью merge-запросов гораздо менее утомительным. Утилиты вроде go fmt, golint и go vet оставляют очень мало пространства для персональных предпочтений в форматировании кода. И в целом, Go не даст так просто превратить ваш проект в монстра с тысячью способов сделать одну и ту же вещь. Если вам приходится проверять код случайных людей из интернета, вы не хотите язык с трюками и, скорее всего, вы не хотите людей, стремящихся доказать, как они круты. Вы хотите что-то максимально ясное и очевидное. Возможно даже локальную обработку ошибок.

Go уменьшает страх открыть исходный код

Это хорошо известный момент, что для открытия исходного кода своего проекта, вы должны быть либо рок-звездой в программировании или иметь эго, как у рок-звезды, чтобы противостоять критике. И на самом деле не важно, как хорошо вы пишете код — всегда найдется кто-то, кто его будет ненавидеть и убедится в том, что он это до вас донёс. Это плохой момент, который подвергает стрессу хороших людей, делающих альтруистичные вещи, из-за чего огромное количество исходных кодов остаются в темноте, потому что их авторы боятся, что он недостаточно хорош для стадии релиза в open-source.

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

Заключительные мысли


Успех Go, на самом деле, уже состоялся. Множество важного системного софта, выходящего в эти дни, написано на Go. OSS-компании, такие как Docker, CoreOS или Hashicorp осуществляют революции в серверах, используя Go, как основной инструмент. Всё больше появляется баз данных, поисковых движков, http-прокси или систем мониторинга. Go уже большой игрок в мире серверного софта и это только увеличивает его богатство.

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

Что если вам и в самом деле нравится простота, но парочка из компромиссов Go просто кажутся вам невыносимыми? Тогда, мне действительно жаль, вы можете либо продолжить дальше поиски языка, который идеально подходит под ваши нужды, или, если вы достаточно талантливы, даже создать ваш собственный язык. Кто знает, если достаточное количество людей нуждается в том же, это может даже получить поддержку.

Update Jun 14, 2015


Похоже, эта статья немного наделала шуму. Около 40К посещений в первые 24 часа, и я получил немало отзывов, прямых и непрямых. Я не собираюсь спорить с интернетом, но хотел бы добавить несколько запоздалых ремарок для тех, кто натолкнется на эту статью в будущем.

О значении слова «успех»

Под словом «успех» я не подразумеваю, что Go заменит все остальные существующие языки. Это было бы глупо. Под успехом я подразумеваю, что достаточно большая часть жизни разработчиков будет, если не написание кода на Go, то, как минимум, пользование софтом, написанным на Go. Это моё понимание успешного языка программирования.

О доказательстве моих утверждений

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

Я не компетентен в том, чтобы формально доказать достижения Go в плане простоты. Я просто ощущаю их на своём опыте. Если вы и вправду хотите узнать, прав ли я — предлагаю вам пройти Go tour и посмотреть на популярные Go репозитории на Github. Также рекомендую взглянуть на статью Роба Пайка " Less is exponentially more", где он описывает и обсуждает многие из упрощений Go.