Интервью с Джереми Эвансом (Jeremy Evans) о Sequel и не только
октября 22, 2011 | Published in Sequel, Интервью | 6 Comments
Оригинал на английском: Interview with Jeremy Evans about Sequel and not only
Привет, Джереми. Расскажи читателям RubyDev немного о себе, своей работе и хобби.
Привет. Меня зовут Джереми Эванс (Jeremy Evans). Я работаю в калифорнийском бюро государственного учета (California Bureau of State Audits), в меленьком департаменте правительства штата которое занимается аудиом других правительственных департаментов. Я главные технический эксперт в департаменте и отвечаю за программирование для департамента, системное администрирование, сетевое администрирование и администирование баз данных, кроме прочих обязанностей.
Кроме компьютеров и программирования моим основным хобби является игра с моим трехлетним сыном.
Джереми, расскажи пожалуйста о Sequel и как у тебя родилась идея разработки Sequel?
это набор инструментов для работы с базой данных из программ на Ruby. Sequel разрабатывался для предоставления простого, независимого от базы данных API для взаимодействия с SQL-базыми данных. Sequel поддерживает продвинутые SQL возможности, которые не поддерживаются другими библиотеками для Ruby для работы с базами данных. Sequel также включает в себя мощный и гибкий ORM, который называется Sequel::Model.
Я не являюсь первоначальным автором Sequel. Первоначальный автор проекта — это Шэрон Рош(c)нер (Sharon Rosner) и я думаю, что толчком к разработке Sequel послужило то, что он был разочарован в ActiveRecord и хотел создать что-то лучшее. Шэрон работал над фреймворком, который назывался ServerSide и Sequel был изначально добавлен как компонент этого фреймворка (ServerSide::Database) в ноябре 2006 года. Затем, в марте 2007 года, он извлек компонент для работы с базой данных в отдельную библиотеку и назвал ее Sequel.
С марта 2007 до февраля 2008 он разрабатывал библиотеку и в марте 2008 он решил, что больше не хочет заниматься ее разработкой. Я недавно отправлял патчи для добавления поддержки ассоциаций в ORM Sequel’а и когда он решил, что больше не будет заниматься поддержкой проекта, то он написал мне и еще нескольким разработчикам письмо с вопросом не хочет ли кто-нибудь из нас заменить его. Мой ответ был принят и я работаю над улучшением Sequel по сей день.
Чего нового планируешь добавить в Sequel в ближайшем будущем?
Мой список todo становится все короче, так как многие вещи уже сделаны, например улучшенная поддержка DB2 и Oracle, поддержка особенностей postgre 9.1 и возможность использовать коллбеки after_commit если транзакция успешна или after_rollback если транзакця неудачна. Следующее, что я хочу добавть, это плагин, который позволит пользователям вызывать методы ассоциаций для набора записей (datasets):
Artist.one_to_many :albums Album.one_to_many :tracks # Получаем все треки у которых имя исполнителя начинается на A, а название альбома на B. Artist.filter(:name=>/^A/).albums.filter(:name=>/^B/).tracks
Как много разработчиков кроме тебя активно шлют коммиты в проект?
Я пишу примерно 90-95% кода, что приходит в Sequel. Ответ на вопрос зависит от того, что ты подразумеваешь под активной отправкой коммитов. Например, есть 16 других разработчиков, которые, которые отправляли патч за этот год. Но я единственный человек, который активно и постоянно работает над исправлениями и улучшениями в Sequel.
Какие самые заметные отличия между Sequel и ActiveRecord или DataMapper ORM’ами?
Первое отличие заключается в том, что Sequel не является ORM, Sequel включает в себя ORM, который называется Sequel::Model. таким образом, если все, что тебе нужно — это просто соединиться с БД и взаимодействовать с ней без создания связки классов моделей, Sequel делает это очень простой задачей, более простой, чем ActiveRecord или DataMapper.
Основное отличие между Sequel::Model (Sequel ORM) и ActiveRecord заключается в том, что Sequel более гибкий. ActiveRecord разрабатывалс я для работы с новой базой данных, где ты контролируешь схему БД, и получается так, что сложно использовать ActiveRecord применительно к базам данных схема которых не использует соглашений принятых в ActiveRecord. Например, ActiveRecord не поддерживает композитные ключи, ни для самих классов моделей, ни для их ассоциаций. В это время Sequel поддерживает оба варианта.
Sequel::Model также более модульный инструмент нежели ActiveRecord. Он имеет маленький модуль реализующий ядро, который покрывает основные CRUD возможности. Он также по умолчанию включает модуль ассоциаций, который более гибкий, чем аналогичный модуль в ActiveRecord, с множеством настраиваемых опций. Все остальное поставляется в отдельных модулях, поэтому пользователь может сам определять какие возможности ему необходимо включить.
Могу сказать, что самым заметным отличием Sequel от DataMapper является то, что DataMapper поддерживает NoSQL базы данных в то время, как Sequel работает только с SQL базами данных. Я прохо знаю DataMapper чтобы мочь сказать еще что-то об их различиях.
Какие инструменты, кроме ORM Sequel::Model Sequel включает в себя? Можешь кратко описать их?
Я не уверен, что правильно понял что ты подразумеваешь под инструментами, но некоторые особенности которые есть в Sequel и которые не поддерживаются другими библиотеками для работы с базами данных — это:
- Master/slave настройки: Отправка SELECT запросов только на slave-сервера, а всех остальных на master-сервер реализуется через несколько строк конфигурации и без какого-либо допиливания кода.
- Поддержка шардинга (распределение БД на нескольких серверах): выбор того, какой shard/partition будет выполняться.
- Подготовленные транзакции/двух-фазный коммит: Соединение с транзакциями в поддерживаемых БД гарантируя, что либо все будут успешны, либо наоборот.
- Подготовленные выражения: создание подготовленных выражений которые работают для всех баз данных через простое API.
Под инструментами я подразумевал стандартные плагины подключаемые в Sequel, что лежат в директории plugins/. Можешь рассказать о самых интересных из них?
- Class Table Inheritance (CTI) — наследование одними таблицами свойств из других в объектном представлении: Поддержка наследования в базе данных использую единственную таблицу для каждого класса в иерархии классов.
- Instance Hooks — Хуки для отдельных объектов: Вы можете определить after_save и прочие хуки только для определенного экземпляра класса модели.
- Lazy Attributes: Как и в DataMapper, все столбцы в таблице по умолчанию сразу не вибираются, но выбираются при помощи ленивой загрузки (запрос формируется постепенно и выбираются только необходимые данные, что экономит оперативную память).
- Many Through Many — ассоциация многие через многие: Позволяет создавать ассоциации между любыми двумя таблицами даже если между ними имеется произвольное число объединяющих таблиц.
- RCTE Tree: Используется стандартное рекурсивное табличное выражение для быстрой загрузки всех предков и потомков для древоподобной структуры.
- Sharding: Работая со встроенной в Sequel поддержкой шардинга объекты модели полученные из шарда автоматически сохраняются в свой шард.
- Tactical Eager Loading — тактическая ранняя загрузка: Как и в DataMapper непосредственно загружаются и ассоциации так что вам не нужно делать это вручную. В отличие от DataMapper поддерживаемая прямая ранняя загрузка выполняется для любого уровня вложенности (смотри слайды начиная с этого: ).
ActiveRecord 3.1 снабжен identity map из-за чего было достаточно много шумихи и положительных отзывов. Используется ли в Sequel этот паттерн для более производительно и безопасной работы?
Да, Sequel включает в себя плагин identity_map уже в течении двух лет. Он используется для реализации другого плагина — lazy_attributes, но самостоятельно использовать его я не рекомендую, ну разве что только в некоторых ограниченных случаях. Глобальные identity maps могут создавать проблемы и, чаще всего, небольшой прирост производительности того не стоит. В ActiveRecord 3.1 Identity map по умолчанию выключен.
Джереми, скажи пожалуйста где ты используешь Sequel и используешь ли ты ActiveRecord или другие аналоги в некоторых своих проектах, или ты предан только Sequel?
Я использую Sequel во всех своих проектах на работе и дома. У меня есть 3 приложения на Rails 3.1 где я использую Sequel, все они были начаты еще до момента релиза Rails 1. Все они использовали ActiveRecord, но когда я стал мейнтейнером в 2008 году, я перевел их на использование Sequel. У меня есть также 10 приложений на Sinatra и они также успешно используют Sequel.
Единственный случай когда я использую ActiveRecord или DataMapper это тестирование проекта, который я назвал Scaffolding Extensions (расширения скоффолдинга), который поддерживает Sequel, ActiveRecord и DataMapper, и может использоваться в 5 различных веб фреймворках.
Я знаю, что многие разработчики используют Sequel только в приложениях на Sinatra. В чем причина этого? Не в том ли, что Sequel более легковесный и производительный в сравнении с ActiveRecord?
Sequel очень популярен в сообществах разработчиков на Sinatra и Ramaze, и я считаю, что частично этот успех обеспечен большей производительностью и легковесностью, но я считаю, что главной причиной является то, что Sequel более прост в использовании и более гибкий.
Я считаю, что ActiveRecord в сообществе Rails-разработчиков всегда будет более популярным решением, чем Sequel просто потому, что ActiveRecord используется в Rails по умолчанию.
Джереми, расскажи пожалуйста о самых известных и крупных проектах, которые используют Sequel.
Самые крупные пользователи Sequel, о которых я слышал — это:
- Heroku (Platform-as-a-service): В Heroku Sequel используется для анализа их огромных PostgreSQL баз данных.
- OMGPop (онлайн игры): Я точно не знаю как они используют Sequel, но предполагаю, что работают они с сотнями миллионов записей.
- Offers.com (купоны): Используют Sequel для обработки сотен миллионов запросов.
Кроме Sequel в каких еще проектах ты участвуешь? Расскажи кратко о них.
Кроме Sequel крупным проектом в котором я участвую является OpenBSD. Я мейнтейнер во многих экосистемах Ruby в OpenBSD включая четыре основных интерпретатора Ruby: MRI 1.8, MRI 1.9, JRuby и Rubinius.
У меня есть множество маленьких проектов над которыми я работаю, их можно увидеть в моем профиле на GitHub ().
Я очень мало знаю о Rubinius, можешь рассказать, какие в этой имплементации отличия от MRI? Использует ли кто-нибудь Rubynius в продакшене или он Rubinius еще не готов для реальных проектов?
Rubinius — это имплементация Ruby авторы которой стараются реализовать как можно больше Ruby на самом Ruby. В этом и заключается основное отличие от MRI, где ядро написано на Си. В Rubinius имеется небольшой кусок кода на C++, но основная часть написана на Ruby. Rubinius использует LLVM для JIT компиляции твоего кода на Ruby и в некоторых случаях Rubinius сильно быстрее MRI 1.9.2, а в некоторых, наоборот — сильно отстает.
В Rubinius 2.0. будет удален GIL, что позволит тредам в Ruby работать параллельно — похожим образом на то, как они работают в JRuby.
Я не знаю, кто использует Rubinius в продакшене, но в тех задачах, где я его использую он работает достаточно стабильно. Мои приложения в продакшене работают на MRI 1.9.2.
Джереми, расскажи пожалуйста как ты начал программировать на Ruby. Какие были самые приятные моменты в изучении и программировании на Ruby?
Я начал изучать программирование на Ruby после 2004 года, после года программирования на PHP и года программирования на Python. После работы над маленьким скриптом на Ruby для вычисления и проверки CRC32-проверочных сумм я резко ринулся в сторону фреймворка Rails, который тогда был то ли в 0.8.5 версии, то ли в 0.9.
Если у меня и есть один единственный момент как самый прекрасный момент в программировании на Ruby, то это, вероятно тот момент, когда я узнал, что можно делать так:
def foo f = File.new('file', 'rb+') yield f ensure f.close if f end
Перейдя с Python 2.4 (до того, как были добавлены контекстные менеджеры), я через это был так восхищен что здесь есть такой способ инкапсулировать код чистки.
На каких языках ты программируешь в данный момент кроме Ruby и на каких еще программировал раньше?
В колледже между 1998 и 1999 годом у меня было несколько курсов по C++ и один по Java, которые мне нравились, но я не воспринимал программирование как свою карьеру. Я не программировал до 2003 года, когда я начал использовать PHP. Затем до 2004 года я программировал на Python, который был основным используемым мною языком программирования пока я не открыл для себя Ruby.
В данный момент основными языками являются Ruby и C, но с момента изучения Ruby я также делал некоторые простые вещи на Lua, Erlang, Perl и совсем недавно на Haskell.
Что думаешь о Java, Scala и прочих подобных языках? Сможет ли Ruby потопить Java-подобные языки программирования?
Прошло много времени с того помента, когда я программировал на Java, но недавно я использовал библиотеки Java в крограмме на Clojure и впечатлило то, как много работы потребовалось чтобы сделать совсем простые вещи.
Я планирую когда-нибудь поиграться со Scala, но в данный момент меня несколько отвращает синтаксис Scala.
Я не думаю, что Ruby сможет уничтожить Java и произошедшие от Java языки. Особенно с наличием JRuby, где Ruby сосуществует с Java.
Джереми, расскажи что думаешь о будущем Rails. Как ты относишься к изменениям сделанным в Rails 3.1 и чего ожидаешь от Ruby 2.0?
После Rails 1.2 я не помню каких-то возможностей, которые были добавлены в Rails и были мне полезны. Свои приложения на Rails 3.1 я продолжаю писать в стиле Rails 1. Если честно сравнивать с Rails, то мои приложения на Sinatra также не используют всего нового функционала Sinatra.
Что касается Ruby, то я не заметил больших изменений произоедших в 1.9 по сравнению с 1.8, кроме увеличения скорости работы. Что касается Ruby 2.0, то мне кажется, что возможность включения модулей не только в конец цепочки наследования является тем нововведением, которое я больше всего жду. Достаточно легко добиться подобной функциональности в 1.8 и 1.9 сохраняя все методы в модулях вместо классов, но я не знаю других библиотек кроме Sequel::Model, которые делали бы это
Что думаешь о многопоточности и параллелизме в Ruby 2.0? Будет ли в Ruby 2.0 код на Си thread-safe (безопасные потоки)?
Я не думаю, что Ruby 2.0 будет thread-safe, по крайней мере в параллельном запуске тредов. Возможно, в MRI 3.0 это будет реализовано.
В данный момент возможность реального параллелизма реализована только в JRuby.
Можешь поделиться некоторыми своими секретами по поводу того, как стать профессиональным программистом и заниматься разработкой замечательных проектов, как Sequel, напимер?
Я, наверное, не самый подходящий человек, которого можно спрашивать о том, как стать профессиональным программистом, но я думаю, что следующие вещи важны, если ты хочешь разрабатывать хорошие проекты:
Отвечать на issues так скоро, как только можешь. Среднее время ответа в Sequel составляет полтора часа и пользователям нравится, что они получают быстрый ответ на любое issue, которое они открыли.
Исправление ошибок в своих библиотеках, даже если они не затрагивают лично тебя. Если ты предоставляешь код для открытого использования, и если ты явно не сообщаешь о том, что проект не поддерживается, то ты обязательно должен заниматься поддержкой и исправлением ошибок. Исправление ошибок должно иметь больший приоритет, чем добавление новых возможностей.
Пиши документацию. Я не люблю писать документацию, но я написал огромное количество документации для Sequel. Чем важнее проект, тем больше ты должен хотеть документировать его. Хорошая документация делает проект простым для использования и позволяет избежать траты времени на ответы на множество вопросов пользователей.
Будь доступным. Отвечай на вопросы в листе рассылок и в IRC-канале. Личный ответ мейнтейнера — это очень хорошо и показывает пользователям, что ты о них заботишься.
Тестируй свой код. Не выпускай код с известными ошибками. Используя инструменты типа RCov чтобы убедиться в том, что твой код хорошо покрыт тестами. Мои слова «100% покрытие ничего не значит, но покрытие тестами меньше 100% что-то означает». Думай о всех возможных проблемах в коде при тестировании.
Ненужно никакого , не делай что-то просто потому, что так делают другие люди. Например, множество rubyist’ов говорят, что ты должен писать тесты перед написанием самого кода (практиковать TDD или BDD). Не делай этого, если видишь, что тебе это не подходит. Лично я иногда пишу сначала тесты, а затем код, а иногда наоборот.
Джереми, что хочешь пожелать читателям RubyDev и все новичкам начавшим изучать Ruby?
Основной фокус в Ruby направлен на то, чтобы сделать программистов счастливыми, поэтому, работайте с удовольствием.
Links
Выводы:
— очень мощный и в то же время очень легкий и быстрый инструмент для работы с базой данных, которым пользуются тостаточно известные компании и достаточно известные и уважаемые в сообществе Ruby’исты. Проект RubyDev окажет поддержку проекту Sequel в виде его популяризации в русскоговорящем сообществе. В ближайшее время я напишу или переведу несколько статей об использовании Sequel в Sinatra и Rails.
октября 22, 2011 at 20:28 (#)
Спасибо! Очень интересное интервью. Этим гемом пользуются в такой известной компании как heroku, надо будет глянуть.
октября 24, 2011 at 12:38 (#)
В переводе косяков полно.
«но в моей с ним работе он работает очень стабильно»
«есть один единственный момент как самый прекрасный момент в программировании на Ruby это, вероятно тот момент»
«Особенно с наличием JRuby, ведь это просто, просто сосуществовать Ruby и Java вместе.»
И так далее.
октября 24, 2011 at 14:29 (#)
Отписался от RSS
октября 25, 2011 at 06:06 (#)
Качество блога упало совсем
у вас ссылочка битая на оригинал, ссылается на самого себя
октября 25, 2011 at 13:49 (#)
Валентин, я проверил ссылку она не бытая, просто оригинал и перевод оформлены одинаково. Интервью брал я у Джереми и опубликовал оригинал для любителей читать на английском, а перевод сделал для тех, кто английского не знает или знает плохо. Т.е. это не перевод интервью с другого сайта, а так сказать, эксклюзив для читателей RubyDev. Почему качество упало?
ноября 2, 2011 at 11:07 (#)
Andy, спасибо, вроде поправил все.