Привет, Хабр! Валерий Линьков — эксперт Skillbox, дипломированный специалист Cisco, автор статей о машинном зрении и математической обработке изображений. Более семи лет обучает студентов по всему миру. Ведёт телеграм-канал «Кудрявый микрофон». В рамках эфира в закрытом комьюнити Skillbox Code Experts Валерий рассказал про «священную войну» языков программирования и свой опыт неудачного переезда. Итак, поехали!
Битва черепах или зачем нужен Golang
Ещё в школе я изучал C++, хотя изучением это можно назвать с натяжкой, но неким знакомством — точно. Спустя годы я попал на работу в Samsung, где меня пытались обучить Java. Мне это очень не понравилось. Java, как я предполагаю, тоже — и мы расстались.
В процессе я стал сетевым инженером Cisco. А Cisco тогда топили за два языка: Python и C#. Python, потому что с ним легко взаимодействовать, он скриптовый, лёгок в изучении. А C# потому, что Cisco в то время кооперировались с Microsoft, а C# — это их проприетарная разработка.
Так что же меня побудило перейти на Golang? В то время я сидел на Python ещё версии 2.7.9 — это примерно 2017 год. Потом вышла версия Python 3. Оказалось, что несмотря на множество обещаний, что теперь всё будет работать из коробки, начались дикие конфликты при переходе с 2.7 на новую третью версию. Я тогда немного разочаровался и начал смотреть, что ещё есть интересное, чтобы поработать с сетями.
Спойлер: мы всё равно в итоге перешли на Python 3. Первое время работали через Power Shell, потому что Microsoft с Cisco сотрудничали и прекрасно работали вместе. А потом в Python исправили версию 3 и выкатили обновления в версиях 3.4, 3.5. Они сами признали проблемы при переходе и конфликт с 2.7 версией. В итоге 2.7 версию в какой-то момент убили и перестали поддерживать.
Но отмотаем назад: пока всего этого не произошло, я стал искать альтернативы. Под мои задачи всегда подходил Python. И в работе с Python я себя чувствовал примерно так: это огромная, очень добрая, очень хорошая, почти пушистая черепаха, но при этом ужасно неповоротливая. Очень тяжело с ней путешествовать, очень тяжело порой заставить её сделать то, что мне нужно. В то же время расширение PyPy разгоняло её очень сильно — условно, с 9 до 0,2 секунд. А ещё примерно тогда же появилась книга Наташи Самойленко «Python для сетевых инженеров», в которой как раз описано, как поставить конфигурации на те или иные сетевые устройства, как взаимодействовать с Active Directory и так далее.
В общем, прямых причин переходить на Golang у меня не было, если бы только не печальный опыт с Python третьей версии. Я считаю, что язык программирования имеет смысл выбирать под определенную нужду. И задумался, для чего нужен Golang?
Тогда в моей голове было чёткое деление на категории, одна из них — языки для написания приложений или драйверов под Windows. И если у тебя есть личная жизнь, то язык выбора C#, а если её нет, то C++ :). Если хочешь сделать огромный сервис по созданию чего бы то ни было, используй Java, с которым не возникнет никаких проблем. Если же хочешь решение проблемы, которое можно быстро сделать и показать, то Python.
Но зачем нужен Golang, я искренне не понимал. Считал, что это такое тотемное животное Google. Тогда обратился к статистике, и она показала активный рост Golang и что на его долю приходится 13,5% бэкенд разработки. Тогда я начал смотреть репозитории, чтобы понять, а что же на нём разрабатывают, но нашёл не так много интересного. Маркетинговая компания Golang была построена так: это такой же простой язык, как Python, но такой же производительный, как C#. Это заслуживает уважения и я решил попробовать.
Преимущества и недостатки Golang
Много попыток я потратил на то, чтобы сделать простую вещь — просто загрузить готовый конфигурационный файл на стоящий рядом роутер. Это оказалась не совсем простая задача. Расскажу почему, начну издалека
Golang — это компилируемый язык. Python — это интерпретируемый язык, соответственно, он медленнее, есть проблемы с интерпретатором, периодически интерпретатор может быть не совсем верно настроен и за счёт этого интерпретация языка может пойти не по плану.
Golang — это низкоуровневое программирование, что круто. Значит, можно подтягивать микросервисную архитектуру, делать параллельные вычисления. Go сразу предлагает встроенную поддержку параллельных вычислений. А ещё собирает мусор и это свойство маркетингово продвигается.
Но было у Go два недостатка, про которые писали все, кому не лень.
Golang — это новый язык программирования. История C начинается с 1970-х, а С++— с 1985-х, С# — с 2000-х, Java — тоже существует давно и у него 3 млн пользователей. А Golang появился только в 2009 году. Но зато его делают ребята из Google. При этом игр на относительно юном Unity просто баснословное количество, а приложений на C# — ещё больше. Поэтому проблемы в молодости Golang лично я не видел.
Ограничения. Go больше заточен под работу с сетевыми приложениями. Но в моем случае, когда я работаю с сетями, это тоже скорее плюс, чем минус.
Есть прикольная статья 2023 года, суть которой в том, что Python — это лёгкий язык программирования, но не простой язык программирования. На Python спокойно можно реализовать ООП, и оно будет прекрасно работать. А Go — это простой язык программирования, но ни разу не лёгкий. И вот «лёгкий» и «простой» — это разные вещи. Объясню эту мысль.
Вот код, написанный на Python, совершенно простой словарик, ничего сложного, ничего страшного.
А вот словарик на Golang. Суперлегко? — Мне так не показалось.
Я начал замечать что, с одной стороны, в Python 33 ключевых слова, которые нужно выучить, а в Golang их 25. И вроде бы это действительно проще, всё работает классно. Но даже из двух примеров кода выше можно предположить, две простые вещи.
В Python весь код — это две строки: строка температур и строка фильтрации. Смысл Python заключается в том, чтобы ты мог написать over-большую команду, вместить в неё множество значений и отправить на сервер. Она будет прекрасным образом выполнена, потому что ты можешь задать все необходимые параметры, работать хоть с Active Directory, хоть с Linux, хоть на любом интерпретаторе — проблем не возникнет.
Есть клуб любителей поставить после массива температур точку с запятой и написать всё в одну строчку. Тогда читабельность кода упадёт куда-то в стратосферу, но, тем не менее, это возможно, и этим можно пользоваться.
Golang не подразумевает , что всё будет написано в одну строку. И для себя я вычленил только два варианта, при которых имеет смысл переходить на Golang. Он быстрее. Согласно исследованиям, C# медленнее, чем Golang. Но, C# — это и не апостол скоростных языков. Java — гораздо быстрее.
Если у вас, например, большое приложение с кучей классов, которые между собой связаны, или даже несколько приложений, которые друг с другом не связаны и никоим образом не взаимодействуют друг с другом, их можно ускорить благодаря Golang. Просто потому, что можно спуститься на уровень вниз.
Но напомню, что в Python есть PyPy, который, по сути, делает то же самое. Это более узконаправленная вещь, которая переводит интерпретатор в очень условный компилятор. PyPy опускает код ниже, что ускоряет код .
Следующий код, который я покажу, как мне кажется, — апогей изучения Golang. Этот код не мой, а блогера на российском YouTube. Он создал сначала проект Hidden Lake, а лотом GoPeer — аналог CTM, Все его процессы выглядят примерно вот так. И всё это написано на Go.
То есть то, что я показал, действительно можно сделать на Golang. И, скорее всего, этим действительно будет удобнее управлять, если ваш проект нацелен исключительно под сети, их низкоуровневую часть.
Но в остальных случаях я полностью разочаровался в Golang. Я попался на маркетинговую историю, что он будет гораздо быстрее, чем все языки программирования, и подавно, чем Python. Но PyPy перечёркивает это преимущество.
А ещё далеко не всегда нам нужны быстрые решения. Быстрые решения нужны чаще всего либо на низкоуровневых драйверах, что Python не может делать, либо в сетях, что может.
Но на моей большой и дружелюбной Python черепахе я уже достаточно лихо катаюсь. Эта черепаха всё ещё медленная, но мой путь не настолько далек, чтобы это создавало реальные трудности. Достаточно взять книжку «Python для сетевых инженеров», открыть все скрипты и посмотреть, каким образом они взаимодействуют. Под любое устройство CISCO, под iOS — под всё, что угодно, мы можем вызвать терминал или командную строку. Для таких решений подходят Bash и PowerShell. Но смысл учить каждый отдельно? Понятно, что в каком-то виде мы овладеваем ими в процессе работы сисадмином. Но при этом нет никакой необходимости переходить с Python на какой-то из этих языков. И, в общем-то, Python снова победил.
Выводы
Если сравнивать Golang и Python, лично я не вижу никакого смысла в переходе. Для себя и своих задач, у вас может быть по-другому. Исключение — если я захочу создать собственную внутреннюю сеть или ускорить ту, что есть. Но, опять же, в этом может помочь PyPy. А если понадобится создать какой-то сервис, то можно использовать Java, C, C++, C#. Для чего же нужен Golang?
Создание сервисов. Если вы знаете только Python и больше ничего, то есть смысл выучить и Golang, чтоб создавать сервисы. Но если вы знаете хоть что-нибудь ещё — Java, C#, С++— Golang просто отваливается, потому что лично я не увидел ничего достаточно хорошего в примерах работы с ним.
DevOps. DevOps-инженеры сейчас смотрят на Java и Golang и им это действительно интересно. Ведь чтобы написать что-то на Java, тебе, по сути, это нужно создать. Прям целиком, без мам, пап и кредитов, чуть ли не с ядра системы. А ещё из-за проблем с VS-Code стало сложнее работать с Java, а переходить на Eclipse для многих — ад. Для Golang же есть множество DE, плагинов, которые позволяют легко и комфортно с ним работать. Но с другой стороны даже «СберТех» создав собственную DE ещё не добавили туда Golang, зато добавили Python и Java. Понятно, что они делали её прежде всего для собственных потребностей и Golang в их число, видимо, не вошёл.
Высокие нагрузки. Если речь про высоконагруженную систему, веб-сервер, где большое количество клиентов, то выбор будет 100% в пользу Go. Тем не менее у «Сбер», «Альфа», «Т-банк» вся архитектура построена на Java, и я думаю это не случайно. Но есть нюанс — много внимания они уделяют мобильной разработке, а она удобнее на Java. Сетевой высоконагруженный сервис же удобнее строить на Go.
Работа с legacy. Ещё один плюс Go — статическая типизация. В Python без неё бывает безумно сложно разобраться в коде, который разрабатывался несколько лет назад. А статическая типизация Go позволяет приводить в порядок код и читать его даже спустя многие годы. Но в скриптовых историях Python даст 100 очков форы вперёд просто за счёт удобства и скорости реализации решения. В Python можно писать сложные вещи, даже если кодовая база растет. Но есть узкое горлышко — это подход людей к написанию.
Бонус. А ещё в Go есть Go tour — если вы ранее уже изучали какой-нибудь язык, то просто переходите на веб-сайт и проходите курс по изучению синтаксиса Go без каких-либо книжек.