Чарльз Наттер. Как перенести древний монолитный проект на JRuby и стоит ли это делать?

Через пару дней в Москве пройдет конференция RubyRussia. Наш гость Чарльз Наттер (работает над JRuby и JVM поддержкой в Red Hat) ответил на пару вопросов.

q2r2c3e8olx0msepc7nj9e9ao0u.jpeg

Как вы попали в мир программирования и Ruby?

В 2004 году я работал по контракту в правительственной фирме в качестве Java Enterprise архитектора. Я работал над проектом для Министерства сельского хозяйства США, и проводил пару недель в месяц в Вашингтоне. Одна из таких поездок совпала с RubyConf 2004, и поскольку один из моих друзей давно рекомендовал мне обратить внимание на Ruby, я решил сходить на конференцию. Так я оказался на мероприятии, посвященном Ruby, не имея никакого представления об этом языке…, но я понял каждый кусочек кода, каждый приведенный пример. Я был поражен и пообещал себе найти способ принести Ruby в мой Java-мир.

Над какими проектами вы работаете сейчас?
Я один из двух руководителей проекта JRuby. В эту работу входят и разные связанные проекты, например, поддержка нативных библиотек (мы поддерживаем Ruby FFI на JRuby), или перекодировка строк (портирование аналогичной логики из CRuby). Кроме того, я работаю с сообществом, чтобы быть уверенным, что наши пользователи всегда могут получить от нас помощь. В общем, работы всегда полно!

У какого из этих проектов самое яркое будущее?

Думаю, что это JRuby, хотя это и не самый популярный язык на платформе JVM.
По крайней мере, мы поспособствовали позитивным изменениям в самой JVM. Во многом благодаря нашему сотрудничеству с Sun Microsystems и Oracle, сейчас JVM стал удобной платформой для многих динамических языков, не только Java. Я надеюсь, что мы сыграли не последнюю роль в этом изменении.

На каких языках вы пишете чаще всего? Какой из них вам нравится больше всего и почему?

Я в основном пишу на Ruby и Java, так как JRuby написан с использованием обоих. Каждый из этих языков хорошо подходит для своих задач. Ruby — для создания приложений, которым необходимо быстро развиваться и адаптироваться. Java — для написания высокоскоростных, надежных библиотек и сервисов. А JRuby сочетает в себе лучшее из обоих миров!

Вам нравится программировать на Java?

Да, особенно, если учесть все недавно добавленные улучшения языка, такие как лямбды (замыкания или блоки в Ruby), и новый синтаксис для объявления локальных переменных (var), когда статический тип однозначен.

А что Вы думаете о Rust?

Rust — отличный язык! В колледже я много использовал C ++, но я могу однозначно сказать, что, если бы в то время я знал Rust, я предпочел бы писать на нем. Мне особенно нравится статически-типизированная модель владения, которая позволяет писать стабильные параллельные программы, и гарантирует безопасный доступ к памяти. Думаю, другим языкам стоит перенять это в будущем.

Какие у вас мысли по поводу перспектив Ruby? Многие годы многие считают, что язык и его сообщество «умирают»…

После многих лет работы над JRuby, я полюбил синтаксис Ruby, и то, как вообще все в нем устроено. Но, боюсь, что проблема производительности реально существует и является важной. JRuby борется за то, чтобы сделать параллельные потоки реальностью для Ruby разработчиков, но, до сих пор, подавляющее большинство Ruby сервисов используют несколько изолированных процессов, тратя огромное количество и ресурсов процессора и памяти. Думаю, это связано со слишком масштабным и инвазивным C API для написания расширений Ruby, которое не позволяет внедрить такие улучшения, как параллельные потоки.
Но я не теряю надежды, что однажды мы все же увидим изменения.

Как вы думаете, какие из не самых популярных фич Ruby должны завоевать внимание в будущем?

Я с нетерпением жду, когда строки станут иммутабельными по умолчанию, как это происходит в большинстве других языков. Параллельное программирование было бы намного проще, если бы больше объектов Ruby можно было бы сделать полностью неизменяемыми (deeply frozen). Это может напоминать модель, используемую в Rust… если вы делитесь объектом в потоках, следует выбирать ту версию объекта, которая точно не будет модифицирована. Это распространяется на массивы, хэши и практически на любой другой изменяемый объект в Ruby: нам необходимо упростить блокировку изменения данных.

У меня есть большой старый монолитный проект на Ruby. Я подумал —, а не перевести ли его на JRuby. Как это можно было бы сделать, и имеет ли это вообще смысл?

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

  • Сокращение затрат ресурсов, когда есть их недостаток, например, если на одном сервере хостятся сразу несколько приложений
  • Развертывание приложения Ruby в JVM-нагруженной среде, которая используется в крупных финансовых и правительственных организациях
  • Необходимость доступа к библиотекам, которые существуют только на Java, или которые проще портировать на JVM, чем их эквиваленты в Ruby или C
  • Небольшое повышение производительности в приложениях с тяжелыми вычислениями (которые грузят процессор) или с большим количеством параллельно выполняющихся задач.

Я бы сказал, что если приложение масштабируется хорошо и не слишком дорого вам обходится, то возможно, вам не стоит ничего предпринимать. Но если вы решите получить от Ruby больше, то вот процесс миграции:

  • Соберите воедино все сторонние библиотеки, которые использует ваше приложение.
  • Выделите среди них те, которые используют С-расширения.
  • Для каждого расширения найдите эквивалент JRuby. У нас есть несколько
  • страниц в JRuby вики об этом. Самые популярные библиотеки имеют JRuby версии. Если же JRuby версий не находится, то можно использовать чистую Ruby версию (она будет достаточно быстрой на JRuby) или JVM-библиотеки (в Java, Scala, Clojure и т.п.), которые могут быть использованы в качестве замены.
  • Как только все ваши гемы заработали на JRuby — заработает и все приложение! Мы очень много внимания уделяем совместимости и стараемся принимать во внимание новые проблемы, на которые обращают внимание наши пользователи. Поэтому с большой вероятностью если у вас собрался bundle на JRuby — то приложение заработает.

Ну, а дальше начинается самое сложное — что делать с освободившимися ресурсами. На сколько потоков распараллелить приложение, как потратить сэкономленные деньги… :)

Что сейчас необходимо знать студентам, чтобы стать хорошими программистами?

Когда я учился в университете, на моих курсах по информатике преподавался язык Scheme, функциональный язык, подобный Lisp, который отлично подходил для обучения основам программирования. Я по-прежнему рекомендую начинающим программистам изучить хотя бы часть книги Structure and Interpretation of Computer Programs, изданной Массачусетским технологическим институтом (MIT). Ну и в целом, чем больше разных языков вы знаете, тем лучше. Это дает новые идеи, и позволяет взглянуть на решение ваших задач под разными углами.

Где вы черпаете мотивацию для работы? Сталкивались ли вы с проблемой профессионального выгорания?

Выгорание — это настоящая проблема в нашей отрасли. Особенно работа в open source
приносит с собой огромное количество стресса. Думаю, это случалось со всеми… когда слишком много работы, не успеваешь все сделать, жертвуешь временем с семьей и друзьями, забываешь о здоровье, ради того, чтобы исправить еще один очередной баг. Чтобы бороться с этим, я стараюсь уделять внимание на хобби: играть в компьютерные и настольные игры, учиться играть на гитаре,
изучать иностранные языки и путешествовать по миру, встречать новых людей. Во мне всегда будет жить ворчащий трудоголик, уговаривающий меня вернуться к работе, но я все же стараюсь поддерживать правильный баланс.

Каково ваше мнение о России, и что вы ожидаете от предстоящего мероприятия RubyRussia?

Я люблю Россию, и все мои поездки на конференции сюда за последние несколько лет были очень полезными. Это будет мой четвертый визит, ранее я был в Санкт-Петербурге, Москве и даже в Новосибирске (!!!). Я с нетерпением жду возвращения в Москву и встречи с российским Ruby-сообществом, о котором я весьма наслышан.

Вопросы подготовил Дмитрий Матвеев, PM в компании Evrone. А задать свой вопрос можно будет уже 6 октября. Так что увидимся на конференции! Все подробности на сайте.

Прочитать оригинал на английском можно на hype.codes.

И огромное спасибо компаниям, которые подерживают главное Ruby-событие в России:

Генеральный партнер — Toptal
Золотые партнеры — Gett и Cookpad
Серебярные партнеры — Instamart, UCHi.ru, JetBrains и Qlean
Партнер афтепати — Teachbase
Бронзовые партнеры — Bookmate и InSales

© Habrahabr.ru