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

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.

Sabrina Leandro

February 06, 2015
Tweet

More Decks by Sabrina Leandro

Other Decks in Technology

Transcript

  1. That is, where the impact of the changes will be

    seen sooner. Start where it hurts the most
  2. 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
  3. • Define project scope • Have a clear deadline •

    Weekly checkpoints • No new features Know when it ends
  4. Deleting your favourite features is hard! But when you know

    your product, you can be ruthless. Deleting is faster than rewriting
  5. Release cycle is more than software development. Give developers the

    right context, and trust them to make the right decisions. Learn to iterate
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. Delete or rewrite tests. Cost of making a small change

    must be small. Fast release cycle = fast build
  13. Delete or rewrite tests. Cost of making a small change

    must be small. Monitor errors in production. Fast release cycle = fast build
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. • Shared language • Small releases • Iterate design and

    product development Culture in practice
  20. 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
  21. Developer and designer pairing • Browser becomes the art board

    • Wider team gets involved with the way the product looks and feels Culture in practice
  22. 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
  23. 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