Паттерны Rust и практические руководства по инженерии
О проекте
- Курс основан на оригинальных материалах Rust Training. Лицензии: MIT (код) и CC-BY-4.0 (текст).
- Русский перевод и адаптация выполнены участниками проекта RustTraining-Rus.
- Замечания и исправления присылайте через Issues и Pull Requests репозитория.
Практическое руководство по паттернам Rust уровня «средний и выше», которые возникают в реальных кодовых базах. Это не учебник по языку: предполагается, что вы уже умеете писать простой код на Rust и хотите перейти на следующий уровень. Каждая глава посвящена одной концепции, объясняет, когда и зачем её применять, и содержит компилируемые примеры с упражнениями прямо в тексте.
Для кого эта книга
- Разработчики, которые прошли The Rust Programming Language, но не понимают, как на практике спроектировать решение
- Инженеры, переносящие промышленные системы с C++ и C# на Rust
- Все, кто упёрся в стену с обобщёнными типами, границами трейтов или ошибками времён жизни и хочет систематический набор инструментов
Предварительные требования
Прежде чем начать, вам стоит уверенно владеть:
- владением, заимствованием и временами жизни (базовый уровень)
- перечислениями, сопоставлением с образцом и
Option/Result - структурами, методами и базовыми трейтами (
Display,Debug,Clone) - основами Cargo:
cargo build,cargo test,cargo run
Как пользоваться этой книгой
Обозначения сложности
Каждая глава помечена уровнем сложности:
| Символ | Уровень | Значение |
|---|---|---|
| 🟢 | Основы | Базовые концепции, которые нужны каждому разработчику на Rust |
| 🟡 | Средний | Паттерны, которые применяются в промышленных кодовых базах |
| 🔴 | Продвинутый | Глубинные механизмы языка: возвращайтесь к ним по мере необходимости |
План изучения
| Главы | Тема | Рекомендуемое время | Контрольная точка |
|---|---|---|---|
| Часть I: Паттерны на уровне типов | |||
| 1. Обобщённые типы 🟢 | Мономорфизация, const-обобщения, const fn | 1–2 часа | Может объяснить, когда dyn Trait предпочтительнее обобщений |
| 2. Трейты 🟡 | Ассоциированные типы, GAT, blanket-реализации, vtable | 3–4 часа | Может спроектировать трейт с ассоциированными типами |
| 3. Newtype и type-state 🟡 | Безопасность типов без затрат во время выполнения, автоматы на этапе компиляции | 2–3 часа | Может реализовать builder-паттерн на основе type-state |
| 4. PhantomData 🔴 | Маркировка времён жизни, вариантность, проверка drop | 2–3 часа | Может объяснить, почему PhantomData<fn(T)> отличается от PhantomData<T> |
| Часть II: Конкурентность и рантайм | |||
| 5. Каналы 🟢 | mpsc, crossbeam, select!, акторы | 1–2 часа | Может реализовать пул воркеров на каналах |
| 6. Конкурентность 🟡 | Потоки, rayon, Mutex, RwLock, атомарные типы | 2–3 часа | Может подобрать подходящий примитив синхронизации для задачи |
| 7. Замыкания 🟢 | Fn/FnMut/FnOnce, комбинаторы | 1–2 часа | Может написать функцию высшего порядка, принимающую замыкания |
| 8. Функциональный и императивный стили 🟡 | Цепочки итераторов, комбинаторы Option и Result, когда выбирать цикл | 2–3 часа | Может объяснить, когда комбинатор понятнее цикла, а когда нет |
| 9. Умные указатели 🟡 | Box, Rc, Arc, RefCell, Cow, Pin | 2–3 часа | Может объяснить, когда применять каждый умный указатель |
| Часть III: Системы и продакшн | |||
| 10. Обработка ошибок 🟢 | thiserror, anyhow, оператор ? | 1–2 часа | Может спроектировать иерархию типов ошибок |
| 11. Сериализация 🟡 | serde, zero-copy, бинарные данные | 2–3 часа | Может написать собственный десериализатор serde |
| 12. Unsafe 🔴 | Сверхспособности, FFI, подводные камни UB, аллокаторы | 2–3 часа | Может обернуть unsafe-код в корректный безопасный API |
| 13. Макросы 🟡 | macro_rules!, процедурные макросы, syn/quote | 2–3 часа | Может написать декларативный макрос с tt munching |
| 14. Тестирование 🟢 | Модульные, интеграционные и doc-тесты, proptest, criterion | 1–2 часа | Может настроить property-based тесты |
| 15. Дизайн API 🟡 | Структура модулей, эргономичные API, флаги функций | 2–3 часа | Может применить паттерн «parse, don’t validate» |
| 16. Async 🔴 | Futures, Tokio, распространённые ошибки | 1–2 часа | Может находить анти-паттерны async |
| Приложения | |||
| Справочная карточка | Краткая сводка по границам трейтов, временам жизни и паттернам | По необходимости | — |
| Итоговый проект | Планировщик задач с безопасностью типов | 4–6 часов | Сдайте работающую реализацию |
Общее расчётное время: 30–45 часов для основательного изучения с упражнениями.
Работа с упражнениями
Каждая глава заканчивается практическим упражнением. Чтобы извлечь из книги максимум:
- Сначала попробуйте сами: потратьте минимум 15 минут, прежде чем открывать решение
- Набирайте код: не копируйте и не вставляйте, набор текста вырабатывает мышечную память
- Меняйте решение: добавьте функциональность, измените ограничение, намеренно что-нибудь сломайте
- Проверяйте перекрёстные ссылки: большинство упражнений сочетают паттерны из нескольких глав
Итоговый проект (в приложении) объединяет паттерны из всей книги в одну систему промышленного качества.
Оглавление
Часть I: Паттерны на уровне типов
1. Обобщённые типы — полная картина 🟢
Мономорфизация, компромиссы по размеру кода, обобщения против перечислений и трейт-объектов, const-обобщения, const fn.
2. Трейты в деталях 🟡 Ассоциированные типы, GAT, blanket-реализации, маркерные трейты, vtable, HRTB, трейты-расширения, диспетчеризация через перечисления.
3. Паттерны newtype и type-state 🟡 Безопасность типов без затрат во время выполнения, автоматы состояний на этапе компиляции, builder-паттерны, конфигурационные трейты.
4. PhantomData — типы, которые не несут данных 🔴 Маркировка времён жизни, паттерн «единицы измерения», проверка drop, вариантность.
Часть II: Конкурентность и рантайм
5. Каналы и передача сообщений 🟢
std::sync::mpsc, crossbeam, select!, обратное давление (backpressure), паттерн актора.
6. Конкурентность, параллелизм и потоки 🟡 Потоки ОС, scoped-потоки, rayon, Mutex/RwLock/атомарные типы, Condvar, OnceLock, паттерны без блокировок.
7. Замыкания и функции высшего порядка 🟢
Fn/FnMut/FnOnce, замыкания как параметры и возвращаемые значения, комбинаторы, API высшего порядка.
8. Функциональный и императивный стили: когда выигрывает изящество 🟡
Комбинаторы Option и Result, цепочки итераторов против циклов, оператор ?, построение коллекций, антипаттерны.
9. Умные указатели и внутренняя изменяемость 🟡 Box, Rc, Arc, Weak, Cell/RefCell, Cow, Pin, ManuallyDrop.
Часть III: Системы и продакшн
10. Паттерны обработки ошибок 🟢
thiserror против anyhow, #[from], .context(), оператор ?, паника.
11. Сериализация, zero-copy и бинарные данные 🟡
Основы serde, представления перечислений, десериализация без копирования, repr(C), bytes::Bytes.
12. Unsafe Rust — контролируемая опасность 🔴 Пять сверхспособностей, корректные абстракции, FFI, подводные камни UB, аллокаторы на основе арен и slab-аллокаторы.
13. Макросы — код, который пишет код 🟡
macro_rules!, когда (не) стоит использовать макросы, процедурные макросы, derive-макросы, syn/quote.
14. Паттерны тестирования и бенчмаркинга 🟢 Модульные, интеграционные и doc-тесты, proptest, criterion, стратегии моков.
15. Архитектура крейтов и дизайн API 🟡 Структура модулей, чек-лист дизайна API, эргономичные параметры, флаги функций, воркспейсы.
16. Основы async/await 🔴 Futures, быстрый старт с Tokio, распространённые ошибки. (Подробнее об async см. в нашем курсе по Async Rust.)
17. Упражнения Сводный набор упражнений по главам книги.
Приложения
Итоги и справочная карточка Руководство по выбору паттерна, шпаргалка по границам трейтов, правила elision времён жизни, дополнительная литература.
Итоговый проект: планировщик задач с безопасностью типов Объединение обобщённых типов, трейтов, typestate, каналов, обработки ошибок и тестирования в единую систему.