Выучэнне Rust праз дзесяць праектаў: ад інструментаў CLI да служб аналізу
Парадак па 10 праектаў на мове Rust, прычымная ад кліентскага інструменту для сканавання файлав да клону Redis, а таксама службы для работы з шэлем і выканання задач, і тое, чым кожны з іх навучае пра памяць, паралельную працу і адказнасць.
Крыніцы: 10 Rust Projects That Will Actually Make You Better at Programming in 2026
Багато распрацоўшчыкаў, якія пачынаюць працаваць з Rust, вітрачаюць тыясчы гадзін на вівучэнне сінтаксісу і навчальных матэрыялаў, але зупыняюцца ў першы раз, калі прабуюць стварыць ўсё-такі рэальны продукт. Знанне ключоўых словаў — гэта не тое ж сама, што розуменне таго, чаму прыстрой для перагляду запозычэнняў адхіляе ваш дызайн, як асінхронныя задачы раздзеляюць стан, або што должна выйсці, калі сокет закрываецца падчас запуску запыту. Надзейны спосаб праявіць гэтыя навыкі — ствараць праекты, якія змушаюць вас сталкнуцца з гэтымі пытаннямі. У гэтым кяле супакаваны дзесяць такіх праектаў у растучай спрабе, паследовнасты сложнасці; апісана, што кожны з іх змушвае вас выучыць, а таксама наведаны прыкметнікі (ітэрацыя, тэставанне, бенчмаркінг і адлежнае выкарыстоўванне AI), якія ператвараюць готавы праект у справжнія навыкі.
Чаму праекты лепшыя за запамятовванне сінтаксісу
Rust выклікаецца ў сістэмнам програмнам забезпечэнні, хмарный інфраструктурэ, інструментах для распрацоўшчыкаў, продуктах абароны, платформах блокчэйну і частках інфраструктуры штучнага інтэлекту. Такая шырока апляванасць робіць яго прываблівым для вівучэння, але таксама спрыяе поверхневам падходу. Вы можэце запам’ятаваць усі этыя ключовыя словы:
let
mut
fn
struct
enum
trait
impl
і ўсё раве застацца без дзеяння, калі рэальны прыграма патрабуе спяльнага зменяемага стану між ніткамі. Найболей корыстныя праекты для навучэння не павінны быць велікімі. Гэта тыя, якія дапамагаюць зрозумець, чымі саме спраектавана мова, адколі яны ставяць вас у сітуацыі, дзе наўмовны падход не компілюецца або не функцыонуе пад рэальнымі данымі.
1. Інструмент у командной лініі, які рашае рэальную проблему
Пачніце з чаго-небудзь простага, з таго, што вы насправдэе будзеце іспользоваць. Хорашыя варыянты – аналізатор логаў, прыстрой для пошуку файлоў, інструмент для красавае выварыць JSON, працоўнік з CSV, генератор пароляў, сканер дырэктарый або канвертар Markdown.
Напрыклад, сканер логаў можна запусціць так:
$ logscan app.log --level error
і вывесіць статыстыку, а пасля – адпаведныя лініі (першая лінія рэзультата тут вывешана разам з статыстыкай):
Found 42 errors12:31:04 Database connection failed
12:31:09 Request timeout
12:31:15 Authentication service unavailable
Нават такі просты інструмент выкарыстоўвае значны частака мовы:
- парсінне аргументаў з лініі каманды
- чытанне файлоў і апрацоўка бядаў I/O
- работа з
Stringі&str - мадэляванне дадзеных за дапамойкай структураў і энумерацый
- перадача бядаў за дапамойкай
Resultі? - організацыя коду ў модулі
- апісанне тэстаў на елементарныя функцыі
Не менш важна ўсё тое, што такі прылады дастаткова маленькія, ўсё можна завершыць. Доставка готовага продукту — гэта сама по сабе навык, а готовы маленькі прылад научыць больш, чым незавершаны амбітны прылад.
2. Мінімальны HTTP-сервер без фрэймворку
Перш чым прыбегаць да веб-фрэймворку, напісце просты HTTP-сервер на базе TCP. Шлях запіту, які вы будзеце рэалізаваць, выглядае прыбліжна так:
Client
↓
TCP connection
↓
HTTP parser
↓
Router
↓
Handler
↓
Response
У працэсе вы пазнаёце TCP і сокеты, структуру HTTP-запісаў, парасінг запітоў, стварэнне адпаведзей, калектывнае керування, адпаведальнасць за даныя, якія пераходзяць межы разных етапаў, а таксама керуванне колькімі з’еднаннямі адночасна. Сервер не павінен быць готовым да вываркі; ключоўая мета — розуменне. Калі вы зробіце гэта самі, фрэймворкі такія як Axum чы Actix Web больш не будуць здавацца чарамі, адтак як вы точна будзеце ведаць, якія завады ўсунуць гэтыя фрэймворкі з вашай працы.
3. REST API, які падаець на рэальную базу даных
Далей перайдзім да рэальнага бэкенда. API для карыстоўвання задачамі ёсць гарным варыянтом, з стандартнымі маршрутамі рэсурсаў:
POST /tasks
GET /tasks
GET /tasks/:id
PUT /tasks/:id
DELETE /tasks/:id
Потым дадам Постгрэскайл, аўтэнтыфікацыю, верыфікацыю, структураваныя адпаведзі на аберанні, логгіранне, калітэкцыю налашоўкаў і тэсты інтэграціі. Сюды почынаюць спаўлявацца атракты кожнага языка ў структуру архітэктуры, і тут з’яўляюцца болей значныя запытанні: які слой павінен карыстацца адпаведной часткай логікі, што павінен рабіць API, калі база даных недоступна, які статус і тэкст павінен прыйняць кліент, як аберанні павінны пераходзіць з слоя хранэння да адпаведзі HTTP, і як налашоўкі павінны разлічвацца ў розных сэрвісах. Гэтыя пытанні дызайну маюць горшы значэнне, чым будзь-якае адна правіла сінтаксі.
4. Канкурантны веб-краўлер
Цяпер падысьце сложнасць. Краулер, які запошчае многі сторанцы адразу, розпускаецца з пачатковай тупыкі так:
┌── URL 1
│
Start ───────┼── URL 2
│
├── URL 3
│
└── URL 4
Дадзіце чыстае паказанне для паралелізма:
Maximum concurrent requests: 10
Гэтыя адзіныя абмежэння змушаюць вас разумець канкуранцію замест таго, каб ствараў задачы і спадзяваўся на найлепшае. Вы будэтэ працаваць з асінхроннымі функцыямі і задачамі, каналамі, спакульнай становым і сінхронізацыяй, якая для гэтага трэбуецца, таймаутамі, перапрыбыткамі і обмежэннямі частоты. Вы таксама станеце сустрэчаць проблемы, якія ніколі не з’яўляюцца ў секвэнцыйных програмах, такія як двойны адвядзенне таго ж URL з двух задач або медленны хост, які стрымвае іншыя. Самэ гэтыя проблемы ўскладнююць стварэнне праекта.
5. Хранілішча тыпу ключ-значэнне
Маленькая база дадзеных — адна з найцікавейшых праектаў для навучэння. Пачніце з трох каманд:
SET name Rothy
GET name
DELETE name
Потым развійце гэты механізм за дапамою запісу на дыск, індэксавання, серыялізацыі, тэрміну давальнасці ключоў, транзакцый і безпечнага сумавернага доступу. Вы не прагначыце конкуруваць з Redis; вы прагначыце разумець, як працуюць двухчысловыя машыны. Праект трэнуе структуры дадзеных, ввод/выход дадзеных з файламі, практыкук структуры памяці, фарматы серыялізацыі, сумавернасць, гарантыі стойкасці і выдатнасць. Сюды ж пачынае стаць значамым, а не пераканальным, модэль власнасці ў Rust, калі вы цяпер карыстаецеся дадзеннямі, якія трываюць дыўга і да якіх хочаць запускацца калькі частак програмы.
6. Мініяцюрны сервер Redis
Калі храненне ключ-значэння вас зацікавіла, ператворыце яго на маленькі сетавы сервер, які вяршыць протакол, сэродні Redis:
SET user:1 Rothy
GET user:1
DEL user:1
і падтрымайце тэрмін давальнасці на адной заснове часу:
EXPIRE user:1 60
З часам можна дадаць магчымасць для TCP-з’яўленняў з калькольных кліентаў, парасінгу команд, адрабаткі паралельных запыткаў, зберагчэння ў памяці, стойкасці дадзеных, тэрміну існавання і стварэння крытэрыяў эфектывасці. Праект спалучае тэхнікі сеткавання, структуры дадзеных, паралельнасці і праектавання сістэм, і спрыяе розумэнню прычын-наследкавых звязкаў. Чы хадзіць серверу оптымізавацца па латэнсі, праўоўеры, выкарыстоўванні памяці чы стойкасці? Рэдка калі існуе адна правільная адпаведзь, і навык рашучага выбору і адказвання на пытанні пра гэты выбор ёсць адным з найболей корыстных урокаў у гэтым спіску.
7. Абавязкі ў чэрзе з працоўнікамі
Абавязкі ў чэрзе ёсць чырвоным практыкам для бэкенд-сістэм. Базовы прайсупутак ўключае:
Producer
↓
Job Queue
↓
Workers
↓
Results
Абавязкі выступаюць як елементы працы, такія як:
send_email
generate_report
process_image
run_test
Пачатакніце з працоўнікаў, які паступова беруць наступную задачу і ўжоўнаюць яе. Потым дадзіце калькі працоўнікаў, можлівасць перапрыбутку, назірання за статусам задач, таймауты, обработку абяканняў і павольны завершэння, пакуль дызайн не стане такім:
Producer
↓
┌───────────────┐
│ Job Queue │
└───────────────┘
↓ ↓ ↓
Worker Worker Worker
Ключовы урок заключаецца ў тым, што програмнае забезпечэнне — гэта не толькі успешны ход задач. Зялёнка задач дапамагае вам адначасова вырашыць, што будзе, калі задача зазнае абякання на паўпацёгу, калі працоўнік зламаецца, або калі працэсу будзе запатрэбавана паўза, калі праца ўжо трывае. Дызайн, які врачуе такія сцэнарыі, і ўражае разліку межы дэманстрацыі і справжней сістэмы.
8. Агрэгатор логаў
Для чагосьці, што больш прыбліжана да рэальнай інжынернай практыкі, створыце невялікую службу для збору логаў. Калькі прыкладных програм надаюць своія логі ў адного зборніка, які іх храніць:
Application A ──┐
Application B ──┼──> Log Collector ──> Storage
Application C ──┘
Зборнік можа прымоць логі праз HTTP аб сыры TCP і запростаць API для запытанняў:
GET /logs?level=error
GET /logs?service=payment
GET /logs?from=...
Праца абаратаецца сеткамі, серыялізацыём, адночасным прыемам дадзейнаў, фільтрацыёй, караткамі часоў, паляваннем дадзейнаў, структурой хранення, выдатнасцю і можлівасцямі аналізу. Гэта таксама чыстая нагода выучыцца, як сэрвіс працуе пад навантажэнням: што адбываецца, калі прыем дадзейнаў перавышае можлівасці хранення, сколькі памяці трэба на буфераванне і як зменшыцца швальнасць запытоў па меры зростання дадзейнаў.
9. Маленькія шэл Unix
Гэты праект ўскладнены, і сама гэта яго ціннасць. Пачніце з адклэювання простых каманд:
$ echo hello
hello
і адклэювання вбудованных функцый разам з зовнішнімі програмамі (прыказка другой каманды тут з’еднана з выходам першай):
$ pwd
/home/user$ ls
file1.txt
file2.txt
Потым дадаце адклэювання каманд, зменных сяродавысці, трубаў, перэнаправлення, фонавых процэсаў і адклэювання сігналаў, працуючы да стварэння такіх пайплайнаў, як:
cat access.log | grep ERROR | sort
У гэты момент вы працюеце нядаўна да аператывной сістэмы. Вы вучыцеся, як ствараюцься і керуюцца працэсы, як падключаюцца stdin, stdout і stderr, як успадковуюцься зменныя сераўысу, як трубкі налажваюць зв’язак между працэсамі, і якія API аператывной сістэмы стояць у основе. Лічная колькасць праектаў дапамагае раз’ясніць, што на самай працоўвае, калі вы нажмаеце Enter у тэрмінале.
10. Маленькія службы для інферэнсу ШЫ
Фінальны праект адбіваецца там, дзе ведуцься большасць новых работ з інфраструктурой. Мета не ў трэніраванні мадэлі, а у стварэнні службы на адной з іх:
Client
↓
Rust API
↓
Request Queue
↓
Inference Worker
↓
Model
↓
Response
Прыгучая служба прымает запыткі аналізу, пераканальвае вхідныя даны, ставіць задачы у чэргу, обрабоцвае запыткі паралельна, вяртае рэзультаты, фіксуе час адпаведзьбы, застаўляе таймауты і адкрывае метрыкі. Справжняй інжынерны кроек знаходзіцца ў інфраструктурэ, а не ў самай модэлі. Можна експерыментаваць з лімітамі паралельнасці, групаваннем запыткаў, кэшаваннем, контролем доступу, выкарыстоўванням памяці, бюджэтамі часу адпаведзьбы, паўтарнымі спробамі і можлівасцямі адзоравання. Самэ тут кантроль Rust над памяцюю і паралельнасцю стае прымусова значным для сістэм, якія стояць за AI-застосункамі.
Займіцеся аднім праектам глыбока, а не дзесяцьма поверхнева
Вам не трэба ствараць кожны з прыказаных тут праектоў, і спроба гэтага зазвычай ёсць памылкай. Выберыце адны, завершыце яго, а потым продаважвайце яго праграсаць. Першы веха можа быць:
Version 1
Basic functionality
Пасуюць даўжэйшыя версіі, кожная з якіх дадае ўстаткування (стрэлкі і пазначкі версій паказваныя разам у гэтым спісе):
↓Version 2
Better error handling ↓Version 3
Tests ↓Version 4
Concurrency ↓Version 5
Persistence ↓Version 6
Benchmarking ↓Version 7
Production-style monitoring
Большая частка навучэння адбываецца ў гэтым цыкле паліпшэння. Кожная версія змушвае вас пераглядаць пакананыя ранейя рашэнняя, а перэработка вашага сапраўднага коду пад новыя трэбаванні дае набагато большых наўканняй, чым запуск іншага праекту з нуля.
Запытанні, якія выучаюцься за дапамой гэтых праектаў
Навучэнне Rust — гэта не справжня мета; мета — навучыцца думаць пра програмнае забезпечэнне. Вышэўзгаданыя праекты постаўляюць вам тыя ж самыя групы запытанняў:
- Памяць: хто ёсць власнікам гэтых дадзенняў, і як дыяўна ўоні існуюць?
- Канкурэнтнасць: што будзе, як два заданняя будуць працаваць з гэтымі дадзеннямі адночасна?
- Памылкі: што трэба рабіць, калі гэтае задання не выйдзе?
- Сеткавыя звязкі: шта будзе, як кліент ад’юнкуруецца на паўпацёгу?
Гэтыя запытанні актуальны для будзь якога мовапраекту. Rust проста змушвае вас сталкнуцца з большай часткай іх раней, частаўна ў момент компілявання, а не пад час працы продакту.
Рэкамендаваная парадоксальнасць
Калі вы пачынайце з нуля, крокуйце па сходах, а не прымаўайцеся за самы складны ўзлёт:
- Пачатківцы: інструмент CLI, для азоў мовы і кантролю памылак.
- Пачатківцы да срэдніх: HTTP-сервер, для сеткавых тэхналогій і базовых концэпцый.
- Срэднія ступень: REST API, для рэальной архітэктуры бэкенду.
- Срэднія ступень: кранер для асінхроннага коду і паралельнай обработкі.
- Срэдняя ступень да прыглушаная: хранільнік ключ-значэння, для зберагчыцтва дадзеных і стану.
Тэставанне з першага дня
Не адкладайце тэставанне да канца. Для кожнага праекту пераканайцеся, што працюе нормальная праца, правільна обработка невалідных і порожніх дадзеных, а таксама умовы на межах, паралельныя операцыі, сцэнарыі абяканняў, таймауты і механізмы вяснавання. Калі канцэнтр патрабуе ID карыстальніка, адна тэстацыя успішнага сцэнарыю недастаткова:
GET /users/123
Таксама пераканайцеся, што працююць нулі, ад’язычныя чысла, нечыслявыя значэння, чразнацальныя ID і сітуацыі з відсутнім элементам:
GET /users/0
GET /users/-1
GET /users/abc
GET /users/999999999
GET /users/
Хто тут праця програміста і тэставальніка спалюецца ў адну дысцыпліну. Програма, якая працуе толькі калі все ідзе правільна, не ўважаецца завершанай. Вбудованы інструмент cargo test у Rust дазволяе проста трэсці такія кейсы разам з кодам.
Бенчмарк узамен на прыпускі
Rust знаецца сваёй швальнасцю, таму крашчэ ёе змерыць, чым проста стварыць прыпускі. Тэст на навантажэнне вашага сервера можа даць атлас, падобны наступнаму; ці фігуры ў ям ёсць толькі ілюстрацыяй, а вашы рэзультаты будуць залежаць абсалютна ад апаратуры і характару работы:
Requests: 100,000
Average: 4.2 ms
P95: 7.1 ms
P99: 11.4 ms
Throughput: 23,800 req/s
Запісаце базовы рэзультат, змяніце адну вешч і зноў яго змерыце. Зверніце увагу на паздзейныя затрымкі, такія як P95 і P99, а не толькі на сярэдню вялічыну, таму што саме тут зазвычай выяўляюцца проблэмы з конкурэнціяй і выдзелам рэсурсаў. Змерыце раней і пазней — гэта прыкмета, якая дапамагае оптымаізацыі базавацца на доказах, а не на прыпускіх.
Існаванне дапаможных ай-інструментаў без прыпінення навучэння
Інструменты для програмавання на ай-і можаць гэтакі час ствараць для вас многа коду на мове Rust: структуры, прыемнікі API, тэсты, запыты да базы дадзеных, тыпы памялкі і дакументацыю. Гэта справдзіваеся корыстна, але якшо мета праекту — стаць лепшым програмістам, то перакладанне всіх задумоў на іншага памячвае цю мету. Лепшы спосаб работы — самостайна спроекаваць рашэнне, яго рэалізаваць, а толькі пасля чаго папросіць дапаможніка пераканацца ў яго якосці, напрыклад, прабачыць перакананне на наявнасць проблем з аднойчынным выкарыстоўванням рэсурсаў, багоў у паралельнай працы, прасочэнняў у апрацоўцы памялкі і непатрэбных выдзелаў памялкі. Такія перакананні чыгуча ўчыць; прасіць пераканацца ў всій аплікацыі — ні. Галоўная мета — не адмовіцца ад ай-інструментаў, а выкарыстоўваць іх не пакідаючы навучэння.
Што включае цяперашні набор
Правільна завершыць хоць тры-чатыры з гэтых праектаў даўа можлівасць пазнакоміцца з шырокім спектрам аспектаў інжынерыі прыкладнага програмавання:
Rust
│
├── Ownership
├── Borrowing
├── Error handling
├── Traits
├── Generics
│
├── Networking
├── Concurrency
├── Async programming
│
├── Databases
├── APIs
├── Operating systems
│
├── Testing
├── Benchmarking
├── Observability
│
└── System design
Такі знанья маюць набагато большую цэнна, чым ўсе туторыялы, якія можна завершыць.
Ключавыя выводы
- Выбірайце праекты, якія змушаюць вас сталкнуцца з пытанням адпаведнасці за працу, паралельнай обработкай дадзеных і можлівымі абяронамі, а не толькі з сінтаксай.
- Пачніце з чаго-небудзь простага, што можна завершыць, а потым перайдзіце да працы з сеткамі, храненнем дадзеных і працы на рэвэлье ОС.
- Работайце над аднім праектам, ствараючы кілька версый, а не пачынайце многа праектов.
- З самага пачатку тэставайце крайнія сітуацыі і магчымыя шляхі абяронаў, а таксама пераканальвайце кожны заявлёны прагрэс.
- Дазвольце ШЫ пераглянуць вашыя праектныя рашэння і код, але самі здзейснюйце праектную частку.
- Найлепшы наступны праект — гэты, які дапаможа ўсвядоміць тое, чаго вы зараз не ведаеце: пачніце з простага, разберыце яго, тэставайце, аналізавайце, выправіце, а потым ускладніце яго.