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
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
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!