- PVSM.RU - https://www.pvsm.ru -
Когда UK Government Digital Service [1] (Служба Электронного Правительства Великобритании) взялась за GOV.UK [2]код был в основном написан на Ruby [3]. С тех пор мы попробовали в деле несколько языков включая Java, Clojure, Scala, Python и Javascript. В последнее время мы переключились на Go для ряда проектов.
Ниже короткий отчет о полученном опыте. Как мы использовали Go и что на наш взгляд полезно знать другим разработчикам помышляющим о внедрении языка в своем окружении. Если вас интересуют подробности, то более детальную информацию мы публиковали в блоге — router [4] (мой перевод [5]), crawler [6] и CDN acceptance test [7].
Мы коллективно осознаем, что изучение и экспериментирование с новыми технологиями знакомит нас с новыми подходами и расширяет наше видение. Языки программирования нового поколения предлагают предлагают новые методы решения задач.
Мы слышали о Go много лестного. Успешный опыт применения языка в инфраструктуре Google и понимание уровня команды стоящей за этим придавало немало оптимизма, все же решающими факторами для эксперимента [8] стали многопоточность, скорость исполнения и нетребовательность к ресурсам. Другие используемые нами языки просто не могли нам этого предложить.
Язык определен достаточно простой и ясной спецификацией. Это облегчает задачу вызвать начальный интерес у коллег для разбора кода, а потом и участия в разработке. Однако мы ни разу не чувствовали себя ограниченными этой простотой. Когда вам нужна выразительность для построения собственных моделей, абстракция интерфейса и композиционность предоставляют достаточный и надежный арсенал средств.
Хваленая стандартная библиотека языка на поверку таковой и оказалась. Она покрывает широкий спектр обиходных задач включая, например, доступ к файловой системе, постройку HTTP сервисов, консольных утилит, работу с JSON данными и календарными представлениями. Стандартная библиотека имеет достаточную глубину и хорошо продуманную архитектуру. Насколько возможно библиотека построена на RFC стандартах, в качестве основополагающего материала.
Библиотека написана качественным, идиоматичным кодом и прекрасно документирована [9] так, что может служить учебным пособием даже для опытных разработчиков. Кроме того предлагаются курс молодого бойца [10] и утилита стандартного форматирования кода. [11]
За последнии несколько лет мы изучили разные модели развертывания Ruby (вроде Unicorn workers) и построили свои средства [12]. Мы культивируем регулярные и частые релизы [13]. Технологии облегчающие развертывание чрезвычайно востребованы в наших обстоятельствах и здесь Go показал себя с лучшей стороны.
У языка нет специальных требований к системе для поддержки среды исполнения. Программа статически компилируется в один бинарник, который и устанавливается на машине, где будет исполняться. Нет никаких зависимостей времени исполнения (вроде bundle install для Ruby) необходимых на целевой машине. И рестарт сервиса на порядок быстрее и проще, чем в Ruby.
Обычно команда решает, какой язык годится. Это решение командное, а не персональное. Go за последний год завоевал широкое признание у нашей команды. Попробуем объяснить почему.
Им легко заразить людей, от сисадмина который претворялся, что не умеет программировать, до разработчика попробывавшего Go в качестве второго языка. Успешности языка немало способствует заботливое отношение его попечителей. В частности для нас очень важны гарантии обратной совместимости для 1.х релизов. [14]
Утилиты go tool сильно упрощает жизнь при решении типовых задач цикла разработки проекта. Си-образный синтакс упрощает знакомство с языком перед освоением специфичных идиом.
Если вам близок девиз “Make it work. Make it right. Make it fast” [15] («Добейся чтобы работало. Работало правильно. И работало быстро»), тогда можете быть уверены написанное на Go работает достаточно быстро с первой попытки. Скорость исполнения высока и уверенно растет с каждым релизом, а стандартная библиотека хорошо оснащена. Это означает, что мы можем сконцентрироваться на характеристиках нашего кода важных для команды: понятность и читабельность.
Нам в GDS, чтобы полностью перейти на Go, осталость разобраться с парой вопросов. Один из них — управление версиями зависимостей. Для ключевых узлов системы мы должны фиксировать версии кода и версии его зависимостей, и обеспечить воспроизводимую сборку. Попечители языка публично одобрили вендоринг [16]. Нас привлекает использование gom и godep в качестве возможных решений [17] более дружелюбных к разработчику.
Смело можно сказать, что мы намерены наращивать свой массив кода на языке Go.
[прим. пер.] Из сторонних Go библиотек GDS активно использует gor [18] для зеркалирования трафика и vegeta [19] для нагрузочного тестирования о чем написано в блоге.
Автор: uvelichitel
Источник [20]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/veb-razrabotka/74610
Ссылки в тексте:
[1] UK Government Digital Service: https://gds.blog.gov.uk/
[2] GOV.UK : https://www.gov.uk/
[3] на Ruby: https://gds.blog.gov.uk/govuk-launch-colophon/
[4] router: https://gdstechnology.blog.gov.uk/2013/12/05/building-a-new-router-for-gov-uk/
[5] мой перевод: http://habrahabr.ru/post/205284/
[6] crawler: https://gdstechnology.blog.gov.uk/2014/08/27/taking-another-look-at-gov-uks-disaster-recovery/
[7] CDN acceptance test: https://gdstechnology.blog.gov.uk/2014/10/01/cdn-acceptance-testing/
[8] эксперимента: https://gdstechnology.blog.gov.uk/2013/12/09/choosing-go-for-a-new-project/
[9] прекрасно документирована: http://golang.org/pkg/
[10] курс молодого бойца: http://golang.org/doc/effective_go.html
[11] утилита стандартного форматирования кода.: http://golang.org/cmd/gofmt/
[12] свои средства: https://github.com/gds-operations/unicornherder
[13] регулярные и частые релизы: https://gds.blog.gov.uk/2012/11/02/regular-releases-reduce-risk/
[14] гарантии обратной совместимости для 1.х релизов. : https://golang.org/doc/go1compat
[15] “Make it work. Make it right. Make it fast”: http://c2.com/cgi/wiki?MakeItWorkMakeItRightMakeItFast
[16] публично одобрили вендоринг: http://golang.org/doc/faq#get_version
[17] gom и godep в качестве возможных решений: https://github.com/alphagov/styleguides/blob/master/go.md#external-dependencies
[18] gor: https://github.com/buger/gor/
[19] vegeta: https://github.com/tsenart/vegeta
[20] Источник: http://habrahabr.ru/post/243327/
Нажмите здесь для печати.