Rust, Clojure, Elixir та Objective-C. Українські розробники – про те, чому обрали непопулярні мови програмування
Чому розробники обирають непопулярні мови програмування? У рейтингу 2022 року від DOU такі мови, як Clojure, Rust та Objective-C, посідають останні місця за популярністю серед українських розробників, а Elixir не увійшов до рейтингу популярних мов взагалі.
Водночас парадоксально, але непопулярні Rust та Clojure входять до п’ятірки найулюбленіших мов за «індексом вподобання», а Elixir у цьому напрямку обігнав лідера рейтингу популярності — JavaScript.
Редакція DOU поспілкувалась із розробниками непопулярних мов розробки про те, чому вони обрали саме їх, які особливості стека та застосування мають їхні мови, та поцікавилася, чи справді за володіння найменш поширеними технологіями платять більше.
«Така інтерактивність розробки недосяжна в інших мовах»
Костянтин Семергій, Clojure Developer
Я починав працювати на JS і вирішив подивитись, що є навколо. Мені дуже сподобався Lisp, коли я дивився курс лекцій SICP. А Clojure нині, мабуть, найпопулярніший член сімейства мов Lisp.
Особливістю мови є те, що будь-який вираз по суті є викликом функції, уся мова складається суто з виразів.
Мова дуже вільна завдяки REPL, така інтерактивність розробки недосяжна в інших мовах (не Lisp). Є доступ до всієї екосистеми як JS, так і Java. До того ж є можливість більш-менш однаковою мовою писати Back-end та Front-end.
Щодо рівня зарплат, то він, мабуть, на 75% залежить від вміння себе продати. Я знаю більш компетентних людей, що заробляють менше за мене, і навпаки.
Як на мене, Clojure досить непопулярна, бо в мовах програмування велику роль відіграє платформа та маркетинг. Хтось став великим і користується цим. Люди часто йдуть на стабільність, за покликом не так багато працює.
«В Clojure найвища крива навчання»
Назарій Феній, Clojure & ClojureScript Software Developer у GlobalLogic
У попередній компанії з’явився проєкт з мовою програмування Clojure, і мені запропонували перейти на нього з можливістю вивчення цієї мови.
Я поспілкувався з кількома розробниками про це, адже сам тільки освоювався у сфері ІТ. Також перечитав декілька статей і вирішив, що мова досить перспективна, активно підтримується її розробником, тож втрачати цікаву можливість не варто.
У разі чого я мав запасний план, адже понад рік працював як JavaScript-розробник і легко міг повернутися до цього. До того ж схожу ініціативу підтримувала компанія.
В університеті я вже вивчав Lisp-подібну мову — Scheme. Вона стала для мене розривом шаблону, оскільки її підхід сильно відрізнявся від імперативного програмування.
Та й в Clojure крива навчання є найвищою серед будь-яких інших мов. Але я звик і зараз з легкістю виконую завдання на різних мовах, а мій загальний досвід програмування на Clojure становить уже майже три роки. Коли майбутній розробник обирає для себе мову програмування, з якої хоче почати, і схиляється до Clojure, то, на мою думку, краще відразу звернути на неї увагу, ніж пізніше перевчатися.
Список переваг і недоліків може бути дуже довгим, але я вважаю основними такі пункти.
Переваги мови:
- Підтримка паралелізму та швидкого обміну інформації між потоками.
- Висока швидкість обробки великих об’ємів даних.
- Інтерактивна розробка за допомогою використання REPL — read evaluate print loop.
- Незмінність стану застосунку, що забезпечує цілісність даних і відсутність прихованих помилок.
- Сумісність із JVM-екосистемою. Це означає, що ви завжди знайдете функцію, бібліотеку або фреймворк для того, що вам потрібно.
- Візуально невеликий розмір коду завдяки синтаксису мови.
- Має власну нотацію об’єкта першого класу EDN, що є аналогом JSON.
- Синтаксис мови може бути розширеним за допомогою макросів.
- За допомогою Clojure та ClojureScript можна створити повноцінний вебзастосунок без використання інших мов.
Недоліки:
- Важко відстежити помилки. Не завжди з трасування стека можна зрозуміти, де саме виникла помилка.
- Артефакти великого розміру. У нових версіях JVM це виправлено тим, що модульні артефакти виключають код, що не використовується.
- Не можна використовувати для написання високоефективного низькорівневого коду через обмеження рівнями Java.
- Це не ідеальний інструмент для коротких скриптів і утиліт командного рядка, оскільки програми, для запуску яких потрібні мілісекунди, споживають одну-дві секунди часу ініціалізації через завантаження JVM і Clojure.
- Відсутня статична та явна типізація, через що прототипування складніше та займає більше часу.
Загалом Clojure є повноцінною мовою програмування для створення як простих, так і еnterprise-вебзастосунків. Тому можна написати як серверну частину на Clojure без знання Java, так і Front-end на ClojureScript — без знання JavaScript.
З особистого досвіду розробки веб- та мобільних застосунків, у мене не виникало питань щодо відсутності чи повноти інструментів та методів мови. Розробник мови Річард Гіккі пояснює основні ідеї при її створенні: сучасний варіант Lisp, використання парадигми функційного програмування, ідея паралелізму й симбіоз із Java (працює на основі JVM).
Завдяки паралелізму мову використовують для обробки великих обсягів даних та штучного інтелекту. Через особливості синтаксису Lisp-код виглядає дуже компактним та читабельним. Також можна парсити вебсторінки, писати і виконувати shell-скрипти, створювати шаблони HTML-сторінок і будувати 3D моделі в OpenGL.
Тобто спектр застосування мови є дуже широким завдяки додатковим бібліотекам, які активно підтримують розробники. Clojure використовують такі відомі компанії, як Adobe, Amazon, Apple, CircleCI, Cisco, Clubhouse, Facebook, Grammarly, Wallmart та багато інших.
Щодо грошей, то є думка, що за непоширені мови компенсація набагато більша, ніж за поширені. Я й справді знайшов декілька статей та статистик про те, що Clojure є однією з найбільш оплачуваних мов.
Але річ у тому, що на результати опитування значно впливає те, що більшість розробників там — рівня Senior та з 10+ роками досвіду. Знаю і тих, хто отримує зарплату нижчу за ринкову, і тих, хто має до 20% вищу за ринкову.
«Синтаксис Elixir простий, але його багато»
Михайло Панарін, Elixir developer у Solarisbank AG
Мені було цікаво розібратися з функціональною мовою програмування, тож я став проглядати варіанти. Хотілось щось більш-менш нове, з реальним потенціалом використання. Elixir сподобався синтаксисом та actor model.
Я почав вивчати мову, мабуть, ще роки чотири тому, але потроху. Стараюсь не надто витрачати вільний час на роботу та програмування. Сама собою мова не надто складна. Синтаксис простий, хоч його і багато.
До Elixir багато чого перейшло від Erlang у формі OTP. Це щось на кшталт вбудованого фреймворку для роботи з цією actor model та ще купою всього іншого. Щоб з усім цим розібратись, потрібно більше часу :) Професійно я працюю на Elixir майже півтора року.
Від Erlang Elixir отримав відмовостійкість та actor model, але має простіший та зрозуміліший синтаксис, схожий на Ruby.
Переваги мови:
- Має всі бенефіти з Erlang VM, такі як: вбудована база даних, можливість кластеризації та балансування навантаження, відмовостійкість за допомогою процесів і їхніх супервізорів, hot reload коду тощо.
- Дуже класний фреймворк Phoenix із вбудованим SSR фронтендом live-view.
- Приємний синтаксис і досить багато абстракцій для простішої взаємодії з OTP.
- Потужний pattern matching. Як я без нього жив раніше?
- Активна та привітна спільнота.
З недоліків:
- Хоча синтаксис і простий, але його багато. Спочатку важкувато.
- Не дуже велике ком’юніті, але воно зростає.
- Іноді трапляються дивні конструкції, які не властиві мові. Пояснюється тим, що вони перекочували сюди з Erlang.
- Не найшвидша мова.
- Динамічна типізація. Для когось це мінус. Але мова має вбудований статичний аналізатор і систему анотації типів.
Я використовую Elixir для розробки вебсервісів. Загалом мова підходить для довготривалих завдань із простою та постійною доступністю. Для вебу — саме те, що треба. Також телекомунікації, якісь демони чи вочери. Є розвинений напрям IoT з фреймворком Nerves, зараз автори Elixir працюють над розвитком AI в екосистемі мови.
Але ця мова не дуже зручна для системного програмування, драйверів,
Щодо зарплат: півтора року тому при переході на Elixir, хоч я й не мав досвіду в продакшені, отримав +35% від старої зарплати. Що для повної зміни стека непогано.
Треба розуміти, що вакансій не дуже багато, але розробників ще менше. Стек екзотичний, тому можна потрапити на вакансію з екзотичним бюджетом :)
«Програми на Elixir легко масштабувати, вони стійкі до відмови»
Марія Козак, Elixir developer у Conractbook
Я обрала Elixir за порадою друга — він порекомендував її як нову та цікаву мову. Вперше спробувала розібратися в ній 2017 року — і невдало :) Після цього намагалася опанувати JS, TS, але теж сильно не просунулася.
На той час я працювала маркетологом, тому вивчати мову програмування не було пріоритетом. Повернулася до Elixir влітку 2019 року, починала з онлайн-курсів на Udemy та книг. Саму мову вчити було нескладно — складніше було зрозуміти, як усе працює. Бракувало загальних знань з Computer Science.
Elixir — це суто функціональна мова, яка успадковує всі переваги та недоліки мов цього типу. Грубо кажучи, це такий собі синтез Erlang і Ruby, де збереглися основні переваги двох мов і максимально усунулись їхні недоліки та помилки.
Програми на Elixir легко масштабувати, їх приємно і просто писати завдяки зрозумілому синтаксису, вони стійкі до відмови. З мінусів — не до кінця розвинена екосистема. Оскільки мова нова, то матеріалів для її вивчення не так багато, але з кожним роком стає дедалі більше.
Elixir має всі переваги Erlang і OTP (Open Telecom Platform — платформа з набором бібліотек і інструментів для написання масштабованих і розподілених систем), але при цьому з простішим і приємнішим синтаксисом, поліпшеними інструментами для написання і тестування застосунків.
Як я згадувала вище, однією з головних переваг Elixir є можливість написання нею стійких до відмови систем. І щоб досягти такої складної мети, від розробника потрібно мінімум зусиль, оскільки багато вже реалізовано «під капотом».
Уявіть, що ви говорите по телефону і стався збій у зв’язку. Кілька секунд шуму, стрімких слів — і ось все знову чудово. Написати таку програму на Elixir не становить труднощів, ба більше, її легко підтримувати та масштабувати.
Але Elixir використовують не тільки в телекомунікаціях, ця мова знайшла широке застосування і в інтернеті, блокчейні та навіть IoT.
Щодо грошей, то якщо вірити Stack Overflow, Elixir є
«Rust був і залишається для мене безкомпромісною мовою»
Владислав Фролов, Rust Evangelist / Engineering Manager в Near Inc.
Я обрав Rust у 2015 році, коли дізнався про нього з анонсу 1.0 релізу. На той час я вже вісім років працював з Python і JavaScript і мав певний досвід з С та С++, а також ще декількома мовами програмування. Але від однієї думки будувати продукт на С чи С++ мені було моторошно, уявляв нескінченні години пошуку можливих вразливостей безпеки і помилок, що виведуть систему з ладу у будь-яку хвилину.
Rust був і залишається для мене безкомпромісною мовою, яку я шукав для реалізації надійних програм без необхідності втрачати у швидкодії або погоджуватися на надмірне використання пам’яті.
Є упередження, що Rust — складна мова. Та я вважаю, що всі мови програмування складні. Різниця лише у тому, коли ця складність зачепить саме вас.
У Rust треба пройти дещо довший шлях на старті, але в результаті у вас буде надійне рішення, в той час, коли на скриптових мовах програмування (JS, Python) можна отримати рішення швидко, але от на надійне вам знадобиться ще немало часу. Помилки з’являтимуться в процесі виконання програми, і, найімовірніше, ви ніколи не будете упевнені в тому, що обробили всі можливі ситуації.
Rust-компілятор — це суворий вчитель, який завжди буде на варті безпеки вашої програми. Що більше у вас досвіду в тому, як працює комп’ютер, то простіше вам даватиметься Rust, завдяки ньому розробникам не потрібно тримати в голові усі взаємозв’язки між компонентами та можливі проблеми їх взаємодії, які так чи інакше треба контролювати — натомість дає потрібні інструменти, щоб виразити ці протоколи взаємодії.
Rust — дуже молода мова, тому багато гарних ідей було запозичено з інших мов, таких як SML, OCaml, C++, Haskell та ще дюжини інших.
«Hello, World!» програма на Rust:
fn main() {
println!("Hello, World!«);
}
Rust — суворо типізована мова програмування, тобто у кожної змінної має бути тип, відомий на момент компіляції, він не може змінюватися. Але Rust-компілятор вміє автоматично виводити типи там, де це можливо визначити однозначно.
Переваги мови:
- Rust дозволяє писати програми, які працюють надійно, швидко та потребують мінімум обсягу памʼяті.
- Rust вже має велику кількість модулів («крейтів»), які можна використовувати, і пакетний менеджер cargo, який допомагає дуже просто це зробити (як npm в JS та pip в Python, але краще).
- Сама мова дає змогу гнучко і виразно описувати компоненти та їхні інтерфейси й використовувати їх.
Недоліки:
- Процес компіляції дещо повільний, якщо в програмі є багато залежностей (програми з невеликою кількістю залежностей компілюються за секунди, а от коли проєкт потребує 500+ залежностей, то компіляція може сягати 30 хвилин на холодному старті й до декількох хвилин, коли інкрементальна компіляція дозволяє лише перезібрати частину проєкту).
Уже сьомий рік поспіль Rust посідає перше місце серед найулюбленіших мов програмування, за даними щорічного опитування Stack Overflow.
Я використовую Rust для реалізації сервісів різної складності (від peer-to-peer реалізації NEAR Protocol до RESTful API), утиліт командного рядка та Wasm застосунків.
Я б використовував Rust усюди, але деякі галузі ще не мають потрібного інструментарію, — наприклад, розробка програм з графічним інтерфейсом найчастіше завʼязана на певну рекомендовану мову програмування для платформи (Swift, Java/Kotlin, C#), а машинне навчання пріоритезує швидкість експериментування, тому в цій галузі домінує Python.
Рік тому O’Reilly відзначили, що розробники на Rust у середньому отримують найбільшу компенсацію.
«Мабуть, я б не радив вивчати Rust як першу мову»
Юрій Ковпак, Rust Developer в AdInMo
Я цікавлюсь різними інструментами та парадигмами, що існують в моїй професії. Це допомагає тримати руку на пульсі та дозволяє подивитися на, здавалося б, звичні речі з іншого боку.
Вперше я почув про існування Rust з результатів опитування на Stack Overflow (здається, 2020 року), де він переміг в категорії «most loved language», вже тоді стало цікаво, що ж це таке і чому воно всім так подобається :)
Але активно почав вивчати мову приблизно рік тому, так би мовити, for fun, адже на той момент кількість вакансій на Rust в Україні наближалася до нуля, а мій досвід (5+ років написання веббекендів на PHP, JS) видавався нерелевантним.
Попри це, через пів року я все-таки вирішив спробувати «свічнутись», спираючись на досвід в суміжних технологіях і програмуванні загалом. У результаті вже шостий місяць працюю в компанії саме на позиції Rust Developer.
Я б не радив вивчати Rust як першу мову, позаяк вона може здатися занадто складною для людей без базових навичок програмування та Computer Science.
Серед переваг мови я б виділив:
- Різноманітність сфер використання: Rust можна використовувати фактично в усіх популярних напрямах: для написання вебзастосунків, системного програмування, геймдеву, IoT тощо.
- Швидкість — тут немає сенсу багато писати, достатньо глянути бенчмарки в інтернеті :) Rust справді швидкий.
- Безпека — система типів і підхід до роботи з пам’яттю допомагають зловити більшість помилок ще на етапі компіляції, а компілятор, своєю чергою, переважно дуже доступно розжовує, в чому саме проблема. Мені як людині, що прийшла зі всесвіту інтерпретованих динамічно типізованих мов, було спочатку складно звикнути до того, що якщо білд пройшов, значить все добре і не потрібно перевіряти все тисячу разів.
- Кількість доступних матеріалів для навчання і, мабуть, найбільш доброзичливе ком’юніті, зокрема українське.
Щодо недоліків — складно виділити конкретний. Хіба дещо вищий поріг входження, ніж у більшості популярних мов.
Хочу розвінчати міф про те, що наразі Rust живе лише у блокчейні. В моїй компанії він застосовується для програмування високонавантажених вебзастосунків.
Після того як я повністю «пересів» на Rust, завдання будь-якої складності хочу писати лише на ньому. Але якщо додати трохи здорового глузду, то для створення простеньких застосунків з відсутністю потреб в мікрооптимізації та перформансі використання Rust буде недоцільним.
Приєднатись до вивчення Rust можна у чаті української спільноти за посиланням.
«Якщо потрібен серйозний софт, обирайте зв’язку ObjC++»
Роман Махненко, Senior Software Developer у DataArt Lublin
У далекому 2008 році Apple дозволив стороннім розробникам писати софт для iOS (це був iOS2), але сама розробка була тією ще пригодою з налагодженням і деплойментом на пристрої.
Я тоді сидів на розробці під Windows суто на С/С++. Було цілком комфортно і зручно робити усілякі низькорівневі затички для .NET-рішень, бо далеко не все можна було реалізувати на тому ж C# через вбогість самої технології (ну насправді, як може бути хорошою система, яка ізолює розробника від «заліза»?). Що ми зараз і спостерігаємо, коли будь-який найбільш наворочений комп’ютер на Windows за рік перетворюється на гарбуз, і лишається тільки викидати його на смітник і купувати нове «залізо», щоб воно змогло запускати «новий» (кривий) софт на .NET.
А Mac’и через те, що це по суті UNIX і розробка для них ведеться нормальними компілювальними мовами, близькими до «заліза», старіють у рази повільніше, тож нині цілком комфортно можна користуватися маками
У
Варіантів було три: Embedded, Unix та Mac. Для Embedded не було тоді робочих цікавих проєктів. Unix — занадто нішева система, і треба бути її фанатом. Мені ж хотілося залишатися у межах нормальної хардової розробки і водночас не втрачати зв’язку з користувачами. Тож вибір Mac/iOS розробки був природним.
Загалом це той самий Unix, тільки з людським обличчям і найпотужнішою компанією, яка все це просуває. MacOS у 2009 році зустрів мене середовищем розробки xCode та мовою Objective-C. Відразу скажу, xCode v3 — це породження диявола :)
В ObjC досить дивний синтаксис. Але до всього можна звикнути, а щойно я розібрався, як використати зв’язку ObjC і С++ — життя одразу налагодилося. Для довідки: тоді ObjC не давав навіть людської (безпечної) роботи з пам’яттю, що легко виправилося в режимі ObjC++.
Якщо хтось пам’ятає, наприкінці
Навіть наступна поява ARC не спонукала мене почати його використовувати (просто в цьому не було потреби).
Але час минав, додавалися фічі, зростала потужність API; а Apple та індустрії потрібно було все більше і більше розробників. А щоб почати швидко і якісно писати код на зв’язці ObjC++, потрібно неабияке розуміння, як все це працює «під капотом».
І тоді сталося страшне... «Дотнет» прийшов і на iOS/MacOS — і ім’я йому Swift. Можна погоджуватися, можна ні, але більш огидної технології не змогли вигадати навіть у Microsoft.
Система спочатку орієнтована на мінімальний поріг входження. Навіть мозок особливо не потрібен, щоб почати щось розробляти «ніби як гарне». Якщо через пів року експлуатації зміниться, наприклад, фреймворк і софт перестане збиратися... що ж, не проблема — наберемо десяток розробників на Swift, і вони швиденько перепилять усе в новий фреймворк... на наступні пів року.
Теж шлях, чому ні? Але код з ObjC++ без проблем у мене збирався аж з 2010 року. Так, іноді потрібно правити deprecated методи в API. Але це буває не так і часто, та й Apple зазвичай за
Підсумовуючи: якщо потрібно на коліні зліпити щось, що схоже на застосунок і навіть щось тупе робить — підходить хоч Swift, хоч JS в якійсь обгортці... Якщо потрібний серйозний софт, який не створюватиме проблем