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

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


  1. kozlov_de
    09.09.2024 15:36
    +26

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

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


    1. pin2t
      09.09.2024 15:36
      +7

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


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

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


        1. GreyN
          09.09.2024 15:36
          +1

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

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


      1. valerylinkov
        09.09.2024 15:36
        +1

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


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

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


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

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


  1. valerylinkov
    09.09.2024 15:36
    +1

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


  1. RandomVertex
    09.09.2024 15:36
    +6

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


    1. WLMike
      09.09.2024 15:36
      +5

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


    1. valerylinkov
      09.09.2024 15:36

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


  1. NeoCode
    09.09.2024 15:36
    +5

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

    foo = 10

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

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


    1. valerylinkov
      09.09.2024 15:36

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


  1. ollegio
    09.09.2024 15:36
    +3

    В примере со "словариком" что-то мне стало непонятно - допустим, в питоне это был массив "словариков", но в го - это уже массив структур. Можно было бы в го сделать массив мап map[string]any, и было бы так же коротко - только типизации бы не было - причем так же, как и в питоне. По хорошему, надо было бы и в питоне объявить структуру (класс), иначе тот, кто будет такой код за вами поддерживать - вам спасибо не скажет.

    Присоединюсь к остальным комментаторам, примеров перехода с питона на го в статье я так и не увидел

    Несколько раз упоминается PyPy, но было бы здорово увидеть конкретные примеры, где он делает "то же самое" - так же быстро? Или может быть даже быстрее? Может всё-таки зависит от ситуаций применения?


    1. valerylinkov
      09.09.2024 15:36
      +1

      Тут согласен. Я не пытался сравнить два кода (это издевательство над обоями языками, как по мне), но если брать пример со словариком — да. Но есть Java. Зачем Go, если есть ява? Та же структура и тот же подход к проектированию.

      С вопросом про PyPy. Оставлю ссылку на статью и гифку оттуда. Это просто понижение языка с интерпретируемого на компилируемые части:

      Разгон дикий


      1. gudvinr
        09.09.2024 15:36

        Не очень понятны условия работы. Это в обоих случаях чистый запуск без кэшей?

        А если pycache всё-таки будет? Разгон тоже дикий будет?

        А если это I/O bound операции, вроде обработки HTTP API, насколько влияние pypy становится существенным?

        Даже на сайте pypy не все тесты выполняются быстрее cpython.

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


  1. ignatfomenko
    09.09.2024 15:36
    +4

    Вот поэтому и начинать жизнь программиста с питона вредно. Трудно переходить на другие языки. Мне лично с С++ и с Java переход на Go не составил особого труда.


    1. valerylinkov
      09.09.2024 15:36

      Ну да. Это правда. Тут как с механикой и автоматом. Научился одному — второе подтянется, но это работает только в одну сторону :)


  1. Kahelman
    09.09.2024 15:36
    +1

    Главное преимущество go перед C#/Python и другими - он выдаёт eye файл. один. С которым не надо тащить runtime. Достаточно просто скопировать и запустить.

    Это перекрывает все остальные преимущества C# и тем более скриптовых языков.


    1. Sly_tom_cat
      09.09.2024 15:36

      Там еще если с CGO_ENABLED=0 собирается, то есть еще киллерфича: собрать контейнер FROM scratch с двумя слоями: FROM stage1 cp /go/bin/app /bin и CMD ["app"]. ну само собой в stage1 собираем наш бинарь. Для микросервисов - самое то: ничего лишнего и даже шелла в контейнер нет - безопастники пищат от восторга.


    1. Sly_tom_cat
      09.09.2024 15:36

      Тут еще добавлю: имею два пет-проджект одного типа: индикатор в linux-овую панель для одного облачного диска. Один на питоне писан в далеком 2015 (еще на 2.7), переписан в Python3, ООП и практически заморожен. Второй родился в 2018 как "надо бы что-то пробовать на go написать, для прокачки скилзов". И там сначала появился низкоуровневый слой, который я к питонячей морде прицепил, а потом я накопал для Go библиотеки для GTK и QT и к низкоуровневой либе навесил два разных индикатора. По прошествии нескольких лет я копнул тему и выяснил, что GTK-шную либу форкнули и перевели на работу через D-BUS: т.е. GUI уже в зоне ответственности того, что там на D-BUS зарегистрировалось как "я вам индикатор нарисую". Это дает полною отвязку от того что там у вас под капотом вашей DE. Ну и с-но QT-шный индикатор пошел под нож (в архив), а GTK-шный стал универсальным (работает практически под любой DE из зоопарка DE Linux).

      Так вот к чему это я. Питончему коду от роду с 2015, а гошному c 2018 и понятно как первый питонячий расползся сильнее (что и по звездочкам на гитхаб очевидно)
      Одноко в питонячем, что не новая версия Ubuntu - то начинают зависимости отваливаться или меняться... То там что-то перестает работать - в общем мороки от его поддержки - довольно много. Go-шный вариант вообще почти без проблем работает годами изредка возникают отдельные вопросы часто упирающиеся в деланные руками не из того места, теми самыми кто "я вам индикатор нарисую". И да конечно круг пользователей гораздо меньше у Go-шного. Но я его больше сам переделывал (чем, надо признать, и багов подсыпал) чем всякие депенденси правил.

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


    1. QtRoS
      09.09.2024 15:36

      Это перекрывает все остальные преимущества C#

      Справедливости ради: C# в эти дни тоже собирается в один бинарь, при желании даже не очень большой, а при большом желании даже очень маленький.


  1. SidVisceos
    09.09.2024 15:36

    Отдельно стоит упомянуть ООП, Которое как бэ есть....
    Отдельно стоит упомянуть ООП, Которое как бэ есть....


    1. Kahelman
      09.09.2024 15:36

      Кстати, после того комбайна в который превратился C# go-шный ООП выглядит классно - просто и со вкусом.
      Опять-таки не забываем кто-то Go придумывал/разрабатывал.


      1. SidVisceos
        09.09.2024 15:36

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