Slide 1

Slide 1 text

Sanity on Rails Michael Kohl Ruby X Elixir Conf Taiwan 2018

Slide 2

Slide 2 text

• Michael Kohl (@citizen428) • CTO @ Lockstep Labs • Based in Bangkok, Thailand • Ruby developer since 200[3|4] • Really into FP (Clojure, Elixir etc) • BUT: I still ❤ Ruby Ruby X Elixir Conf Taiwan 2018 locksteplabs.com whoami

Slide 3

Slide 3 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Outline • Recurring problems • Communication • Dependencies • Lack of architecture • Easy code, not simple • Good news: easily avoidable

Slide 4

Slide 4 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com BUT…

Slide 5

Slide 5 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com The other problem Sometimes we forget how good we have it!

Slide 6

Slide 6 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Things to remember #1 It’s Ruby! On Rails.

Slide 7

Slide 7 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Things to remember #2 It’s Ruby. On Rails!

Slide 8

Slide 8 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Things to remember #3 We are Ruby on Rails!

Slide 9

Slide 9 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Agency requirements • Clients pay for results, not tech • Handoff project • Easy to onboard new developers • Usable across projects • Fits team & work flows

Slide 10

Slide 10 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Communication “You didn’t specify the resolution” Leonardo Da Vinci, Oil on poplar panel, 1503

Slide 11

Slide 11 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Communication “First, solve the problem. Then, write the code.” – John Johnson “Any fool can write code that a computer can understand. Good programmers write code that humans can understand.” – Martin Fowler

Slide 12

Slide 12 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Dependencies “Updating your bundle” Roy Lichtenstein, Lithograph on paper, 1963

Slide 13

Slide 13 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Dependencies + Help bootstrap the app faster + Avoid reinventing the wheel + Get peer reviewed - Easily get outdated - Memory footprint & startup times - Have more dependencies

Slide 14

Slide 14 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Dependencies • Be selective about dependencies • Do reinvent certain wheels • Look for actively maintained gems • Prefer developers with vested interest • Use gems for common tasks

Slide 15

Slide 15 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Reinventing the wheel Original wheel Potentially better wheel

Slide 16

Slide 16 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Dependencies

Slide 17

Slide 17 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Lack of architecture “Programmers at work maintaining a Ruby on Rails application" Eero Järnefelt, Oil on canvas, 1893

Slide 18

Slide 18 text

"A basic conceptional structure (as of ideas)" – Merriam Webster "A basic structure underlying a system, concept, or text." – Oxford English dictionary Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Frameworks

Slide 19

Slide 19 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Frameworks

Slide 20

Slide 20 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Frameworks - Models • Wrapper around datastore • ActiveRecord configuration • Associations • Validations • Finders / scopes • Simple accessors / mutation methods

Slide 21

Slide 21 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Frameworks - Models • Extract POROs • Use namespacing • Various extraction patterns • Service objects • Form objects • Query objects • many more

Slide 22

Slide 22 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Frameworks - Models ! tree app/models/cv app/models/cv "## file_mover.rb "## importer.rb "## parser.rb "## repository.rb "## suggestion_handler.rb $## viewer.rb

Slide 23

Slide 23 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Frameworks - Models

Slide 24

Slide 24 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Frameworks - Models

Slide 25

Slide 25 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Frameworks - Models

Slide 26

Slide 26 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Frameworks - Controllers • Abstracting HTTP communication • Authentication • Authorization • Sessions / cookies • Param validation / transformation • Redirection / rendering

Slide 27

Slide 27 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Frameworks - Controllers

Slide 28

Slide 28 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Frameworks - Controllers - Hanami

Slide 29

Slide 29 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Frameworks - Views • Response generation • Should be mostly logic free • Rails “views” are templates • Helpers become dumping grounds

Slide 30

Slide 30 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Frameworks - Views

Slide 31

Slide 31 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Frameworks - Views

Slide 32

Slide 32 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Frameworks - Views

Slide 33

Slide 33 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Implicit code “Reading your own code after 3 months” Edvard Munch, Oil, tempera, pastel and crayon on cardboard, 1893

Slide 34

Slide 34 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Implicit code • “Convention over configuration” • “Magic”: • AR configuration • Instance variables in views • Implicit code: • AR callbacks • before_action/after_action

Slide 35

Slide 35 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Implicit code • Hard for newcomers to understand • Hard to follow code flow • Easy, not simple • Doesn’t apply in all cases

Slide 36

Slide 36 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Simple vs. easy

Slide 37

Slide 37 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Implicit code • Be more explicit! • Reading is more important than writing! • POROs to encapsulate processes • Don’t try to be too clever!

Slide 38

Slide 38 text

• Communicate! • Manage your dependencies! • Stay change positive! • Optimize for reading! • Make your own rules! • Have fun! Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Summary

Slide 39

Slide 39 text

• How DHH Organizes His Rails Controllers
 http://jeromedalbert.com/how-dhh-organizes-his-rails- controllers/ • 7 Patterns to Refactor Fat ActiveRecord Models
 http://blog.codeclimate.com/blog/2012/10/17/7-ways- to-decompose-fat-activerecord-models/ • Objects on Rails
 http://objectsonrails.com • Exploding Rails
 https://speakerdeck.com/radar/exploding-rails Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Resources

Slide 40

Slide 40 text

Ruby X Elixir Conf Taiwan 2018 locksteplabs.com Thank you!