Привет! Сегодня публикуем интервью с Ником Сатерером. Ник создатель Trailblazer, автор нескольких гемов и новых слоев абстракции в Rails, Rails contributor. Накануне RailsClub 2017, где Ник будет делать доклад, Дмитрий Матвеев пообщался с ним о его работе и взглядах на развитие Rails.

image

Где ты сейчас находишься?

Сейчас я в Германии, работаю и живу в Ганновере, а до этого 4 года жил в Австралии. Я никогда не планировал оставаться в Австралии, но пребывание там многое изменило в моей жизни: я подсел на серфинг! Круто делать перерыв на серф и снова садиться программировать. Но я вернулся в Европу, потому что тут происходит много всего важного, так что в данные момент для меня интереснее жить здесь.

Как ты решил стать программистом, почему, где и когда?

Когда мне было 8 лет, я очень любил играть в игры на ПК, хотел создавать их сам — это была моя мечта. Отец купил мне несколько книг, и я начал «играть» в программирование. Мой отец — тоже программист, можно сказать, теперь это наша семейная традиция.

Первый язык, который я начал изучать — С++. Так что пишу код без перерыва с восьми лет :)

А что на счет образования в компьютерных науках?

Я стал зарабатывать программированием в старших классах, безо всякого университета. Тогда я работал в интернет кафе официантом, а мой босс хотел сделать базу данных для учета яхт и попросил моей помощи. Так я пришел в PHP.

Почему перешел на Ruby on Rails?

Я программировал на PHP и Perl по всем правилам. Мне нравилось ООП, и я старался создавать небольшие объекты с простым и понятным интерфейсом. Однажды мой коллега показал мне Ruby on Rails. Я был заинтригован, но сразу увидел некоторые архитектурные недостатки. Мой друг не смог мне ясно объяснить, где именно я должен писать код, и почему. Но я начал баловаться с Rails 1.1 и с Active Record, и мне понравился сам язык. Я стал использовать Ruby для своего личного проекта, но в работе по прежнему был PHP.

Ты и сейчас работаешь в найме?

Нет, у меня уже несколько лет своя компания. Мы развиваем Trailblazer и консультируем компании, которые Trailblazer используют в своих коммерческих проектах, помогаем им решать архитектурные проблемы.

Какой совет ты можешь дать тем, кто хочет совместить работу за деньги и open source?

Работай на open source несколько часов в день и не говори менеджеру :)

Шучу. Важно работать как за деньги, так и помогать решать проблемы всего сообщества, поддерживать его. Ну а если твой open source продукт будут использовать другие компании, ты будешь востребован как консультант. Таким образом работа в OSS может стать финансово оправданной.

Почему твой доклад на RailsClub 2017 называется «Ruby is dead»?

У меня есть официальное разрешение от Матца называть Ruby мертвым языком :) Конечно, это провокация. Не новость, что я всегда критикую Ruby и Rails. Мне нравится Ruby, но я всегда сравниваю его с другими языками. В докладе я покажу примеры из Java и PHP, расскажу как они развивались и как сильно улучшились за последнее десятилетие. Но Ruby остался таким же, как 20 лет назад, и это должно быть предупреждением для нас. Я хочу остаться в Ruby, но он должен развиваться! Многие люди переходят на другой стек, потому что хотят работать с языком, который решает их проблемы. Моя проблема — как создать стабильное и надежное коммерческое приложение. Да, в Ruby процесс добавления новых фич, таких как, например, поддержка типизации, идет очень сложно, во многом из за поддержки обратной совместимости. Но ведь другим языкам удалось это сделать!

Еще я расскажу в докладе о mruby. Это очень интересная тема, над ней сейчас как раз Матц работает. Я уже говорил, что главная проблема Ruby, на мой взгляд, в том, что сложно добиться стабильного поведения от приложения. Практически невозможно!!! Я всегда получаю «method not found», это основная ошибка в продакшн. Я считаю планы Матца по поводу добавления в Ruby поддержки определения типов (“duck inference” typing) очень многообещающими. Типизация — это действительно полезно.

Другая проблема в рельсах — это плохая структурированность кода.

Rails позволяет создавать простые приложения за два часа, но для большого приложения это просто не подходит. Ты счастлив первые две недели, но потом начинаешь злиться. Rails отлично подходит для демонстрации — за один день новичок пишет работающее приложение, и он очень доволен. Но проблема в том, что если вы хотите писать на Rails стабильные вещи, вы не уйдете далеко. Хочется писать и просто, и надежно одновременно, но с помощью Rails это будет затруднительно сделать.

Основная проблема в ООП — слишком много функциональности в одном объекте. Я не думаю, что у объекта должно быть 300 методов. Вот в функциональных языках приходится писать отдельную функцию для всего, и это, на мой взгляд, лучше. Тогда не приходится заботиться о внутреннем состоянии, а именно из-за него часто возникают проблемы в ООП.

Почему ты решил посетить Россию, что ожидаешь увидеть?

Это моя первая поездка сюда. На Rails Сlub будет много классных людей и много крутых спикеров, а еще я наслушался рассказов о русских афтепати… :)

Еще я хочу посмотреть Санкт-Петербург, так что планирую пробыть в России примерно полторы недели и надеюсь получить гигантскую порцию вдохновения!

Расскажи побольше о Trailblazer?

Забавный факт — в России самая большая база пользователей Trailblazer! Это набор абстракций, которые могут быть использованы во фреймворках, таких как Rails или Hanami, и добавляют туда новые концепции, такие как from object и policies, и в итоге связывают все вместе, вашу бизнес логику и рабочие процессы.

Сейчас я работаю в проекте для полиции, в нем 60% кода — это набор условий if-else, которые управляют правами доступа. В Trailblazer 2.1 будет добавлена поддержка BPMN и workflow диаграмм. Это позволит вынести условный код из кода приложения. Я покажу примеры на конференции!

Какой у тебя прогноз насчет будущего Ruby/Ruby on Rails?

Каверзный вопрос! На мой взгляд, Rails умирает, и я не очень оптимистичен по поводу этого фреймворка. Никаких новых абстракций, никаких инноваций за последние 10 лет! Есть энтузиасты, которые пытаются делать что-то новое, но основная команда разработки фреймворка в этом не особо заинтересованы. Rails застряли.

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

Однако, для меня есть хорошая новость про Rails — чем больше людей ими пользуется, тем больше людей сталкивается с их недостатками, и поэтому они начинают использовать Trailblazer :)

Есть ли у тебя какой-то набор гемов для нового проекта?

Конечно! В Trailblazer, мы используем стек, который мы назвали Tamarama. Он состоит из:

— Sinatra для роутинга
— Trailblazer для бизнес логики
— Sequel или Active Record для баз данных
— Cells для слоя представления

Что ты можешь сказать про то, что Ruby медленный?

Я знаю, что есть много более быстрых языков. Но я думаю, что в этом нет никакой проблемы. Вы можете сделать ваше приложение на Ruby быстрее, например, с помощью Tamarama или Trailblazer. И да, Ruby медленный, но Rails делает его еще медленнее! Лично у меня никогда не было проблем с производительностью приложений на Ruby, потому что я не использую Rails :)
К тому же, Ruby постоянно улучшается в этом направлении, и последние версии языка стали намного быстрее.

Посоветуй блоги или веб-сайты, которые тебе нравятся?

Я не читаю никаких блогов или новостных сайтов на регулярной основе, живу, как в прошлом веке :) Возможно, я пропущу что-то ценное, но зато избавлюсь от кучи ненужной информации. Вот мои советы:

— Не доверяйте тому, что говорят другие люди, доверяйте себе.
— Делайте код простым.
— Не пытайтесь изобрести колесо.

А книги по программированию?

Я прочитал только две книги по программированию — это Рефакторинг Мартина Фаулера и TCP / IP Illustrated, Vol. 1. Это было больше 10 лет назад. Из TCP/IP Illustrated, Vol. 1. я почерпнул много базовых знаний о программировании, о разделении на слои и инкапсуляции. Рекомендую. А Мартин Фаулер — это вообще мой Иисус в мире разработки ПО, у меня на стене даже его фотография висит.

Как ты умудряешься не терять интерес к программированию?

У меня отличный баланс между жизнью и работой :) Много интересов, кроме программирования — еда, готовка, спорт. А главное, я работаю над тем, что действительно люблю. Работа в Open Source и консультирование — это то, что мне очень по душе. Так что сейчас я как никогда далек от выгорания.

Задать свои вопросы лично (и на легендарном русском афтепати :) можно будет 23 сентября на конференции RailsClub. Программа и регистрация на Railsclub.ru

А прочитать оригинал на английском — на hype.codes

image Традиционное спасибо партнерам конференции! Компания VoltMobi, наш бронзовый партнер, делает отличные мобильные приложения с бэкендом на Ruby и Rails. А Александр Щеглов и Станислав Тютин расскажут о своем опыте применения Trailblazer. Так что мы на конкретном примере увидим, как можно прийти на legacy-проект и не начать плодить такой же устаревший код, а начать делать хорошо, не сильно теряя во времени и не устраивая глобальный рефакторинг.

Всех ждем! RailsClub.ru

Комментарии (15)


  1. Sys_Admin
    29.08.2017 23:17
    +7

    Рельсы умирают… Никогда такого не было и вот опять!


    1. therhino
      29.08.2017 23:24
      +8

      Рельсы регулярно умирают, как минимум каждую конференцию


      1. Fuelen
        30.08.2017 13:55

        Рельсы были рождены, чтобы умирать.


  1. therhino
    29.08.2017 23:17

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


  1. Envek
    29.08.2017 23:29
    +6

    Про Trailblazer: начинание у него очень хорошее — этакий фреймворк над фреймворком, со своим Convention over Configuration и оговорённой структурой проекта. Т.е. человек, делавший один проект на Rails+Trailblazer будет знать где что искать и куда складывать новый код в любом другом проекте на Rails+Trailblazer. Потому что всем нужны сервисные объекты, форм-объекты, и прочая и прочая и в разных проектах все делают по разному, да даже в одном проекте кто в лес, кто по дрова. В результате переход между проектами затруднён — код приходится натурально распутывать. Первый Trb был хорош тем, что был прост, как доска, хотя и немного негибким. Второй Trailblazer сделали гибким, но вот тут-то подкрался п****ц — он перестал быть интуитивным и в документации к нему ты начинаешь проводить больше времени, чем в редакторе (и ещё больше времени в их чатике).


    Operation, кстати, очень хороши для сложной «многоходовой» бизнес-логики — когда надо сформировать или распарсить замороченную Excel'ку или сделать хитрое проксирование в другой API (которое раскладывается на 2N + 3 запроса к нему) и т. п. Потому что тут начинает хорошо проявлять себя вот этот DSL операций и заморочки с прокидыванием состояния между шагами.


    Это, кстати, классная идея у них: вытаскивание с помощью keyword arguments метода-шага операции нужных тебе данных из переданных в операцию параметров, зависимостей и внутреннего состояния. Получаются очень явно видны зависимости между шагами и где какие данные используются. Операции — добро.


    А вот прочие компоненты Trb надо использовать с осторожностью. На вид они вкусные, но шаг влево или шаг вправо, задача чуть посложнее — и можно просто весь день убить на чтение доков, исходников и чатика Trb. А внутри там местами очень нечитаемый и магичный код. С тем же Representable я хлебнул как-то горя.


    Резюме: если вы погрязли в Rails Way, модели трещат по швам от бизнес логики, любой вызов Model.first.save вызывает взлёт и крах парочки империй (и вы до сих пор не используете сервисные объекты, форм-объекты и прочее) — возьмите Trailblazer, хуже не будет. Но возьмите сначала только операции, потом, когда с ними освоитесь, прикрутите Reform. И, в принципе, на этом можно и остановиться.


    1. printercu
      30.08.2017 11:11

      А чем reform лучше active_model?


      И про операции не совсем понятно. Я допускаю, что в некоторых ситуациях удобно. При этом для простых экшенов вполне достаточно ActiveRecord, а для тех что по-сложнее можно использовать ActiveModel или PORO. Операции выглядят как декларативный способ написания метода call:


      class Song::Create < Trailblazer::Operation
        extend Contract::DSL
      
        contract do
          property :title
          validates :title, presence: true
        end
      
        step     Model( Song, :new )
        step     :assign_current_user!
        step     Contract::Build()
        step     Contract::Validate( )
        failure  :log_error!
        step     Contract::Persist(  )
      end
      
      # вместо простого:
      class Song::Create
        def call(attrs:, user:)
          @model = Song.new(attrs)
          @model.current_user = user
          @model.save!
        rescue => e
          log_error!(e)
          raise
        end
      end

      При этом наверняка реализован (или нужно реализовывать) свой способ расширения, ведь super/yield так просто не получится использовать.


      1. Envek
        30.08.2017 20:13

        Reform хорош при двух вариантах:


        1. Когда данные одной формы распихиваются в несколько сущностей в БД (или даже в разные БД)
        2. Их нужно хитро преобразовывать или инициализировать. Гораздо нагляднее видеть в контракте, что есть хитрые популяторы/препопуляторы у некоторых полей.

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


      1. amerov
        30.08.2017 23:09

        А чем reform лучше active_model?

        Умеет работать с Nested forms и виртуальными атрибутами.


        1. printercu
          31.08.2017 10:38

          У ActiveModel все атрибуты виртуальные (если виртуальные — те, которые не хранятся в базе). Через delegate можно настроить проброс атрибутов из AR.


          Nested forms — это fields_for и подобные? Тоже все работает.


          С i18n непонятно. Нашел reform-rails, выглядит редко поддерживаемым, с такими вот комитами https://github.com/trailblazer/reform-rails/commit/5bd93ed1ee825f107f248c9c67e6bb81f0c75e00. В самом reform такого функционала нет.


          1. Envek
            31.08.2017 11:22
            +1

            Если все проблемы, решаемые Reform'ом, можно решить ActiveModel'ями, то пишите статьи и книги, выступайте на конференциях, и тогда это тоже начнут использовать. Успех современного OpenSource-проекта большей частью зависит от пиара и маркетинга, чем от кода. Ник давно и плотно продвигает именно свой Trailblazer, так же как и чуваки из ROM, DRY и Hanami пилят и пиарят, как могут, свои проекты, которые большей частью призваны заменить рельсу (и не все понимают, зачем её на что-то менять, если в их конкретном случае она работает хорошо и не путается под ногами), просто потому, что Rails — это омакасэ, а выбор ингридиентов и способ готовки шеф-повара DHH устраивает не всех.


            1. printercu
              31.08.2017 13:55
              +1

              Спасибо! Возможно, стоит попробовать выступить с похожей темой. Статьи в гугле находятся и про form object, и про nested attrs, но получается следует периодически дописывать новые, чтобы держать технологию на слуху.


              и пиарят, как могут

              Без грязи бы пиарили, вроде "рельсы мертвы", было бы лучше. Кроме этого, многие не понимают, что этот пиар — часть бизнеса, и Ник просто зарабатывает так деньги, трэилбрэйзер — это его продукт. Он пишет статьи и говорит на конференциях, чтобы зарабатывать деньги (продавать больше консультаций), в отличие от других разработчиков, у которых цель — делиться опытом или подобная. Поэтому он может тратить на это больше времени, чем другие Что он и делает.


              Как и других сферах, продукт может быть и не очень хорошим, но маркетинг вытаскивает.


  1. KeyJoo
    31.08.2017 09:12

    Такого рода статьи новичков как я, всегда загоняют в тупик. А стоит ли прокачивать свои скиллы в стеке Ruby/Rails? Или стоит приглядеться к чему-то другому?


    1. lightman
      31.08.2017 11:42

      хотите чтоб один раз выучить технологию и работать на ней до самой пенсии — ява;
      чтобы вас любили работодатели (и коллеги, за что им самим не приходится погружаться в это) — node.js;
      хотите удовольствия и выбора огромного количества библиотек — python;
      максимального удобства (intellisense как в коде, так и во вьюшках) — asp.net


      1. KeyJoo
        31.08.2017 13:10

        Очень хорошее распутье возможные альтернативы, спасибо за ответ!


    1. nico
      31.08.2017 18:25
      +1

      Если тебе нравится руби и по душе rails way конечно стоит. В мире IT любят хоронить технологии, обращать на это внимание себе дороже. Rails не доминирующий фреймворк сегодня, но с рынка он никуда не ушёл и не уйдёт в обозримом будущем.
      Для примера посмотри на VB.net, вот уж кто должен быть мертвее мертвого, а в штатах на нем проектов очень много до сих пор много