Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 5
×

Чому я перейшов з 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-проєктах. У цій сфері немає упереджень на ринку, можуть взяти як джуна, так і досвідченого світчера.

👍ПодобаєтьсяСподобалось23
До обраногоВ обраному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

Я вчора заглянув на рекомендований канал Jon Gjengset
youtu.be/k6xR2kf9hlA?t=2367

Я щиро не розумію, чому люди у захваті від Rust, від цього вирвіглазного синтаксису із максимальним залученням усіх можливих не-alphanumeric символів у одному рядочку.

Там нумерація в neovim relative numbers, тому буду називати рядочки по номерам зверху, або знизу від 0.

Рядочок зверху, 9. «None». Шо? шозаноне саме по собі?
Рядочок зверху, 4, 0 запихається в якусь константу/змінну? Ну окей, нехай, цифри зліва, змінні справа.
Рядочок наступний 3, n => 2*n. Блд, шо??? n запихається у 2*n?

Рядочок 0, так і називається, муть (mut). Там у нас усьо, і знак оклику після змінної, і квадратні дужки, і ще й, щоб не скучно жилося «;» посередині.

Нагадало із старих часів, коли я готувався до мутних підковирок на співбесідах по C/C++ — c-faq.com/decl/cdecl1.html

declare a as array of pointer to function returning
		pointer to function returning pointer to char

	char *(*(*a[])())()

Рядочок знизу, 4. %, дужки, і ще два рази as u64, і щоб нескучно жилося as usize.

До рядочка 19 знизу у мене зауважень нема. Хіба що загальний контекст, що там тестується і як перевіряється на правильніть?

Я ось тут це називав «Z-реваншизм C++ -ників 90-х і початку 2000-х», але по ходу — це мова для нового юного покоління, хто C++ не бачив, і із задоволенням хочуть по граблям пройтися, бо їх пре і купу енергії нема куди діти.
dou.ua/...​rums/topic/41055/#2525956

ой гевальт
Всі твої питання — це просто незнання основ Rust-а

Я щиро не розумію, чому люди у захваті від Rust, від цього вирвіглазного синтаксису із максимальним залученням усіх можливих не-alphanumeric символів у одному рядочку.

Я так розумію, що коду на Perl ти не бачив...
Про всякі APL мовчу, бо це вже з часів мастодонтів :)

Рядочок зверху, 9. «None». Шо? шозаноне саме по собі?

Це функція, з якої вертається None
У Rust, як і у багатьох інших мовах, прийнято, що останній вираз вертає це значення з функції.

Рядочок зверху, 4, 0 запихається в якусь константу/змінну? Ну окей, нехай, цифри зліва, змінні справа.
Рядочок наступний 3, n => 2*n. Блд, шо??? n запихається у 2*n?

Це pattern match синтаксис, прийшов з функціональних мов.
Віддаленим аналогом було б switch-case, але pattern match набагато потужніший.
Відповідно, тут є 2 гілки — одна перевіряє, чи self.buckets.len() є 0, а друга — просто «розпаковує» значення з self.buckets.len(), якщо воно не 0, і кладе у змінну n

Рядочок 0, так і називається, муть (mut). Там у нас усьо, і знак оклику після змінної, і квадратні дужки, і ще й, щоб не скучно жилося «;» посередині.

mut означає змінну, яку можна потім міняти. Типу як const тільки навпаки, бо по дефолту всі змінні у Rust є const
vec! — це макрос (всі макроси у Rust закінчуються на !, щоб їх було видно), а весь вираз — це ініціалізація вектору з даними

Рядочок знизу, 4. %, дужки, і ще два рази as u64, і щоб нескучно жилося as usize.

Я так розумію, що оператор остачі від ділення % тобі невідомий?
«as u64» та «as usize» — це приведення типів, щоби компілятор правильно виводив всі подальші типи і не бухтів.
Rust строго типізований, приблизно як Ocaml та F#

До рядочка 19 знизу у мене зауважень нема. Хіба що загальний контекст, що там тестується і як перевіряється на правильніть?

Тестується можливість вставки у контейнер.
Враховуючи весь цей код, який написано вище, навіть проста операція вставки не зкомпілюється або гигнеться з помилкою, якщо десь наплужили у коді контейнера.

Я ось тут це називав «Z-реваншизм C++ -ників 90-х і початку 2000-х», але по ходу — це мова для нового юного покоління, хто C++ не бачив, і із задоволенням хочуть по граблям пройтися, бо їх пре і купу енергії нема куди діти.

Нове юне покоління якраз не зрозуміє більшості фішок Rust-а, бо не стикались із тим, як воно може бути, коли за тобою не перевіряють типи.

Та й таке

Я так розумію, що коду на Perl ти не бачив...

бачив
і якось історія показує, де Perl залишився — у Booking легасі код підтримувати і дописувати

Це pattern match синтаксис, прийшов з функціональних мов.

а, є така штука

Я так розумію, що оператор остачі від ділення % тобі невідомий?

та відомий, я ж про все загалом, яке воно вирвіглазне

«as u64» та «as usize» — це приведення типів

та зрозуміло, я знову ж таки про те, як вродили C++ наново

Дякую за терпляче пояснення.

Я вчора заглянув на рекомендований канал Jon Gjengset

Во-первых, это не совсем Rust 101 канал. У него есть видео, где он в деталях расписывает все, что ты видишь на экране и отвечает на вопросы нубов типа «а зачем нам тут писать fn, почему тут не так как в сишечке?», но конкретно то, что ты открыл, это лайв кодинг реального проекта, в котором объясняется как он пилит проект и какие-то фичи языка/библиотеки, специфичные к его задаче, а не базовые вещи синтаксиса самого языка.

Во-вторых, ты вообще видео смотрел или просто рандомно ткнул в середину, чтоб повозмущаться, что ничего не понятно?

Рядочок зверху, 9. «None». Шо? шозаноне саме по собі?

Чувак явно говорит «we can return None»: youtu.be/k6xR2kf9hlA?t=1694

Ты можешь не знать синтаксиса, что последнее выражение в блоке, если оно без ; возвращает значение из блока (или в данном случае из функции), но когда тебе говорят «we can return None», то это должно намекать, тем более, что эта фича не уникальна для раста. F#, Ruby, Scheme имеют то же самое.

Рядочок зверху, 4, 0 запихається в якусь константу/змінну? Ну окей, нехай, цифри зліва, змінні справа.
Рядочок наступний 3, n => 2*n. Блд, шо??? n запихається у 2*n?

youtu.be/k6xR2kf9hlA?t=940

Автор объяснил логику кода. Даже если ты не знаешь что такое match, можно понять, что он не «запихивает что-то в константу», а вычисляет новое значение и записывает его в переменную, которая там же объявлена.

Автор не сделал глубокое объяснение того, что такое match, вероятно, потому что предполагает, что зритель это уже знает (match это rust 101). Если это первое видео по Rust, которое ты смотришь, то, вероятно, можешь не понять что оно делает, но не потому, что раст сложный, а потому что у тебя нет нужной теоритической базы для просмотра.

Синтаксис матча практически 1:1 повторяет такой же из F#, и, оказывается, даже C# (честно не знал, что завезли, но таки завезли) так что проблема тут даже не в том, что синтаксис раст сложный для начинающих, а в том, что ты не видел патерн матчинг в современных языках программирования.

Рядочок 0, так і називається, муть (mut). Там у нас усьо, і знак оклику після змінної, і квадратні дужки, і ще й, щоб не скучно жилося «;» посередині.

То, что ты видишь, называется turbofish, и выглядит вырвиглазно.

Можешь или выучить и принять как есть, или покопать глубже и выяснить, что этот синтаксис сделан, потому что более интуинивный (который запилен в C++), делает синтаксис языка двусмысленным для парсера (т.е. парсер не может понять, или ты используешь <> для дженериков, или ты их используешь как операторы сравнения. Это проблема с одной стороны для разработчиков языка, которым приходится делать парсер монолитом с семантическим анализатором, с другой стороны, для самих пользователей языка, потому что из-за этой многозначности в случае синтаксической ошибки компилятор не может указать в точное место кода и сказать «вот тут вот вы ошиблись, забыли поставить запятую, поставьте и все будет збс», а вместо этого выдаст 50 страниц template error из-за того, что ты где-то забыл поставить запятую.

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

Рядочок знизу, 4. %, дужки, і ще два рази as u64, і щоб нескучно жилося as usize.

Тебе больше нравится когда сделано как в сишечке, где любой тип можно присваивать к любому другому типу без явного указания того, что ты хочешь делать конвертацию типов?

До рядочка 19 знизу у мене зауважень нема. Хіба що загальний контекст, що там тестується і як перевіряється на правильніть?

Вероятно, надо досмотреть видео до конца, где автор реализует метод get и дальше пишет полный тест, который что-то проверяет?

github.com/...​ster/src/lib.rs#L288-L300

Во-первых, это не совсем Rust 101 канал. У него есть видео, где он в деталях расписывает все, что ты видишь на экране и отвечает на вопросы нубов типа «а зачем нам тут писать fn, почему тут не так как в сишечке?», но конкретно то, что ты открыл, это лайв кодинг реального проекта, в котором объясняется как он пилит проект и какие-то фичи языка/библиотеки, специфичные к его задаче, а не базовые вещи синтаксиса самого языка.

Починається, блд, з наїздів, не прочитавши те, що я пишу «Я вчора заглянув на рекомендований канал Jon Gjengset
youtu.be/k6xR2kf9hlA?t=2367»

Во-вторых, ты вообще видео смотрел или просто рандомно ткнул в середину, чтоб повозмущаться, что ничего не понятно?

Звичайно, що друге. І таки підтвердило моє припущення, що незрозуміло :-D

что ты не видел патерн матчинг в современных языках программирования.

апять висновки, не читаючи комментів, бачив я його, у попередньому комменті відповів попередньому коментатору, хто набагато доброзичливіший

То, что ты видишь, называется turbofish, и выглядит вырвиглазно.

про turbofish мені пояснив один фанат Rust на попередній конторі, і бачиш, ти сам кажеш, що вирвіглазно

Автор объяснил логику кода

ну я же не чітатєль, я ткнув навмання, грубо кажучи маєш скріншот без звуку і відео, і охрєнєваєш від муті, і очі кривавлять

Вероятно, надо досмотреть видео до конца, где автор реализует метод get и дальше пишет полный тест, который что-то проверяет?

ніт! достатньо було скріншоту

Тебе больше нравится когда сделано как в сишечке, где любой тип можно присваивать к любому другому типу без явного указания того, что ты хочешь делать конвертацию типов?

Дякую за решту пояснень і лінків.

По суті, просто не сходяться верески фанатів Rust і шуміхи навколо нього, закликів його вчити і 21 століття, коли очікуєш, о, новомодна мова, там усьо кльово, там усе буде збс, а по суті — треба ходити і тикати типами на кожний чих, приводити типізацію, як у C/C++, і до кучі то все вирвіглазне.
Те, що на ньому можна щось писати нішове — не сумніваюся, те, що за ним майбутнє — ой.

Починається, блд, з наїздів

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

вирвіглазного синтаксису
Блд, шо???
Z-реваншизм C++ -ників 90-х

то будет что будет.

апять висновки, не читаючи комментів, бачив я його, у попередньому комменті відповів попередньому коментатору, хто набагато доброзичливіший

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

про turbofish мені пояснив один фанат Rust на попередній конторі, і бачиш, ти сам кажеш, що вирвіглазно

Вырвиглазно с непривычки, привыкнуть легко, и используется он довольно редко, обычно при использовании более продвинутых фич системы типов, ну а в тех случаях это наименьшая проблема, туда вообще без phd в расте лучше не соваться.

ну я же не чітатєль, я ткнув навмання, грубо кажучи маєш скріншот без звуку і відео, і охрєнєваєш від муті, і очі кривавлять

Такая специфика видео курсов. Я вот потратил где-то пол часа чтоб найти тебе несколько таймстампов. Видео надо смотреть от начала до конца, потому что если что-то пропустил, то хрен найдешь где оно до этого объяснялось. По статьям/книгам попроще, можно пролистать назад или поиском найти.

По суті, просто не сходяться верески фанатів Rust і шуміхи навколо нього, закликів його вчити і 21 століття

По сути, просмотра нескольких скринов с 50 строчками кода может быть недостаточно, чтоб сформировать глубокое мнение по этому поводу

Поинт раста не в красивом синтаксисе или легкости изучения, а в совсем других вещах, и чтоб их понять, нужно потратить больше времени. Вопрос только в том есть ли у тебя цель в этом разбираться и времени+усидчивость, чтоб досмотреть остальные 100 часов видео из того канала.

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

дуже дивно чути від тебе про якісь не такі комменти, гляди на свої комменти у іншому місці, хз що тебе кусає
dou.ua/...​rums/topic/40684/#2509405

dou.ua/...​rums/topic/40684/#2509584

dou.ua/...​rums/topic/40684/#2510021

dou.ua/...​rums/topic/40684/#2509424

Абсолютно нормальные коменты. Если тебя расстраивают, то i’m sorry that you feel this way.

Ты решил к поколению снежинок затусить и начать зачем-то тригериться по поводу и без повода? Не надо.

Абсолютно нормальные коменты. Если тебя расстраивают, то i’m sorry that you feel this way.

Абсолютно ненормальні, у мене так знайомий бикував у мессенджерах.
Віддебажили, він качатися почав ходити і тестостерон зашкалював чуть видно.

Ты решил к поколению снежинок затусить и начать зачем-то тригериться по поводу и без повода? Не надо.

Ти починав за здравіє, але перейшов знову у якесь ге, формулювання питання і риторичного пріговору. Ти окей ващє?

Извини если что. Перечитываю еще раз и не вижу в чем проблема. Попрошу еще кого-то почитать и дать фидбек, может я десенсибилизировался.

На всякий случай воздержусь от комментирования, чтоб ничего не случилось.

Хорошая цитата оттуда:

one of my teams at Google was one of the first to switch entirely from C++ to Go, and it took no more than about two weeks before the entire 15-odd-person team was quite comfortably coding in Go for the first time. With Rust, even after months of working daily in the language, most people on the team never felt fully competent

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

Так є, на оф. сторінці є перелік компаній які застосовують 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 визвати, і чогось придумувати тільки вже коли на профайліну стало ясно — що бібліотечна функція щось погано працює. Авжеш це не так вже і рідко стається, та усякі математичні методи розпізнання чи який алгоритм є оптимальний — не виправдались. Той досі робимо припущення і імпіричні заміри.

В порівнянні з Растом:

— nil everywhere замість Option, the billion dollar mistake
— весь стан mutable, взагалі без можливості const
— обробка помилок на чотири рядка, наворочування саморобних стектрейсів вручну
— відсутність перевантаження операторів, нормальних макросів, можливості робити DSL, уродський go:generate
— concurrency легка, але небезпечна, компілятор не допомагає розуміти і вивіряти код: горутини це занадто низькорівневий примітив замість нормально типізованих і перевірених borrow checker пулів потоків або Future із async/await. Контексти очевидні лише в найпростіших прикладах, реальний код із WithTimeout це завжди дебаг і wtf. Mutable shared memory by default, паніки горутин не ловляться, дедлоки і гонки.
— убогі і завжди динамічні інтерфейси замість повноцінних трейтів
— новозавезені дженерики часто куці і дивні
— defer замість RAII, забути підчищання якогось ресурсу елементарно.
— garbage collection, досить великий і важкий неопціональний рантайм, прибитий до мови
— жодного нормального ffi крім cgo, погана взаємодія із будь-якою іншою мовою.

Голанг є нішевою мовою, ідеальною хіба що для мережевих сервісів і девопсів. Він не скейлиться ні в GUI, ні в Data Science, ні в фронтенд (WebAssembly, JS interop), ні в нормальне системне програмування (embedded, драйвери, WebGPU).

Голанг, попри дуже якісну і вмілу реалізацію, практично не пропонує свіжих ідей і прогресу порівняно із існуючими мовами.

Если хейтишь, хейти грамотно.

— весь стан mutable, взагалі без можливості const

Наличие mut/const само по себе это не киллер фича, потому что она ухудшает эргономику языка и пользоваться ей будут очень мало (если, разумеется, нет анального механизма, принуждающего ими пользоваться как borrow checker в Кгые).

— обробка помилок на чотири рядка, наворочування саморобних стектрейсів вручну

Если подебажить Rust приложения, то быстро становится понятно, что там обработка ошибок тоже хромает, и что исключения (или panic хотя бы) — это «золотой стандарт», все остальное (включая возвращение error code/error struct) ухудшает эргономику дебага.

— відсутність перевантаження операторів

Я вот серьезно не помню чтоб мне пришлось работать с крейтом, где перегружены операторы и чтоб это оказалось хорошей идеей. Пара исключений типа каких-то математических библиотек, но это очень маленькие кейсы.

нормальних макросів

Проблема в том, что «нормальные макросы» в расте в основном закрывают дыры, которые существуют из-за отсутствия рантайма, рефлексии, перегрузки операторов, JIT и т.п., и в других языках эти макросы просто не принесли бы большой пользы, потому в них что аналогичный функционал можно делать без макросов, что большой плюс, так как разработка макросов — это довольно геморное занятие.

можливості робити DSL

Можете привести примеры каких-то хороших крейтов, предоставляющих DSL?

замість нормально типізованих і перевірених borrow checker пулів потоків або Future із async/await

Проблема в том, что в расте заделиверено 10% от async/await, который нужен для нормальной работы. Те же async traits будут неизвестно когда даже в куцом виде. А с тем, что есть, работать мягко говоря тяжеловато.

— убогі і завжди динамічні інтерфейси замість повноцінних трейтів

Полноценные трейты это збс, но есть опять же несколько проблем.

Если их использовать так, как крабе прописал, то надо везде протягивать дженерики через 10 слоев приложения, только потмоу что где-то хочется считать время не напрямую из std::time, а через какой-то trait TimeProvider. Это серьезно ухудшает эргономику и делает рефакторинг убийственным занятием

Если читерить через &dyn MyTrait, то с удивлением выясняешь, что есть такая штука как «object safety» и для того, чтоб трейт можно было использовать через динамический диспатч, там надо выдержать кучу ограничений.

Интерфейсы здорового человека можно посмотреть в C#, например.

— garbage collection, досить великий і важкий неопціональний рантайм, прибитий до мови

Сборщик мусора предоставляет эргономику намного лучше, чем управление памятью в Rust, а проблемы связаны с редкими случаями типа того же embedded, который является валидным кейсом, но кроме эмбедед есть куча ниш (большинство из оставшихся), в которых GC вполне нормальный способ управления памятью.

— жодного нормального ffi крім cgo, погана взаємодія із будь-якою іншою мовою.

Собственно, то же самое в Rust.

Він не скейлиться ні в GUI

Та же фигня в расте :)

Поздравляю с прозрением! Добро пожаловать в коммьюнити Go’пников :)

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

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

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

Коментар порушує правила спільноти і видалений модераторами.

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

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

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

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

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

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