Black Hat Rust, Rust, Программирование

#7 Black Hat Rust. Ментальные модели для подхода к Rust.

Здравствуйте, дорогие друзья.

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

Воспользуйтесь компилятором

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

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

Изучение как раз вовремя

Rust — это обширный язык, который Вы не сможете освоить за несколько недель. И это совершенно нормально. Вам не обязательно знать все, чтобы начать. Я потратил много времени на чтение всей компьютерной документации, лежащей в основе Rust, еще до того, как написал свои первые программы. Это был неправильный подход. Слишком много можно прочитать обо всех функциях Rust, и есть большая вероятность, что Вы не будете использовать их все (и Вам не следует! Например, пожалуйста, никогда не используйте non_ascii_idents, это только внесет хаос в экосистему!). Все это — материал действительно интересный и создается очень умными людьми, но он мешает Вам что-то делать. Вместо этого примите неизведанное и создавайте свои первые программы. Провал. Учить. Повторять.

Делайте все просто

Не пытайтесь быть слишком умным! Если Вы боретесь с ограничениями языка (который и так огромен), это может означать, что Вы делаете что-то неправильно. Прекратите то, что Вы делаете, сделайте перерыв и подумайте, как Вы можете поступить по-другому. Это происходит со мной почти каждый день. Кроме того, имейте в виду, что чем больше Вы играете с ограничениями системы типов, тем больше Ваш код будет создавать труднопонимаемых ошибок компилятором.

Предпочитайте доводить дело до конца, а не создавать идеальный дизайн, который никогда не будет реализован. Гораздо лучше переделать несовершенное решение, чем никогда не выпускать идеальную систему.

Вы оплачиваете расходы авансом

Программирование на Rust иногда может показаться более медленным, чем, например, на Python, Java или Go. Это связано с тем, что для компиляции компилятору Rust требуется уровень корректности, намного превышающий уровень в других языках.

Таким образом, за все время существования проекта Rust while сэкономит Вам массу времени. Вся энергия, которую Вы тратите на создание правильной программы, в 1-10 раз больше времени (а также денег и психического здоровья!) Вы экономите, когда Вам не придется тратить долгие часы на отладку странных ошибок.

Первые программы, которые я запустил в производство, были на TypeScript (Node.js) и, из-за слабых компиляторов этих языков, Вам приходится добавлять сложные инструменты в свой код и внешние службы для обнаружения ошибок во время выполнения. В Rust мне никогда не приходилось использовать это простое ведение журнала (как мы увидим в последующих разделах) это все, что мне когда-либо было нужно для отслеживания ошибок в моих программах. Кроме этого, насколько я помню, я никогда не сталкивался с сбоем в производственной системе в Rust. Это происходит потому, что Rust вынуждает Вас “оплачивать расходы авансом”: Вы должны обрабатывать каждую ошибку и очень тщательно подходить к тому, что Вы делаете.

Вот еще одно свидетельство от «jhgg», старшего штатного инженера Discord:

«Мы усиленно работаем над rust в 2021 году после нескольких очень успешных проектов в 2019 и 2020 годах. наши инженеры усовершенствовали язык, и у нас есть хорошая внутренняя поддержка (как с точки зрения инструментов, так и знаний), чтобы убедиться в его успехе.

 Как только вы пройдете этап обучения – Imo, писать на rust намного проще и продуктивнее, чем на go, — особенно если Вы знаете, как использовать систему типов для создания идиоматического кода и API, которые очень сложно использовать неправильно.

Каждый фрагмент кода rust, который мы до сих пор отправляли в производство, прошел идеально благодаря действительно мощным проверкам во время компиляции и гарантиям языка. Я не могу сказать того же о нашем опыте работы с go. Наши причины выходят далеко за рамки ”о, gc в go доставил нам проблемы”, но больше похожи на “go как язык добровольно игнорировал и отвергал достижения в языках программирования”. Вы можете вырвать эти алгебраические типы данных, перечисления, средство проверки заимствования, управление памятью во время компиляции / безопасность и т.д. … из моих холодных мертвых рук. [..]»

Функциональность

Rust — это (на мой взгляд) идеальное сочетание императивного и функционального языков для достижения поставленной цели. Это означает, что если Вы исходите из чисто императивного языка программирования, Вам придется отучиться от некоторых вещей и принять функциональную парадигму.

Отдавайте предпочтение итераторам, а не циклам for. Отдавайте предпочтение неизменяемым данным, а не изменяемым ссылкам, и не волнуйтесь, компилятор отлично справится с оптимизацией Вашего кода. Это усугубляется моделью владения Rust, которая превращает ссылки в яд, сильно усложняющий Ваш код.

На этом все. Всем хорошего дня!

Black Hat Rust

Цикл статей по курсу Black Hat Rust.