Эксперты Слёрма — Антон Черноусов, Павел Селиванов, Денис Наумов и Владислав Килин — собрались, чтобы обсудить, какой язык больше подходит для админов, инженеров и devops.

Дисклеймер. Этот материал не претендует на звание истины в последней инстанции. Статья создана на основе рабочего (и жизненного) опыта экспертов, которым они поделились на этом митапе.

Интро

Где кончается работа инженеров, и начинается работа программистов? С одной стороны, не инженерское это дело — программирование. Отдаем все в разработку, и гори оно синим пламенем. С другой стороны, на практике разницы все меньше и меньше. Возьмем SRE: эта сфера находится непосредственно в Ops-е (обслуживание и восстановление), но здесь нужно очень глубоко понимать разработку. Получаем, что SRE — это в том числе программист.

Google в своей SRE Book предлагает не разделять потоки найма и брать на работу SRE и разработчиков, которые пилят бизнес-фичи, из одних и тех же людей. Понятно, что нельзя нанимать программиста, который совсем не шарит в Linux, но знание ОС для него будет на ступень ниже: если условный разработчик собеседуется на сеньора, то ОС ему нужно знать на уровне мидла.

Для SRE все будет с точностью наоборот: сеньор должен знать ОС на уровне сеньора, а программирование — на уровне мидла. Поэтому инженеры, которые хотят перейти в SRE, должны качать разработческие навыки; нарабатывать опыт написания настоящих production-приложений, больших бизнес-приложений. Здесь важно понимание концепции микросервисов и их взаимодействия, разбития этого всего на OP.

Часто в компаниях практикуется полная передача проекта на сопровождение в SRE. Когда продукт находится не в стадии активной разработки, его поддерживает только SRE-команда. Соответственно, если в приложении возникают проблемы, инженеры открывают код, дописывают нужное, фиксят баги и выкатывают все в production. И это уже непосредственная, прямая разработка.

А теперь давайте говорить о программировании для инженеров.

Где-то в 99-м году главный выбор для инженера заключался между Bash и Perl. Естественно, хороший инженер должен был знать и то и другое, но в чем-то была нужна более сильная компетенция. Такие вот муки выбора вставали перед инженерами регулярно. Но со временем Perl стал применяться реже, и сейчас на горизонте практически не появляется.

Сегодня мы лицезреем другое противостояние необходимых навыков для инженера: Python против Golang. Первый — огромный как айсберг: за все годы на него многое наросло из разработки. Пайтон везде интегрирован, машинное обучение на нем поддерживать очень круто. С другой стороны врывается Go — быстрый, прямо крейсерский. А еще этот язык родился сразу «в облаках», поэтому вокруг него нарастает совершенно другая идеология разработки и инфраструктура.

Python

В Пайтон довольно просто погрузиться, когда не знаешь ничего о разработке: начать можно с простеньких скриптов или Hello world-ов. Это интерпретируемый язык, который позволяет писать скрипты. Отлично справляется, когда нужно автоматизировать 2 задачи друг за другом, но сделать чуть хитрее, чем может Bash.

Python точно пригодится инженеру, когда нужно скопировать операции прямо в production-е, чтобы они там сразу запустились. Конечно, лазать по prod-ам руками в 21-м веке со всеми нашими Cloud Native подходами — идея, мягко говоря, не слишком хорошая. Кто-то даже предлагает бить за такое по рукам. Но мы живем в неидеальном мире, и иногда приходится работать так. 

С помощью Пайтона можно походить по prod-овым сервакам и запустить важные операции. Уж точно лучше, чем руками. Если автоматизировать с головой, то вероятность ошибиться меньше, чем при ручном выполнении одной и той же операции по 500 раз. Скриптовый язык полезен для простеньких задач, когда нужно иметь в кармане скрипт, который делает что нужно, но не применяется регулярно. Будет даже удобнее, чем все время таскать за собой бинарник.

Python тяготеет ко многим практикам. Самое очевидное — грепать логи. Еще можно, например, автоматизировать простые задачи и класть их в Крон. Пользователи раскатываются из AD-шки простым Пайтоновским скриптом, который лежит в Кроне на каждом сервере. Раз в 5 минут он ходит в AD-шку, проверяет, не добавились ли в группу сервера новые пользователи, и создает всех пользователей на сервере. Это можно сделать и на Ansible, но он медленный и достаточно прожорливый — проще написать 20 строчек на Пайтоне.

С системами оркестрации этот язык тоже отлично справляется. Возьмем тот же Ansible: некоторые вещи сделать в нем сложнее, чем написать свой модуль, который будет делать задачу, как надо.

Еще одна важная область применения Python — ML-Ops. Здесь он решает 2 задачи: является языком поддержки ML-специалистов и одновременно системным языком, которым может пользоваться инженер. Важно учитывать, что никакие функции и библиотеки для Machine Learning-а чисто на Пайтоне не написаны (большинство на C++), здесь язык выступает как удобная API-шка. Большой плюс в экосистеме: у других языков на текущий момент столь распространенной экосистемы нет.

Даже с Kubernetes, написанном на Go, можно работать на Пайтоне. Например, проверять статусы pod-ов и в случае чего алертить в Telegram или Slack. Для этого можно взять родную Куберовскую библиотеку, сходить в API-шку K8s, достать все необходимое и отправить в условный Telegram.

Библиотек и фреймворков у Python тоже достаточно: DevOps Python Tools в GitHub-овских репозиториях, библиотека для работы с GitLab-ом, преобразователи (например, XML в Yaml) и прочее.

Пока все, о чем мы писали, говорит в пользу Python. Но у любого хорошего инструмента всегда есть обратная сторона.

Самое очевидное — табики, их многие не переваривают. Пайтон медленный, куда без этого. Язык подходит в основном для простых задач, когда нужно написать короткий скриптик, благополучно о нем забыть, а в нужный момент достать. Веб-приложение сделать на Python будет проблематично.

Выше говорили про запуск скриптов на prod-е, и это иногда может быть достаточно болезненно. Условный Memory Foot Prints от Пайтона на 2 или 3 порядка больше, чем от того же Go. С одной стороны, скрипт написать действительно проще. С другой — запускать его именно на prod-е, даже read only, не всегда рационально. Бывает, что production просто не позволяет занять 200 мегабайт оперативы скриптом, который грепает логи.

Простота для входа может быть как преимуществом Python, так и его существенным недостатком. Когда приходится погружаться глубже, то это вполне может привести к необходимости писать на C-подобном языке: С-Python, C, C++. Задачу нужно решить здесь и сейчас, но затык в том, что писать придется на C.

Пример. Возьмем большую систему сбора пользовательских событий с разных frontend-ов, с разных серверов, где все приложение написано на Пайтоне с использованием C-библиотек. Если по системе жахнет, скажем, 70 тысяч довольно-таки жирненьких запросов в секунду, ее придется переписывать.

Приближаясь к уровню сеньора, рано или поздно придется столкнуться с тем, что Python тормозит. Следовательно, всю экосистему надо адаптировать под нынешние реалии, когда десятки тысяч RPS — это обыденность, учитывая всякие Интернет вещей и прочее.

Golang

На Go легко начать писать большие сервисы, сложные консольные утилиты и при этом очень трудно что-то сломать. Поэтому если Ops никогда в жизни не писал код, то стоит поставить на Golang. Он также хорошо подойдет тем, для кого Python слишком медленный, а Java слишком объектно-ориентированная.

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

С машинным обучением Golang тоже дружит. Он медленно, но верно движется в сторону того, чтобы занять нишу ML в Data Science наравне с Пайтоном и поделить с ним все пространство возможностей.

Лирическое отступление. Время и компетенции современного инженера стоят дороже, чем вычислительные ресурсы. Поэтому облака и Kubernetes-ы нацелены на то, чтобы однопоточные языки программирования могли работать быстро. Если система может держать, например, 10 RPS, то с помощью Kubernetes это количество можно серьезно увеличить.

Go смотрит в эту же сторону: лучше написать что-то простое и запустить в Kubernetes, чем сидеть на OS-ях и работать с памятью, отлаживая свою программу. А прямая работа с памятью еще и чревата ошибками.

Говоря о Кубере, можно назвать еще один плюс изучения Golang: он точно нужен инженеру, если компания нацелена на использование K8s в качестве основного средства оркестрации микросервисной архитектуры. Если инженеру нужно дописать оператор к Kubernetes, гораздо проще и удобнее реализовать это на Go: можно сделать все Kubernetes-подобным.

Но есть и подводные камни, без них никуда. Например, с GitLab-ом напрямую Go работать не умеет — приходится вручную прописывать запросы, Quary параметры.

Выводы

Какой язык выбрать инженеру в качестве первого? Как всегда, однозначного ответа нет. Раньше выбор ограничивался стандартами организации: хочешь в компанию — будь любезен, учи тот язык, на котором тут программируют. Поэтому выбирали языки, на которых потенциально могли начать работать. Теперь же ситуация поменялась: разработка стала гораздо более распределенной, давая возможность зарабатывать на жизнь при помощи любого языка.

Python станет адекватным выбором, если необходимо познакомиться со всеми распространенными концепциями в области разработки — с теми же классами. Этого языка будет достаточно, чтобы начать работу. 

Конечно, после изучения и работы на Python инженер может легко уйти в разработку, что не всегда выгодно компании. Но, как говорил философ, это уже совсем другая история.

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

А теперь — главный совет от экспертов Слёрма.

Бывает так, что человек всю жизнь учил Python, но при переходе в новую команду обнаружил, что здесь работают на Golang (или наоборот). Это нормально.

С точки зрения инженера все языки программирования выглядят примерно одинаково: те же самые функции и т. д. При этом синтаксис — это обычно документация на 3-4 странички, чтобы понять, как работает язык. Поэтому для современного инженера хорошей практикой станет качать не просто знание одного языка, а понимание программирования как такового вместе с умением читать чужой код.

Способность читать чужой код дает 50% знания языка. Можно сколько угодно знать Python, но не суметь понять код, написанный другим разработчиком.

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

Конец.

P. S. У Слёрма есть курс «Python для инженеров», старт потока 29 августа, и «Golang для инженеров», старт потока 10 октября.

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


  1. saipr
    16.08.2022 09:55
    +4

    С точки зрения инженера все языки программирования выглядят примерно одинаково: те же самые функции и т. д. При этом синтаксис — это обычно документация на 3-4 странички, чтобы понять, как работает язык. Поэтому для современного инженера хорошей практикой станет качать не просто знание одного языка, а понимание программирования как такового вместе с умением читать чужой код.
    Способность читать чужой код дает 50% знания языка. Можно сколько угодно знать Python, но не суметь понять код, написанный другим разработчиком.
    Умение прочесть разные языки программирования сделает из инженера по-настоящему универсального специалиста, который сможет оперативно разобраться в любом коде с использованием Википедии и двух страничек о синтаксисе.

    Золотые слова и Python здесь ни при чём.


    1. deathbel
      16.08.2022 10:36
      +1

      для этого в нормальных вузах на прогерских специальностях сначала читали теорию алгоритмов а уже потом языки.


      1. saipr
        16.08.2022 11:00

        Именно так у нас и БЫЛО:
        image
        А читал нам этот курс Лебедев Владлен Николаевич
        . Я думаю на его бестселлере "Введение в системы программирования" выучилось не одно поколение программистов как с Советском Союзе, да и в России тоже:
        image


  1. sgjurano
    16.08.2022 10:40
    +4

    Картинка нарисована, мягко говоря, далёкая от правды.

    Те задачи, для которых предлагается в статье использовать Python (погрепать логи, по ssh походить, кроном список юзеров актуализировать), гораздо удобнее решать с помощью bash — есть на любом линуксе без дополнительных подпрыгиваний, библиотеки ставить не нужно, утилиты удобно вызывать опять же (а они таки очень быстрые).

    Если говорить про web-сервисы, то на Python они получаются очень лаконичными, один инстанс при этом держит 2-3 тысячи rps без походов по сети, правда придётся освоить асинхронную парадигму программирования, но зато от data race язык защищает.

    Golang силён в первую очередь своей моделью конкурентности и сборкой в бинарник без зависимостей — но если вы пишете действительно нагруженный web-сервис (в моей голове это 10k+ rps), то за это придётся заплатить необходимостью уметь писать многопоточный код, всё же несмотря на CSP горутины выполняются на нескольких потоках, а значит от data race программиста защищает только здравый смысл.

    Вывод примерно такой: для начала стоит освоить bash, потом по мере нарастания сложности использовать python, а в случае необходимости таскать большие по объему кода бинарники или писать нагруженные web-сервисы, уже изучать Golang.


    1. andreymal
      16.08.2022 13:09

      от data race язык защищает

      Нет: https://verdagon.dev/blog/python-data-races


      В однопоточном asyncio хоть и сложнее, но всё равно теоретически возможно получить data race если слишком перемудрить с тоннами await'ов в коде, поэтому даже для asyncio есть примитивы синхронизации


      1. sgjurano
        16.08.2022 13:19
        +1

        Пример по вашей ссылке это замаскированный синтаксисом языка race condition, об этом даже в шапке статьи написано "Note: I wrote this article with an unusual (and partially incorrect) definition of data race. To get the most out of this article, one could interpret "data race" as "race condition". "


        1. andreymal
          16.08.2022 13:22

          Ах, я тоже перепутал data race и race condition, воспринимая их как синонимы. Тогда вы правы, да


          1. sgjurano
            16.08.2022 13:27

            Они очень похожи, вообще не уверен что между ними существует чёткая граница. Если подумать об этом поглубже, то data race один фиг превращается в race condition на более низком уровне.

            Anyway потребность в примитивах синхронизации возникает в любом конкурентном коде :)


    1. AlexSyz
      16.08.2022 14:39
      +1

      Вывод примерно такой: для начала стоит освоить bash, потом по мере нарастания сложности использовать python, а в случае необходимости таскать большие по объему кода бинарники или писать нагруженные web-сервисы, уже изучать GoGolang.

      В целом согласен. Но это для миддла. Сеньор должен знать шелл, один скриптовый и один компилируемый язык. И уметь читать ещё пару - тройку языков.

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


    1. askharitonov
      18.08.2022 22:14

      Вывод примерно такой: для начала стоит освоить bash, потом по мере нарастания сложности использовать python

      Bash наверное будет посложнее, чем Python. По крайней мере в использовании: нужно знать, где в bash можно выстрелить себе в ногу.

      Например, команды вроде ls * могут принять имена файлов, начинающиеся на «-» за опции командной строки, ну вот к примеру, допустим, у нас есть некий каталог, и мы в нём выполняем команду ls *, увидим, как и ожидали, список файлов. Теперь, если в нём создать файл '-l' (touch ./-l), то ls * в том же каталоге выдаст список файлов в другом формате. А какая-нибудь другая программа может и запустить что-нибудь неожиданное. То есть, нужно помнить, что вместо * в таких случаях нужно писать ./*.

      Или, например, важно помнить то, что по умолчанию выполнение скрипта продолжится даже если запущенная в нём программа или команда оболочки вернула ошибку, то есть, возможны такие ситуации: перешли в каталог (но, как оказалось, неудачно), удалили всё в текущем каталоге, но, как потом выяснилось, совсем не там, где нужно... Игнорирования ошибок в процессе выполнения — это не совсем то, чего интуитивно ждёшь от языка программирования.

      Или, например, представим нетипичную (возможно искусственно созданную...) ситуацию, когда имя файла содержит переводы строки. Если это не учесть, то скрипт может принять такое имя за несколько других имён (и не сделать что-то нужное с файлом или сделать что-то ненужное с другими файлами). Это, опять же, можно предусмотреть (-print0 в find, -0 в xargs), но и про эти грабли тоже надо знать.

      Поэтому наверное всё-таки начинать нужно не с bash. А с Python — почему бы и нет?


  1. ForestDront
    16.08.2022 10:59
    -3

    Есть риск, что Go могут запретить, как гуглевское порождение. А питон я бы сам запретил за систему отступов, отсутствие строгой типизации и отсутствие компиляции


  1. economist75
    16.08.2022 14:33
    +2

    Согласен с автором. Кол-во доступных в Сети админ-скриптов для типовых админ-задач на Python vs Go соотносится, имхо, 50:1. Это хороший знак начать именно с Python. А дальше - Go. Языки Bash/CMD смотрится анахронизмом в наше время. Под Windows - админ-задач, пожалуй, до сих пор большинство, а там одни кодировки могут довести до красноглазия, не говоря про экранирование символов, работу с файлами и сетевыми пакетами итд. PowerShell под Windows не стал админ-тулом №1 (имхо).

    Для грепа и построения внутренних web-сервисов у Python много "помогаек" в виде либ pandas, numpy, gradio, streamlit, их автор не упомянул. "Проблема скорости" Python с этими либами становится несущественной - многие из них написаны на быстрых и очень быстрых языках.


  1. capitannemo
    17.08.2022 15:30

    В принципе все сформулировано в народной мудрости: За комаром не с топором.
    Хорошо идти от задач к выбору языка и знать их (языков) плюсы и минусы.
    А не ваять все на одном, как например 1С ники пытаются.

    Языков ведь много неспроста, питон берет массовостью, перл обработкой строк на порядок быстрее, баш он и в африке баш всегда под рукой, его надо знать


  1. knyazz
    18.08.2022 13:14
    +1

    Очень забавно, когда в заголовке пишут явно, что админу надо программировать. Это же нонсенс! Я не встречал в своей жизни заголовков типа "Проктология для стоматолога: какой инструмент выбрать?", а в тексте реально расписывают потолще или потоньше и длиннее, при этом никто не написал, что стоматолог должен зубы лечить, а не одном месте ковыряться.

    Я сам являюсь инженером с функциями админа и программиста (приходится тянуть те инструменты, которые писал будучи программистом), но в корне считаю это неверным подходом.

    По языкам - Го и Питон интересные языки, но зачем они админу? Я много работал с питоном, перлом, с/с++, а даже ассемблером. Но для админа - BASH! Задача админа - администрировать!

    Мне не раз приходилось срочно вылетать на какой-то объект, где что-то не сработало "как надо". По факту выяснялось, что автор программы на питон/с/perl пытался натянуть что-то на глобус и при каких-то условиях это что-то не сработало, в то время, как задача решалась двумя строчками bash с использованием проверенных инструментов. А зачастую "программисты" любят изобретать велосипед, напарываясь на те ошибки, которые уже пройдены другими десятилетиями назад.

    Алё!!! Вы в своем уме там все?


  1. Coffe4wolf
    18.08.2022 17:02

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