Чому я перейшов з Node.js на Rust

Всім привіт, мене звати Володимир. Я — Rust Developer у компанії Yalantis, працюю на проєкті у сфері енергетики. Передусім, я — світчер, який понад 5 років працював з Node.js, JavaScript та частково C++. Мій досвід поширюється на компʼютерну графіку; системне програмування та кросплатформену розробку; розробку утиліт для збірки, тестування та налагодження; розробку Node.js аддонів; бекенд та фронтенд, також у мене чималий досвід в open-source.

Rust-ом я почав цікавитись з 2021-го. Все почалось з пропозиції мого колеги вивчати нову технологію, щоб в майбутньому зробити перехід. Спочатку я скептично ставився до цього, але мій тіммейт поринув у Rust з головою і постійно знайомив нашу команду з цікавими знахідками та застосуванням мови. Це замотивувало мене серйозніше ставитись до Rust. На той момент у нас вже було багато open-source модулів, які ми постійно підтримували та використовували у проєктах. Виникла ідея перенести їх з часом на Rust. Ще один чинник — велике бажання застосувати нову технологію у реальному проєкті.

Як я почав перехід: ком’юніті, організація воркшопів

Своє знайомство з Rust я почав із rustlings. Це набір невеликих задач, націлених на спрощення процесу звикання до нової мови. Всім відомий rust-book — це, без сумнівів, крута річ і його необхідно пройти усім, хто бажає вивчати Rust. Але на той час мені кортіло швидше застосувати Rust на практиці. Я був приємно вражений наявністю такого інструменту та з захопленням виконував вправи, від тоді мене захопив азарт. Деякі задачі давались складніше через нові концепції та необхідність звикнути до компілятора. Часто користувався підказками та гуглив все незрозуміле. Пізніше я все-таки повернувся до rust-book та зі спортивного інтересу неодноразово проходив курс rustlings від початку. Також можу порадити книгу Programming Rust, 2nd Edition. Від цього моменту ідея розвиватись в напрямку Rust стала пріоритетною, а JavaScript/Node.js я відклав на другий план, хоч і продовжував застосовувати у роботі.

В той самий час у мого колеги виникла нова ідея — створити ком’юніті, щоб вивчати Rust спільнотою і розвиватись разом. На той момент в українському просторі існувала ще одна Rust-спільнота, але вона не була дуже активною, а з часом об’єдналась із новоствореним ком’юніті.

Щоб привабити більшу аудиторію, ми почали розповідати про мову Rust з боку її використання у сфері блокчейну, тоді багатьох людей цікавило саме це. Ми провели офлайн-воркшоп, куди запросили розробника з команди Near. Усі охочі могли долучитись до розробки «іграшкового» блокчейну через контрибуцію до репозиторію на GitHub. Пізніше виникла ідея проводити щотижневу коротку зустріч у діскорді, де учасники обмінювалися знаннями та цікавими знахідками про Rust. Наступні воркшопи були вже пов’язані із графікою та геймдевом. Там ми розробляли гру в шахи: починали з логіки та CLI інтерфейсу, а далі імплементували вже графічну частину. Воркшоп складався з двох частин, по декілька годин на день. У перший день ми займались розробкою логіки гри та CLI інтерфейсу. Другий день був присвячений графічному інтерфейсу гри. Графічна частина реалізувалася за допомогою bevy та egui. Учасники були поділені на команди, що мали власних лідерів. За виконані задачі команда отримувала бали, в залежності від складності виконаного завдання. Деякі завдання залежали від інших, для їх виконання необхідно була кооперація між командами. Наприкінці воркшопу ми визначили переможця за найбільшою кількістю балів та провели демонстрацію результатів роботи. Це був дуже цікавий досвід, раніше я не займався подібним.

Перший проєктний досвід

Можливість використати Rust на справжньому проєкті не змусила довго чекати. Свій перший досвід я отримав працюючи в команді над mvp графічного проєкту для анімації націленого на веб і, в перспективі, на мобільні та десктоп девайси. Особисто я займався налагодженням збірки під різні платформи та питаннями інтеграції wgpu. Тут мав змогу вперше ознайомитись із проєктом cargo-make, який пізніше знайшов застосування у наступному проєкті. Також я отримав досвід розробки на Rust для iOS та Android-пристроїв, цей досвід теж вдалось застосувати в новому проєкті. Окрім досвіду я зробив для себе багато нових відкриттів, які стали в пригоді у майбутньому. Думки про повернення до Node.js зникли.

Перехід в Yalantis: поточний проєкт, моя діяльність

В компанію я прийшов навесні 2022-го. Мені поталанило і я дуже задоволений результатом. Я почав роботу на проєкті із дослідження питань збірки нашого майбутнього SDK, написаного на Rust, для використання в Android та iOS проєктах. Став у пригоді досвід здобутий раніше. Я познайомився з рішеннями, що дають змогу використовувати Rust-ові бібліотеки в інших мовах програмування, зокрема, Kotlin та Swift. Пізніше я приєднався до команди, що займається розробкою фреймворку. Зараз моя діяльність полягає у розробці фреймворку, в якому значну роль відіграють процедурні макроси. Робота з макросами є складною й одночасно дуже цікавою. Складність полягає не лише в імплементації, тестуванні чи налагодженні, а і в тому, що їх застосування та робота не є тривіальними для Rust, якщо казати саме про нашу ситуацію. В процесі дослідження та розробки фреймворку, я також отримав цікавий досвід роботи з компілятором та його інтерфейсом.

Чим мені подобається Rust

Rust вирішив мій особистий біль — це tooling. Це утиліти, з якими ти як розробник стикаєшся кожен день. Порівнюючи з Node.js, мені дуже часто доводилося змінювати версії та платформи, це створювало незручності через необхідність користування декількома утилітами. В Rust є стандартизований менеджер версій, і це перша річ, яку встановлює розробник. Відсутність єдиного загальновизнаного рішення для написання та генерації документації в Node.js теж викликає труднощі. Згенерована документація проєктів відрізняється: як візуально, так і по функціоналу. Аналогічна ситуація із лінтером та утилітою для форматування коду. В Node.js це були сторонні рішення, у Rust — загальноприйняті, що є частиною тулчейну.

Тепер про компілятор. Робота з компілятором у Rust приносить мені значно більше задоволення, порівнюючи із досвідом Node.js. Повідомлення та запропоновані варіанти розв’язання проблем від компілятора Rust, в більшості випадків, допомагають усунути проблему швидше. Для мене комфорт розробки був ще одним вирішальним фактором у виборі Rust як наступної технології. На мою думку, краще витратити більше часу на етапі розробки у боротьбі із компілятором, ніж витратити більше часу на діагностику проблеми у майбутньому. Звичайно, порозумітись із компілятором вдалось не відразу, але із накопиченням досвіду компілятор стає твоїм кращим другом, з яким ви займаєтесь парним програмуванням.

Відзначу крутий pattern matching, макроси та ком’юніті. Якщо порівнювати макроси у Rust з іншими мовами, то такої потужної системи я ще не зустрічав. Щодо спільноти, то растове ком’юніті дуже дружнє — там завжди готові допомогти початківцю. Перехід на Rust важкий і продукує багато питань, але люди зі всього світу охоче відповідають навіть на найдурніші питання і це приваблює. У Rust є кодекс поведінки, що дотримується командою модераторів, тому офіційні портали й більшість неофіційних сприяють приємному спілкуванню. Community дбає про мову, але це винятково мої відчуття.

Для чого я використовував Rust

Серед напрямків, з якими я мав справу:

Web development. Цей напрямок використання мови швидко розвивається. Вже зараз Rust може запропонувати чималу кількість фреймворків та крейтів на різну тематику.

Зростання присутності WebAssembly у браузері є великим плюсом для Rust, адже відкривається ще одна ніша для застосування мови. Швидкодія WASM є перевагою для використання у складних додатках. Наприклад, графічних, як Figma. Також WASM дає можливість не перейматись обфускацією коду, портувати чинні проєкти, написані на інших мовах, писати фронт та бекенд, використовуючи одну мову програмування.

Більше інформації про можливості веброзробки з використанням Rust можна дізнатись: тут, у книзі з WASM та на головній сторінці.

Gamedev & Graphics. Rust чудово підходить для розробки графіки та ігор під web, мобільні девайси та десктоп. Екосистема ще молода, але постійно розвивається. Зараз можна знайти достатньо засобів для початку експериментів. Говорячи про проєкти пов’язані із графікою, я б відзначив:

Що стосується геймдеву, то мені на думку спадають такі проєкти:

Детальніше про проєкти та екосистему можна дізнатись тут.

Розробка розширень для використання в інших мовах програмування. Окрім можливостей розробки додатків для інших мов, хочу сказати декілька слів про розробку бібліотек для мобільних платформ. Mozilla дуже активно використовує Rust не тільки для переписання критичних частин. У них вона застосовується і в мобільних додатках. Mozilla розробляє uniffi — рішення для генерації байндінгів для бібліотек, написаних на Rust під інші мови програмування, зокрема Kotlin та Swift, що використовуються в Android та IOS проєктах. Uniffi активно застосовується в наступних проєктах:

Розробка CLI застосунків та скриптинг. Rust чудово підходить для розробки CLI застосунків. Для цього в екосистемі є чимала кількість крейтів. Підтвердженням цьому є велика кількість опублікованих утиліт та розширень cargo. Серед проєктів які я використовую, особисто можу відзначити:

Що стосується скриптингу, то особливо корисними для мене є:

Компанії, які вже використовують Rust

Мову Rust вже використовують відомі гравці на ринку технологій: Atlassian, Evo Company, Coursera, Cryptape. У 2021 році Facebook приєднався до Rust Foundation. Файловий та хмарний хостинг Dropbox теж активно використовує мову у серверній частині, що відповідає за синхронізацію. Twitter використовує Rust для високонавантаженої частини сервісу. 2022 може нарешті стати роком для Rust всередині ядра Linux версії 6.1. Таку інформацію повідомив автор ядра Linux і координатор його розробки Лінус Торвальдс на Kernel Maintainers Summit.

Rust є сприятливим варіантом для великих розподілених мереж із великою кількістю підключених пристроїв, що потребують агрегування та обробки великих обсягів даних. Таким чином виробники пристроїв інтернету речей й виробники медичного обладнання можуть отримати особливу користь від впровадження Rust. У 2019 році компанія 42 Technology анонсувала свої перші однокристальні пристрої IoT, створені в Rust. Ця мова є універсальною та підходить для всіх рівнів підключення IoT: хмарних, периферійних та IoT девайсів.

За допомогою бібліотек на основі Rust можна створювати масштабовані та швидкі програми. Наприклад, перспективним є біотехнологічний стартап Imeka, що використовує Rust для створення бібліотеки, що утворює високопродуктивні алгоритми медичної візуалізації з високою роздільною здатністю на своїй платформі візуалізації мозку. Сюди ж можна додати й розробку високопродуктивних інструментів розробки й тулінгу. Консалтингова компанія Stratum Security, що займається інформаційною безпекою, використовує Rust для проведення тестування витоку даних, щоб забезпечити кращу безпеку програм для своїх клієнтів. JetBrains також пропонує зручний інструмент тестування та налаштування в Rust.

Багато глобальних компаній, таких як Braintree, Postmates і Snapview, використовують Rust для побудови бекенду своїх вебслужб. Rust підходить для оптимізації будь-якої клієнт-серверної архітектури. Snapview, німецька цифрова комунікаційна компанія, використовує Rust, щоб розширити можливості свого сервера для надання високоякісних і високопродуктивних послуг відеоконференцій. Отже, Rust — це мова загального призначення для розробки ефективного та продуктивного програмного забезпечення, що легко масштабується та підтримується.

Ситуація на ринку, складність знайти проєкт і розробника

Якщо ми подивимося на популярні мови програмування, то практично за кожною з них стоїть велика корпорація. Новачку важко пробитися в таку тісну компанію. Але Rust поступово завойовує своє місце. Можливо, це погано видно через аутстаф-орієнтований ринок розробників України. Зараз Rust цілком готовий для широкого та масштабного використання. Попит на мову програмування Rust становить 2,4% у світовому масштабі порівняно з іншими мовами. Проте 5,18% опитаних розробників сказали, що знають мову. Пропозиція Rust розробників перевищує попит на них. Вважаю, що в цьому випадку не ринок переконує розробників, які мови вивчати, а скоріше розробники почнуть переконувати ринок, яких спеціалістів шукати. І в цьому випадку Rust справді змінює правила гри. Згідно з опитуванням Stackoverflow за 2022 рік, Rust входить до 10 найбільш високооплачуваних мов програмування у світі.

Мої міркування, чому хмарний сервіс AWS перейшов на Rust? Справа в зацікавлених у цій мові людях. У них є дуже крутий чувак Jon Gjengset, залишу посилання на його Youtube канал. Маючи такого крутого фахівця, дійсно можна перейти на іншу технологію. Rust розвиває специфічний стиль мислення, після якого ти вже не будеш таким, як раніше.

Щоби переконати керівництво для переходу на іншу технологію, треба показати конкретні цифри, в чому буде lifetime value. Компанії треба інвестувати в це гроші, потрібні аргументи для такого переходу. Нам пощастило, ініціатором розробки на Rust був сам клієнт. Це дуже круто, що в українському просторі з’являються клієнти з таким бажанням. Важливу роль грає й Community. Якщо ми будемо активно розвивати цю частину — більше розробників та потенційних клієнтів звернуть увагу на Rust. Ринок лімітований — складно знайти або проєкт, або розробника високої експертизи, якщо такий проєкт з’являється.

Отже, коли ти маєш достатньо досвіду, в тебе не виникає бажання шукати нові штуки, ти просто пишеш код. У випадку з Rust, ти постійно шукаєш нові крейти, відкриття, які можна принести у свій проєкт.

Я рекомендую подивитися у бік Rust розробникам, які все більше незадоволені інфраструктурою та екосистемою теперішньої мови програмування. Якщо ви просто втомилися від спірних і нелогічних речей, як це було зі мною, поступово переглядайте вакансії, ходіть на співбесіди, дізнавайтеся, що запитують і визначайте свої слабкі сторони. Практикуйтесь на pet-проєктах. У цій сфері немає упереджень на ринку, можуть взяти як джуна, так і досвідченого світчера.

Сподобалась стаття? Натискай «Подобається» внизу. Це допоможе автору виграти подарунок у програмі #ПишуНаDOU

👍ПодобаєтьсяСподобалось19
До обраногоВ обраному10
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Чи є життя на расті окрім блокчейну? Я не про пет проекти а про продакшн?

Так є, на оф. сторінці є перелік компаній які застосовують Rust: www.rust-lang.org/production, www.rust-lang.org/production/users

Я от не розумію, чого всі так хайпують від раста, коли є чудовий golang? Неперевершена швидкість розробки та роботи, кросплатформеність, легкість мови, gc (для мене це +)? Чим людям go не подобається?

Эх, не те уже троли пошли. Вот в мою молодость троли так троли были.
images.slideplayer.com/...​35219/slides/slide_65.jpg

Можешь дорисовать картинку с сортировкой на Go, чтобы поразить нас в самое сердце !
А не с этой гошной шелупонью, которая в каждом первом менеджед есть

кросплатформеність, легкість мови, gc

Вибачте, але я не тролю і на повному серйозі.
Кросплатформеність — дуже легко написати CLI/сервіс, етц під Linux/Mac/Win — потрібно буде майже 0 надлишкових рухів (особливо, якщо не використовувати екзотичні модулі). Спробуйте повторити такий фокус з растом.
Те, що мова легка призводить до того, що продукт легше підтримувати, легше находити людей, швидко їх онбоардити і т.д.
gc — для дечого не підходить (так, в ядрі Лінукса не буде), але для 99% продуктів прибирає головняк.

Все ще не розумію.

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

Ну, для мене Python -> Golang то був легкий рух і привнесло всі плюси го (ну ви знаєте — швидкість, типізацію, нормальну конкарренсі, кросплатформи (вкл. ARM)).
Я повністю признаю Rust як заміну для С/С++ для проектів типу драйверів, етс, але якщо ціль — зробити щось просте і швидко — мікросервіс, CLI, скрипт, інструмент то як раз євангелісти раста намагаються всунути його всюди, а потім інші мають попобіль підтримувати це все.

але якщо ціль — зробити щось просте і швидко
Неперевершена швидкість розробки

Так что там с квиксорт ?

images.slideplayer.com/...​35219/slides/slide_65.jpg

Я мабуть не знаю цього приколу, буде на 90% вигдядати як в С — партішен, рекурсія всі діла, а що?

але якщо ціль — зробити щось як завжди
Типова швидкість розробки

Let me fix it for you

Ви робите типову помилку. Швидкість розробки != менше рядків коду.
Я зазвичай більше думаю (в тому числі, як писати код, щоб вчорашні випускники могли дописувати мій код), ніж набираю код на швидкість.
Знав я одного девелопера який використовував list/dict comprehension в пайтоні 4 рівня вкладення. Зекономлені рядки — так. Швидкість розробки — hell, no.

Швидкість розробки != менше рядків коду.

Разве вам предложили соревноваться с языками APL, J, K где на листке А4 можно ERP систему написать ? Вы пишите много кода, потому что вы пишите много кода. И все.

Нащо мені це? Я пишу рівно стільки рядків, скільки треба для clean code (і я ще досі фан Zen of Python, так :) ).

clean code

Можно с закрытыми глазами. Судя по риторике опыт работы ~2-3 года.
Ладно, главное чтобы энтузиазм не пропал. Потом переосмыслите.

Драйвер писати навіть на С++, це вже часто густо куча оверхеду. Там в ассемблер стилі воно усе пишеться. С++ має лише сенс коли той драйвер дуже складний, наприклад драйвер відеокарти. На расті зараз зроблений Firefox і треба визнати усе вдалось як слід, для десктопу концепція працює. Багато років С++/JavaScript XPCOM реалізація Mozilla/Gecko страждала саме memory leak на сам перед. Та всеж у сімейства Krusader — WebKit/Blink etc на modern C++ нема таких проблем і подекуди Chrome/V8 краще, але не усюди. На Golang — написані Docker та Kubernetes. Та зараз активно розпилють монолітну архітектуру на модульну, де окремі шматки якраз самі низкорівневі, якщо переписати на С, як скажімо crun замість runc, буває що показують в 20 раз кращій перформанс. Тобто усе як завжди, якість програм більше залежить набагато більше від программістів ніж від конкретного інструментарію. В одних умовах і технічному завданні підходить один інструментарій і архітектура — в іньших умовах і завданні той самий інструментарій і архітектура не виправдовується.

Эх, не те уже троли пошли. Вот в мою молодость троли так троли были.
images.slideplayer.com/...​35219/slides/slide_65.jpg

пофиксил:

Сортировка в C:

void sort(...) {
    // doing bubble sort here because doing quick sort is a pain and 
    // we won't have many elements anyway 
}

Можна і треба в бойовому продукті бібліотечну функцію qsort визвати, і чогось придумувати тільки вже коли на профайліну стало ясно — що бібліотечна функція щось погано працює. Авжеш це не так вже і рідко стається, та усякі математичні методи розпізнання чи який алгоритм є оптимальний — не виправдались. Той досі робимо припущення і імпіричні заміри.

Дякую за статтю, але додавайте посилання на українські спільноти з Rust.

Яка швидкість розробки на Rust?
Не роботи застосунку, а саме розробки до продакшена. У порівнянні з іншими мовами програмування для точно такого ж функціонала. Наприклад порівняння з PHP для бекенду, порівняння з C# для геймдеву і т.д.

Така сама, як і на іньших мовах програмування. Rust-оманія ще раз прийшла до ідеї, що програмісти ніби можуть не цікавитись керуванням пам’ятю і залишити це на автоматичні інструменти, на цей раз вже не на етапі рантайму — а на етапі компайл тайму, що всеж набагато розумніше. В усьому іньшому — звичайнісінька імперативна мова програмування. Це дійшло аж до того, що мова одрбрена самим Лінусом Торвальдсом для розробки ядра Linux.

Ось добрі люди щойно вкинули
mdwdotla.medium.com/...​tionary-tale-42ab823d9454
В 4 рази повільніша з досвіду стартапа

Схоже там хлопці хотіли побачити швидкий круд на пайтон, а побачили реінкарнацію Сі++. Про що явно пишуть. Це не зовсім стихія раст.

Єдина проблема Rust — відсутність вакансій.

вакансии есть, но в основном хайповое говно под распил бюджета инвестора — крипта, блокчейн

Блокчейн/крипта звісно переважає, але це не означає що знайти проєкт в інших сферах не можливо. Я на особистому прикладі переконався що це реально. Можу додати що приклад на this-week-in-rust.org доволі часто зустрічаються пропозиції( схоже зараз вони перейшли в реддіт )

Підписатись на коментарі