Slide 1

Slide 1 text

WHAT'S UP, RUBY? by Vladimir Dementyev

Slide 2

Slide 2 text

palkan_tula palkan Почему про Ruby? 2 github.com/palkan evilmartians.com

Slide 3

Slide 3 text

palkan_tula palkan Место Ruby в мире веб-разработки 3 jetbrains.com/lp/devecosystem-2021/

Slide 4

Slide 4 text

palkan_tula palkan Место Ruby в мире веб-разработки 4 redmonk.com/sogrady/2021/08/05/language-rankings-6-21/

Slide 5

Slide 5 text

palkan_tula palkan Под капотом — Ruby 5

Slide 6

Slide 6 text

palkan_tula palkan 6 Язык для чтения

Slide 7

Slide 7 text

palkan_tula palkan 7 No bothersome semicolons to type mechanically at the end of each line No troublesome type declarations to keep in sync (especially in separate files) No unnecessary words just to keep the compiler happy No error-prone framework code

Slide 8

Slide 8 text

palkan_tula palkan 8 Ruby is designed to make programmers happy It allows you to concentrate on the creative side of programming, with less stress Matz (Yukihiro Matsumoto)

Slide 9

Slide 9 text

palkan_tula palkan Родословная 9 rigaux.org/language-study/diagram.html

Slide 10

Slide 10 text

palkan_tula palkan Доска почёта 10 2008 RSpec 2005 2007 2011 2006

Slide 11

Slide 11 text

palkan_tula palkan Доска почёта 11 2008 RSpec 2005 2007 2011 2006 2005

Slide 12

Slide 12 text

palkan_tula palkan Йеси-паси 12

Slide 13

Slide 13 text

palkan_tula palkan Атака Rails клонов 13

Slide 14

Slide 14 text

palkan_tula palkan Ruby заражает 14

Slide 15

Slide 15 text

palkan_tula palkan Так как там Ruby? 15 isrubydead.com

Slide 16

Slide 16 text

palkan_tula palkan Ruby 2021 16 def beach(*temperature) case temperature in :celcius | :c, (20 ..45) :favorable in :kelvin | :k, (293 ..318) :scientifically_favorable in :fahrenheit | :f, (68 ..113) :favorable_in_us else :avoid_beach end end

Slide 17

Slide 17 text

palkan_tula palkan Ruby 2021 17 RBS (Type Signatures for Ruby)

Slide 18

Slide 18 text

palkan_tula palkan Ruby 2021 18 server = Ractor.new do puts "Server sends: ping" Ractor.yield 'ping' received = Ractor.receive puts "Server received: #{received}" end client = Ractor.new(server) do |srv| received = srv.take puts "Client received: #{received}" puts "Client sends: pong" srv.send 'pong' end [client, server].each(&:take) Ractor — Ruby actor

Slide 19

Slide 19 text

palkan_tula palkan Ruby — вампир 🤔 19

Slide 20

Slide 20 text

palkan_tula palkan Ruby Type Signatures 20 I hate type annotations Аннотации типов — это костыль Если мы добавим типы в язык, то их сложно будет убрать из него в будущем, когда вывод типов будет полностью автоматическим

Slide 21

Slide 21 text

palkan_tula palkan TypeProf 21 github.com/ruby/typeprof

Slide 22

Slide 22 text

evl.ms/chronicles/climbing-steep-hills-or-adopting-ruby-types

Slide 23

Slide 23 text

palkan_tula palkan Пессимисты 23 sorbet.org

Slide 24

Slide 24 text

palkan_tula palkan 24

Slide 25

Slide 25 text

palkan_tula palkan Ractor 25 Настоящий параллелизм, или прощай GIL brandur.org/nanoglyphs/018-ractors

Slide 26

Slide 26 text

palkan_tula palkan Ruby-трёшка 26

Slide 27

Slide 27 text

palkan_tula palkan Ractor 27 Не любит делиться — сложно ему будет в нашем мире Ractor.shareable?(1) # => true Ractor.shareable?('foo') # => false Ractor.shareable?('foo'.freeze) # => true

Slide 28

Slide 28 text

palkan_tula palkan Ruby-трёшка+ 28

Slide 29

Slide 29 text

palkan_tula palkan Fiber 29 Кооперативная многозадачность

Slide 30

Slide 30 text

palkan_tula palkan Fiber 30 От полностью ручного управления к автоматическому Ruby 2 Ruby 3

Slide 31

Slide 31 text

palkan_tula palkan Fiber Scheduler 31 Интерфейс, не реализация

Slide 32

Slide 32 text

palkan_tula palkan Fiber Scheduler 32 Интерфейс, не реализация Without changing existing code 🙀

Slide 33

Slide 33 text

palkan_tula palkan Приоритеты 33

Slide 34

Slide 34 text

palkan_tula palkan Совместимость 34

Slide 35

Slide 35 text

palkan_tula palkan Совместимость 35 В обе стороны 🙃 evilmartians.com/blog/ruby-next-make-all-rubies-quack-alike

Slide 36

Slide 36 text

palkan_tula palkan От Ruby к Rails 36

Slide 37

Slide 37 text

palkan_tula palkan Just-in-Time 37 rubykaigi.org/2021-takeout/presentations/maximecb.html

Slide 38

Slide 38 text

palkan_tula palkan Rails 7 38

Slide 39

Slide 39 text

palkan_tula palkan Rails 7 frontend 39

Slide 40

Slide 40 text

palkan_tula palkan Кризис веб-разработки 40

Slide 41

Slide 41 text

palkan_tula palkan Rails 2021 41 Full-stack возвращается noti.st/palkan/v01SxZ/frontend-bez-frontenda

Slide 42

Slide 42 text

palkan_tula palkan Full-stack Rails 42 HTML-over-the-Wire

Slide 43

Slide 43 text

palkan_tula palkan NEW MAGIC 43 hotwired.dev

Slide 44

Slide 44 text

palkan_tula palkan Hotwire 44 Turbo Drive (ex-Turbolinks) и Frames — SPA «для бедных» Turbo Streams — обновление HTML через WebSockets Stimulus — «живая вода» для HTML

Slide 45

Slide 45 text

palkan_tula palkan Stimulus 45

Slide 46

Slide 46 text

palkan_tula palkan Hotwire 46 evilmartians.com/blog/hotwire-reactive-rails-with-no-javascript

Slide 47

Slide 47 text

palkan_tula palkan Stimulus Reflex 47 docs.stimulusreflex.com Hotwire для взрослых

Slide 48

Slide 48 text

palkan_tula palkan Sockpuppet 48 github.com/jonathan-s/django-sockpuppet

Slide 49

Slide 49 text

palkan_tula palkan View Component 49 HTML компоненты на Ruby viewcomponent.org

Slide 50

Slide 50 text

palkan_tula palkan View Component 50 # app/components/button/component.rb class Button ::Component < ViewComponent ::Base attr_reader :label, :icon def initialize(label:, icon: nil) @label = label @icon = icon end alias icon? icon end # app/components/button/component.html.erb <% if icon? %> <%= icon %> <% end %> <% == label %>

Slide 51

Slide 51 text

palkan_tula palkan Монолит или..? 51

Slide 52

Slide 52 text

palkan_tula palkan Модульный монолит 52

Slide 53

Slide 53 text

palkan_tula palkan Rails Engines 53

Slide 54

Slide 54 text

palkan_tula palkan Shopify 54 shopify.engineering/shopify-monolith

Slide 55

Slide 55 text

palkan_tula palkan Hanami 55 Не Рельсами едиными hanamirb.org

Slide 56

Slide 56 text

palkan_tula palkan Подготовка к запуску 56 Вы всё ещё используете Capistrano?..

Slide 57

Slide 57 text

palkan_tula palkan Kuby 57 getkuby.io

Slide 58

Slide 58 text

palkan_tula palkan Kuby 58 Kuby.define("anycable-rails-demo") do environment(:production) do app_creds = read_creds(:production) docker do credentials do username app_creds[:do_token] password app_creds[:do_token] end image_url "registry.digitalocean.com/anycable/anycable-rails-demo" end kubernetes do add_plugin :rails_app do hostname "kuby-demo.anycable.io" end add_plugin :anycable_rpc add_plugin :anycable_go provider :digitalocean do access_token app_creds[:do_token] cluster_id app_creds[:do_cluster_id] end end end end На выходе сотни строк кода для Docker и Kubernetes kuby setup && kuby build && kuby push && kuby deploy

Slide 59

Slide 59 text

palkan_tula palkan Пост-Ruby 59

Slide 60

Slide 60 text

СПАСИБО! @palkan @palkan_tula evilmartians.com @evilmartians