Upgrade to Pro — share decks privately, control downloads, hide ads and more …

I've Made a Huge Mistake - GoRuCo 2018

I've Made a Huge Mistake - GoRuCo 2018

How we got services wrong and what we learned along the way

Kelly Sutton

June 16, 2018
Tweet

More Decks by Kelly Sutton

Other Decks in Programming

Transcript

  1. I’ve Made a Huge Mistake How we got services wrong

    and what we learned along the way Kelly Sutton — GoRuCo 2018
  2. Applications vs. Services Have their own process Might have their

    own process Have their own database Probably share a database
  3. Applications vs. Services Have their own process Might have their

    own process Have their own database Probably share a database Scale independently Scales with the host app
  4. Applications vs. Services Have their own process Might have their

    own process Have their own database Probably share a database Scale independently Scales with the host app Might be an another language Share the same language
  5. 1 # app/models/company.rb 2 class Company < ApplicationRecord 3 has_many

    :employees 4 end 5 6 # app/models/employee.rb 7 class Employee < ApplicationRecord 8 belongs_to :company 9 end
  6. 1 # app/models/company.rb 2 class Company < ApplicationRecord 3 has_many

    :employees 4 end 5 6 # app/models/employee.rb 7 class Employee < ApplicationRecord 8 belongs_to :company 9 end Do we need this?
  7. 1 # app/services/company_signed_up.rb 2 class CompanySignedUp 3 def self.call(company) 4

    CompanyMailer.welcome_email(company) 5 StatsTracker.company_signed_up(company) 6 end 7 end
  8. 1 # app/services/company_signed_up.rb 2 class CompanySignedUp 3 def self.call(company) 4

    user_first_name = company.admin_first_name 5 email = company.admin_email 6 7 CompanyMailer.welcome_email(email, user_first_name) 8 StatsTracker.company_signed_up(company.id) 9 end 10 end
  9. 1 # app/models/company.rb 2 class Company < ApplicationRecord 3 after_create

    :send_update_email, if: :has_email? 4 5 private 6 7 def send_update_email 8 CompanyMailer.welcome_email(self) 9 end 10 end
  10. 1 # app/services/create_company.rb 2 class CreateCompany 3 def self.call(company_params) 4

    company = Company.create!(company_params) 5 6 CompanyMailer.welcome_email(company) 7 end 8 end
  11. –Kent Beck “Make the hard change easy (this may be

    hard), then make the easy change.”
  12. References • Bernhardt, Gary. “Boundaries.” 2012. • Bernhardt, Gary. “Functional

    Core, Imperative Shell.” 2012. • Evans, Eric. “Domain-Driven Design: Tackling Complexity in the Heart of Software.” 2003. • Fowler, Martin, et al. “Refactoring: Improving the Design of Existing Code.” 1999. • Feathers, Michael. “Working Effectively with Legacy Code.” 2004. • Hickey, Rich. “Simple Made Easy.” 2011. • Scott, James C. “Seeing Like a State.” 1999. • Searls, Justin. “My Preferred Method of TDD.” 2017 • Spolsky, Joel. “Things You Should Never Do, Part I.” 2006.
  13. Special Thanks • Noa Elad • Matan Zruya • Sihui

    Huang • Natalie Wong • Karlo Hoa • Amelie Meyer-Robinson • Quentin Balin