В отличие от нашего прошлого героя, Михаил сделал выбор не в пользу Scala, а предпочел Rust, так как этот язык обеспечивает безопасное использование данных и ресурсов. На нём можно управлять памятью и создавать не только более быстрый, но и более надёжный код. Кстати, Михаил считает C++ не столько базовым языком для Rust, сколько консервативным конкурентом. По его словам, поклонники C/C++ недолюбливают Rust лишь потому, что имеют о нём много предрассудков и пока не осознали преимущества нового языка.

Мы поговорили с ведущим системным программистом департамента разработки компании «Криптонит» Михаилом Дорониным, чьей основной специализацией в компании является программирование на Rust.

— Михаил, как ты стал Rust-программистом?

— Всё началось с того, что я учился в Колледже космического машиностроения и технологий по специальности радиотехнических комплексов и систем управления космическими аппаратами. Сейчас, кажется, такой специальности больше нет. Есть просто радиотехника. Вот там какие-то основы программирования давали, но мне было не сильно интересно. На тот момент меня больше интересовало что-то, что можно руками потрогать, какой-то реальный радиоприемник сделать…

— Как тогда появилась тяга к программированию?

Уже потом я учился заочно, тоже на радиотехнику. Работал в конструкторском бюро, занимавшемся разработкой навигационного оборудования для авиационной техники. Там я всё больше уходил от схемотехники в программирование контроллеров и ПЛИС. В какой-то момент меня знакомые учёные позвали поработать программистом в лабораторию электронно-оптических систем. Она тоже до сих пор успешно работает. Они занимались в основном оптическими датчиками. Например, такими, которые в томографах используются. Там обычный микрофон нельзя поставить, поэтому применяют оптические микрофоны. Подобные вещи применяются в сфере безопасности для охраны периметра, в геологоразведке… Вот на этой работе я был занят прямо супер full stack.

— Что именно было нужно программировать?

— Сама система уже была написана, требовалось оптимизировать постобработку с Python на C++, разрабатывать веб-интерфейс для АРМ. Много с чем удалось поработать, было очень интересно. Наверное, это моё самое творчески интересное место работы, потому что компания относительно небольшая и в ней нет никакой бюрократии.

— Почему выбрал Rust?

— Это произошло позже. Потом я долгое время работал в разных компаниях на позиции бэкенд-разработчика на Java и Python, но мне Rust как язык стал больше нравиться. К тому же, я тогда немножко подустал от писания бизнес-логики и программирования высокого уровня. Начинал-то я карьеру с самого низкоуровневого. Потом какое-то время занимался Enterprise-разработкой и обработкой научных данных.

— Как давно ты в «Криптоните»?

— С октября 2019 года. И я сразу занялся программированием на Rust. Меня пригласил знакомый и сказал, что есть возможность попробовать Rust. Он предупредил, что будет непросто, что наверняка возникнут сложнее вопросы. В «Криптонит» я в принципе пришёл с понижением зарплаты, но на более интересные задачи и перспективы. Мы вначале договорились, что если буду соблюдать определённый план, то з/п повысят. Сейчас у меня и задачи интересные, и зарплата хорошая.

— Какие ты видишь преимущества Rust перед Scala?

— Отсутствие сборки мусора. Соответственно, вы сами управляете памятью. Вы можете написать код, который будет быстрее работать. В Scala есть явный уклон в сторону верификации кода. Это язык программирования, построенный на строгой научной практике, как Си, например.

— Чем ты занимаешься в «Криптоните»?

— Я работал над проектом Small files storage, а сейчас мы его активно тестируем. В какой-то момент мы всё-таки приняли решение не писать его с нуля, а допиливать готовые модули.

— Какой функционал у этого «хранилища малых файлов»?

Представьте, что у вас очень много маленьких файлов, и вы хотите иметь к ним быстрый доступ. Стандартные файловые системы для этого не подойдут. Наша система пишет всё в один большой файл и как бы бинарный BLOB дописывает в конец. Плюс отдельно хранятся метаданные. Конечно, в реальности всё сложнее, чем я сейчас говорю. Система распределенная, есть поиск по нескольким узлам, выполняется дедупликация и сжатие данных.

— Переход на SSD не снизил актуальность вашей разработки?

Смысл в ней всё равно остаётся, поскольку твёрдотельные диски всё ещё дороже обычных HDD. Когда у вас сотни терабайт данных, их слишком дорого хранить во флэш-памяти.

— Тебе как-то пригодился твой радиотехнический бэкграунд?

Да. Я когда пришёл, мы работали над одним проектом, в котором я занимался оптимизацией производительности, профилированием данных. Вот там мне пригодились мои навыки по цифровой фильтрации. У нас была задача передискретизации аудиоданных, и я увидел, что кое-что делается не совсем правильно, приводя к возникновению артефактов в спектре. Объяснил команде, как надо сделать. Потом ещё делал оптимизацию с векторными инструкциями. Использовал набор инструкций AVX, но без AVX-512, поскольку на рабочих машинах у нас тогда AVX-512 не поддерживался.

— CUDA-оптимизацию не пробовали?

Нет, хотя была такая идея. Просто мы не были уверены, что в конечном продукте однозначно будет графический ускоритель с поддержкой CUDA, а SSE2 есть везде, да и на процессоре мы всё успевали просчитать. Не стали усложнять систему.

— Как ты оцениваешь перспективы языка Rust? Можно ли с его помощью найти «профессию будущего»?

В основном сейчас пишут на C/C++, Java, Python… и Rust встречает активное сопротивление со стороны программистов старой школы. Очень много людей крайне превратно его понимают, не хотят изучать глубоко, и у них формируется предвзятое отношение. Типа, это «Си на стероидах». Конечно, это не так. В Rust есть уникальные механизмы, другая система типов, свои приятные «плюшки». Он становится популярнее год от года. Я вижу ситуацию так, что ниша Rust будет расширяться в сторону высоконагруженных распределённых систем, а также встраиваемых систем и драйверов Linux.

— Какие выгоды может принести Rust в коммерческих проектах?

— Для маленьких компаний эти выгоды могут быть неочевидными, а вот крупные смогут экономить сотни миллионов долларов ежегодно. Если они сейчас используют Java, а потом перепишут код на Rust, он, грубо говоря, станет в три раза быстрее и гораздо надежнее за счет более продвинутой системы типов. Поэтому можно прогнозировать, что в ближайшее время какие-то крупные проекты будут переписывать на Rust. Ниша Rust будет расти, простите за каламбур, а ниша Java – сужаться. Например, в Google уже внутренние тулзы для Android-разработки, драйверы и компоненты ядра пишут на Rust. Там ещё энергоэффективность всех процессов считают и борются за снижение выбросов углекислого газа.

— На твой взгляд, в чём причина неприятия Rust некоторыми программистами, освоившими мейнстримовые языки?

Есть такой мем, в котором птичка прямо активно что-то отвергает, а потом пробует, и ей нравится. На мой взгляд, с Rust такая же ерунда. Те, кто выступают против Rust, просто его не распробовали. Я ведь тоже при изучении Haskell возмущался и спрашивал себя, почему в этом языке всё так странно? Но это была первая стадия, для которой подобное восприятие типично. Вот до второй стадии — осознания и принятия — мало кто доходит. Это нужно определенный склад ума иметь и математический бэкграунд. Чтобы развиваться дальше, я прошёл много разных курсов по функциональному программированию, посещал соответствующие конференции… тогда и вошёл во вкус. Чтобы хорошо изучить Rust, нужно избавиться от предрассудков и попробовать привыкнуть к его особенностям.

— Насколько быстрым получается код на Rust?

— Он будет такой же быстрый, как и на С++, даже потенциально быстрее, потому что компилятор в Rust знает о твоём коде чуть больше, чем сишный компилятор. В частности, компилятор знает, что если у тебя есть мутабельная ссылка, то он не может пересекаться с другим. Компилятор в Rust предотвращает типичные ошибки, что повышает безопасность программ и позволяет заодно выполнять некоторые оптимизации при их написании. Также Rust лишён тяжёлого Legacy-наследия Cи, поэтому код на нём получается чище и легче.

— С чего стоит начать тем, кто всерьёз планирует осваивать Rust?

Rust приносит идеи из теории типов (аффинные типы) и с помощью них делает низкоуровневый код более безопасным. Соответственно, полезно иметь бэкграунд или теории типов и/или в низкоуровневом ПО: понимать, как работает память, ОС, процессор, указатели…  Если изучал высшую математику, хорошо знаешь алгебраические структуры, то лучше сразу начинать с Rust. Мне лично было относительно просто его учить ещё и потому, что к тому моменту я уже понимал, как работает процессор, как устроена память, что такое указатель…

— Насколько Rust популярен в других ИТ-компаниях?

— Вот не знаю, как сейчас — я ведь уже давно перестал мониторить вакансии. На момент перехода в «Криптонит» на российском рынке было очень мало предложений для программистов на Rust. Когда он появился в 2016 году, многие западные вузы переделали курсы по операционным системам сразу на Rust. Недавно видел доклад Microsoft, в котором представитель компании сказал, что у них около 70% багов происходит из-за небезопасной работы с памятью. Rust эффективно предотвращает такого рода ошибки, поэтому к нему сейчас большой интерес со стороны Microsoft, Amazon, Google и других западных компаний. Они вкладывают много ресурсов в его развитие и в поддержку сообщества специалистов.

— А в России такие же тенденции?

— Пока ещё нет. Когда-то давно я общался с ребятами из Яндекса, так они оказались достаточно консервативными. Когда услышали, что мне не очень интересно развиваться в C++, но с удовольствием помогу с переходом на Rust, они начали “объяснять”, что С++ лучший язык и никакой Rust не нужен. А спустя лет шесть у них вышел доклад от молодого сотрудника, который рассказывал о преимуществах Rust. Поэтому мне кажется, что в России переход на Rust —это очень вялотекущий процесс.

— Можешь дать несколько советов начинающим Rust-программистам? На чём чаще всего спотыкаются, и как преодолеть эти демотивирующие препятствия в изучении языка?

— При освоении Rust многие новички сталкиваются с моментом, который называется fight the borrow checker. Его надо преодолеть и дальше всё пойдет гораздо проще. Мне помогло понимание теории типов и осознание, что lifetimes — это (и технически, кажется, так оно и реализовано в компиляторе) параметр типа. Это помогло чисто формально прочитать, что именно мне говорит компилятор, где какие типы у него не совпадают и почему, а потом уже из этого сложить картинку: понять, в чём на самом деле тут проблема с точки зрения работы с памятью, и есть ли она вообще. Этот процесс похож на чтение математического доказательства. Сначала ты прослеживаешь чисто механически каждый шаг, и удостоверяешься, что он верный, и только потом через какое-то время приходит «инсайт» — понимание того, о чём это доказательство, и "почему это так".

— Посоветуешь пару-тройку ресурсов по Rust для наших читателей?

— Да, вот список основных, которыми я сам пользовался:


1. https://www.youtube.com/c/JonGjengset — PhD в MIT, делает много стримов про Rust как для новичков, так и для продвинутых. Он же превратил часть материалов в книгу https://rust-for-rustaceans.com/

2. https://doc.rust-lang.org/book/ — официальная книга для новичков по Rust

3. https://www.packtpub.com/product/rust-high-performance/9781788399487 — неплохая книга, которая в сжатой форме рассказывает об особенностях и лучших практиках языка. Подойдет продвинутым программистам, которые, например, уже знают С++.

4. https://doc.rust-lang.org/nomicon — про низкоуровневые подробности языка и о том, как писать безопасный "небезопасный код".

5. https://www.youtube.com/watch?v=IPmRDS0OSxM — в ролике за полтора часа рассказывается о главных особенностях Rust. Рекомендуется тем, кто знает C++.

6. https://www.youtube.com/watch?v=LjFM8vw3pbU — видео от Брайана Кэнтрилла про то, как он перешёл на Rust. Это очень известный программист из IBM, работавший над Solaris, пока последний не выкупила Oracle.

***

PS: мы ищем Rust-программистов: https://career.kryptonite.ru/vacancies/senior-rust-developer-rust-developer/

 

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


  1. amarao
    15.09.2022 11:04
    +8

    Наблюдение: все хотят сеньёр-программистов на Rust.


    1. vassabi
      15.09.2022 12:17
      +2

      ну, как только появились Swift и Kotlin - все тоже хотели сеньёр-программистов на них.


    1. Alex_ME
      15.09.2022 14:06

      Следствие: никто не хочет hello-world программисто на Rust.

      Вопрос: как стать программистом на Rust, если +- senior программист на C и C++, но не имеешь опыта работы в Rust, который требуется даже в middle вакансиях.


      1. amarao
        15.09.2022 14:12
        +8

        Ну вот я начал по чуть-чуть писать в опенсорс проекты. Пулл-реквест тут, пулл-реквест там...


      1. DarkEld3r
        15.09.2022 17:41

        По моему опыту, опыт в других языках, особенно С++, часто идёт в зачёт.


      1. DarthVictor
        15.09.2022 18:16
        +3

        Просто не говорите, что у вас его нет. У тех, кто вас будет нанимать этого опыта скорее всего тоже не будет, проверить они не смогут.


  1. Lee_Fun
    15.09.2022 11:14
    +8

    Перепишут с Java на Rust? Ну это врятли.. Только небольшие критичные по производительности куски. На Cobol до сих пор много чего крутится - всё никак не перепишут.


    1. amarao
      15.09.2022 12:19

      Всё не перепишут, разумеется. Более того, "переписывают" только от отчаяния.

      Обычно речь идёт про "дальше пишут на". То есть живые проекты, которые существенно пишутся прямо сейчас, могут переключиться на другой язык; либо новые проекты.


  1. bret99
    15.09.2022 12:39
    -6

    Rust перспективен (мб., даже Golang поборет), но синтОксис - да, отталкивает.


  1. 4reddy
    15.09.2022 15:34
    +16

    Очередная скучная рекламная статья из серии "кем был ,что ел, с кем спал".
    Зачем мне всё это знать про какого-то там Михаила? Дайте больше технического контента. Дайте конкретный опыт Миши как программиста. Ни одного бенча, ни одного сниппета. Одни сплошные домыслы и вымыслы.


    1. JohnScience
      15.09.2022 18:17
      -4

      Привет земляку. Я когда-то тоже жил в Перми. Я сейчас работаю над бесплатным курсом по Rust, могу показать что есть по этому поводу. Телеграм@dmitrii_dem


  1. segment
    15.09.2022 17:13
    +3

    Rust настораживает только изменяющейся концепцией. Сразу скажу, что я не писал на rust кроме каких-то простых примеров, я из мира Си. Еще давно продвигали концепцию borrow, потом вдруг сказали, что что-то тут не сходится и нужно бы еще умных указателей завезти. И так далее, вроде все круто, но у меня впечатление складывается как «нецелостного» языка. Как будто разработчики языка превозмогают ради превозможения. Поправьте меня, пожалуйста, если я что-то не так воспринимаю.


    1. DarkEld3r
      15.09.2022 17:46
      +6

      Я бы попробовал "поправить", но не понял сути претензии насчёт "нецелостности". ???? С указателями аля unique_ptr (Box) бороу чекер прекрасно работает. И весьма очевидно, что статический анализ (этот самый бороу чекер) не может отследить ситуации когда нам нужно динамическое время жизни и тогда на помощь приходят указатели с подсчётом ссылок (аналог shared_ptr). Мне кажется, неправильно заявлять, что концепция поменялась так как (A)rc были с версии 1.0 (и раньше).


  1. ZhilkinSerg
    15.09.2022 22:04
    -1

    — Он будет такой же быстрый, как и на С++, даже потенциально быстрее,
    потому что компилятор в Rust знает о твоём коде чуть больше, чем сишный
    компилятор

    Что это вообще значит? Причем тут сишный компилятор?


    1. andy128k
      16.09.2022 03:13
      +2

      Rust накладывает на программиста больше ограничений чем C++. И компилятору вроде как "проще" от этого.

      Сишный компилятор тут как эталон. Rust сделан как фронтенд к LLVM. Точно так же сделан и Clang. И значит их можно как-то сравнивать в этом поле. Гипотеза (и вроде есть примеры) в том что Rust может передать тому же LLVM больше информации о коде чем Сlang.


  1. robertd
    15.09.2022 22:43
    +11

    Как сказал кто-то на ютубе, "мне в расте нравится то давно забытое чувство, что я учу что-то совсем ново-фундаментальное в Computer Sciences" :) Поддерживаю, давно ничего такого не было. Мое имхо, что познакомиться с языком, распробовать суперский подход в работе обработки ошибок и испытать тот самый fight with borrow checker, когда компилятор настаивает, что умнее тебя в избегании ошибок -- имеет смысл хотя бы для кругозора