Лидер минской .NET user group Роман Бугаев в новом проекте сменил C# на Ruby — и не остался разочарованным. В преддверии RubyConf 2017 Роман поделился с dev.by своим видением Ruby и рассказал, почему многим разработчикам стоит попробовать этот язык.
Чем хорош Ruby: гибкость, инфраструктура, сообщество
— Я работаю с компанией Payfort, где мы занимаемся проектом по процессингу карточных транзакций — приёмом платежей от Visa и MasterCard. Это аналог Stripe, но для стран Среднего Востока: Саудовской Аравии, ОАЭ, Египта, Катара. Проект работает в режиме стартапа: он небольшой и в плане команды (нас четверо), и в плане нагрузок. Сейчас мы пытаемся найти нишу, много экспериментируем. Поэтому и выбрали Ruby — платформу, которая позволяет быстро и легко делать эксперименты, проверять их и делать на их основе выводы.
Главный плюс языка Ruby — его гибкость. Мы даже проводили эксперимент: стояла задача подобрать параметры для одного из банков, и над решением параллельно работали две команды, наша и ещё одна в Иордании. Коллеги использовали Java и PHP, и для подбора параметров им понадобилось порядка недели. Мы сделали то же на Ruby за день-два: просто заходили на продакшн, включали IRB-консоль и изменяли параметры в ней — без перекомпиляции, сборки, повторного деплоя. Банк делал вызов, мы проверяли, как работают параметры, и меняли их, если требовалось.
Ещё один плюс — хорошая инфраструктура. Про Sinatra и Ruby on Rails и рассказывать не нужно — даже те, кто никогда не интересовался Ruby, знают, что эти фреймворки сделаны хорошо. Есть достаточно мощные ORM-системы — например, хорошо работает Active Record, хотя многие его недолюбливают. Ruby вполне подходит для построения «модных» систем на основе микросервисов, в которых смешивается код на разных языках: в нём есть поддержка gRPC (Google Remote Procedure Calls) и все необходимые сериализаторы, включая JSON и Protobuf. Подключать любые базы данных — и SQL, и NoSQL — тоже очень легко.
В Ruby on Rails очень хорошо реализован MVC: Мартин Фаулер, автор известных книг о паттернах и архитектуре ПО, когда-то говорил, что именно реализация в Ruby самая правильная и каноничная. Но опытных разработчиков это не удивит: её уже успели скопировать в разные языки, в том числе в C#.
Мы используем в проекте подход Infrastructure as Code: все серверы и балансировка сети прописаны в коде. В Ruby есть много хороших инструментов для такого подхода, конкретно мы используем Chef. Поскольку работаем с карточками, ещё один важный момент — безопасность. Тут у Ruby тоже всё хорошо: существует большое сообщество, которое выкладывает много кода в open source. Есть готовые инструменты, которые позволяют определить потенциальные уязвимости и найти для них патчи.
Одни и те же библиотеки можно использовать и близко к фронтенду, и в глубоком бэкенде — это очень удобно. Скачиваешь, например, во время развёртывания Terraform state с Amazon Web Services — и ничего нового подключать не нужно, для доступа к библиотекам используется RubyGems.
Ещё в Ruby отличные инструменты тестирования — и для юнит-тестов, и для интеграционных. Думаю, именно Ruby завёл моду на test-driven development, behavior-driven development и прочие -DD. Ещё один плюс — удобные DSL (domain specific languages). Их много, некоторые из них максимально приближены к естественным языкам — их вполне могут использовать непрограммисты, чтобы писать спецификации или даже изменять поведение продукта.
В открытом доступе есть много хороших библиотек на Ruby, в том числе алгоритмических. Например, сейчас мы разрабатываем платформу, которая позволит создавать дополнительные правила и сразу же применять их ко всем транзакциям — это нужно для борьбы с недобросовестными продавцами, которые пытаются платить чужими карточками или отмывают деньги. Очень быстро нашлась библиотека на Ruby, которая реализует нужные алгоритмы. И самое интересное, что написал её парень из Microsoft — и при этом не на .NET, а именно на Ruby.
Прикладной инструмент с быстрым входом
Разговоры о том, что на Ruby не написано ни одного большого проекта — неправда. Тот же Stripe, стартап-миллиардер, с которым мы конкурируем, использует Ruby в качестве базового языка. Понятное дело, обрабатывать большие данные или держать огромные нагрузки на Ruby смысла нет, да и машинное обучение на нём не построишь — для всего этого лучше подойдут Go, Python или та же Java.
Ещё с предыдущей компанией мы всегда старались подбирать для каждой задачи правильный инструмент: если лучше подходит Java — берём Java, если .NET — .NET, то же самое с Go, Scala. Ruby при таком подходе очень хорош, поскольку у него несложная кривая обучения: через два-три месяца после знакомства с языком ты можешь довольно комфортно писать на нём любой код. Для входа в тот же C# понадобится намного больше времени.
Думаю, именно поэтому Ruby иногда называют «языком для хипстеров». Он очень хорош для быстрого старта: выглядит, как английский язык, работает при соблюдении минимальных правил. На Coursera есть куча курсов «Как начать стартап», и в качестве основы там часто берут Ruby. Если знаешь английский, то сможешь писать простые вещи почти без подготовки. Именно поэтому язык часто выбирают в качестве первого языка для входа в профессию.
Но если хочется чего-то более фундаментального, стоит начинать с языка для исследований — например, Python или Java. На Ruby можно просто взять и начать писать — код будет работать, и это создаст ложное ощущение, что ты всё знаешь. А вот пока будешь разбираться в Java, поднимешь множество концептов программирования, познакомишься с шаблонами проектирования. Путь сложнее, зато ты в процессе разбираешься с важными вещами. Во многих университетах люди начинают с C, потому что он ещё сложнее.
Зато Ruby позволяет абстрагироваться от этих сложностей и сконцентрироваться на прикладных задачах. Сейчас мы в компании рассматриваем варианты написания отдельных сервисов на Go, но я думаю, что Ruby останется нашим базовым инструментом, поскольку с ним действительно очень просто. Там, где в большинстве языков потребуется 10-12 строк, в Ruby хватит трёх — и можно идти в продакшн. А весь хороший инструментарий, который я упоминал, позволяет легко организовать непрерывную доставку и непрерывную интеграцию.
Ruby — очень прикладной инструмент, кому-то он даже может показаться скучным. Но как шутят о PHPшниках, представителях одной из древнейших профессий веб-программирования: «Им настолько скучно думать про разработку, что они начинают думать про бизнес — и в итоге получаются фейсбуки и вконтакты». Думаю, с Ruby та же история.
Почему Ruby стоит попробовать (и как это сделать)
Разработка со временем становится всё более мультипарадигменной. Большинство популярных языков полнофункциональны, на них можно делать практически всё, и выбор конкретного языка становится делом вкуса. Разные базы данных, платформы, операционные системы — всё уживается в одном проекте. Моя предыдущая команда из 10 человек использовала в одном проекте 12 различных баз данных! А за счёт такой мультипарадигменности идеи одной платформы регулярно переходят в другие — и это интересно и полезно.
Я остаюсь лидером .NET user group, по-прежнему слежу за новинками в .NET. C# — очень мощный язык программирования, который значительно влияет на другие языки. В интернете даже шутят, что со временем все языки превратятся в C#. Но один из негативных моментов .NET — платформа очень сильно разрослась и требует от разработчика много знаний о себе. В Ruby-сообществе, как мне кажется, люди больше думают про бизнес, про то, как лучше сделать конкретную «фичу» — и не заморачиваются о том, как язык работает изнутри и как правильно писать код.
В целом, в Ruby я для себя не нашёл ничего нового. Здесь нет ни одного «вау», ничего по-настоящему необычного — в этом плане язык напоминает мне Go. Наверное, по нему даже ни одного PhD не написали, в отличие от какого-нибудь Scala с огромным количеством особенностей, которые удивляют, заставляют задуматься или даже переосмыслить подход к программированию. Но эта «обычность» — тоже преимущество: не надо тратить много времени, чтобы понять какие-то новые концепции, и ты не отвлекаешься от основных задач.
Моё первое знакомство с Ruby произошло через IronRuby: окружение, которое компилирует код на Ruby в .NET и позволяет запускать его на Windows. Едва ли кто-то хвалит этот интерпретатор, да и сами рубисты его не любят, но если кто-то из дотнетчиков хочет попробовать Ruby, начинать с него можно. А для джавистов, в свою очередь, есть JRuby. Можно написать маленькую библиотечку, подключить её к своему проекту и посмотреть, что получится. Плохо точно не будет: расширение кругозора — всегда хорошо.
Кстати, Microsoft поддерживает Ruby в Visual Studio и Visual Studio Code. Я пишу на Ruby именно в VS Code. Всё, что для этого потребовалось — установить плагины для поддержки синтаксиса. Попробовать Ruby просто – при случае обязательно сделайте это.
О трендах Ruby — в Минске
2 апреля на минской площадке Space состоится RubyConf 2017, где перед гостями выступят мировые звёзды разработки на Ruby и RoR. Подробнее — в нашем календаре.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.