Метаморфозы Go: сможет ли язык одолеть Python и Java?

Kate

Administrator
Команда форума
Мы продолжаем публиковать выдержки из дискуссий экспертов, которые обсуждали наиболее важные тренды в IT. Эти встречи проводились *instinctools в рамках проекта «Техпора», и одна из бесед касалась развития языка программирования Go. Правильно ли считать Go перспективным языком и что в нем и экосистеме изменилось за последнее время?

Фото instinctools.ru
Фото instinctools.ru
На эти и другие вопросы отвечали Алексей Палажченко – гофер со стажем, организатор митапа 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. Язык повзрослел и заматерел, если можно так сказать. Из последних релизов я бы выделил нормальный, официальный релиз модулей.

Фото Google.com
Фото Google.com
Алексей Палажченко: В ближайшем релизе будут крупные изменения в самом языке. А до этого пока идет подготовка. Самые крупные изменения – это то, что 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 работает неплохо.

 Фото https://www.iphones.ru
Фото https://www.iphones.ru

«Все думали, что Go будет «убийцей» С++»​

Олег Ковалев: На самом деле, когда язык публиковался в 2007-2008 годах, все постоянно говорили, что авторы языка страдали от того, что в будущем будет использоваться С++. И все думали, что Go будет «убийцей» С++, поскольку Google почти весь написан на C++, и авторы нового языка это упоминали. Но как показала практика, в Go перешло больше скриптовых разработчиков с Python, Perl и Ruby. В итоге C++ остался на месте, поскольку язык заменить сложно в силу его возможностей. И применение Go перешло больше в web. Еще одна причина бума Go – это наличие стандартных пакетов с реализациями HTTP- и TCP-серверов. Ты можешь писать любой http-сервер, почти все для этого есть. Может, нет роутера, но зато есть 30 версий на GitHub и всегда была возможность выбрать что-то лучшее. Недавно вышла статья, как выбрать роутинг для своего проекта, и там была целая схема по подбору.

«В Go давно есть дженерики»​

Алексей Палажченко: В Go давно есть дженерики, и через них можно делать 90% того, что в других языках сложно. Дженерики – это интерфейс и набор методов. Взяли какую-то функцию, которая принимает интерфейс, и подсовываете ей все что угодно. Но в языке на базовых типах нет методов. Нельзя взять и написать какой-то универсальный контейнер или map, который сохраняет порядок вставки элементов. Дальше у нас есть несколько вариантов. Можно одну и ту же имплементацию скопировать и отредактировать 20 раз, для всех базовых типов. Можно завернуть это в интерфейс и каждый раз при вставке элемента из коллекции заворачивать и разворачивать. Это менее эффективно в рантайме, конечно, но зато не нужно писать реализацию. И есть третий вариант с применением дженериков, когда в компиляторе у нас все будет тормозить, зато в рантайме все будет эффективно. Дженерики – это не только красиво, но и еще влияет на производительность. Конечно, все механизмы так или иначе влияют на производительность, причем либо это производительность программистов, либо производительность компилятора и рантайма. Текущая спецификация дженериков не диктует вариант реализации. Чисто технически можно сделать такие дженерики, которые будут полностью в рантайме работать. Но текущая реализация пока вся в компиляторе.

 Фото https://www.geeksforgeeks.org
Фото https://www.geeksforgeeks.org

«Переносить 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, то у них пересечение крайне малое.

Полную версию дискуссии вы можете посмотреть тут.

 
Сверху