#9 Black Hat Rust. Стремительное развитие языка.
Здравствуйте, дорогие друзья.
Может быть легко написать трудночитаемый и отладочный код
Из-за его наглядности и множества функций, код Rust может быстро стать трудным для понимания. Generics, trait bounds, lifetimes… Легко не обращать внимания и писать очень трудночитаемый код. Мой совет — всегда дважды подумайте, прежде чем писать сложный код или макрос (для меня они являются худшими нарушителями), которые можно легко заменить функцией.
Стремительное развитие языка
Это тот момент, который пугает меня больше всего в отношении будущего Rust. Каждые 6 недель выходит новая версия, с пакетом новых функций. Этот темп не только вызывает у меня беспокойство, но и противоречит одному из столпов моей жизни: минимализму, где общеизвестно, что неограниченный рост (в данном случае языковых возможностей) является первопричиной упадка всего сущего. Когда что-то добавляется, что-то должно быть убрано в другом месте. Но кто отвечает за удаление функций Rust? Возможно ли это вообще?
В результате, я боюсь, что сложность языка будет расти быстрее, чем темпы его внедрения, и что это будет бесконечная, изнурительная гонка за тем, чтобы оставаться в курсе новых функций, как разработчики.
Медленное время компиляции
Время компиляции ближе к тому, что мы можем найти в мире C++, чем в мире динамических языков, таких как TypeScript (если TypeScript можно рассматривать как динамический язык). В результате “редактировать, компилировать, отлаживать, повторять” рабочий процесс может привести к разочарованию и нарушению потока для разработчиков.
Существует множество приемов, позволяющих повысить скорость компиляции Ваших проектов. Первый — разбить большой проект на более мелкие блоки и извлечь выгоду из инкрементной компиляции Rust.
Другой — использовать cargo check вместо cargo build большую часть времени.
$ cargo check
В качестве примера, в проекте, с изменением одной буквы:
1 2 3 4 5 |
$ cargo check Finished dev [unoptimized + debuginfo] target(s) in 0.12s cargo build Compiling agent v0.1.0 (black-hat-rust/ch_11/agent) Finished dev [unoptimized + debuginfo] target(s) in 2.24s |
Полученные результаты важны в течение дня (недели или месяца) разработки. И, наконец, просто сократите использование дженериков. Дженерики добавляют много работы компилятору и, таким образом, значительно увеличивают время компиляции.
Сопровождение проектов
Ни для кого не секрет, что большая часть времени и затрат, затрачиваемых на программный проект, приходится на техническое обслуживание. Rust быстро развивается, и его экосистема тоже, необходимо автоматизировать обслуживание проектов. Хорошей новостью является то, что, по моему опыту, благодаря строгой типизации, обслуживание проекта Rust проще, чем на других языках: ошибки, такие как изменения API, будут отслеживаться во время компиляции.
Для этого сообщество создало несколько инструментов, которые сэкономят Вам много времени и позволят поддерживать ваши проекты в актуальном состоянии.
Rustup
Обновите свой локальный набор инструментов с помощью rust up :
1 2 3 |
$ rustup self update $ rustup update Rustfmt |
rustfmtp — это средство форматирования кода, которое позволяет базам кода иметь согласованный стиль кодирования и избегать придирок во время проверки кода.
Его можно настроить с помощью файла .rustfmt.toml: https://rust-lang.github.io/rustfmt.
Вы можете использовать его, вызвав:
$ cargo fmt
В своих проектах.
Clippy
clippy — это линтер для Rust. Он выявляет шаблоны кода, которые могут приводить к ошибкам или идентифицируются сообществом как плохой стиль. Это помогает Вашей кодовой базе быть согласованной и сокращает время, затрачиваемое на проверку кода, при обсуждении мельчайших деталей.
Его можно установить с помощью:
$ rustup component add clippy
И использовать с:
1 2 3 |
$ cargo clippy Cargo update $ cargo update |
Это команда, которая автоматически обновит Ваши зависимости в соответствии с объявлением сервера в Вашем файле Cargo.toml.
Cargo outdated
cargo-outdated программа, помогающая Вам идентифицировать Ваши устаревшие зависимости, которые не могут быть автоматически обновлены с помощью cargo update.
Ее можно установить следующим образом:
$ cargo install --locked cargo-outdated
Использовать его так же просто, как запустить
$ cargo outdated
В Ваших проектах.
Cargo audit
Иногда Вы, возможно, не всегда сможете сохранить свои зависимости до последней версии, и Вам потребуется использовать некоторые старые версии (из-за зависимости от другой Вашей зависимости…) контейнера. Как профессионал, Вы все равно хотите быть уверены, что ни одна из Ваших устаревших зависимостей не содержит какой-либо известной уязвимости.
cargo-audit можно установить с помощью:
$ cargo install -f cargo-audit
Как и другие помощники, он очень прост в использовании:
1 2 3 4 5 |
$ cargo audit Fetching advisory database from `https://github.com/RustSec/advisory-db.git` Loaded 317 security advisories (from /usr/local/cargo/advisory-db) Updating crates.io index Scanning Cargo.lock for vulnerabilities (144 crate dependencies) |
Как отслеживать свои выводы
Вам захочется отслеживать ход ваших проверок и то, что Вы обнаружите на этом пути, будь то для того, чтобы поделиться с командой или вернуться позже.
Существуют мощные инструменты, такие как Maltego, но это может стать дорогостоящим, если Вам нужны все функции. Что касается меня, я предпочитаю использовать простые файлы на диске, с markdown для записи заметок и отчетов, и git для резервного копирования. Преимущество программы в том, что она чрезвычайно проста в использовании, мультиплатформенна, легко экспортируется и бесплатна. Кроме того, с помощью pandoc легко создавать PDF-файлы, .docx или другие форматы документов из файлов markdown.
Я также слышал много хорошего о Obsidian.md и Notion.so, но лично я не использую: я предпочитаю владеть своими данными.
На этом все. Всем хорошего дня!