Интервью с Дмитрием Кириенко
Дмитрий является ведущим разработчиком компании. За его плечами многолетний опыт работы в джава и руби.
Работал в таких проектах, как Ringorang, Groupistan, Grublife и ActiveConversion. Сейчас трудится над британским
проектом TurbineHQ. Никогда не работал ни в Getsocio, ни в Трекере. Характер крайне дружелюбный. Женат.
Насколько нам извесно, ты являешься контрибьютором проекта Ruby on Rails. На твоем счету около десяти коммитов в рельсы. Какие советы ты можешь дать будущим контрибьюторам в большие оупенсорс проекты?
Во-первых, читайте исходный код. Благо к этому нас поощряет сам open source, в котором документация довольно часто либо недостаточна, либо расходится с реальностью. По поводу и без повода заглядывайте в исходный код библиотек, с которыми вы работаете. Это очень полезно. Вы увидите, почему вещи работают так или иначе. То, что вы считали магией, обернётся простыми и понятными строчками кода.
Во-вторых, не бойтесь. Если посмотреть историю коммитов в Rails, можно увидеть, что больше половины работы выполняется людьми за пределами так называемой core team, а core team всего лишь принимает pull requests. Если вы встречаете очевидно неверное поведение библиотеки, и, заглянув в код, видите ошибку — делайте fork и исправляйте. Вклад Github в развитие open source трудно переоценить — никогда ещё участие в open source разработке не было столь лёгким.
Что до участия в разработке Rails, тут я советую прочитать раздел rails guides, посвящённый этому вопросу. Это сэкономит вам часик-другой. В корне каждой части Rails (таких как ActiveRecord, ActiveSupport, и т.д.), лежит файлик RUNNING-UNIT-TESTS с инструкциями по запуску модульных тестов. Это сэкономит ещё полчасика. Обязательно пишите тесты на вносимые изменения — патч без тестов, скорее всего, не будет принят. Лучше вносить изменения в режиме «вначале тесты».
Если очень хочется поучаствовать в разработке Rails, но что сделать — не знаете, просмотрите список открытых issues, особенно тех, которым присвоен тот или иной milestone. Там всегда есть что-то простое и быстрое.
Ещё изучите Github markdown — ваши pull requests будут лучше смотреться.
В общем, ничего военного. Просто загляните в код, улучшите его, отправьте pull request. Это просто.
А как на счет своих оупенсорс решений? Многие разработчики в своих проектах, не найдя готового решения, пишут свою библиотеку. Ты являешься автором нескольких готовых решений среди которых гем soprano или abacus_count. Когда наступает тот самый момент, когда код из папки ’lib’ должен перекочевать на github?
Не стоит называть меня «автором» soprano. Soprano — не более чем реинкарнация сборника рецептов Capistrano от Дениса Барушева, который назывался Capone и больше не поддерживается. Моего кода, по большому счёту, там и нет совсем. Я добавил «поддержку» mysql2, убрал рецепты, которые больше не нужны (такие как rake gems:install) и переделал инфраструктуру проекта с Jeweller на Bundler-style. Да, я планирую поддерживать этот сборник рецептов, но пока что я не его автор. Скорее, maintainer.
Что же до вопроса, отдельный gem и папка lib равнозначны. Если код достоин папки lib, значит, он достоин и того, чтобы стать библиотекой =). Критерий для обоих случаев я формулирую так: если вы можете описать, что делает код, не используя слов из предметной области проекта — это точно библиотека. Если нет — это возможно библиотека.
Однако, жизнь вносит свои коррективы, и, казалось бы, чисто инфраструктурные решения прозябают в многочисленных папках lib многочисленных Rails проектов. Только в моём текущем проекте их около 5. Почему так происходит? Помимо элементарной нехватки времени и лени, есть два больших препятствия: тесты и проблема «неуловимого Джо».
Да, чтобы выложить библиотеку на Github, она должна включать в себя автоматические тесты. Если этого не сделать, развитие библиотеки будет парализовано — у потенциальных авторов fork’ов просто не будет способа узнать, не сломали ли они чего-то. Очень часто у нас хорошо протестировано собственно приложение, затем, в ходе рефакторинга из него выделяются инфраструктурые части, но вовсе не в режиме «вначале тесты». Потом тесты на саму библиотеку тоже не пишутся. Это приводит к тому, что код обречён пребывать в папке lib долго-долго-долго. Что тут сказать? Помимо очевидного — выделяя инфрастуктурный код, переписывайте его заново в TDD — могу ещё добавить: выкладывайте как есть. Когда появится первый fork, его автор сам попросит у вас тесты — будет хороший стимул.
Вторая же беда — проблема «неуловимого Джо» — гораздо серьёзнее. Бывает такое, что ваше инфраструктурное решение подобно неуловимому Джо — оно никому даром не нужно. Приведу пример.
В ходе работы над моим текущим коммерческим проектом возникла необходимость сделать боковую панель с набором разнообразных фильтров, управляющих коллекцией записей, отображаемых на странице. Примером может служить список фильмов kinobaza.tv. Пройдя несколько реинкарнаций родилось довольно миленькое решение с ограниченно приятным интерфейсом и разумным набором характеристик (фич). Когда же я «созрел» для того, чтобы переписать его в TDD, оформив в виде библиотеки, я уже пришёл к мнению, что такие задачи нужно решать совершенно по другому. Если заботит проиводительность, нужно прибегнуть к чему-то наподобие Sunspot/Solr или Elastic Search (особенно привлекательно выглядит Elastic — обязательно его пощупаю в ближайшем будущем), а если хочется чего-то инфраструктурно простого — что бывает гораздо чаще — я категорически рекомендую использовать Ransack (ранее известный как MetaSearch) от замечательного open source разработчика Ernie, автора ещё как минимум двух замечательных must-use библиотек для ActiveRecord. Если же Ransack не решает какой-то специфической проблемы — лучше вложиться в Ransack pull request’ом и/или временно использовать свой fork.
Наверное, с проблемой «неуловимого Джо» стоит поступать так же, как и с тестами — игнорировать и всё равно выложить. Разрабатывают же Clearance и Sorcery, при том, что стандартом де-факто является Devise.
В качестве хорошего пособия по написанию библиотек для Rails приложений я настоятельно рекомендую книгу Crafting Rails Applications всем известного Хосе Валима (кстати, она есть у нас на вики).
Резюмируя, скажу, что нужно больше библиотек, хороших и разных. Во-первых, вам же будет легче — в следующий проект ваши решения будете не копировать, а просто повторно использовать. Во-вторых, если кто-то ещё будет этим пользоваться — он быстрее вас может найти ошибку и, тем самым, позволит вашему решению стать лучше. В-третьих, в масштабах организации размера Анахорета это вообще основной способ появления новых open-source решений — пишем для себя, пользуемся, обкатываем, получаем новую популярную библиотеку.