Применение Rust в разработке: страдания и высокий порог входа. Григорий Петров разбирается, когда этот язык необходим

image-loader.svg

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

Первая статья в серии — интервью с Григорием Петровым, DevRel из Evrone. Применять новомодный Rust в заказной разработке — решение, на первый взгляд, неочевидное. Готовых разработчиков мало, порог входа — высокий. Давайте узнаем, в каких условиях использовать Rust все-таки полезно?  

Гриша, расскажи, как вы в Evrone пришли к использованию Rust?  

13 лет назад, когда Evrone только начинался, мы специализировались на full stack Ruby решениях. Но с годами мы начали расширять палитру того, что предлагаем клиентам. Вначале у нас выделилось направление фронтенд — это React, Vue.js. Затем к нам приполз Python, как альтернатива Ruby, потому что многие клиенты выбирают стек технологий под уже существующие команды и процессы. 

И уже несколько лет мы используем Rust как комплементарную технологию, которая позволяет точечно ускорять наши решения на Python и Ruby в 10, а иногда и 100 раз. 

Теперь, когда к нам приходит бизнес и говорит: «Ну вы же знаете, что Ruby нетороплив, наша система уже 100 000 запросов в секунду, нам надо потратить еще вагон денег и переписать ее на Java. Да?» Мы такие: «Нет! Мы выделяем вот эти три точки, которые у вас под нагрузкой, и наши ребята переписывают их на Rust. У вас всё начинает работать быстро, надежно и при этом поддерживаемо, а бизнес фичи продолжают фигачиться с той же страшной скоростью». 

И мы в Evrone используем Rust именно для таких решений: берем наши проекты на Ruby и Python, ищем в них места с высокой нагрузкой. Когда клиент хочет, чтобы мы переписали это на каком-то системном языке, мы предлагаем либо Rust, либо Go, в зависимости от команды клиента, его бизнеса. И нам очень нравится результат, потому что можно использовать лучшее от обоих миров: где бизнес-логика и не надо высоких скоростей, много строчек кода, и надо, чтобы разработчики могли прийти и быстро разобраться, чтобы фигачить бизнес-фичи, мы используем Ruby или Python. А для тех немногих задач, где десятки и сотни тысяч запросов долбятся в сервера, мы используем Rust либо Go.

Rust иногда называют «убийцей С++», согласен ли ты с такой оценкой?

Скорее да, чем нет. Rust идеально занял ту нишу, которую раньше занимали С и C++.

С++ — довольно тяжелое историческое наследие. Этот язык программирования считается небезопасным. Не в том смысле, что придут злобные хакеры и украдут все деньги, а в том, что программы, написанные на нём, могут аварийно завершиться. Кто хочет, чтобы аварийно завершился сервис, считающий рейтинги в образовательном проекте? Чтобы рейтинги у всех обнулились или пропали? Или чтобы аварийно завершилась система, которая занимается аутентификацией, и чтобы пользователи потеряли возможность логиниться в систему?

C++ требует очень серьезной квалификации, богатого опыта, знания специфических приемов программирования на этом языке, которые позволяли бы разработчикам создавать надежный код. А Rust как раз решает эту проблему — сильно снижает критичность незнания трюков, черной магии, практик сложной разработки программного обеспечения, которым разработчики обучаются в течение 10–15 лет.

Rust в явном виде говорит: «Разработчик, я тебе помогу писать код, который одновременно быстрый и надежный. Для этого тебе надо прочитать вот такую толстенную книгу, она сложная, ты будешь страдать. Но если ты освоишь мой синтаксис, тебе не нужно будет годами лазать по интернету и самому изучать, как именно писать быстрый код, который не падает. Мы все за тебя сделали, язык тебе поможет. Через полгода ты будешь писать быстрый и надежный код».

А если мы сравним Rust и Go? Какие преимущества есть у каждого из них и какие недостатки?  

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

Отличия в том, насколько язык заставляет разработчика заботиться о памяти. Go — умеренно, он находится где-то между C++ и Python. Он с одной стороны позволяет разработчику писать низкоуровневый код, а с другой стороны там есть garbage collector, и нет необходимости заниматься такими вещами, как семантика владения: кто выделил память, кто владеет памятью и кто освободит память. 

Что это значит с точки зрения программиста, который пишет код? Go по синтаксису языка гораздо проще, чем Rust. Но у этой простоты есть своя цена. Между Go и операционной системой есть некоторая прослойка — go runtime. Это не такая прослойка, как в Python или Ruby, где используется виртуальная машина. Go очень быстрый, компилируется в машинный код, но прослойка по управлению памятью все равно останется. Go делает код надежным за счет garbage collector, так же как Java и C#. 

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

Go создан для того, чтобы писать маленькие и быстрые программы, при этом надежность никогда не была частью синтаксиса, экосистемы, это отдается на откуп программистам. Чтобы программисту на Go писать надежный код, ему нужно обучиться мастерству написания надежного кода на любом языке программирования. А это, на секундочку, 10–15 лет опыта. Понятно, что Go возник не так давно, и опытный программист на С++ будет писать надежный код на Go и обучать этому джунов. Так как Go — максимально простой в освоении язык, то джуны под руководством такого лида тоже начинают писать надежный код, и у компании всё хорошо. 

Rust, как я уже говорил, тяжело освоить, у него тяжелый синтаксис, но код на нем надежный, потому что в синтаксисе языка заложены механизмы для контроля ошибок и управления памятью. Двадцать лет назад я создавал надежные системы на C++ и не побоюсь смелого утверждения, что из мейнстримовых языков программирования сейчас это единственный язык, который позволяет адекватно работать с ожидаемыми и неожиданными ошибками в коде. Мой коллега Михаил Грачев будет выступать на RustCon 3 декабря, и работе с ошибками в коде будет посвящена часть доклада. 

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

Поэтому да, Rust похож на Go, позволяет делать быстрый код, близкий к операционной системе, позволяет делать маленькие исполняемые файлы, которые мы можем скомпилировать сразу под все комбинации операционной системы и процессора. Но при этом Rust гораздо сложнее и позволяет делать надежный код. Go проще, позволяет делать быстрый код, а за надежностью — это уже к тимлиду.

Ты упоминал про сложность изучения Rust. Возникает вопрос, как вы в Evrone обучаете ему сотрудников? Или вы берете готовых специалистов? Мы сталкивались с тем, что разработчики изучали Rust как дополнительный язык программирования, при этом не могли понять, где его применить и как найти работу, потому что во многих компаниях его еще нет. 

Интересный вопрос. Естественным образом сложилось, что у нас корни в Ruby. Рубистов у нас много. Специфика Ruby — это язык для бизнеса. Его называют «станком для программиста»: разработчик приходит, становится за этот «станок» и начинает пилить бизнес-фичи. Это очень приятный в использовании станок, за которым удобно работать. 

Ruby, так же как и Rust, — сложный. Это не Python, который считается лучшим языком для обучения новичков. Ruby — это профессиональный, очень богатый синтаксисом и семантикой язык. На Ruby крайне мало джунов. Он почти никогда не бывает первым языком программирования, на него переходят разработчики, которые уже несколько лет писали на чем-то и теперь хотят делать бизнес-автоматизацию, backend, erp, crm, криптобиржи, админки и тд. Они выбирают Ruby, изучают его и получают удовольствие от работы. Как правило, это компетентные разработчики, которые знают несколько языков.   

Наши разработчики выбирают Rust, потому что хотят развиваться, хотят получать грейды, более интересные проекты, зарабатывать больше денег. Наши Rust-разработчики, как правило, или рубисты, или питонисты, которые сами изучили Rust с целью стать лучше и решать задачи бизнеса. Когда бизнес говорит: «смотрите, вот здесь тормозит, мы же не хотим закупать серверов еще на несколько миллионов рублей», а разработчик отвечает: «Я как раз инвестировал последние несколько лет в Rust Book, так что давайте запилим микросервис на Rust».

А как вы решаете проблему code review? Если ребята сами учились, наверняка должен быть кто-то, кто может все проверить?  

У нас больше одного Rust-разработчика, некоторые из них уже довольно компетентны, так что могут проводить code review. В этом и плюс обращения в компанию, которая занимается заказной разработкой — даже если вы нанимаете у нас только одного разработчика, при вашем желании он может советоваться с другими. И когда у него случится проблема, он пойдет не к заказчику, а на базу, где ему помогут. А заказчику он будет приносить только пользу.

Что делать компании, когда у нее только один Rust-разработчик? Кто будет ревьюить его код? Мы в Evrone не стесняемся обращаться к сторонним экспертам. Я один из организаторов сообщества Moscow Python, делаю Ruby Russia и другие конференции. Я один из организаторов сообщества Moscow Python, делаю Ruby Russia и другие конференции. И когда нам нужно собеседовать, а все наши лиды заняты, мы обращаемся к сообществу, платим деньги, и топовые российские Python, Ruby или JS эксперты помогают нам собеседовать новых бойцов. Это вполне себе общепринятая практика в бизнесе. 

Как найти такого человека, который тебе поможет? Для этого у вас в команде должен быть компетентный DevRel. Уверен, это могут делать и компании, которые только начинают использовать Rust — приходить в сообщество, общаться с кем-нибудь (например, с нами) понимать, кто из сообщества может прийти и помочь с Rust разработкой, code review и тд. 

Что ты думаешь про будущее Rust? Одни говорят, что это очень перспективный стек, а другие — что это просто модная игрушка. 

Это они 25 лет назад не пытались на плюсах исключения ловить. 

Если вы посмотрите на современный софт — это же баг на баге. Создаваемый во всем мире софт очень ненадежный. 

Rust за небольшую плату (просто прочтите толстую книжку, осознайте, попрактикуйтесь) позволяет писать код, в котором фундаментально меньше багов. Это язык, на котором прямо сейчас пишется куча системных утилит: то, что делалось раньше на Go, а до этого C и C++. На нем создаются быстрые и надежные инструменты для фронтенд разработки. Rust вносят в ядро линукса. 

Я не умею предсказывать будущее. Возможно, Google или Microsoft создадут новый язык, который съест Rust, Go, Python, Ruby, JS и настанет светлое будущее моноязыка. 

Но пока ситуация такая: в современном мире разработчиков требуется гораздо больше, чем у нас есть. И я считаю, что Rust ждет очень светлое будущее в качестве системного языка, который заменит C, C++ и потеснит Go…

Сколько разработчику из другого стэка нужно времени, чтобы освоить Rust на сколько-нибудь приемлемом уровне?

Тут интересная история. Есть Rust Book — это великолепная книга, ее написал разработчик с которым я недавно делал интервью. 

Растбук очень хорош. У опытного разработчика (не джуна, а middle+), который уже много лет пишет на другом языке программирования, месяца три займет вдумчивое чтение книги, плюс еще столько же уйдёт на практику. В общем, полгода — это разумный срок для middle+, который занимается учебой один-два часа каждый день. С одной стороны, значительные инвестиции, с другой стороны это вам не японский выучить, там 3–5 лет на базовый уровень. 

Один-два часа это очень много, на самом деле. Вы скажете: «да что там, я сериалы один-два часа в день смотрю». Но изучать что-то новое, читать реально сложную книгу, практиковаться со сложным языком программирования — это высокая стрессовая нагрузка на нашу систему подкрепления, простите мне мой нейрофизиологический жаргон. Уже через 5–10 минут система подкрепления и все наше естество начнет вопить, что нет, я не хочу этим заниматься, у меня чугунная голова, я хочу смотреть сериалы или программировать на том, что уже знаю.  Так что один-два часа в день — это надо прям собраться и выдержать. 

Но если мы чего-то хотим достичь, приходится инвестировать личное время, страдать и становиться лучше.

Конференция RustCon Russia пройдёт 3 декабря в Москве. Если вы дочитали до этого места — то вот вам подарок: промокод evrone даёт скидку 10% на покупку билета :)

© Habrahabr.ru