Интервью с Расс Коксом и Самиром Аймани

Перевод статьи Interview with Go’s Russ Cox and Sameer Ajmani, автор - PL Enthusiast

Сегодня я интервьюирую Расса Кокса и Самира Аймани, которые работают в Google над языком программирования Go. Они делятся со мной своими идеями касательно разработки языка, который считают уникальным и ценным, а также  рассказывают о предстоящих планах.

Это интервью продолжает нашу серию PhD, работающих над различными языками программирования (Авик Чоудхури был первым). Спасибо Рассу и Самиру, что нашли время поделиться своим опытом!

Что такое академическое образование?

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

Самир: Я получал бакалавра Computer Science в Cornell в период 1994-1998 и закончил магистром & PhD в MIT в 1998-2004. Мой советник в MIT - Barbara Liskov. Мое исследование -  "Доверенная платформа выполнения для многопартийной вычислений". Для защиты докторской степени я работал над "Автоматическими обновлениями программного обеспечения для распределенных систем". Я присоединился к Google в 2004 году и к команде Go в 2012 году.

Расс: Я вырос рядом с Bell Labs, а в средней школе и колледже имел счастье провести время в отделе computer science, на "родине" Unix и C, а также yacc, Yacc, и Dragon Book. На каком-то уровне, зная, как соединить язык (маленький или большой) и компилятор - это было просто частью культуры. Это почти наверняка привело меня к созданию улучшенной среды программирования для себя.

Какова история происхождения Go и ваше участие в его развитии?

Расс: Robert Griesemer, Rob Pike и Ken Thompson начали разработку Go в Google в конце 2007 года для решения проблем разработки программного обеспечения, с которыми столкнулись в Google.

Первая проблема заключается в том, что сетевые системы становятся все больше, по мере взаимодействия между несколькими частями. Существующие языки не делают эти взаимодействия настолько гладким для передачи, как хотелось бы. Решение должно было принять модель Хоара - Взаимодействующие последовательные процессы (CSP). Это кажется рискованным, но Роб и Кен имели опыт работы с последовательностью языков в Bell Labs , которые использовали CSP для достижения оптимального эффекта.

Вторая проблема: программы становятся больше и получают более широкое распространение. Язык, который подходит для небольшой группы, может не подходить для крупной компании с тысячами инженеров, которые работают над миллионами строк кода. Когда есть много инженеров, работающих вместе, вы хотите убедиться, что в языке нет "пыльных углов". Базова кода настолько огромна, что даже обслуживание требует механической помощи, а существующие языки не были разработаны с учетом этого факта. Все эти соображения и многое другое, привело к идее написания CSP на новом языке, вместо того, чтобы пытаться изменить существующий.

Я заканчивал докторскую степень весной 2008 года и в это время посетил Google. Я работал с Робом в Bell Labs, он и Кен рассказали мне о Go - и я был завербован. Когда я присоединился к команде в августе, язык был еще только в стадии прототипа, почти без библиотеки. Я взял на себя компилятор и время выполнения, с целью помочь разработать стандартную библиотеку и все изменения и уточнения к языку на основе этого опыта. Сегодня Роб и я ведем общий проект Go в Google.

Самир: В начале 2011 года я присутствовал на семинаре Роба Пайк о Go в Google Нью-Йорке и был особенно впечатлен параллельностью языков. Я работал в отделе Google Maps и писал код, имеющий дело с реплицированными системами хранения данных. У меня была библиотека на C++ для операции хранения в F + 1 и переключена на дополнительных копий; в ней было около 700 строк. Я преобразовал этот код в Go, получилось около 100 линий, и в более понятной форме. Я начал тратить 20% своего времени для улучшения библиотеки Go в Google. Осенью 2011 года меня пригласили присоединиться на полный рабочий день. Я присоединился к команде в январе 2012 года В этот момент язык был почти завершен; Go 1.0 был выпущен 28 марта 2012.

По вашему мнению, какие ключевые вещи отличают Go от других языков?

Расс: Самое очевидное, что отличает Go - фокус на CSP, с легкими потоками управления (мы называем их goroutines) , передача сообщений идет по каналам. Это была не самая обычная модель, когда Go был запущен. Erlang ближе всего, но даже в Erlang нет явных каналов (это больше похоже на оригинальный CSP, нежели CSP, усовершенствованный Hoare).

Самир: Большинство основных языков обеспечивают поддержку параллелизма с помощью библиотек. Встроенные в язык возможности делают параллельный код проще для чтения и записи, а компилятор и среда исполнения (планировщик, GC) могут отлично выполнять параллельные программы.

Какие приложения отлично подходит для Go, но не для других языков?

Самир: Go отлично подходит для параллельных программ, особенно серверов. Обработчики запросов в серверах в основном независимы и поэтому, естественно, реализуются в виде отдельных потоков. Go обеспечивает goroutines, чрезвычайно легкие потоки (4KB стеки, которые растут по мере необходимости). Принято иметь программы с сотнями тысяч goroutines. Go предоставляет каналы, чтобы позволить goroutines коммуницировать (для синхронизации и обмена данными).

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

Каким в научной литературе было влияние дизайна Go - положительным или отрицательным?

Расс: дизайн Go был под влиянием, прежде всего, практического опыта, в частности, оригинальных дизайнеров. Роберт работал над реализаций Modula-3, Strongtalk и JavaScript, а Роб и Кен работали над Unix и C и языками CSP, которые я упоминал ранее. Go представляет собой скорее инженерный проект, чем чисто исследовательский.

Влияние научной литературы - в основном за счет опыта применения в более ранних языках. Например, опыт работы с CSP применяется в Promela, Squeak, Newsqueak, Alef, Limbo, даже Concurrent ML. Исследователи языка программирования иногда разочарованы тем, что Go не взял больше последних идей из литературы, но эти идеи просто не успели пройти через фильтр практического опыта.

Есть ли в Go особенности, которые имеют важное значение на практике, но недооценены в научной литературе?

Расс: Я думаю, что исследователи  иногда недооценивают практическую важность простоты и предсказуемости в функции языка, особенно в неправильных программах.

Возьмем один пример, вывода типа Хиндли-Милнера очень понятен, и, как правило, принимается на языке программирования сообщества как хорошая особенность. Но новые программисты ML неизбежно попали в ситуацию, когда изменение одной части программы вызывает загадочную ошибку в, казалось бы, не связанной части. Решение состоит в том, что на практике пишут тип подписи для большинства функций. Хиндли-Милнера не так хорош на практике. В Go единственным логическим выводом типа является то, что если вы говорите var x = e, то x происходит от e. Это правило является простым и предсказуемым и не страдает от более сложных алгоритмов логического вывода. 

Самир: Акцент на разработке программного обеспечения является столь же важным и часто упускается из виду. Например, Go поддается машинной трансформации. Мы использовали это для обеспечения автоматического форматирования и обновления импорта строк исходного файла. В результате программисты Go  просто написали свой ​​код, а инструмент обновляется по мере необходимости , чтобы получить необходимы пакеты. Мы работаем над новыми инструментами для автоматического упрощения кода и функциональным изменением подписей для запросов данных в области видимости. Эти функции позволяют масштабировать Go до большого объема кода и больших команд, позволяя нам продолжить улучшение качества существующего кода, даже после того, как разработчики перешли на другие проекты.

Каковы нынешнее состояние языка, краткосрочные и долгосрочные цели?

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

Наш краткосрочный акцент делается на улучшении выполнения и решений Go работать в большем количестве мест. Недавно мы превратили компилятор С в Go (механически), и теперь мы раздумываем о добавлении SSA- оптимизации. В режиме исполнения, основной акцент делается на реализации параллельной сборке мусора с ограниченным паузами. Мы также смотрим на то, чтобы пойти работать для всех тех мест, из  которые люди сегодня выполняют код: от сетевых серверов до мобильных устройств.

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

Какие основные уроки, которые вы узнали (о чем-либо вообще!), работая над Go?

Самир: Небольшая, высококвалифицированная команда с несколькими талантливыми дизайнерами лучше, чем большая команда с большим количеством мнений. Небольшой, полезный язык с несколькими мощными функциями лучше, чем большой язык с большим количеством функций. Большое значение в сохранении компактности языка: это делает код гораздо более читабельным,  простым для написания и поддержки, так как существует меньше разумных способов выполнения задачи.

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