Rewriting code and culture - RubyConf Aus

Rewriting code and culture - RubyConf Aus

This is the story of a company that survived a much needed transformation of its product and codebase, but most importantly, of its culture. There's no real prescription for being agile. It's about the journey a team takes to discover how to best work together and deliver great products.

In this presentation, I'll share a candid view of a team trying to overcome a slow product development process. How we refactored our way out of badly coupled code, moved to continuous deployment, and greatly improved our approach to product and software development.

From Ruby Conf Australia, Melbourne 2015.

4d1993f91aa4f2efccf08051205e3bad?s=128

Sabrina Leandro

February 06, 2015
Tweet

Transcript

  1. 4.
  2. 5.
  3. 9.
  4. 10.
  5. 11.
  6. 12.

    That is, where the impact of the changes will be

    seen sooner. Start where it hurts the most
  7. 17.

    Build a new, simplified web app based on core iPhone

    features so that we can improve the immediate velocity roadblocks and move onto building quickly on top of this core foundation. One main goal
  8. 18.

    • Define project scope • Have a clear deadline •

    Weekly checkpoints • No new features Know when it ends
  9. 19.

    Deleting your favourite features is hard! But when you know

    your product, you can be ruthless. Deleting is faster than rewriting
  10. 24.

    Release cycle is more than software development. Give developers the

    right context, and trust them to make the right decisions. Learn to iterate
  11. 27.

    controllers/ events_controller.rb models/ event.rb page_models/ event.rb event/ brief.rb models/ event.rb

    services/ event_listings.rb views/ events/ _brief.html.erb show.html.erb assets/ stylesheets/ event.css components/ event-brief.css
  12. 28.

    controllers/ events_controller.rb models/ event.rb page_models/ event.rb event/ brief.rb models/ event.rb

    services/ event_listings.rb views/ events/ _brief.html.erb show.html.erb assets/ stylesheets/ event.css components/ event-brief.css class EventsController < ApplicationController def show @page = PageModels::Event.new(event) end end
  13. 29.

    class PageModels::Event < PageModels::Base def brief PageModels::Event::Brief.new(@event) end end controllers/

    events_controller.rb models/ event.rb page_models/ event.rb event/ brief.rb models/ event.rb services/ event_listings.rb views/ events/ _brief.html.erb show.html.erb assets/ stylesheets/ event.css components/ event-brief.css
  14. 30.

    class PageModels::Event::Brief def event_title @event.festival? ? @event.festival_name : @event.headliners.first.name end

    end controllers/ events_controller.rb models/ event.rb page_models/ event.rb event/ brief.rb models/ event.rb services/ event_listings.rb views/ events/ _brief.html.erb show.html.erb assets/ stylesheets/ event.css components/ event-brief.css
  15. 32.

    show.html.erb <div class=“primary”> <%= component(:brief, @page.brief)%> </div> _brief.html.erb <div class=“component

    brief”> <h1><%= brief.event_title %></h1> </div> controllers/ events_controller.rb models/ event.rb page_models/ event.rb event/ brief.rb models/ event.rb services/ event_listings.rb views/ events/ _brief.html.erb show.html.erb assets/ stylesheets/ event.css components/ event-brief.css
  16. 33.

    event.css @import ‘components/event-brief.css’; event-brief.css .brief h1 { color: #f80046; }

    controllers/ events_controller.rb models/ event.rb page_models/ event.rb event/ brief.rb models/ event.rb services/ event_listings.rb views/ events/ _brief.html.erb show.html.erb assets/ stylesheets/ event.css components/ event-brief.css
  17. 37.

    Delete or rewrite tests. Cost of making a small change

    must be small. Fast release cycle = fast build
  18. 38.

    Delete or rewrite tests. Cost of making a small change

    must be small. Monitor errors in production. Fast release cycle = fast build
  19. 40.

    class EventsController < ApplicationController def show @event = Event.find(params[:id]) …

    end end class Event < ActiveRecord::Base end controllers/ events_controller.rb models/ event.rb page_models/ event.rb event/ brief.rb models/ event.rb services/ event_listings.rb views/ events/ _brief.html.erb show.html.erb assets/ stylesheets/ event.css components/ event-brief.css
  20. 41.

    controllers/ events_controller.rb models/ event.rb page_models/ event.rb event/ brief.rb models/ event.rb

    services/ event_listings.rb views/ events/ _brief.html.erb show.html.erb assets/ stylesheets/ event.css components/ event-brief.css class EventsController < ApplicationController def show event = Models::Event.from_id(params[:id]) @page = PageModels::Event.new(event) end end
  21. 42.

    class Models::Event def self.from_id(id) data = Services.event_listings.event_from_id(id) new(data) end def

    initialize(data) @id = data[‘id’] @date = Date.parse(data[‘date’]) # etc. end end controllers/ events_controller.rb models/ event.rb page_models/ event.rb event/ brief.rb models/ event.rb services/ event_listings.rb views/ events/ _brief.html.erb show.html.erb assets/ stylesheets/ event.css components/ event-brief.css
  22. 43.

    class Services::EventListings def event_from_id(id) ar_event = ::Event.find(id) ar_event.to_hash end end

    class Event < ActiveRecord::Base def to_hash { 'id' => id, 'date' => date.to_s, # etc. } end end controllers/ events_controller.rb models/ event.rb page_models/ event.rb event/ brief.rb models/ event.rb services/ event_listings.rb views/ events/ _brief.html.erb show.html.erb assets/ stylesheets/ event.css components/ event-brief.css
  23. 44.

    class Services::EventListings def event_from_id(id) response = http.get(“/events/#{id}") JSON.parse(response.body) end end

    controllers/ events_controller.rb models/ event.rb page_models/ event.rb event/ brief.rb models/ event.rb services/ event_listings.rb views/ events/ _brief.html.erb show.html.erb assets/ stylesheets/ event.css components/ event-brief.css
  24. 46.
  25. 47.
  26. 48.
  27. 56.

    • Shared language • Small releases • Iterate design and

    product development Culture in practice
  28. 57.

    Close collaboration from the start • Developers involved in the

    idea development stage • Kick off meeting to define what we’re building and why Culture in practice
  29. 58.

    Developer and designer pairing • Browser becomes the art board

    • Wider team gets involved with the way the product looks and feels Culture in practice
  30. 60.

    Learn to collaborate and work in a multidisciplinary team. They

    make for happier teams, better products, and can even improve your code’s quality. Rewriting culture
  31. 61.

    Links The client-side of SOA http://devblog.songkick.com/2012/08/30/the-client-side-of-soa/ Path to SOA http://devblog.songkick.com/2012/09/06/the-path-to-soa/

    Our object-based Rails frontend http://devblog.songkick.com/2012/09/14/our-object-based-rails- frontend/ :) https://www.youtube.com/watch?v=3noDS5uoK8o