Эрик — Ruby-герой 2014 года, популярный ментор среди разных Ruby-сообществ (Ruby Summer of Code, Google Summer of Code и Rails Girls Summer of Code) и просто интересный человек. Изначально интервью должно было выглядеть в стиле «коротко продолжи фразу», но Эрик подошел к делу творчески, поэтому публикую его полностью.
Я начал полноценно работать на Ruby в 2006 году, когда моя команда решила перевести наше веб-приложение с PHP на Rails. Rails на тот момент был на уровне версии 1.0. Кажется, мы использовали Ruby версию 1.8.4 и веб-сервер Mongrel. Это было еще до Rack, Bundler, RubyGems.org или GitHub. Оглядываясь назад, трудно себе представить работу на Ruby без этих инструментов, которые я сейчас использую каждый день.
Ruby помог мне осознать, что люди ценнее компьютеров. Большинство языков программирования оптимизированы для быстрого выполнения кода. Ruby оптимизирован так, чтобы можно было быстро читать и писать код. Это изменило мое понимание кода, теперь я пишу для людей, а не для компьютеров.
Ruby, как язык, очень классный, но намного больше мне нравится Ruby-сообщество. Будучи его частью, я общаюсь с замечательными людьми по всему миру. Мне нравится встречать новых Ruby-программистов на Meetup’ах и конференциях. Я очень много узнал от тех, кто открыто делится своими знаниями в своих блогах, подкастах, видеороликах и т.д. Я люблю Rails Girls, RailsBridge и другие ИТ-сообщества, которые делают программирование более разнообразным и содержательным. Мне по душе творческий дух Ruby-сообщества, который вдохновляет на создание таких проектов как Artoo, Kids Ruby, Shoes, Gosu, Sonic Pi и т.д.
Я думаю, что Ruby будет лучше, если его синтаксис будет более последовательным. Например, в Ruby есть 2 различных способа сделать хэш и 7 различных способов сделать функцию (def, proc, Proc.new, lambda, ->, {}, do…end) по сравнению с JavaScript, который имеет единый синтаксис хэша/объекта и один способ определить функции, независимо от того, именованная ли это функция или анонимная. Ruby также имеет слишком много псевдонимов по сравнению с философией Python, которая говорит, что должен быть только один очевидный способ сделать что-то. Дизайн – это искусство принятия решений. При наличии нескольких имен для одного метода (например, map/collect, reduce/inject, find/detect, find_all/select и т.д.), создатели Ruby избегали жесткого решения, передав этот выбор пользователю. Ruby также имеет много похожих имен для методов, которые несколько отличаются (например ==, ===, eql?, equal?). Я использую Ruby ежедневно в течении почти 10 лет, и я до сих пор не могу вспомнить разницу между eql? и equal?, не посмотрев подсказку. Мне бы хотелось, чтобы эти методы имели более описательные имена.
Другим примером являются тонкие различия между alias и alias_method, или private и protected. Думаю, Symbol можно заменить на frozen String и удалить из пользовательской части языка. Есть несколько других языковых «особенностей», которые я хотел бы исключить из Ruby, если бы мог, например глобальные переменные, пришедшие из Perl. На мой взгляд, это не связано с остальной частью языка. Есть также много плохо поддерживающегося и устаревшего кода в стандартной библиотеке Ruby. Хотелось бы чтобы стандартные библиотеки обновлялись, для использования новых возможностей языка, например keyword arguments. Если подобные функции не используются для основных/стандартных библиотек, их нужно исключить, так как они создают ненужные сложности. Было бы замечательно, если бы в Ruby была возможность находить некоторые виды ошибок на начальной стадии (во время запуска).
И еще не помешал бы динамический компилятор, способный генерировать бинарные файлы. И лучшую производительность выполнения. Я начал использовать вместо Ruby Crystal, которому и будет посвящен мой доклад, так как в нем есть большинство функций, которые мне нравятся в Ruby и отсутствуют те, которые мне не нравятся.
Первое, что приходит на ум, это то, как Rails выполняет проверку уникальности. Для тех, кто не знает, он просто делает SELECT, чтобы увидеть, существует ли поле, прежде чем делать INSERT. Первая проблема заключается в том, что эти две операции не делаются в транзакции, так что возникают условия для появления гонок сигналов, которые позволяют вставлять неуникальные записи. Тем не менее, транзакции, в принципе, не очень хорошее решение, так как они вызывают слишком много блокировок таблиц. Лучшим решением является просто создание уникального индекса на этом поле в базе данных, что гарантирует правильность и оптимальную производительность. Подход Rails к валидации уникальности – это слабая защита, которая дает пользователю ложное ощущение безопасности.
Это новость о создании RubyBench.org Аланом Го Сян Таном (Alan Guo Xiang Tan). Это невероятно ценный (и давно ожидаемый) вклад в сообщество Ruby. Этот проект будет гарантировать рост производительности Ruby, и с каждым релизом он будет становится все быстрее. Если бы RubyBench существовал раньше, он мог бы предотвратить потерю производительности в Ruby 1.9.
Crystal! Чтобы узнать больше – приходите на мой доклад :) (В конце мая Эрик будет выступать на Ruby-конференции в Киеве с темой доклада о Crystal).
В данным момент я работаю над переписыванием Twitter CLI под Crystal а также обучаю студентов на Rails Girls Summer of Code
Особое место в моей среде разработки занимает Fish shell, который я рекомендую всем, кто проводит много времени в командной строке. Попробуйте пользоваться им неделю, и вы уже не сможете без него обходиться!
Ruby-Talk, Ruby Weekly, и This week in Rails рассылки. Блоги Aaron Patterson, Aman Gupta, Sam Saffron, James Edward Gray II, Thomas Reynolds, Sandi Metz, Tom Stuart, Avdi Grimm, Jessica Kerr и Pat Shaughnessy. Также я читаю много блогов, не имеющих отношения к Ruby.
“Ruby Under a Microscope”, Pat Shaughnessy, поскольку это захватывающий взгляд на то, как работает Ruby изнутри. Я также рекомендовал бы Practical Object-Oriented Design in Ruby, Sandi Metz каждому Ruby-программисту, который еще ее не читал. Для лучшего понимания IT, как области знаний, я рекомендую Understanding Computation, Tom Stuart. А для совсем начинающих, я рекомендую Learn to Program by Chris Pine. Ну и наконец, книга Why's (Poignant) Guide to Ruby, занимает особое место в моем сердце.
Добавь такую строку в свой crontab: */30 9-17 * * 1-5 say «Stand up and walk around».
- Расскажи, пожалуйста, о своем опыте работы на Ruby. Когда начал и с чего?
Я начал полноценно работать на Ruby в 2006 году, когда моя команда решила перевести наше веб-приложение с PHP на Rails. Rails на тот момент был на уровне версии 1.0. Кажется, мы использовали Ruby версию 1.8.4 и веб-сервер Mongrel. Это было еще до Rack, Bundler, RubyGems.org или GitHub. Оглядываясь назад, трудно себе представить работу на Ruby без этих инструментов, которые я сейчас использую каждый день.
- Ruby помог мне...
Ruby помог мне осознать, что люди ценнее компьютеров. Большинство языков программирования оптимизированы для быстрого выполнения кода. Ruby оптимизирован так, чтобы можно было быстро читать и писать код. Это изменило мое понимание кода, теперь я пишу для людей, а не для компьютеров.
- Я люблю Ruby за...
Ruby, как язык, очень классный, но намного больше мне нравится Ruby-сообщество. Будучи его частью, я общаюсь с замечательными людьми по всему миру. Мне нравится встречать новых Ruby-программистов на Meetup’ах и конференциях. Я очень много узнал от тех, кто открыто делится своими знаниями в своих блогах, подкастах, видеороликах и т.д. Я люблю Rails Girls, RailsBridge и другие ИТ-сообщества, которые делают программирование более разнообразным и содержательным. Мне по душе творческий дух Ruby-сообщества, который вдохновляет на создание таких проектов как Artoo, Kids Ruby, Shoes, Gosu, Sonic Pi и т.д.
- Я не люблю Ruby за...
Я думаю, что Ruby будет лучше, если его синтаксис будет более последовательным. Например, в Ruby есть 2 различных способа сделать хэш и 7 различных способов сделать функцию (def, proc, Proc.new, lambda, ->, {}, do…end) по сравнению с JavaScript, который имеет единый синтаксис хэша/объекта и один способ определить функции, независимо от того, именованная ли это функция или анонимная. Ruby также имеет слишком много псевдонимов по сравнению с философией Python, которая говорит, что должен быть только один очевидный способ сделать что-то. Дизайн – это искусство принятия решений. При наличии нескольких имен для одного метода (например, map/collect, reduce/inject, find/detect, find_all/select и т.д.), создатели Ruby избегали жесткого решения, передав этот выбор пользователю. Ruby также имеет много похожих имен для методов, которые несколько отличаются (например ==, ===, eql?, equal?). Я использую Ruby ежедневно в течении почти 10 лет, и я до сих пор не могу вспомнить разницу между eql? и equal?, не посмотрев подсказку. Мне бы хотелось, чтобы эти методы имели более описательные имена.
Другим примером являются тонкие различия между alias и alias_method, или private и protected. Думаю, Symbol можно заменить на frozen String и удалить из пользовательской части языка. Есть несколько других языковых «особенностей», которые я хотел бы исключить из Ruby, если бы мог, например глобальные переменные, пришедшие из Perl. На мой взгляд, это не связано с остальной частью языка. Есть также много плохо поддерживающегося и устаревшего кода в стандартной библиотеке Ruby. Хотелось бы чтобы стандартные библиотеки обновлялись, для использования новых возможностей языка, например keyword arguments. Если подобные функции не используются для основных/стандартных библиотек, их нужно исключить, так как они создают ненужные сложности. Было бы замечательно, если бы в Ruby была возможность находить некоторые виды ошибок на начальной стадии (во время запуска).
И еще не помешал бы динамический компилятор, способный генерировать бинарные файлы. И лучшую производительность выполнения. Я начал использовать вместо Ruby Crystal, которому и будет посвящен мой доклад, так как в нем есть большинство функций, которые мне нравятся в Ruby и отсутствуют те, которые мне не нравятся.
- Самое ужасное архитектурное решение/ код, которое ты когда-либо встречал...
Первое, что приходит на ум, это то, как Rails выполняет проверку уникальности. Для тех, кто не знает, он просто делает SELECT, чтобы увидеть, существует ли поле, прежде чем делать INSERT. Первая проблема заключается в том, что эти две операции не делаются в транзакции, так что возникают условия для появления гонок сигналов, которые позволяют вставлять неуникальные записи. Тем не менее, транзакции, в принципе, не очень хорошее решение, так как они вызывают слишком много блокировок таблиц. Лучшим решением является просто создание уникального индекса на этом поле в базе данных, что гарантирует правильность и оптимальную производительность. Подход Rails к валидации уникальности – это слабая защита, которая дает пользователю ложное ощущение безопасности.
- Самая впечатляющая новость о Ruby в 2014 году...
Это новость о создании RubyBench.org Аланом Го Сян Таном (Alan Guo Xiang Tan). Это невероятно ценный (и давно ожидаемый) вклад в сообщество Ruby. Этот проект будет гарантировать рост производительности Ruby, и с каждым релизом он будет становится все быстрее. Если бы RubyBench существовал раньше, он мог бы предотвратить потерю производительности в Ruby 1.9.
- Жизнь после Ruby – это...
Crystal! Чтобы узнать больше – приходите на мой доклад :) (В конце мая Эрик будет выступать на Ruby-конференции в Киеве с темой доклада о Crystal).
- Над чем работаешь сейчас?
В данным момент я работаю над переписыванием Twitter CLI под Crystal а также обучаю студентов на Rails Girls Summer of Code
- В процессе разработки я обязательно использую...
Особое место в моей среде разработки занимает Fish shell, который я рекомендую всем, кто проводит много времени в командной строке. Попробуйте пользоваться им неделю, и вы уже не сможете без него обходиться!
- Твои любимые Ruby блоги/сообщества/сайты
Ruby-Talk, Ruby Weekly, и This week in Rails рассылки. Блоги Aaron Patterson, Aman Gupta, Sam Saffron, James Edward Gray II, Thomas Reynolds, Sandi Metz, Tom Stuart, Avdi Grimm, Jessica Kerr и Pat Shaughnessy. Также я читаю много блогов, не имеющих отношения к Ruby.
- Я рекомендую книгу...
“Ruby Under a Microscope”, Pat Shaughnessy, поскольку это захватывающий взгляд на то, как работает Ruby изнутри. Я также рекомендовал бы Practical Object-Oriented Design in Ruby, Sandi Metz каждому Ruby-программисту, который еще ее не читал. Для лучшего понимания IT, как области знаний, я рекомендую Understanding Computation, Tom Stuart. А для совсем начинающих, я рекомендую Learn to Program by Chris Pine. Ну и наконец, книга Why's (Poignant) Guide to Ruby, занимает особое место в моем сердце.
- Твой личный лайфхак:
Добавь такую строку в свой crontab: */30 9-17 * * 1-5 say «Stand up and walk around».