Интервью с Джереми Эвансом, ведущим разработчиком Sequel и Roda

Джереми Эванс: «Мое отношение к новым возможностям Ruby очень консервативно»

Джереми Эванс — ведущий разработчик библиотеки для работы с базами данных Sequel, веб-фреймворка Roda, фреймворка для аутентификации Rodauth и многих других библиотек для языка Ruby. Он также поддерживает порты Ruby для OpenBSD, участвует в разработке интерпретаторов CRuby и JRuby и множества популярных библиотек. Мы рады представить вам новое интервью с ним. 

Интервью

Evrone: Благодаря работе над именованными параметрами тебя приняли в основную команду разработчиков и вручили премию Ruby Prize 2020. Можешь рассказать нам об этой работе и своих впечатлениях?

Джереми: Я счастлив, что стал членом основной команды и получил премию RubyPrize в 2020 году. Начну с того, как меня приняли в команду.

Я присылал в Ruby патчи и сообщения об ошибках с 2009 года. В 2019 году стал работать с Ruby гораздо активнее, после того как услышал о новом подходе к именованным параметрам в Ruby 3. Первоначальной идеей было полное разделение: попытки передать хэш методам, которые принимают именованные параметры должны были приводить к ошибке; передача именованного параметра методу, который принимает опциональные аргументы в виде хэша тоже должно было стать ошибкой. Мне эта идея показалось слишком радикальной, поскольку она бы сломала совместимость со старым кодом, который не использовал именованные параметры.

Я разработал новый патч, который был обратно-совместимым и представил его Юске Эндо (Yusuke Endoh) на встрече разработчиков RubyKaigi в 2019 году. Пока мы ждали решения Matz’а по именованным параметрам, я начал посылать разработчикам исправления ошибок в Ruby, и в итоге Эндо предложил дать мне права доступа к коду на запись, а Matz принял это предложение.

Что касается RubyPrize, изначально меня номинировали в 2019 году за мою работу над именованными параметрами и исправление ошибок, но тогда мне удалось только выйти в финал. Я продолжил работу над Ruby и исправил множество ошибок в его объектной модели, а также улучшил производительность обработки именованных параметров и отслеживания исключений. В 2020 году меня снова номинировали на премию, и в этот раз я победил. Мне кажется, это второй раз, когда разработчик сначала становится финалистом, а на следующий год оказывается победителем: Такаси Кокобун (Takashi Kokubun), автор реализации JIT-компилятора, был финалистом в 2017 и победителем в 2018.

 

Evrone: Ты автор Roda и Rodauth, координатор разработки Sequal и член команды разработчиков Ruby. Какую деятельностью в работе над проектами с открытым исходным кодом ты находишь самой интересной и что приносит тебе больше удовлетворения?

Джереми: Это непростой вопрос. Я получаю удовольствие от всей своей работы над open-source проектами. Однако работа над самим Ruby, пожалуй, приносит больше всего удовлетворения — по нескольким причинам.

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

Во-вторых, для меня эта работа гораздо сложнее. Очень часто мне приходится работать с кодом на Си, или с незнакомыми частями стандартной библиотеки Ruby. Большинство других проектов я писал на чистом Ruby и хорошо ориентируюсь в их коде, так что исправлять в них ошибки или добавлять новые функции гораздо проще.

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

 

Evrone: У твоих проектов очень большие наборы тестов и хорошее покрытие кода тестами. Что ты думаешь об аннотациях типов в Ruby 3: помогут ли они тебе писать более качественный код?

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

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

 

Evrone: Ты сейчас отвечаешь за Ruby в системе портов OpenBSD, включая JRuby и Rubinius. С твоей точки зрения, как OpenBSD используется в 2021 году и какую нишу занимает, по сравнению с дистрибутивами Linux?

Джереми: Не могу говорить об использовании OpenBSD в целом. Я использую этот дистрибутив на всех своих компьютерах и ноутбуках, а также на всех критичных по безопасности серверах моей компании. Думаю, что это лучшая операционная система общего назначения. В своих веб-приложениях на Ruby я активно использую уникальные функции безопасности из OpenBSD, такие как pledge и unveil.

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

Производительность OpenBSD ниже, чем у других операционных систем, но в моём окружении я готов пожертвовать производительностью ради безопасности и простоты обслуживания.

 

Evrone: Насколько активно ты следишь за другими фреймворками для веб-приложений, аутентификации и работе с базами данных?

Джереми: Что касается веб-фреймворков, обычно смотрю на списки изменений в больших обновлениях Rails и Hanami, в основном чтобы узнать, нет ли там новых полезных функций, которые можно было бы добавить в Roda, но в детали не углубляюсь.

За фреймворками для аутентификации не слежу вовсе. Когда я начал работать над Rodauth в 2015 году, то изучил существовавшие тогда фреймворки, чтобы позаимствовать из них идеи для своего. С тех пор ни на один из них не смотрел.

Относительно библиотек для работы с базами данных, я просматриваю изменения в ActiveRecord каждые несколько месяцев в поиске полезных добавлений, которые можно было бы реализовать в Sequel. В последнее время узнал о многих важных pull request’ах в ActiveRecord через Twitter. В паре случаев мне показалось, что они достаточно полезны, чтобы сделать такое же в Sequel. Так появились расширения async_thread_pool и column_encryption. Я также просматриваю изменения в ROM, но скорее, чтобы понять, как они используют Sequel, а не как её можно улучшить.

 

Evrone: В последние годы в Ruby появилось множество новых возможностей: сопоставление с образцом, нумерованные и именованные параметры, аннотации типов, ractor’ы, асинхронные fiber’ы, правостороннее присваивание и многое другое. Какие из них тебе нравятся больше всего и сильнее всего повлияли на твой процесс разработки?

Джереми: Мое отношение к новым возможностям языка очень консервативно. Многие из моих библиотек до сих пор поддерживают Ruby 1.9, а мои приложения работают на Ruby 2.5. Самая новая фича, которую использую в своем коде — «одинокий оператор» для проверки значений на nil из Ruby 2.3.

 

Evrone: Ты работаешь над Sequel и её реализацией ORM уже более десяти лет. Как ты думаешь, какие основные сложные задачи сейчас стоят перед разработчиками ORM?

Джереми: Я не уверен, что хорошо понимаю, какие трудности стоят перед разработчиками других ORM. Что касается Sequel, в последние годы всё идет гладко и без особых трудностей. Тем не менее, есть много областей, где сложность кода очень высока и работать с ним непросто. Одна из таких областей — работа с подготовленными запросами и связанными переменными. Сложность там возникла от того, что при проектировании Sequel их поддержка не предусматривалась. Другая  — работа со сложными ассоциациями, особенно с жадной загрузкой данных. Однако не могу сказать, что у нас были серьёзные трудности в этих областях в последние несколько лет.

 

Evrone: Для каких сценариев использования ты посоветовал бы разработчикам на Ruby использовать Roda, Rodauth и Sequel? Для чего они подходят идеально, а для чего лучше взять другие фреймворки?

Джереми: С чисто технической точки зрения, думаю, что Roda, Rodauth и Sequel — лучшие фреймворки для веб-приложений, аутентификации и работы с базами данных. Во всех этих случаях их производительность, архитектура и гибкость гораздо лучше, чем у других популярных проектов. Если выбирать по техническим характеристикам, то у Roda, Rodauth и Sequel явное преимущество при любых размерах приложения.

Однако во многих случаях, технические преимущества не так важны. Если сравнить Roda, Rodauth и Sequel c Rails, Devise и ActiveRecord, то у стека Rails есть несколько преимуществ.

Во-первых, с Rails знакомы больше разработчиков, так что найти их гораздо проще, чем разработчиков на Roda/Sequel.

Во-вторых, многие сторонние библиотеки разработаны специально для Rails. В случае с Roda/Sequel, вместо множества библиотек для твоей задачи ты скорее найдёшь всего одну, а то и вовсе ни одной.

В-третьих, решение использовать Rails несёт меньше рисков. Риск тут бывает двух видов. Первый — «никого ещё не уволили за выбор Rails». Второй — над Rails и ActiveRecord и библиотеками для них работают больше людей. Сторонние разработчики присылают в Roda и Sequel патчи очень хорошего качества, но большая часть работы всё равно остается на мне. Хочется верить, что благодаря стопроцентному покрытию тестами, даже без моего присутствия любой заинтересованный разработчик сможет взять на себя поддержку моих библиотек. Возможно, я чрезмерно оптимистичен.

Думаю, что выбор между Roda/Sequel и Rails зависит от того, что для тебя важнее: технические преимущества или нетехнические.

 

Evrone: Пандемия заставила разработчиков работать из дома и проводить конференции в онлайн-формате. Как это отразилось на твоём балансе между личной жизнь и работой и твоём участии в проектах с открытым исходным кодом?

Джереми: Считаю, что мне очень повезло, что пандемия не слишком повлияла на мою жизнь. Пару месяцев я работал удалённо из дома, но в основном всё оставалось по-прежнему. Я продолжал участвовать во всех тех же проектах. Скучаю по личному присутствию на конференциях и жду того момента, когда пандемия закончится, чтобы присутствовать на них снова.

 

Evrone: Roda недавно перешагнул порог в миллион загрузок и стал четвертым фреймворком на Ruby, которому это удалось. У Sequel 25 миллионов загрузок, а это очень много обратной связи с пользователями. Чему тебя это научило в техническом плане за все эти годы?

Джереми: Самый главный урок, который я извлёк из моей работы над проектами с открытым кодом — важность тестирования. Набор тестов очень важен, чтобы с уверенностью исправлять ошибки и добавлять новые функции.

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

 

Evrone: Работа над твоими проектами и OpenBSD вынуждает тебя сталкиваться с альтернативными реализациями Ruby, такими как JRuby, MRuby и Rubinius. Насколько они популярны и как влияют на твои проекты?

Джереми: Тестирование моих библиотек на JRuby помогло мне найти множество ошибок, особенно ошибок безопасности параллелизма, которые не проявляются в CRuby из-за присутствия в нем глобальной блокировки.

Не уверен, насколько они популярны. Мне кажется, число приложений, которые работают на JRuby невелико по сравнению с CRuby. Однако среди больших корпоративных приложений их процент может быть куда выше.

Я не работаю со встраиваемыми системами, так что не было случая поработать с MRuby, кроме разработки пакета для OpenBSD. По моему опыту, в США он непопулярен, но известен в Японии.

Насколько я могу судить, проект Rubinius уже мёртв, его место в экосистеме занял TruffleRuby. Я использую TruffleRuby в некоторых автоматизированных тестах, но не уверен, работает ли он на OpenBSD.

 

Evrone: VIM остается твоим любимым текстовым редактором на протяжении многих лет. Ты пробовал VSCode? Многие разработчики думают, что это отличная современная альтернатива VIM, поскольку он поддерживают привычную навигацию с клавиатуры. Что ты об этом думаешь?

Джереми: Я не пробовал VSCode. VIM полностью соответствует моим потребностям. Если честно, хоть и использую его уже много лет, но я не такой уж продвинутый пользователь. Тем не менее VIM хорош для меня настолько, чтобы не задумываться о возможных альтернативах.

 

Evrone: Есть ли у тебя планы на будущее, которыми ты мог бы поделиться с нашими читателями?

Джереми: Мои планы довольно скучные. Я собираюсь поддерживать мои проекты как минимум еще 15–20 лет, а может и дольше. Также планирую дальше работать над самим Ruby, в основном над исправлением ошибок.

 

Evrone: Разработка веб-приложений недавно вернулась к своим корням, появились проекты вроде Hotwire, которые рендерят HTML на стороне сервера. Что думаешь о моде на HTML-over-the-wire и full-stack разработку без JavaScript?

Джереми: Я уже много лет активно призываю ограничивать использование JavaScript. Большинство моих приложений написаны в стиле Web 1.0 с подходом запрос-ответ, рендерингом HTML на сервере и стандартными формами HTML. Я использую JavaScript только при необходимости. Если мне нужно что-то за пределами подхода запрос-ответ, то это обычно всё равно одностороннее взаимодействие, так что использую MessageBus вместо WebSocket.

Однако это не полный ответ на вопрос. Я никогда не пробовал Hotwire или похожие библиотеки, и когда посылаю запросы с помощью JavaScript, вероятно предпочту получить ответ в виде JSON, а не HTML. Так что в некотором смысле надеюсь, что тенденция к простоте сохранится.

Когда используешь JavaScript, не нужно мыслить о выборе между JSON и HTML догматически. Бери то, что лучше подходит для конкретного случая. Если нужно заменить содержимое целого элемента, HTML подойдет лучше, в иных случаях лучше взять JSON. Ничто не мешает использовать оба формата. У меня есть приложения, где сервер возвращает JSON с фрагментами HTML, если мне нужно обновить несколько элементов HTML сразу.

 

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

Джереми: Скорее всего удалил бы ряд фич из Ruby, начиная с локальных расширений классов (refinements) и Module#prepend. Обе эти возможности сильно усложняют объектную модель и реализацию. Обе были причиной множества дефектов, причем такие дефекты могут быть неисправимыми. Это эгоистичный ответ, поскольку я сам не использую эти фичи, но потратил много времени на исправление дефектов, которые из-за них возникали, так что лично для меня от них один вред и никакой пользы. Однако я понимаю, что для других проектов они дают ощутимые преимущества.

Заключение

Мы активно поддерживаем open-source проекты и берём интервью у самых разных людей из мира разработки, чтобы вы могли познакомиться с авторами инструментов, которые, быть может, используете в работе. Если хотите узнать больше — познакомьтесь с нашими собственными open-source инициативами и другими интервью.

Работа над самим Ruby, пожалуй, приносит больше всего удовлетворения. Когда я исправляю ошибки, которые до этого оставались неисправленными много лет, это кажется серьёзным достижением.
Джереми Эванс
Член команды разработки Ruby, ведущий разработчик Sequel, Roda и Rodauth
Связаться с нами
Нужна команда?
Давайте обсудим ваш проект
Прикрепить файл
Максимальный размер файла: 8 МБ.
Допустимые типы файлов: jpg jpeg png txt rtf pdf doc docx ppt pptx.