Всем привет!
Мы гордимся тем, с каким успехом и рвением выпускаем на русском языке крутую литературу по языку Rust. Мы занялись этим, когда Rust ещё далеко не был мейнкуном мейнстримом — и нашим первым (и сразу же очень успешным) заходом в тему была ныне легендарная книга Тима Макнамары «Rust in Action». Она вышла в издательстве «Manning» в 2021 году, а на русском языке мы выпустили первый тираж «Rust в действии» в ноябре 2022 года. Очередная допечатка закончилась к новому 2026 году, и мы решили разместить здесь переводную статью о книге для привлечения внимания к свежей допечатке (тираж ограничен!)
С тех пор эта книга стала базовым введением в Rust и пропуском в отрасль, но мы на ней, конечно, не остановились. Далее мы выпустили (дата первого тиража):
Мара Бос «Rust. Атомарности и блокировки» (10.06.24)
Бренден Мэтьюз «Rust. Профессиональное программирование» (27.03.25)
Также у нас готовится фундаментальная книга по алгоритмам на Rust, которую пишет уважаемый Марк Шевченко @markshevchenko, опытный Rust‑разработчик, основатель Московского клуба программистов (рукопись ожидается в течение весны этого года, сейчас готова на 60-70%).
Наконец, на этапе заключения договора — ещё одна потенциально отличная книга с рабочим названием «Rust для научных вычислений». Её автор, имя которого пока оставим в секрете, разработал ряд утилит и библиотек на Rust и старается применять этот язык в той сфере, где доминирует Python. Так мы надеемся воплотить давно назревший запрос на книгу, позиционирующую Rust как второй язык.
Под катом — перевод статьи, вышедшей в 2021 году, вслед за оригиналом книги Тима Макнамары. Автор поговорил с Макнамарой, затронув как саму книгу, так и широкий круг тем, которые, несомненно, будут интересны всем серьёзным Rust‑ и C++‑разработчикам.
Беседа с Тимом Макнамарой о том, как Rust открывает ворота к изучению системного программирования
Открыв для себя Rust, я обнаружил, что в определённом отношении он очень напоминает акаузальную коммуникацию:
При акаузальной коммуникации два её участника выигрывают, предугадывая, чего хочет партнёр, и делая это, притом, что у партнёра может не быть никакого способа пообщаться или повлиять друг на друга. Они даже не имеют прямых доказательств, что партнёр существует.
В аспирантуре я писал много кода на C, когда готовил диссертацию — стремился довести до максимума пропускную способность по некоторым алгоритмическим бенчмаркам. Этот язык мне действительно очень нравился — настолько полно он позволяет управлять, как именно и что выполняется, а также как именно данные располагаются в памяти. Также в период обучения в аспирантуре я много программировал на Haskell, поскольку мне нравится изучать тонкости новых систем типов, а Haskell, в принципе, является бесконечным источником такого материала.
В результате я оказался на странном распутье: мне одновременно нравятся низкоуровневые языки, где отдельные биты ощущаются буквально на ощупь, но при этом практически отсутствуют возможности абстрагирования — и в то же время нравится ультра‑высокоуровневый ленивый язык со сборкой мусора и целой башней абстракций, конца которым не видно. Поэтому мне постоянно недостаёт каких‑то аспектов то из C, то из Haskell:
В C просто не хватает некоторых прямолинейных, очевидно хороших языковых фич, например, алгебраических типов данных, замыканий, вывода типов и дженериков.
В Haskell есть и сборщик мусора, и среда выполнения, но из‑за его общей ленивости всё равно то и дело сталкиваешься с утечками пространства!
Мы с коллегой‑аспирантом некоторое время изучали, можно ли написать функциональный язык, в котором отсутствовала бы сборка мусора, но нам показалось, что в этой теме не так велико поле для оригинального исследования. Всё самое сложное уже продумано до нас, но никто так и не собрал эти фичи в красивый отшлифованный язык программирования. Ближе всего к этому состоянию подошёл Cyclone, безопасный диалект C, в котором для безопасного управления памятью впервые стали применяться линейные типы. В конечном счёте, именно на их основе появилась проверка заимствований в Rust. Но Cyclone со всей очевидностью остался академическим языком, его просто слабо разрабатывали, и новый код на Cyclone появлялся лишь когда кто‑то хотел подготовить очередную статью.
Так что с моей точки зрения этого элемента паззла явно не хватало, и я ждал, пока кто‑нибудь когда‑нибудь его дособерёт. Оказалось, что Грейдон Хоар начал разрабатывать язык Rust ещё в 2006 году, но на тот момент я ещё не понимал, что это и есть тот самый недостающий кусок паззла. В Rust в те времена ещё была сборка мусора и среда выполнения с зелёными потоками в стиле Erlang. Только в 2013 году, когда вышел пост Патрика Уолтона , в Rust снесли как сборщик мусора, так и большую часть старой среды выполнения — и этот язык начал принимать тот вид, в котором мы знаем его сегодня.
Я открыл для себя Rust вскоре после этого, в 2014 году — тогда, пожалуй, акаузальную коммуникацию между нами можно было считать состоявшейся. Нашлось немало умных людей, с огромной самоотдачей, благодаря усердному труду которых этот приятный язык был создан и доведён до ума; в нём было всё, что мне нужно. Я же в ответ… ничего не сделал. Можно считать, что это был мне акаузальный подарок.
Но я осознаю, что это был далеко не самый типичный вход в Rust. Правда, хотя на Rust многие до сих пор пишут в свободное время, а не в рабочее, устоявшийся путь к изучению Rust уже сложился. Об этом пути я поговорил с Тимом Макнамарой, автором книги «Rust в действии„, который рассказал, как сам нашёл путь в этот язык:“»
Мой карьерный путь был по‑настоящему, скажем так, нелинейным. Достаточно странным.
У меня был университетский диплом по философии и немецкому языку. Ещё у меня была степень бакалавра, полученная в университете, о котором никто не слышал, потому что он находится в Новой Зеландии. Также я получил степень магистра в публичной политике. В общем, всё это предрасполагало к карьере чиновника.
Несколько лет я проработал в data science, делал некоторые по‑настоящему красивые вещи, связанные с текстом, поиском и так далее. Также я пару лет проработал в компании Canonical, которая поддерживает дистрибутив Ubuntu. Но, поскольку мне просто очень нравится заниматься данными, я оказался на посту старшего исследователя данных в небольшой (а со временем значительно выросшей) консалтинговой фирме у нас в Новой Зеландии.
То есть, я вошёл в Rust немного по пути. Я был Python‑разработчиком, кажется, около десяти лет. Но лет пять назад меня стада донимать идея, что на Python я просто разбазариваю значительную часть производительности. Я относительно профессионально владею Python, но знаю людей, которые любят приговаривать что‑то вроде «вся суть — в расширениях на С„. Как будто, используя Python, вы обязательно что‑то упускаете.“»
Но мне всегда рассказывали что‑то в духе… что C опасен. Как правило, расширения C писать не требуется — ими пусть занимаются волшебники и эксперты, а вы не эксперт. Поэтому даже не пытайтесь, потому что у вас получится или какая‑то ошибка сегментации, вы сломаете компьютер или даже уничтожите мир (либо подвергнете ваших пользователей каким‑то совершенно необязательным рискам). Поэтому C меня всегда пугал.
Впервые я попробовал свои силы в Rust за обработкой естественного языка. Когда требуется нарезать много текста и преобразовать его в большие массивы числовых матриц. Такие матрицы подаются на вход моделям машинного обучения, которые затем можно продолжать использовать в мире Python.
Я добился 100-кратного ускорения, просто переделав это на Rust. А потребление памяти стало исчисляться в мегабайтах, а не в гигабайтах. Можно сказать, что мне это просто прочистило мозги и заставило согласиться: «Действительно, Rust по‑настоящему хорош».
В то же время Тим живо интересовался тем, что происходит в программах на самом низком уровне.
В этом есть что‑то волшебное. Мой компьютер может обмениваться информацией почти с любым другим компьютером в мире, причём, мы рассчитываем, что компьютер просто будет работать… кстати, а как он работает? Стало практически общим местом, что мы особенно не задумываемся о всей сложности работы компьютера, что происходит, когда вы нажимаете «Enter» на клавиатуре.
Но, всё‑таки, за этим нажатием следует целый каскад событий, в результате которых на экране отображаются пиксели, а когда это произойдёт — можно делать всё, что потребуется далее.
Так Тим и решил писать книгу «Rust in Action», в которой собирался подробно исследовать некоторые их этих вопросов. Одни темы выводили его на другие, и он просто продолжал раскопки.
Глава о базах данных фактически началась как глава о файлах. Я задумался: как именно компьютер представляет эти структуры данных? Как они выглядят в последовательной строке на диске? В памяти всё расположено иерархично, там повсюду указатели и так далее. Поэтому нам требуется как‑то разровнять всё.
Как в базах данных обеспечивается, например, сохранность ваших данных — даже если аппаратное обеспечение, например, базовая платформа, окажется без электропитания или будет повреждена? Как знаете, всему верить нельзя — как же тогда обеспечить безопасность данных?
Так что полная версия, которая, можно сказать, располагается у меня на компьютере, напоминает по‑настоящему интересную структуру данных B‑дерево, довольно сложно устроенную. Поэтому мы можем реализовать достаточно крутую семантику поверх хранилища ключей и значений.
Макнамара писал книгу, стремясь исследовать эти темы, но быстро столкнулся с ограничениями, присущими книжному формату.
Всегда хочется чуть‑чуть пожаловаться — можно сказать, я немного раскаиваюсь, что не смог в книге полностью раскрыть ту или иную тему. В книге о Rust невозможно объяснить всё, что важно знать о системном программировании. Да, можно рассмотреть достаточно большой сектор, но все книги в одну книгу не уместить.
В таком случае оказывается, что можно написать главу, которая займёт 90 страниц, а пользователей особенно не заинтересует. Не думаю, что у меня столь много терпеливых читателей, которые смогут усвоить мой подробный рассказ о базах данных или о внутреннем устройстве баз данных..
Можно сказать, что требуется плотно всё утрамбовать, так, чтобы каждый следующий пример знакомил читателя с одной новой фичей Rust. Я не могу за один раз рассказать сразу о четырёх концепциях Rust, которые для читателя будут новыми. Так, я не могу одновременно рассказать о замыканиях и Result. Ко мне не раз и не два обращались люди, указывавшие: «вот здесь есть натяжка».
Я сознаю, что никогда не смогу написать ни одного технического текста, который всем покажется идеальным. Это просто требуется признать. Начинал же я именно с такой грандиозной идеей в голове — что смогу написать самую лучшую техническую книгу в мире.
Самому мне сразу казалось, что я смогу выдать очень высококачественный текст. Поэтому полагаю, что одно из самого сложного в этом деле — постоянное ощущение, что получающийся материал недостаточно хорош.
Был момент, когда я полагал, что раздел уложится в пару страниц, а в итоге получилось 100 страниц. Спасибо тем, кто прагматично вычитывал мою книгу и подсказывал: «Тим… тут ты перегибаешь, это безумие».
Также мы поговорили о целевой аудитории книги, и о том, что Тим хотел этой книгой донести.
Если вы примерно похожи на такого человека, каким был я несколько лет назад, пытливо увлекающегося тем, как именно работают компьютеры, и вы действительно хотите разобраться, что такое указатель, что означает «разыменовать ссылку» — то это книга для вас. Есть много «известных умолчаний», то есть, таких вещей, которые в Rust‑сообществе не озвучиваются, так как считаются общеизвестными. Именно такой материал вы здесь и найдёте.
Я намеревался упростить моим читателям вкатывание в сообщество Rust. Там часто говорят об аффинных системах типов и употребляют массу жаргона. Эта книга — как раз такой ресурс, который позволяет в общем сориентироваться в ситуациях, когда кто‑то скажет, например: «Это должно делаться через системный вызов„.“»
Если кто‑то рассматривает код на Rust и думает: «Эх, вот же умные люди написали, куда мне до них», то я своей книгой хочу ему ответить: «Нет, проходите, пожалуйста. И вам тоже за этим столом найдётся место». Сообщество Rust открыто для вас, а Rust — это инструмент, который поможет вам писать быстрые программы, а ваши пользователи при этом будут в безопасности.
Учитывая специализацию Тима, я также спросил его, что он думает о data science на Rust
Думаю, что Rust с трудом совместим с data science, скажем так, по двум причинам. Основной проблемой я считаю вопрос эргономичности. R и Python в этой области всегда будут ощущаться чуть более податливыми.
Я — очень странный исследователь данных, затративший значительные усилия на то, чтобы понять софтверные инструменты, с которыми я работаю, и тот софтверный мир, в котором обитаю. Но, как правило, исследователи данных не слишком задумываются о программной инженерии. Сейчас зарождается новая область, именуемая «инженерией данных», пожалуй, именно ею я и занимаюсь.
Теперь, освоившись в Rust, я полагаю, что на Rust следовало бы написать такие вещи как TensorFlow. Я бы посмотрел, как можно было бы реализовать на Rust Kafka и ZeroMQ, а также разнообразные системы обмена сообщениями и агрегации логов. Словом, весь этот скучный инструментарий, благодаря которому можно хранить, передавать и анализировать данные.
Думаю, Энди Гроув действительно поработал на славу. Он отвечает за внедрение Rust в проекте Apache Arrow. Исходно Apache Arrow задумывался как попытка перекинуть мостик между мирами Python и R и обитающими в них аналитиками данных. Предполагалось создать формат для хранения данных в оперативной памяти, чтобы можно было без издержек передавать структуры данных из Python в R и обратно.
В своё время Энди планировал заново реализовать небезызвестный Hadoop, но впоследствии стала более популярна идея сделать на основе Arrow новую версию Spark — этот проект называется Ballista.
Вот, именно в таких больших и тяжеловесных инструментах, которые служат инфраструктурой для data science, думаю, язык Rust придётся очень кстати. Я думаю, Rust было бы очень сложно хотя бы немного потеснить Python. Думаю, с Julia сложилась гораздо более оптимистичная история, получился удобный и быстрый язык для интерактивного использования. Вам же доводилось говорить с автором ядра на Rust для ноутбуков Jupyter . Думаю, это действительно «открывашка», но её одной недостаточно. Не менее важно иметь возможность взаимодействовать с переменными, заглядывать в них и так далее
А где кроме этой книги Тим использует Rust?
Есть пара роликов на YouTube с моим туториалом по Nannou — это фреймворк. Так что, в основном, в виде сайд‑проектов.
На работе мы медленно занимаемся оптимизацией. Если речь идёт об утилитах и прочем материале, рассчитанном на частое использование, я иногда деликатно корректирую работу. Например, если нам нужна штука, которая будет одновременно надёжна и проста в развёртывании, причём, это можно было бы использовать как микро‑инстанс, а не как какую‑то крупную виртуальную машину в облаке, то я склоняю коллег воспользоваться Rust. То есть, мы постоянно в поиске чётко очерченных вещей, которые было бы правильнее сделать на Rust, и так Rust постепенно находит свою нишу. Обычно речь идёт о замене или о дополнении для таких вещей, которые сначала реализуются на Python.
Обычно эти разработки относятся к CLI‑утилитам или к ETL, то есть, к конвейеру, в котором преобразуются данные.
Что вас особенно воодушевляет в языке Rust или окружающей его экосистеме?
Честно говоря, я чувствую, что WebAssembly плюс WASI станут стандартом для поставки ПО в некотором недалёком будущем. Именно это направление развития Rust кажется мне наиболее захватывающим.
Ещё мне нравится наблюдать, как активно разработчики языка Rust включились в дискуссию об async .
Мне бы очень хотелось, чтобы впоследствии когнитивная нагрузка, присущая async, как‑нибудь бы испарилась. Не знаю, сложно предположить, произойдёт ли это на самом деле. Уверен, что на практике это будет реализовано не идеально, но всё указывает, что проект на правильном пути. Есть люди, которые правильно подходят к этой проблеме, например, Niko, Ryan Livek и другие. Они нацелены на разработку такой структуры, которая позволит превратить Rust в самую приятную экосистему в мире для асинхронного программирования.
Об инструментарии и рабочем окружении самого Тима:
Здесь всё достаточно скучно. У меня компьютер Dell XPS 15 и VSCode с rust‑analyzer.
Понимаете, «я не волшебник, я только учусь». Но мне действительно очень нравится инструментальное оснащение Rust, тот комплект, который устанавливается по умолчанию. Мне пришлось заплатить за CLion, но одна из причин, по которым я им не пользуюсь — я занят большим количеством проектов на Twitch и YouTube. И я хочу быть уверен, что мой контент будет легко доступен. А если я стану пользоваться проприетарной платной технологией, при помощи которой сделал пару из моих первых видео, то создам своеобразный барьер, которого, на мой взгляд, быть не должно.
Советы Тима начинающим Rust‑разработчикам
Вполне нормально не пользоваться идиомами Rust. Если вы Java‑разработчик, или много работали с C#, или пришли к Rust из какой‑либо другой парадигмы программирования, то, естественно, ваш код на Rust будет немного напоминать на вид Java или C#. Знаете, просто это типичный случай.
Вы будете писать геттеры, которые, на мой взгляд, смотрятся жутко, как будто вы добавляете getThing. Но это проблема моя или другого опытного пользователя Rust. Я немного посетую на ваш код, увидев его и, кстати, это нормально, поскольку вы не обязаны выучить всё и сразу. Когда начинаете что‑то делать, не стоит сразу стремиться к совершенству.
Наконец, чтобы подмаслить оперативный отряд евангелистов Rust, позволю себе вставить небольшую несдержанную похвалу нашему языку:
Обычно, знакомясь с новой технологией, я ожидаю, что у нас с ней будет такой двухлетний конфетно‑букетный период, а потом она начнёт вас заметно раздражать. Так что я просто дожидаюсь, пока иллюзии развеются таким образом. Но с Rust я работаю давно и чувствую, что это первое восхищение им не спадает.
Это тот самый язык, на котором можно писать софт одновременно крутой и безопасный, и это чрезвычайно важно. Но я считаю, что, когда за работой ты растёшь не только как специалист, но и как человек — это не менее важно. Именно этой чертой отчётливо выделяется язык Rust и вся его экосистема.
Но, чтобы немного уравновесить вышесказанное:
Иногда эта проповедь даётся мне тяжело — признаться, я не очень хороший языковой евангелист. На мой взгляд, Rust отчётливо педантичен и зачастую может восприниматься как забюрократизированный и душный. Иногда хочется, чтобы Rust просто дал вам послабление. Но он никогда его не даёт.
Как найти Тима
У книги Rust In Action есть страничка на сайте издательства Manning. В сети X Тима можно найти под ником @timClicks, его канал со стримами на YouTube называется timClicks. Кроме того, Тим ведёт технический блог по адресу tim.mcnamara.nz
fenrir1121
Как купивший все книги по Rust вашего издательства благодарю за Ваш труд. Спасибо, что даже в последние годы, уделяете внимание не только LLM и всему что с ними связано, но и более нишевым направлениям.