Мы продолжаем публиковать выдержки из дискуссий экспертов, которые обсуждали наиболее важные тренды в IT. Эти встречи проводились *instinctools в рамках проекта «Техпора», и одна из бесед касалась развития языка программирования Go. Правильно ли считать Go перспективным языком и что в нем и экосистеме изменилось за последнее время?
На эти и другие вопросы отвечали Алексей Палажченко – гофер со стажем, организатор митапа Golang Москва и конференции GopherCon Russia, ведущий воркшопов и подкаста Golang Show, Илья Данилкин – Tech Lead команды кластера Авто, Авито, Олег Ковалев – Senior Software Engineer, ведущий подкаста GenericTalks, Сергей Новацкий – ведущий разработчик и куратор Go-направления в *instinctools.
Go – это довольно молодой язык, но tooling стремительно меняется
Алексей Палажченко: Если мы сравниваем Go с Java, я бы сказал, что Go совсем молодой язык. Ему недавно исполнилось 15 лет. Поэтому нельзя сказать, что он радикально менялся и что есть legaсy, как на Java, и нужно все переписать на новые стримы. Но при этом tooling стремительно меняется, несмотря на то, что сам язык остается стабильным. И если вы сейчас возьмете какую-нибудь программу, написанную на Go 1.0, то вы ее, конечно, соберете. Но запустить компиляцию в каких-то случаях будет уже сложно, не говоря уже про интеграцию с языком С и так далее.
Илья Данилкин: Изменился даже сам стиль языка. То, что мы считали нормальными паттернами в 1.6 или 1.5, сейчас будет восприниматься несколько дико. От реализации зависимостей от вендоров потихоньку переехали к другим решениям. Появились нормальные IDE. Язык повзрослел и заматерел, если можно так сказать. Из последних релизов я бы выделил нормальный, официальный релиз модулей.
Алексей Палажченко: В ближайшем релизе будут крупные изменения в самом языке. А до этого пока идет подготовка. Самые крупные изменения – это то, что Go test может выводить наконец-то json. Произошли ещё и улучшения в testing framework. Теперь можно создавать временные каталоги. Но это все же мелочи, которые говорят о стабильности языка Go и его консервативности, вплоть до следующего релиза.
«Go не претерпел настолько больших изменений, чтобы приходилось делать LTS»
Сергей Новацкий: Каждая мажорная версия Go поддерживается ровно год. И непонятно, почему нет долговременных LTS-версий. Не закрывает ли это дорогу в корпоративный сегмент рынка? Может быть, Go нашел бы больше применения в корпоративной сфере при наличии долгосрочной поддержки?
Алексей Палажченко: Мажорная версия Go – это Go 1. Все, что сейчас выходит, – это минорные версии. И это во многом объясняет, почему нет LTS. И у меня нет уверенности, что версия поддерживается только год. Да, официально поддерживаются текущая и предыдущая версии языка. Но случаи, когда есть поддержка и более старых версий, все же есть. Кстати, что касается LTS, недавно была инициатива по созданию LTS, чтобы улучшить использование Go в корпоративном секторе. И эту инициативу все «заминусовали», потому что решили, что Go и так используется в энтерпрайзе и не нужно формировать сообщество для деления на две части: одна, которая сидит на Java 8, вторая – на Java 17. Да и в целом LTS-релиз у нас есть – это Go 1. После этого релиза язык стабилен. Да, тулинг меняется, поэтому могут быть сложности с запуском компиляции. Но в любом случае исходный код может быть скомпилирован.
Илья Данилкин: Язык не претерпел настолько больших изменений, чтобы приходилось делать LTS. То, что фиксы для CVE не выходят или выходят редко для старых версий, – это проблема. Но это подстегивает к обновлению хотя бы до последней, текущей поддерживаемой версии. Я поработал в нескольких разных компаниях, которые разрабатывали на Go как на основном языке.
«На мобильных устройствах Go плохо приживается»
Алексей Палажченко: Вначале Go позиционировался как язык для системного программирования. Но то, что авторы Go имели по этому поводу в виду, – это не то, что думал о Go весь мир. Авторы заявили, что написали язык для «системного программирования». Разработчики удивились, но после выяснилось, что в Google системным программированием называется язык для разработки систем. Получается, что Go – это язык для разработки больших, распределенных, отказоустойчивых систем. Но опять Go меняется, и теперь мы начинаем на этом языке писать целиком операционные системы. И делаем это без больших проблем. Но на мобильных устройствах Go плохо приживается. Хотя уже начали появляться нативные Go-реализации для ML. Сейчас перспективы использования Go на микрокомпьютерах значительно выше, чем на мобильных устройствах. Я, конечно, считаю, что Raspberry Pi – это уже давно не микрокомпьютер. У меня как раз стоит последний Raspberry Pi, и на нем крутится Kubernetes. Он такой монстр, что мощнее моего компьютера, который был у меня несколько лет назад. И даже если брать минимальный Raspberry Pi, например Raspberry Pi Zero, все равно там Go работает неплохо.
«Все думали, что Go будет «убийцей» С++»
Олег Ковалев: На самом деле, когда язык публиковался в 2007-2008 годах, все постоянно говорили, что авторы языка страдали от того, что в будущем будет использоваться С++. И все думали, что Go будет «убийцей» С++, поскольку Google почти весь написан на C++, и авторы нового языка это упоминали. Но как показала практика, в Go перешло больше скриптовых разработчиков с Python, Perl и Ruby. В итоге C++ остался на месте, поскольку язык заменить сложно в силу его возможностей. И применение Go перешло больше в web. Еще одна причина бума Go – это наличие стандартных пакетов с реализациями HTTP- и TCP-серверов. Ты можешь писать любой http-сервер, почти все для этого есть. Может, нет роутера, но зато есть 30 версий на GitHub и всегда была возможность выбрать что-то лучшее. Недавно вышла статья, как выбрать роутинг для своего проекта, и там была целая схема по подбору.
«В Go давно есть дженерики»
Алексей Палажченко: В Go давно есть дженерики, и через них можно делать 90% того, что в других языках сложно. Дженерики – это интерфейс и набор методов. Взяли какую-то функцию, которая принимает интерфейс, и подсовываете ей все что угодно. Но в языке на базовых типах нет методов. Нельзя взять и написать какой-то универсальный контейнер или map, который сохраняет порядок вставки элементов. Дальше у нас есть несколько вариантов. Можно одну и ту же имплементацию скопировать и отредактировать 20 раз, для всех базовых типов. Можно завернуть это в интерфейс и каждый раз при вставке элемента из коллекции заворачивать и разворачивать. Это менее эффективно в рантайме, конечно, но зато не нужно писать реализацию. И есть третий вариант с применением дженериков, когда в компиляторе у нас все будет тормозить, зато в рантайме все будет эффективно. Дженерики – это не только красиво, но и еще влияет на производительность. Конечно, все механизмы так или иначе влияют на производительность, причем либо это производительность программистов, либо производительность компилятора и рантайма. Текущая спецификация дженериков не диктует вариант реализации. Чисто технически можно сделать такие дженерики, которые будут полностью в рантайме работать. Но текущая реализация пока вся в компиляторе.
«Переносить Python в Go – это не совсем правильная логика»
Олег Ковалев: Я бы дал новичкам в Go следующий совет: нужно знать три папки. Это «cmd», где должен лежать тот файлик, который «говорит»: «тут main, я что-то сделаю – и он запустится». Потом должна быть папка, где «что-то запустится». Я пошел против системы и называю это «app», или «application». И третья папка – это «pkg», все пакеты, которые никак не связаны с бизнес-логикой, но при этом являются полезными. Я описал минимум, который нужно иметь в проекте и с которым можно стартовать. Потом, по мере роста проекта, вы сами догадаетесь, чего не хватает. Надо начинать с чего-то малого, есть много проектов, когда люди переходили с Python, Ruby и Java и применяли опыт другого языка. И они считали, что Go – это плохой язык, много кода, интерфейсов и не всегда понятно, зачем это нужно. И тут нужно понимать, что переносить Python в Go – это не совсем правильная логика. Лучше сделать шаг назад, начать с более простого, а потом уже набраться опыта.
Go идет, сбивая конкурентов типа Python и Java
Олег Ковалев: Язык входит в период зрелости. На нем специализируются уже много компаний, растет комьюнити, количество вакансий. Язык показал, что, даже используя один вид цикла и без возможности дженериков, ты можешь построить огромный бизнес, большие команды и интересные проекты. Все идет к тому, что язык продолжает идти по накатанной дороге, сбивая конкурентов типа Python и Java. Конечно, конкуренция не такая острая, ведь и упомянутые языки развиваются, есть новые вакансии и проекты.
Алексей Палажченко: Будет больше простых и базовых проектов на Go в будущем. Там, где люди раньше бы применяли php как самый массовый язык, то сейчас там будет Go. Язык Go будет «есть» хлеб и Java, и php. Если говорить об угрозе Go со стороны Rust, то у них пересечение крайне малое.
Полную версию дискуссии вы можете посмотреть тут.
Комментарии (6)
Daar
23.03.2022 23:05Уже более 10 лет как начал писать на Go и уже редко использую Python, Java, PHP, node.js. Когда приходилось деплоить всего 1 бинарник на сотни серверов, меня по началу вводило в шок. Сильно присел, когда участвовал в проекте в нефтянке. Там оборудование было на базе плат типа raspberry и этих устройств реально было десятки тысяч и нужно было все опрашивать и апгрейдить. Дефолтный софт был написан на Java, но все было так медленно... вот психанули и переписали на Go, и многое стало пахать не то что в 2-5 раз быстрей, а наверно в десятки. Причем первоначально исполнитель был в пендосии, потом как-то хитро выкупили сырцы и набрали своих программеров. Точнее они были, но по другим ЯП, но им выдали учебники по Go. Помню даже 1Сникам всучили, типа: читайте, просвещайтесь, может тоже где примените и в 1С и она тоже начнет быстро работать :)
Большой минус, это писать десктоп приложения, нет нормальной поддержки GUI ОС, пока делаю приложения с вебмордами. Но тенденция развития языка нравится.
А так каждый ЯП это как инструмент, и каждому нравится свой набор инструментов для решения определенных задач. Хотя часто приходится видеть, когда из пушки херачат по воробьям :))))
schors
24.03.2022 11:27Меня немного смущает то, что дискуссия прямо сходу начинается с неверных предпосылок в принципе и из отрицания 30-летней истории языка. Все что обсуждается в этой вырезке - оно всё понятно, объяснимо и какие-то удивления (которые звучат в тексте) вызывает только если навесить всей этой истории того чего не было. Вот это всё "заматерел" и "позиционировался" не имеет ни малейшего отношения к реальности. И поэтому тулинг развивается и нестабильный (хотя офигенный), поэтому нет нацеленности на корпоративный сектор. Всё, от чего надо отталкиваться, это то, что это очень древняя, вынашиваемая десятилетиями, игрушка Пайка и Томпсона, на которую дали зеленый свет с деньгами. И дальше всё и раскручивается. Хотите мобильники, хотите корпоративный сектор - да пожалуйста. Но никто об этом не думал. Это была юношеская мечта, без вот этих глубоких привязок
gohrytt
- "... сможет ли язык одолеть Python и Java? ..."
- Зачем?
Alexrook
Заменить вряд ли сможет. Но в некоторых случаях плюсы очевидны. У меня на работе практически не реально добиться от админов установки чего-то «лишнего». Python и Java требуют наличия интерпретатора или виртуальной машины. Так, если я дома напишу какую-то утилиту под себя, я ее все равно не смогу запустить на работе. Go в этом плане выручает.
Borz
GraalVM вам в помощь
AlexGorky
Go компилируется в небольшой бинарник.
А как с размером при использовании GraalVM?