Языку программирования Go — семь лет

672e74f26a924d87a08e1243d91177a8.jpg

Семь лет — важный возраст в жизни многих людей, символический рубеж нового этапа взросления, когда мы начинаем ходить в школу. Вроде бы семь лет — не так уж много, но всё-таки и не мало. Так что если языки программирования представить в виде людей, то сегодня мы празднуем день рождения первоклассника Go — ему исполнилось семь!

Что такое Go и чем он хорош, мы описывать не будем: кто в теме, знают и так, а остальные могут почитать в Википедии. Уже вчера мы поделились с вами полезным переводом 50 оттенков Go: ловушки, подводные камни и распространённые ошибки новичков, а сегодня передаём слово нашим разработчикам, пишущим на Go. В честь годовщины мы задали каждому из них три вопроса:

  1. Почему ты выбрал Go (плюсы/минусы)?
  2. Что ты уже написал на Go?
  3. Как лучше изучать Go, что посоветуешь начинающим?

Вот что они ответили.

00d3d23c56fc433c86248ec90acf038c.jpgВиктор, программист Почты Mail.Ru

Началось с того, что я делал несколько задач в проекте, написанном на Go. Мне понравилось, втянулся. Go хорошо подошёл для новых задач по соотношению производительности и лёгкости в написании/поддержке кода. Плюсы: читаемость кода, предсказуемость, производительность приложений на Go. Минусы: неидеальная интеграция с C-шным кодом.

На сегодняшний день я написал хранилище blob«ов для Почты Mail.Ru: в нём хранятся почти (но не совсем) тела писем. Также помогал переписывать Почту на Go.

Для начала в Go вполне достаточно изучить tour.golang.org. В стандартной библиотеке есть почти всё, чтобы написать не слишком сложный веб-сервис. Из стороннего сразу понадобятся разве что коннекторы к базам данных. Go достаточно простой, там нет сложной теории и хитрых логических концепций, мало «тонких» мест в спецификации. Мне кажется, что лучше всего изучать язык в процессе написания кода.

Советы:

  • Гуглить что-нибудь про Go лучше по слову «golang».
  • Лучше сразу использовать утилиты для vendoring«а.
  • Если есть сомнения по поводу работы компилятора/runtime, можно посмотреть его исходный код на Go. Он вполне читаемый и идёт в комплекте с компилятором.

3d832916f636449ca72b32aab1fd5f77.jpgМихаил, ведущий программист myTarget

«Мне скучно знать то, что раньше знал». Однажды интернет убедил меня, что хорошо знать новые языки программирования. Не просто другие, помимо привычных C++ и Python, а именно новые: за ними будущее. Я смотрел в сторону Rust, Go и Scala. Но при этом очень хотелось, чтобы изучаемый язык мог пригодиться именно мне. Года три назад я увлёкся Erlang«ом (и ФП в целом), но понял, что зарабатывать на нём — да ещё столько же, сколько на C++, — я не смогу (сразу, а не через пять лет). По этой же причине отпала Scala (жаль, мне она показалась весьма интересной), этот язык подразумевает серьёзный бэкграунд на Java. Rust просто не понравился сразу. Go, кстати, тоже не понравился: после C++ мне многого в нём не хватает, в первую очередь гибкости.

Но у Go есть богатая стандартная библиотека, горутины, он развивается, на нём пишут серьёзные вещи (Docker, Dropbox). И — обратная сторона того, что мне не понравилось, — Go требует несколько другого мышления. Не ООП, как в C++ или Python. Эта перспектива освоить «несколько другое мышление» меня и привлекает.

С прагматично-финансовой составляющей у Go тоже неплохо. Область его применения — мой любимый backend. То есть моим основным языком остаётся C++, но понемногу некоторые задачи решаются на Go — на том же самом рабочем месте, без потери в зарплате. На Go я пока написал только утилитку для распознавания и пополнения тэгами своей музыкальной коллекции. Это было, когда я только знакомился с языком. Тогда же понял, что Go не предназначен для таких задач.

А продакшен-код я не пишу, я его рецензирую. Осваиваю Go вместе с авторами кода. Я сам начинающий, так что могу только поделиться своими планами по изучению:

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

e121e44da3ed45158857e46eccbe4afa.jpgИлья, программист Почты Mail.Ru

Я успел попрограммировать много на чём (C++, PHP, Java, Objective C). До того как прийти в Mail.Ru Group, писал на Perl. Писать на нём можно, но грустновато местами, так как очень много «исторически сложившегося» ужасного кода. В какой-то момент я услышал про Go и Rust, примерно в одно и то же время, и решил попробовать. Мне больше понравился Go. Со временем я даже придумал, как его использовать в работе. Плюсы — простота, компилируемый язык, строгая типизация, статическая компиляция.

На Go я писал для двух проектов Mail.Ru Group: для Cars Mail.Ru написал асинхронного «паука» для скачивания картинок из внешних источников с возможностью досрочной остановки скачивания; для Почты Mail.Ru — парсер/разборщика/отправителя логов. Остальное — домашние проектики, скорее экспериментального характера.

Тем, кто хочет освоить Go, нужно начинать писать код и гуглить. Может, понравится, а может, и нет. Есть масса видеоуроков, статей навалом. В Go есть свои фишечки, которые многим людям могут не прийтись по душе. :) Язык довольно простой, с небольшим количеством магии. Хотя по сравнению с Perl её почти нет. Изданы хорошие книжки (Алан А.А. Донован, Брайан У. Керниган. «Язык программирования Go»; Марк Саммерфильд. «Программирование на Go. Разработка приложений XXI века»), они помогут использовать более правильные подходы к разработке на Go и хорошо разобраться в инструментах.

e0cb511fb47c4e5aa4fd312d2014383e.jpgМаксим, стажер в Почте Mail.Ru

Когда я пришёл на собеседование, то претендовал на должность C-разработчика backend«а Почты Mail.Ru. А собеседовал меня Виктор. Диалог был примерно таким.

— Хочешь ли ты писать на С? — спросил Витя.
 — Не очень, — честно ответил я.
 — А почему?
 — В нём много букафф.
 — Согласен, идём тогда ко мне, будем писать на Go — и никакого С, — предложил Витя, хитро прищурив глаз.
 — Чё-то страшно, на Go пишут хипстеры, а нам серьёзные штуки делать надо, — ответил я, уже почти согласный на всё.
 — Да всё будет норм, зуб даю! — сказал Витя…

Так я и стал Go-разработчиком. Но, конечно, без С в работе не обошлось. Если вы уже умеете писать на каком-либо языке программирования, но вдруг решили ступить на путь истинный и выбрали Go, то нужно привыкнуть к строгой системе типов. Использовать больше интерфейсов, меньше наследований.

Если Go — ваш первый опыт в программировании, радуйтесь. Здесь гораздо меньше синтаксических конструкций по сравнению с Python, Ruby, Java, что должно немного упростить обучение. Go не самый элегантный язык, но при этом он очень выразителен. Огромное количество вспомогательных инструментов (gofmt, goimports, govet…) поможет забыть о многих раздражающих проблемах.

Для начала рекомендую прочитать пост effective go. Отдохнуть, перечитать effective go, через некоторое время ещё раз заглянуть в effective go. Effective go много не бывает, его стоит перечитывать время от времени. Всем важно понять (а некоторым — простить) модель памяти языка и запомнить: «Do not communicate by sharing memory; instead, share memory by communicating».

b8ae26bbede44d5b8446cd235e8ea25c.jpgАлександр, младший программист в Почте Mail.Ru

В январе я пришёл стажёром на должность С-разработчика. В первый день коллега спросил: не хочешь писать на Go? Я согласился. Так всё и завертелось. Переписал с Perl на Go почтовые треды, также на подходе Сишный messages/status. Сейчас переписываю почтовый API с Perl/C. На opensource-проекты пока что не хватает желания. :(

Новичкам сначала стоит пройти tour.golang.org:). Потом можно попробовать написать собственный API-сервис, чтобы охватить как можно больше возможностей стандартной библиотеки, используя http.HandleFunc. А дальше написать свой собственный http.HandleFunc:)

74cd7885257a42ec9b06ab8911763a32.jpgРоман, программист в группе разработки видеосервисов

Когда я пришёл в Mail.Ru Group, наш основной backend переписывался с NodeJS на Go. Так что это Go выбрал меня, но я доволен. У Go есть три основных преимущества перед NodeJS:

  • статическая типизация;
  • простое, но продуманное окружение;
  • и хорошая модель асинхронных/конкурентных вычислений.

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

Мой опыт разработки на Go пока ограничивается микросервисами и консольными утилитами. Чтобы начать знакомиться с Go, рекомендую открыть спецификацию и читать по 20 минут перед сном, пока не вызубрите (шучу). Конечно, чтобы освоить язык, на нём надо писать. А для усвоения идиом хорошо бы полистать код стандартных библиотек Go. Ещё рекомендую effective go.

2196dfc845c64715a47a5be1ffce84b0.jpgДмитрий, программист в студии Allods Team

Я выбрал Go в основном потому, что мне не известны другие языки, в которых асинхронный IO можно было бы писать так же просто, как синхронный (разве что async-await в C#, но на *nix-системах он не очень популярен). Кроме того, язык прост в изучении, в стандартной библиотеке есть почти всё что нужно (и есть развитая экосистема сторонних библиотек); инструментарий лёгкий, без излишеств, хорошая документация. Из недостатков: мне не хватает generic«ов.

На текущий момент я написал на Go несколько утилит для внутреннего использования. Для старта будет достаточно изучения информации с официального сайта. Там есть краткий обзор и более полная спецификация плюс выступления с конференций.

На этом всё. А как вы изучали Go? Делитесь историями в комментариях.

Комментарии (0)

© Habrahabr.ru