Привет, Хабр! Валерий Линьков — эксперт 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 два недостатка, про которые писали все, кому не лень. 

  1. Golang — это новый язык программирования. История C начинается с 1970-х, а С++— с 1985-х, С# — с 2000-х, Java — тоже существует давно и у него 3 млн пользователей. А Golang появился только в 2009 году. Но зато его делают ребята из Google. При этом игр на относительно юном Unity просто баснословное количество, а приложений на C# — ещё больше. Поэтому проблемы в молодости Golang лично я не видел. 

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

Есть прикольная статья 2023 года, суть которой в том, что Python — это лёгкий язык программирования, но не простой язык программирования. На Python спокойно можно реализовать ООП, и оно будет прекрасно работать. А Go — это простой язык программирования, но ни разу не лёгкий. И вот «лёгкий» и «простой» — это разные вещи. Объясню эту мысль.

Вот код, написанный на Python, совершенно простой словарик, ничего сложного, ничего страшного.

А вот словарик на Golang. Суперлегко? — Мне так не показалось. 

Я начал замечать что, с одной стороны, в Python 33 ключевых слова, которые нужно выучить, а в Golang их 25. И вроде бы это действительно проще, всё работает классно. Но даже из двух примеров кода выше можно предположить, две простые вещи.

  1. В Python весь код — это две строки: строка температур и строка фильтрации. Смысл Python заключается в том, чтобы ты мог написать over-большую команду, вместить в неё множество значений и отправить на сервер. Она будет прекрасным образом выполнена, потому что ты можешь задать все необходимые параметры, работать хоть с Active Directory, хоть с Linux, хоть на любом интерпретаторе — проблем не возникнет. 

Есть клуб любителей поставить после массива температур точку с запятой и написать всё в одну строчку. Тогда читабельность кода упадёт куда-то в стратосферу, но, тем не менее, это возможно, и этим можно пользоваться. 

  1. 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, тебе, по сути, это нужно создать. Прям целиком, без мам, пап и кредитов, чуть ли не с ядра системы. А ещё из-за проблем с VC-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 без каких-либо книжек. 

Комментарии (44)


  1. kozlov_de
    09.09.2024 15:36
    +43

    листал, ждал когда вода закончится и мясо пойдет, статья и закончилась

    хорошо, что статья короткая, спасибо


    1. pin2t
      09.09.2024 15:36
      +13

      Видимо в Skillbox и обучение такое, как минимум у этого эксперта. Бла-бла-бла и ничего конкретного. Где туу опыт неудачного переезда с Python на Go тоже не понял


      1. darovska_online Автор
        09.09.2024 15:36

        ну человек — дипломированный специалист Cisco, почему он не может быть экспертом? У него экспертиза в сетях, он сетевой архитектор и вот он поковырял Go и сложил такое мнение в процессе, при этом про преимущества Golang он тоже пишет. :)


        1. GreyN
          09.09.2024 15:36
          +3

          что такое "дипломированный специалист Cisco"?
          что такое CCNA, CCNP, CCIE и CCAr - понятно (только еще область надо указать). Причем, тест на CCNA способен сдать любой человек, который просто умеет читать.

          что такое "дипломированный специалист Cisco" - вообще не понятно.


      1. valerylinkov
        09.09.2024 15:36

        "Бла-бла-бла" — это объяснение. Если нужна конкретика, то peer-to-peer сеть — это единственное, что можно написать на GO с реальной особенностью языка, а больше делать в языке нечего. Это ИМХО. Я не настаиваю на этом. Если есть желание, я готов совершенно бесплатно и без Skillbox подискутировать с Вами, вижу Вы истинный эксперт в вопросе, так что наша дискуссия будет интересной.


    1. darovska_online Автор
      09.09.2024 15:36

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


      1. qrKot
        09.09.2024 15:36
        +1

        "Человек и сетевой инженер" взял не подходящий для его задач инструмент и жалуется, что инструмент ему не понравился. Про задачи, где Go подошел бы идеально, человек и инженер пишет какую-то оторванную от реальности околесицу (впрочем, как и про назначение той же Java). И про стек сбера и тбанка он странное пишет - Go у них отлично применяется.

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


    1. darovska_online Автор
      09.09.2024 15:36

      Плюс статья в разделе «Мнения», а не кейсы, поэтому тут именно мнение


  1. valerylinkov
    09.09.2024 15:36

    Если бить — не надо :)


  1. RandomVertex
    09.09.2024 15:36
    +8

    Закончил чтение статьи на моменте, когда персонаж назвал себя экспертом.


    1. WLMike
      09.09.2024 15:36
      +8

      Повезло - я дочитал до конца, все надеялся


    1. valerylinkov
      09.09.2024 15:36

      Закончил с тобой общение на слове "персонаж"


  1. NeoCode
    09.09.2024 15:36
    +10

    Главная проблема языков типа Python и PHP с моей точки зрения - это отсутствие статической типизации и отсутствие явного объявления переменных. То есть достаточно просто написать

    foo = 10

    и у нас готовая новая переменная. Или не новая, а измененная старая. Понимаете? Одна маленькая опечатка в имени и... всё будет замечательно работать. Но неправильно. И это неправильно может вылезти не сразу, а очень нескоро и в самом неожиданном месте. Вот эта особенность была для меня просто как нож по горлу. И языки типа Python и PHP вызывали у меня, С/С++ программиста, абсолютно устойчивое неприятие. Кто-то скажет что это мелочь, но для меня это - фундаментальный дефект дизайна языка.

    Но потом появился Go. И оказалось что это ровно то что нужно, как глоток свежего воздуха. Простой высокоуровневый (в отличие от того же С++) язык, куча библиотек, и переменные объявляются явно, ровно так как надо! В общем теперь многое, главным образом всякие утилиты и программы для работы с сетью, пишу на Go.


    1. valerylinkov
      09.09.2024 15:36

      Тут согласен. Статическая типизация решает, а с Python можно получить кучу глюков внутреннего пробрасывания переменных. Действительно, это большая проблема, а Go её решил. Лично для меня это был прикольный момент, но в процессе я выбрал C# (так как я могу сделать бОльшее), а не Go (хотя с ним можно тоже поиграть с теми же вопросами). Но тут уж на вкус и цвет, но статическая типизация — однозначный плюс