golang

Интервью Роберта Пайка про Go

  • вторник, 2 апреля 2024 г. в 00:00:09
https://habr.com/ru/articles/797665/

Первого января 2024 года Роберт Пайк дал интервью Medium.

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

Вот полная и нередактированная запись интервью - это не похоже на обычные запланированные вопросы/ответы.

Вам наверняка покажется это интересным.

Интервьюер. Прошло больше десятка лет с тех пор, как Вы изменили мир разработки программного обеспечения. Что Вы теперь чувствуете, оглядываясь назад?

Пайк. Вообще-то я вспоминал те времена как раз перед тем, как Вы приехали. Помните - все писали на PHP сайты, и проблема была в том, что все это делали чертовски замечательно. Онлайн-курсы тоже чертовски замечательно рекламировали "войти в айти". Это привело к понижению компетенции. Подчеркну - "компетентные" специалисты выпускались с феноменальной скоростью, два месяца и ты сеньор. Это и породило проблему.

Интервьюер. Проблему?

Пайк. Да, проблему. Помните когда все писали сайты на Perl?

Интервьюер. Конечно, я тоже это делал.

Пайк. Ну вот, в начале эти ребята были как боги. Им платили кучу денег и относились как к королям.

Интервьюер. Да уж, вот это были времена...

Пайк. Именно. Ну и что же случилось? Расмус решил сделать домашнюю страничку. Попробовал Perl - медленно. Попробовал C - сложно. И сделал шаблонизатор HTML. Так любой HTML верстальщик внезапно оказался PHP программистом и их стало до ужаса много.

Интервьюер. Вот так и я вылетел из сферы разработки сайтов на Perl. В течение десятка лет зарплата упала настолько, что даже журналистом можно было зарабатывать больше...

Пайк. Точно. То же самое потом случилось уже и с программистами, писавшими на PHP.

Интервьюер. Понятно, ну и что же Вы все-таки хотите этим всем сказать?

Пайк. Однажды я сидел у себя в офисе, и мне пришла в голову небольшая идейка, как хоть немного восстановить баланс. Я подумал: интересно что же было бы, если бы был язык программирования с такими широкими возможностями и такой сложный для изучения, что никто бы уже не смог заполнить рынок толпой программистов, пишущих на этом языке? У меня уже были тогда кое-какие мысли по этому поводу. Вот, знаете наверное, C++. У него есть все ингредиенты, которые мне были нужны - комплексный синтаксис, неявно определённые сложные для понимания мрачные функции с сокращёнными именами, настоящая объектно-ориентированная структура. Даже сейчас только единицы полностью знают синтаксис C++.

Интервьюер. Шутите?

Пайк. Ничуть. Есть еще одна проблема. На PHP через некоторое время появилась возможность писать бэкенд - это значило то, что любой программист, пишущий на PHP, мог очень легко стать бэкендером. Помните сколько обычно зарабатывали большинство бэкендеров?

Интервьюер. Да, я же ведь тоже этим занимался.

Пайк. Так вот, этот новый язык должен был отделять себя от операционной системы путем скрывания всех системных вызовов. Тогда ребята, которые только бэкенд и умели, получили бы возможность писать фронтенд, под "мобилки", под самолёты и космические корабли.

Интервьюер. Не верится в то, что Вы это сказали...

Пайк. Ну, Go развивается уже достаточно долго, и такая возможность сейчас появилась. Но сейчас, когда на Go пишут все и подо всё — настало время перейти ко второй части моего плана. Помните же, я говорил про сложный язык?

Интервьюер. Но Go не сложный.

Пайк. Конечно. Но увеличение сложности - не за горами. Я считаю дженерики одним из первых успешных достижений в этом плане. А новый принцип обработки ошибок? А микросервисы, из которых состоит любая система на Go? Любой человек, даже с половиной мозга, может понять что микросервисы контр-интуитивны, нелогичны и неэффективны.

Интервьюер. Что?

Пайк. Когда Вы слышали, чтобы хоть одна компания переиспользовала написанный микросервис со специфичной бизнес-логикой?

Интервьюер. Ну, вообще-то не слышал, но...

Пайк. Вот так-то. Некоторые, кстати, пытались. Была такая компания из Санкт-Петербурга - Озон [примечание переводчика: переведено согласно российским реалиям], в которой просто заболели тем, что пытались переписать всё что можно на Go и микросервисах. Я на самом деле им сочувствовал, но думаю, что люди по крайней мере, научились чему-то на их ошибках.

Интервьюер. Очевидно у них ничего не вышло?

Пайк. Вообще ничего. Но было бы сложно объяснить держателям акций компании ущерб в 4 миллиарда рублей и вот, надо отдать им должное, они все-таки заставили это работать в итоге.

Интервьюер. Так все-таки у них получилось? Это доказывает что микросервисы работают.

Пайк. Почти. IT отдел получился таким огромным, что только коммуникации по согласованию спецификаций API между множеством отделов на 3000 сотрудников отнимают львиную долю времени. Я думал, что это станет камнем преткновения, но это никого особенно не заботило. Мендеджмент был только рад управлять такой толпой людей.

Интервьюер. Но ведь IT менеджмент с тех пор прошёл уже большой путь - все эти команды, лиды, спринты.

Пайк. На самом деле? Попробуйте согласовать обратно несовместимое изменение API какого-нибудь финансового микросервиса в подобной компании. Только для того, чтобы собраться и обсудить ваше предложение - поставят задачу в джиру, её в спринт, да и то - в следующий спринт, этот уже занят. Или нет, лучше через спринт. Или через два. А там дальше и планнинг покер - «Кажется, он хочет обсудить ересь. 14 сторипойнтов». Не правда ли, забавно смотреть на это?

Интервьюер. Да, но Go, в общем, вполне нормальный язык.

Пайк. Вы в это так верите? Пробовали ли вы когда-нибудь сесть и сделать ревью микросервиса на Go, с нуля написанного джуном? Во первых, я расставил достаточно ловушек, чтобы просто так работали только тривиальные проекты. Во вторых, сама разработка. Для начала согласовали спецификации API. Каждый начинает писать свой микросервис. Для других микросервисов пишутся «моки». Под конец «со всем этим пытаются взлететь». А теперь попробуйте соединить все эти микросервисы в единое целое, особенно если у вас их больше трёх. Казалось бы достаточно убрать «моки» и переключить адреса API на реальные микросервисы? Боже, я иногда не могу удержаться от смеха, когда слышу о проблемах, когда даже две команды не могут сделать так, чтоб их микросервисы общались между собой по API.

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

Пайк. Не совсем так. У каждого есть его выбор. Я не предполагал, что всё это так выйдет из-под контроля. Но всё-равно, практически всё у меня получилось. Go cейчас в топе, а труд программистов продолжает нормально оплачиваться - особенно тех, кто имеет дело со всей этой чепухой - вы же понимаете, что невозможно работать эффективно с большим программным проектом на Go, если не вы сами его написали.

Интервьюер. Как это?

Пайк. Не понятно что-ли? Помните всё те же микросервисы, про которые я говорил?

Интервьюер. Конечно.

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

Интервьюер. Значит, Вы утверждаете, что Вам все, что Вы хотели удалось...

Пайк. Ну, вспомните, сколько занимает реализация интернет-магазина среднего размера на PHP? Это около 6 месяцев для 2-3 человек. Не достаточно долго чтобы парень с женой и детьми мог заработать себе на нормальное существование. Попробуйте тот же проект реализовать на Go, и что получится? Вам понадобится 1-2 года и 20 человек. Не правда ли, это замечательно? Кроме этого: из университетов уже так давно выходит мало «инженеров-программистов», что теперь рынок заполнили разработчики после онлайн-курсов. Как вы думаете: сколько парней смогут сообразить что делать с 'err' , после того как их научили только 'if err != nil return err' и никогда не заботились о проверке ошибки? Большинство программистов на Go только выбрасывают эту ошибку «наверх» и «а, 'наверху' разберутся».

Интервьюер. Ладно. А микросервисы? Они ведь на самом деле сохраняют много времени?

Пайк. Нет, я же говорил... Замечали, в чем разница между стадиями планирования проектов на PHP и Go? Для проекта на Go эта стадия в три раза дольше. Время уходит на то, чтоб убедиться что всё что надо микросервис возвращает, а всё что не надо - нет. И все-равно без ошибок не обходится. Кто слышал когда-нибудь об утечке памяти в сайте на PHP? Теперь нахождение этих утечек в программах на Go - целый труд. Большинство лидов сдаются, так и закрывают спринт, зная что утечка памяти существует.

Интервьюер. Но есть различные программные инструменты...

Пайк. Большинство из которых написаны на Go.

Интервьюер. Если мы опубликуем все это, то Вас просто могут линчевать, понимаете?

Пайк. Сомневаюсь. Как я сказал Go сейчас на пике популярности. Все компании без раздумий выбирают Go для проекта, а если начинаются проблемы, то они думают что дело в людях, зарплате, менеджменте. Но сообразить, что всё дело в языке программирования - им не приходит в голову. Ну, так им и надо, они заслужили это. Знаете, я пытался убедить Линуса Торвальдса переписать Linux на Go.

Интервьюер. О Боже. И что же он сказал?

Пайк. К счастью, у него присутствует хорошее чувство юмора. Я думаю, он уже давно понимал что я делаю. Он ответил, что может мне помочь переписать главную страницу Google на Go, если я захочу. Ну ту, которая со строкой ввода и кнопкой поиска.

Интервьюер. Ну и как? Вы захотели?

Пайк. Я дал эту задачу стажёрам. Спустя полгода они закончили обсуждение по выбору библиотеки логгирования. Думаю, ещё на пару месяцев их займёт выбор библиотеки http роутинга. А количество микросервисов на настоящее время уже превысило 30. Всё это просто летает на кластере Кубернетеса из 10 нод и всего 15 нод под распределённую СХД.

Интервьюер. На что же это похоже в рамках всего Google?

Пайк. Вы, очевидно, шутите. Видели же вы, что Google разрабатывает своё серверное железо? Как думаете, для чего? Я думаю об этом как о своем величайшем успехе.

Интервьюер. Знаете, эта идея насчет Linux на Go заставила меня задуматься. Ведь где-то может сидеть парень, которому придет в голову сделать это...

Пайк. Но не после того, как он прочитает это интервью.

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

Пайк. Но это же история века. Я просто хотел чтоб мои приятели-программисты помнили меня за то, что я для них сделал. Знаете как сейчас оплачивается программирование на Go?

Интервьюер. Последнее, что я слышал - настоящие профессионалы зарабатывают 1кк в наносекунду.

Пайк. Понимаете теперь? И я уверен, что они заслуживают этих денег. Отслеживание всех этих ловушек, которые я встроил в Go - не лёгкая работа. И, как я говорил раньше, каждый программист на Go чувствует себя обязанным следовать Go best practices и что он должен использовать все эти десятки библиотек, выстраивать сложнейшую микросервисную архитектуру для разработки тривиальнейшего проекта. Вообще это и меня часто раздражает, даже тогда, когда это служит моим целям. Но сейчас, когда прошло столько времени, мне уже начинает нравиться этот язык...

Интервьюер. Имеете ввиду, что раньше Вам Go не нравился?

Пайк. Ненавидел его. Он даже выглядит неуклюже, вы не согласны? Но вот когда мне стали поступать отчисления от издания книг про Go... вот, тогда-то я и увидел полную картину.

Интервьюер. Погодите, а как насчет передачи данных по указателю? Вы подтверждаете, что сделали это для возможной оптимизации кода? Конечно, важно исключать преждевременную оптимизацию и вот это всё.

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

Интервьюер. Обычно на этой стадии я говорю 'большое спасибо за интервью', но сейчас это было бы как-то не к месту.

Пайк. Пообещайте мне, что опубликуете это.

Интервьюер. Я извещу Вас, но мне кажется, что я знаю, что скажет мой редактор по этому поводу.

Пайк. А все-равно, кто этому поверит? Кстати, не могли бы вы мне прислать копию этой записи?

Интервьюер. Это я могу.