Slide 1

Slide 1 text

Ten Years of Rails Upgrades Jordan Raine @jnraine

Slide 2

Slide 2 text

Jordan Raine (@jnraine) I’m a Rails developer at Clio From Vancouver, BC ! " # Ten Years of Rails Upgrades

Slide 3

Slide 3 text

Why is it still so tough?

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Tiny Co. / Big Inc.

Slide 6

Slide 6 text

$ Tiny Co.

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

% Big Inc.

Slide 9

Slide 9 text

$ Tiny Co. % Big Inc. 1. Gems Few Many 2. Code changes Few Many 3. Test Few failures Won’t even run 4. Deploy Easy Terrifying

Slide 10

Slide 10 text

$ Tiny Co. % Big Inc. 1. Gems ✅ ✅ 2. Code changes ✅ ✅ 3. Test ✅ ✅ 4. Deploy ✅ ✅

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

2010 2011 2012 2013 2014 2015 2009 2008 2007 2016 2017 2018 2.0 3.0 3.1 3.2 2.1 2.2 2.3 2.0 2.1 2.2 2.3 3.0 3.1 3.2 4.0 4.2 4.1 5.0 5.1 5.2 4.0 4.1 4.2

Slide 13

Slide 13 text

2010 2011 2012 2013 2014 2015 2009 2008 2007 2016 2017 2018 2.0 3.0 3.1 3.2 2.1 2.2 2.3 2.0 2.1 2.2 2.3 3.0 3.1 3.2 4.0 4.2 4.1 5.0 5.1 5.2 4.0 4.1 4.2

Slide 14

Slide 14 text

'•More developers
 •More features
 •More customers
 •More revenue

Slide 15

Slide 15 text

2010 2011 2012 2013 2014 2015 2009 2008 2007 2016 2017 2018 2.0 3.0 3.1 3.2 2.1 2.2 2.3 2.0 2.1 2.2 2.3 3.0 3.1 3.2 4.0 4.2 4.1 5.0 5.1 5.2 4.0 4.1 4.2

Slide 16

Slide 16 text

Problems Tiny Co. / Big Inc.

Slide 17

Slide 17 text

Gemfile

Slide 18

Slide 18 text

Dependencies aren’t free.

Slide 19

Slide 19 text

Find the dependencies – and eliminate them. https://www.joelonsoftware.com/2001/10/14/in-defense-of-not-invented-here-syndrome/ “ ” Joel On Software

Slide 20

Slide 20 text

The Excel team’s ruggedly independent mentality also meant that they always shipped on time [and] their code was of uniformly high quality. Joel On Software https://www.joelonsoftware.com/2001/10/14/in-defense-of-not-invented-here-syndrome/ “ ”

Slide 21

Slide 21 text

gem "quickbooks-ruby" gem "oauth"

Slide 22

Slide 22 text

gem "quickbooks-ruby" gem "oauth"

Slide 23

Slide 23 text

gem "quickbooks-ruby" gem "oauth", "0.x.x"

Slide 24

Slide 24 text

a) Don’t upgrade any gems b) Upgrade both gems c) Fork a gem and downgrade

Slide 25

Slide 25 text

a) Don’t upgrade any gems b) Upgrade both gems c) Fork a gem and downgrade

Slide 26

Slide 26 text

gem "quickbooks-ruby", github: "/quickbooks-ruby", ref gem "oauth", "0.x.x"

Slide 27

Slide 27 text

Rigid dependencies are difficult to maintain.

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

class MyController < ApplicationController - before_filter :require_login + before_action :require_login end

Slide 32

Slide 32 text

class MyModel < ApplicationRecord attr_accessible :name, :description # ... end

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

protected_attributes 4,947,703 activerecord >= 5.0 15,350,275

Slide 35

Slide 35 text

We like protected_attributes 1/3 as much as activerecord.

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

2010 2011 2012 2013 2014 2015 2009 2008 2007 2016 2017 2018 2.0 3.0 3.1 3.2 2.1 2.2 2.3 2.0 2.1 2.2 2.3 3.0 3.1 3.2 4.0 4.2 4.1 5.0 5.1 5.2 4.0 4.1 4.2 ( ( (

Slide 38

Slide 38 text

Tiny Co. / Big Inc. Problems Close the gaps

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

) Keep the Gemfile healthy * Outlaw deprecations + Canary Rails

Slide 41

Slide 41 text

) Keep the Gemfile healthy * Outlaw deprecations + Canary Rails

Slide 42

Slide 42 text

gem "multi_json", "1.9.1" gem "mime-types", "~> 2.0"

Slide 43

Slide 43 text

gem "multi_json", "1.9.1" gem "mime-types", "~> 2.0" Drop those version constraints!

Slide 44

Slide 44 text

gem "multi_json" gem "mime-types" Drop those version constraints! ,

Slide 45

Slide 45 text

gem "quickbooks-ruby", github: "/quickbooks-ruby",

Slide 46

Slide 46 text

gem "quickbooks-ruby", github: "/quickbooks-ruby", Kill your forks!

Slide 47

Slide 47 text

gem "quickbooks-ruby" , Kill your forks!

Slide 48

Slide 48 text

Culture of updating gems $ bundle update multi_json mime-types

Slide 49

Slide 49 text

$ bundle outdated

Slide 50

Slide 50 text

$ bundle outdated Outdated gems included in the bundle: * actionmailer (newest 5.2.0, installed 5.1.4, requested ~> 5.1) in groups "default" * actionpack (newest 5.2.0, installed 5.1.4, requested ~> 5.1) in groups "default" * actionview (newest 5.2.0, installed 5.1.4, requested ~> 5.1) in groups "default" * active_model_serializers (newest 0.10.7, installed 0.8.3, requested ~> 0.8.3) in groups "default" * activejob (newest 5.2.0, installed 5.1.4) * activemodel (newest 5.2.0, installed 5.1.4, requested ~> 5.1) in groups "default" * activerecord (newest 5.2.0, installed 5.1.4, requested ~> 5.1) in groups "default"

Slide 51

Slide 51 text

actionmailer (newest 5.2.0, installed 5.1.4, requested ~> 5.1) in groups "default" name newest version installed version requested version group

Slide 52

Slide 52 text

$ bundle outdated bundle outdated Fetching gem metadata from https://rubygems.org/............... Fetching gem metadata from https://rubygems.org/.. Resolving dependencies........... Outdated gems included in the bundle: * actionmailer (newest 5.2.0, installed 5.1.4, requested ~> 5.1) in groups "default" * actionpack (newest 5.2.0, installed 5.1.4, requested ~> 5.1) in groups "default" * actionview (newest 5.2.0, installed 5.1.4, requested ~> 5.1) in groups "default" * active_model_serializers (newest 0.10.7, installed 0.8.3, requested ~> 0.8.3) in groups "default" * activejob (newest 5.2.0, installed 5.1.4) * activemodel (newest 5.2.0, installed 5.1.4, requested ~> 5.1) in groups "default" * activerecord (newest 5.2.0, installed 5.1.4, requested ~> 5.1) in groups "default" * activesupport (newest 5.2.0, installed 5.1.4, requested ~> 5.1) in groups "default" * addressable (newest 2.5.2, installed 2.5.1) * arel (newest 9.0.0, installed 8.0.0) * aws-partitions (newest 1.80.0, installed 1.24.0) * aws-sdk-core (newest 3.19.0, installed 3.6.0) * aws-sdk-kms (newest 1.5.0, installed 1.2.0) * aws-sdk-s3 (newest 1.9.0, installed 1.4.0) in groups "default" * barber (newest 0.12.0, installed 0.11.2) in groups "default" * better_errors (newest 2.4.0, installed 2.1.1) in groups "development" * bootsnap (newest 1.3.0, installed 1.1.8) in groups "default" * bullet (newest 5.7.5, installed 5.5.1) in groups "development" * byebug (newest 10.0.2, installed 9.0.6) in groups "test, development" * chunky_png (newest 1.3.10, installed 1.3.8) * crass (newest 1.0.4, installed 1.0.3) * ember-data-source (newest 3.0.2, installed 2.2.1) * ember-handlebars-template (newest 0.8.0, installed 0.7.5, requested = 0.7.5) in groups "default" * ember-rails (newest 0.21.0, installed 0.18.5, requested = 0.18.5) in groups "default" * ember-source (newest 2.18.2, installed 2.13.3, requested = 2.13.3) in groups "default" * erubi (newest 1.7.1, installed 1.6.1) * excon (newest 0.62.0, installed 0.56.0) in groups "default" * exifr (newest 1.3.3, installed 1.2.5) * fabrication (newest 2.20.1, installed 2.9.8, requested = 2.9.8) in groups "test, development" * faraday (newest 0.14.0, installed 0.11.0) * ffi (newest 1.9.23, installed 1.9.18) * globalid (newest 0.4.1, installed 0.4.0) * hashdiff (newest 0.3.7, installed 0.3.4) * hashie (newest 3.5.7, installed 3.5.5) * highline (newest 1.7.10, installed 1.7.8) in groups "default" * http_accept_language (newest 2.1.1, installed 2.0.5, requested ~> 2.0.5) in groups "default" * i18n (newest 1.0.0, installed 0.8.6) * in_threads (newest 1.5.0, installed 1.4.0) * jmespath (newest 1.4.0, installed 1.3.1) * jwt (newest 2.1.0, installed 1.5.6) * kgio (newest 2.11.2, installed 2.11.1) * lograge (newest 0.10.0, installed 0.7.1) in groups "default" * logstash-logger (newest 0.26.1, installed 0.25.1) in groups "default" * method_source (newest 0.9.0, installed 0.8.2) * mini_mime (newest 1.0.0, installed 0.1.3) in groups "default" * minitest (newest 5.11.3, installed 5.10.3) in groups "test" * mocha (newest 1.5.0, installed 1.2.1) in groups "test, development" * mock_redis (newest 0.18.0, installed 0.17.3) in groups "test, development" * oauth (newest 0.5.4, installed 0.5.1) * oauth2 (newest 1.4.0, installed 1.3.1) * oj (newest 3.5.1, installed 3.4.0) in groups "default" * omniauth (newest 1.8.1, installed 1.6.1) in groups "default" * omniauth-facebook (newest 5.0.0, installed 4.0.0) in groups "default" * omniauth-google-oauth2 (newest 0.5.3, installed 0.3.1) in groups "default" * omniauth-instagram (newest 1.3.0, installed 1.0.2) in groups "default" * omniauth-oauth2 (newest 1.5.0, installed 1.4.0) in groups "default" * omniauth-twitter (newest 1.4.0, installed 1.3.0) in groups "default" * parser (newest 2.5.1.0, installed 2.5.0.3) * pg (newest 1.0.0, installed 0.21.0, requested ~> 0.21.0) in groups "default" * progress (newest 3.4.0, installed 3.3.1) * pry (newest 0.11.3, installed 0.10.4) * pry-rails (newest 0.3.6, installed 0.3.4) in groups "default" * public_suffix (newest 3.0.2, installed 2.0.5) * puma (newest 3.11.4, installed 3.9.1) in groups "default" * r2 (newest 0.2.7, installed 0.2.6, requested ~> 0.2.5) in groups "default" * rack-openid (newest 1.4.2, installed 1.3.1) * rack-test (newest 1.0.0, installed 0.7.0) * railties (newest 5.2.0, installed 5.1.4, requested ~> 5.1) in groups "default" * rake (newest 12.3.1, installed 12.3.0) in groups "default" * rb-fsevent (newest 0.10.3, installed 0.9.8) in groups "test, development" * rb-inotify (newest 0.9.10, installed 0.9.8, requested ~> 0.9) in groups "test, development" * redis (newest 4.0.1, installed 3.3.5) in groups "default" * redis-namespace (newest 1.6.0, installed 1.5.3) in groups "default" * request_store (newest 1.4.1, installed 1.3.2) * rinku (newest 2.0.4, installed 2.0.2) in groups "default" * rotp (newest 3.3.1, installed 3.3.0) in groups "default" * rspec (newest 3.7.0, installed 3.6.0) in groups "test, development" * rspec-core (newest 3.7.1, installed 3.6.0) * rspec-expectations (newest 3.7.0, installed 3.6.0) * rspec-mocks (newest 3.7.0, installed 3.6.0) * rspec-rails (newest 3.7.2, installed 3.6.1) in groups "test, development" * rspec-support (newest 3.7.1, installed 3.6.0) * rubocop (newest 0.54.0, installed 0.53.0) in groups "test, development" * ruby-prof (newest 0.17.0, installed 0.16.2) in groups "development" * sass (newest 3.5.6, installed 3.4.24) * sassc (newest 1.11.4, installed 1.11.2) in groups "default" * seed-fu (newest 2.3.9, installed 2.3.7) in groups "default" * shoulda-matchers (newest 3.1.2, installed 2.8.0) * sidekiq (newest 5.1.3, installed 5.0.5) in groups "default" * slop (newest 4.6.2, installed 3.6.0) * sprockets-rails (newest 3.2.1, installed 3.2.0) in groups "default" * stackprof (newest 0.2.11, installed 0.2.10) in groups "default" * thor (newest 0.20.0, installed 0.19.4) in groups "default" * tilt (newest 2.0.8, installed 2.0.7) in groups "default" * tzinfo (newest 1.2.5, installed 1.2.3) * uglifier (newest 4.1.9, installed 3.2.0) in groups "assets" * unf_ext (newest 0.0.7.5, installed 0.0.7.4) * uniform_notifier (newest 1.11.0, installed 1.10.0) where do I start? • what is most important? • which are the oldest? • what is unmaintained?

Slide 53

Slide 53 text

$ bin/bundle_report

Slide 54

Slide 54 text

$ bin/bundle_report outdated

Slide 55

Slide 55 text

$ bin/bundle_report outdated | head -n 5 rack-openid 1.3.1: released about 7 years ago (latest version, 1.4.2, released about 4 years ago) method_source 0.8.2: released over 4 years ago (latest version, 0.9.0, released 7 months ago) fabrication 2.9.8: released about 4 years ago (latest version, 2.20.1, released 3 months ago) slop 3.6.0: released over 3 years ago (latest version, 4.6.2, released about 1 month ago) active_model_serializers 0.8.3: released over 3 years ago (latest version, 0.10.7, released 5 months ago)

Slide 56

Slide 56 text

rack-openid 1.3.1: released about 7 years ago (latest version, 1.4.2, released about 4 years ago) name installed version release date newest version release date

Slide 57

Slide 57 text

$ bin/bundle_report compatibility --rails-version=5.2.0

Slide 58

Slide 58 text

$ bin/bundle_report compatibility --rails-version=5.2.0

Slide 59

Slide 59 text

$ bin/bundle_report compatibility --rails-version 5.2.0 => Incompatible with Rails 5.2.0 (with new versions that are compatible): These gems will need to be upgraded before upgrading to Rails 5.2.0. lograge 0.7.1 - upgrade to 0.10.0 => Incompatible with Rails 5.2.0 (with no new compatible versions): These gems will need to be removed or replaced before upgrading to Rails 5.2.0. jquery-rails 4.3.1 - new version, 4.3.1, is not compatible with Rails 5.2.0 2 gems incompatible with Rails 5.2.0

Slide 60

Slide 60 text

$ bin/bundle_report compatibility --rails-version 5.2.0 => Incompatible with Rails 5.2.0 (with new versions that are compatible): These gems will need to be upgraded before upgrading to Rails 5.2.0. lograge 0.7.1 - upgrade to 0.10.0 => Incompatible with Rails 5.2.0 (with no new compatible versions): These gems will need to be removed or replaced before upgrading to Rails 5.2.0. jquery-rails 4.3.1 - new version, 4.3.1, is not compatible with Rails 5.2.0 2 gems incompatible with Rails 5.2.0

Slide 61

Slide 61 text

$ bin/bundle_report compatibility --rails-version 5.2.0 => Incompatible with Rails 5.2.0 (with new versions that are compatible): These gems will need to be upgraded before upgrading to Rails 5.2.0. lograge 0.7.1 - upgrade to 0.10.0 => Incompatible with Rails 5.2.0 (with no new compatible versions): These gems will need to be removed or replaced before upgrading to Rails 5.2.0. jquery-rails 4.3.1 - new version, 4.3.1, is not compatible with Rails 5.2.0 2 gems incompatible with Rails 5.2.0

Slide 62

Slide 62 text

$ bin/bundle_report compatibility --rails-version 5.2.0 => Incompatible with Rails 5.2.0 (with new versions that are compatible): These gems will need to be upgraded before upgrading to Rails 5.2.0. lograge 0.7.1 - upgrade to 0.10.0 => Incompatible with Rails 5.2.0 (with no new compatible versions): These gems will need to be removed or replaced before upgrading to Rails 5.2.0. jquery-rails 4.3.1 - new version, 4.3.1, is not compatible with Rails 5.2.0 2 gems incompatible with Rails 5.2.0

Slide 63

Slide 63 text

) Keep the Gemfile healthy * Outlaw deprecations + Canary Rails

Slide 64

Slide 64 text

) Keep the Gemfile healthy * Outlaw deprecations + Canary Rails

Slide 65

Slide 65 text

User.find(current_user) # DEPRECATION WARNING: You are passing an instance # of ActiveRecord::Base to `find`. Please pass the # id of the object by calling `.id`. (called from at (

Slide 66

Slide 66 text

ActiveSupport::Deprecation.behavior = :raise

Slide 67

Slide 67 text

if ENV["DEPRECATION_TRACKER"] DeprecationTracker.track_rspec( config, shitlist_path: "deprecation_warning.shitlist.json", mode: ENV["DEPRECATION_TRACKER"] ) end

Slide 68

Slide 68 text

$ DEPRECATION_TRACKER=save rspec deprecations.shitlist.json $ DEPRECATION_TRACKER=compare rspec -

Slide 69

Slide 69 text

No content

Slide 70

Slide 70 text

No content

Slide 71

Slide 71 text

{ "./spec/controllers/post_controller_spec.rb": [ "DEPRECATION WARNING: env is deprecated and will be remov ], "./spec/controllers/session_controller_spec.rb": [ "DEPRECATION WARNING: `xhr` and `xml_http_request` are de "DEPRECATION WARNING: env is deprecated and will be remov ], "./spec/controllers/accounts_controller_spec.rb": [ "DEPRECATION WARNING: Using positional arguments in funct ] }

Slide 72

Slide 72 text

{ "./spec/controllers/post_controller_spec.rb": [ "DEPRECATION WARNING: env is deprecated and will be remov ], "./spec/controllers/session_controller_spec.rb": [ "DEPRECATION WARNING: `xhr` and `xml_http_request` are de "DEPRECATION WARNING: env is deprecated and will be remov ], "./spec/controllers/accounts_controller_spec.rb": [ "DEPRECATION WARNING: Using positional arguments in funct ] }

Slide 73

Slide 73 text

{ "./spec/controllers/post_controller_spec.rb": [ "DEPRECATION WARNING: env is deprecated and will be remov ], "./spec/controllers/session_controller_spec.rb": [ "DEPRECATION WARNING: `xhr` and `xml_http_request` are de "DEPRECATION WARNING: env is deprecated and will be remov ], "./spec/controllers/accounts_controller_spec.rb": [ "DEPRECATION WARNING: Using positional arguments in funct ] }

Slide 74

Slide 74 text

$ bin/deprecations info

Slide 75

Slide 75 text

$ bin/deprecations info Ten most common deprecation warnings: Occurrences: 608 DEPRECATION WARNING: Using positional arguments in functional tests has been deprecated, in favor of keyword arguments, and will be removed in Rails 5.1. Deprecated style: get :show, { id: 1 }, nil, { notice: "This is a flash message" } New keyword style: get :show, params: { id: 1 }, flash: { notice: "This is a flash message" }, session: nil # Can safely be omitted. (called from block (3 levels) in at spec/foo.rb:67) ---------- Occurrences: 553 DEPRECATION WARNING: Passing an argument to force an association to reload is now deprecated and will be removed in Rails 5.1. Please call `reload_active_al_subscription` instead. (called from reload_subscriptions at app/models/foo.rb:270) # ...

Slide 76

Slide 76 text

$ bin/deprecations run

Slide 77

Slide 77 text

$ bin/deprecations run --pattern "ActiveRecord::Base"

Slide 78

Slide 78 text

$ bin/deprecations run --tracker-mode save

Slide 79

Slide 79 text

ActiveSupport::Deprecation.behavior = :raise

Slide 80

Slide 80 text

) Keep the Gemfile healthy * Outlaw deprecations + Canary Rails

Slide 81

Slide 81 text

) Keep the Gemfile healthy * Outlaw deprecations + Dual-boot Rails next

Slide 82

Slide 82 text

“current” Rails “next” Rails 4.2 5.0 5.0 5.1 5.2 master

Slide 83

Slide 83 text

$ bin/next rails s $ bin/next rspec $ DEPRECATION_TRACKER=save bin/next rspec

Slide 84

Slide 84 text

$ bin/next rails s $ bin/next rspec $ DEPRECATION_TRACKER=save bin/next rspec

Slide 85

Slide 85 text

$ bin/next rails s $ bin/next rspec $ DEPRECATION_TRACKER=save bin/next rspec

Slide 86

Slide 86 text

-old_deprecated_thing +new_thing_that_works_in_both_versions

Slide 87

Slide 87 text

+if Rails.application.next? + do_new_thing +else + do_old_thing +end -do_old_thing

Slide 88

Slide 88 text

Gemfile

Slide 89

Slide 89 text

Gemfile Gemfile.next

Slide 90

Slide 90 text

# top of Gemfile def next? File.basename(__FILE__) == "Gemfile.next" end # later if next? gem "rails", "5.2.0" else gem "rails", "5.1.6" end

Slide 91

Slide 91 text

# top of Gemfile def next? File.basename(__FILE__) == "Gemfile.next" end # later if next? gem "rails", "5.2.0" else gem "rails", "5.1.6" end

Slide 92

Slide 92 text

# top of Gemfile def next? File.basename(__FILE__) == "Gemfile.next" end # later if next? gem "rails", "5.2.0" else gem "rails", "5.1.6" end

Slide 93

Slide 93 text

Gemfile.next Gemfile.next.lock Gemfile.lock Gemfile

Slide 94

Slide 94 text

$ bin/next --init

Slide 95

Slide 95 text

#!/bin/bash export BUNDLE_GEMFILE=Gemfile.next export BUNDLE_CACHE_PATH=vendor/cache.next if [[ "${@}" =~ ^bundle ]]; then $@ else bundle exec $@ fi

Slide 96

Slide 96 text

#!/bin/bash export BUNDLE_GEMFILE=Gemfile.next export BUNDLE_CACHE_PATH=vendor/cache.next if [[ "${@}" =~ ^bundle ]]; then $@ else bundle exec $@ fi

Slide 97

Slide 97 text

#!/bin/bash export BUNDLE_GEMFILE=Gemfile.next export BUNDLE_CACHE_PATH=vendor/cache.next if [[ "${@}" =~ ^bundle ]]; then $@ else bundle exec $@ fi

Slide 98

Slide 98 text

$ bundle install # install gems $ rails s # run rails $ rspec # run tests

Slide 99

Slide 99 text

$ bin/next bundle install # install gems $ bin/next rails s # run rails $ bin/next rspec # run tests

Slide 100

Slide 100 text

No content

Slide 101

Slide 101 text

) Keep the Gemfile healthy * Outlaw deprecations + Dual-boot Rails next

Slide 102

Slide 102 text

Make it easy to do the right thing.

Slide 103

Slide 103 text

# Try it out $ gem install ten_years_rails_conf_2018 # Or, read the code $ open https://github.com/clio/ten_years_rails_conf_2018

Slide 104

Slide 104 text

Tiny Co. / Big Inc. Problems Close the gaps Summary

Slide 105

Slide 105 text

$ Tiny Co. % Big Inc. 1. Gems Few Many 2. Code changes Few Many 3. Test Few failures Won’t even run 4. Deploy Easy Terrifying

Slide 106

Slide 106 text

$ Tiny Co. % Big Inc. 1. Gems Few Many Few 2. Code changes Few Many 3. Test Few failures Won’t even run 4. Deploy Easy Terrifying

Slide 107

Slide 107 text

$ Tiny Co. % Big Inc. 1. Gems Few Many Few 2. Code changes Few Many Few 3. Test Few failures Won’t even run 4. Deploy Easy Terrifying

Slide 108

Slide 108 text

$ Tiny Co. % Big Inc. 1. Gems Few Many Few 2. Code changes Few Many Few 3. Test Few failures Won’t even run Few failures 4. Deploy Easy Terrifying

Slide 109

Slide 109 text

$ Tiny Co. % Big Inc. 1. Gems Few Many Few 2. Code changes Few Many Few 3. Test Few failures Won’t even run Few failures 4. Deploy Easy Less terrifying*

Slide 110

Slide 110 text

Blur the lines

Slide 111

Slide 111 text

Prepare for Rails upgrade Make codebase better

Slide 112

Slide 112 text

No content

Slide 113

Slide 113 text

Removed 33 gems Updated 27 gems Reduced to zero deprecations Fixed 2,950 of 3,300 failing tests

Slide 114

Slide 114 text

Created an upgrade process where everyone can contribute

Slide 115

Slide 115 text

Hundreds of tiny changes.

Slide 116

Slide 116 text

Hundreds of tiny changes. Don’t wait.

Slide 117

Slide 117 text

Thanks Jordan Raine @jnraine