SlideShare una empresa de Scribd logo
1 de 181
Descargar para leer sin conexión
Ruby on Rails
Tuesday, December 15, 2009
AkitaOnRails.com




Tuesday, December 15, 2009
www.slideshare.net/akitaonrails

                             fabio.akita@locaweb.com.br




Tuesday, December 15, 2009
Tuesday, December 15, 2009
Ruby on Rails             2.3

                         Ruby   1.8

        “Novo” Ruby             1.9
Tuesday, December 15, 2009
Ruby on Rails             2.3

                         Ruby   1.8

        “Novo” Ruby             1.9
Tuesday, December 15, 2009
Ruby on Rails             2.3

                         Ruby   1.8

        “Novo” Ruby             1.9
Tuesday, December 15, 2009
“Matz”




                             1993
Tuesday, December 15, 2009
Tuesday, December 15, 2009
“Prag Dave”




                             2001
Tuesday, December 15, 2009
Tuesday, December 15, 2009
“DHH”


                              2004
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Charles Nutter



                                2006
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
“Tornar as coisas
                simples fáceis e as
                coisas complexas
                    possíveis”
                             Filoso a Ruby

Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Orientação a
                              Objetos?


Tuesday, December 15, 2009
Tuesday, December 15, 2009
Alan Kay   Dan Ingalls
Tuesday, December 15, 2009
Alan Kay
Tuesday, December 15, 2009
Alan Kay
Tuesday, December 15, 2009
Eu inventei o termo
                                            ‘orientação a
                                          objetos’, e posso
                                         lhes dizer que não
                                        estava pensando em
                                                 C++


                             Alan Kay
Tuesday, December 15, 2009
Meta-
                        programação


Tuesday, December 15, 2009
Meta-
                        apresentação


Tuesday, December 15, 2009
Tuesday, December 15, 2009
Ruby on Rails


Tuesday, December 15, 2009
Código que gera Código

          Convention over Con guration

                             Don’t Repeat Yourself

                        Extreme Programming
Tuesday, December 15, 2009
Código que gera Código

          Convention over Con guration

                             Don’t Repeat Yourself

                        Extreme Programming
Tuesday, December 15, 2009
Código que gera Código

          Convention over Con guration

                             Don’t Repeat Yourself

                        Extreme Programming
Tuesday, December 15, 2009
Código que gera Código

          Convention over Con guration

                             Don’t Repeat Yourself

                        Extreme Programming
Tuesday, December 15, 2009
Restful Resources

                    Unicode, Time Zone, i18n

        Segurança (XSS, CSRF, Injection)

              Rack Support (Middlewares)
Tuesday, December 15, 2009
Restful Resources

                    Unicode, Time Zone, i18n

        Segurança (XSS, CSRF, Injection)

              Rack Support (Middlewares)
Tuesday, December 15, 2009
Restful Resources

                    Unicode, Time Zone, i18n

        Segurança (XSS, CSRF, Injection)

              Rack Support (Middlewares)
Tuesday, December 15, 2009
Restful Resources

                    Unicode, Time Zone, i18n

        Segurança (XSS, CSRF, Injection)

              Rack Support (Middlewares)
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Model
  class Product < ActiveRecord::Base
    after_create :set_initial_inventory

      has_many :variants, :dependent => :destroy
      has_many :images, :as => :viewable, :order => :position,
        :dependent => :destroy
      has_many :properties, :through => :product_properties
      belongs_to :tax_category

      validates_presence_of :name
      validates_presence_of :master_price
      validates_presence_of :description

    make_permalink :with => :name, :field => :permalink
  end




Tuesday, December 15, 2009
Model
  class Product < ActiveRecord::Base
    after_create :set_initial_inventory

      has_many :variants, :dependent => :destroy
      has_many :images, :as => :viewable, :order => :position,
        :dependent => :destroy
      has_many :properties, :through => :product_properties
      belongs_to :tax_category

      validates_presence_of :name
      validates_presence_of :master_price
      validates_presence_of :description

    make_permalink :with => :name, :field => :permalink
  end




Tuesday, December 15, 2009
Model
  class Product < ActiveRecord::Base
    after_create :set_initial_inventory

      has_many :variants, :dependent => :destroy
      has_many :images, :as => :viewable, :order => :position,
        :dependent => :destroy
      has_many :properties, :through => :product_properties
      belongs_to :tax_category

      validates_presence_of :name
      validates_presence_of :master_price
      validates_presence_of :description

    make_permalink :with => :name, :field => :permalink
  end




Tuesday, December 15, 2009
Model
  class Product < ActiveRecord::Base
    after_create :set_initial_inventory

      has_many :variants, :dependent => :destroy
      has_many :images, :as => :viewable, :order => :position,
        :dependent => :destroy
      has_many :properties, :through => :product_properties
      belongs_to :tax_category

      validates_presence_of :name
      validates_presence_of :master_price
      validates_presence_of :description

    make_permalink :with => :name, :field => :permalink
  end




Tuesday, December 15, 2009
Model
  class Product < ActiveRecord::Base
    after_create :set_initial_inventory

      has_many :variants, :dependent => :destroy
      has_many :images, :as => :viewable, :order => :position,
        :dependent => :destroy
      has_many :properties, :through => :product_properties
      belongs_to :tax_category

      validates_presence_of :name
      validates_presence_of :master_price
      validates_presence_of :description

    make_permalink :with => :name, :field => :permalink
  end




Tuesday, December 15, 2009
Model
  class Product < ActiveRecord::Base
    after_create :set_initial_inventory

      has_many :variants, :dependent => :destroy
      has_many :images, :as => :viewable, :order => :position,
        :dependent => :destroy
      has_many :properties, :through => :product_properties
      belongs_to :tax_category

      validates_presence_of :name
      validates_presence_of :master_price
      validates_presence_of :description

    make_permalink :with => :name, :field => :permalink
  end




Tuesday, December 15, 2009
Model
  class Product < ActiveRecord::Base
    after_create :set_initial_inventory

      has_many :variants, :dependent => :destroy
      has_many :images, :as => :viewable, :order => :position,
        :dependent => :destroy
      has_many :properties, :through => :product_properties
      belongs_to :tax_category

      validates_presence_of :name
      validates_presence_of :master_price
      validates_presence_of :description

    make_permalink :with => :name, :field => :permalink
  end




Tuesday, December 15, 2009
Views ERB
  <div id="product-listing">
    <%= breadcrumbs(@taxon) %>
    <br/>
    <%= render :partial => "shared/products.html.erb",
    :locals => {:products => @products, :taxon => @taxon } %>
  </div>

  <% content_for :sidebar do %>
    <td id="shop-by-col" valign="top">
      <%= render :partial => "shared/taxonomies" %>
    </td>
  <% end %>

  <%= render :partial => 'shared/paginate',
    :locals => {:collection => @products, :options => {}}
    unless @products.empty? %>



Tuesday, December 15, 2009
Views ERB
  <div id="product-listing">
    <%= breadcrumbs(@taxon) %>
    <br/>
    <%= render :partial => "shared/products.html.erb",
    :locals => {:products => @products, :taxon => @taxon } %>
  </div>

  <% content_for :sidebar do %>
    <td id="shop-by-col" valign="top">
      <%= render :partial => "shared/taxonomies" %>
    </td>
  <% end %>

  <%= render :partial => 'shared/paginate',
    :locals => {:collection => @products, :options => {}}
    unless @products.empty? %>



Tuesday, December 15, 2009
Views ERB
  <div id="product-listing">
    <%= breadcrumbs(@taxon) %>
    <br/>
    <%= render :partial => "shared/products.html.erb",
    :locals => {:products => @products, :taxon => @taxon } %>
  </div>

  <% content_for :sidebar do %>
    <td id="shop-by-col" valign="top">
      <%= render :partial => "shared/taxonomies" %>
    </td>
  <% end %>

  <%= render :partial => 'shared/paginate',
    :locals => {:collection => @products, :options => {}}
    unless @products.empty? %>



Tuesday, December 15, 2009
Rotas RESTFul


  ActionController::Routing::Routes.draw do |map|

      map.resources :products
      map.resources :addresses
      map.resources :orders,     :has_many => [:line_items]

    map.namespace :admin do |admin|
      admin.resources :users
      admin.resources :products
    end
  end




Tuesday, December 15, 2009
Rotas RESTFul


  ActionController::Routing::Routes.draw do |map|

      map.resources :products
      map.resources :addresses
      map.resources :orders,     :has_many => [:line_items]

    map.namespace :admin do |admin|
      admin.resources :users
      admin.resources :products
    end
  end




Tuesday, December 15, 2009
Rotas RESTFul


  ActionController::Routing::Routes.draw do |map|

      map.resources :products
      map.resources :addresses
      map.resources :orders,     :has_many => [:line_items]

    map.namespace :admin do |admin|
      admin.resources :users
      admin.resources :products
    end
  end




Tuesday, December 15, 2009
Rotas RESTFul


  ActionController::Routing::Routes.draw do |map|

      map.resources :products
      map.resources :addresses
      map.resources :orders,     :has_many => [:line_items]

    map.namespace :admin do |admin|
      admin.resources :users
      admin.resources :products
    end
  end




Tuesday, December 15, 2009
Rotas RESTFul

                 GET /products/new
  ActionController::Routing::Routes.draw do |map|
                 GET /products
    map.resourcesPOST /products
                  :products
    map.resources :addresses
    map.resourcesGET /products/1 => [:line_items]
                  :orders,    :has_many

    map.namespaceGET /products/1/edit
                  :admin do |admin|
      admin.resources :users
                 PUT /products/1
      admin.resources :products
    end          DESTROY /products/1
  end




Tuesday, December 15, 2009
Controller
    class UsersController < Spree::BaseController
      resource_controller
      before_filter :initialize_extension_partials
      actions :all, :except => [:index, :destroy]

        show.before do
          @orders = Order.checkout_completed(true)
            .find_all_by_user_id(current_user.id)
        end

        create.after {       self.current_user = @user }

      create.response do |wants|
        wants.html { redirect_back_or_default(products_path) }
      end
    end


Tuesday, December 15, 2009
Controller
    class UsersController < Spree::BaseController
      resource_controller
      before_filter :initialize_extension_partials
      actions :all, :except => [:index, :destroy]

        show.before do
          @orders = Order.checkout_completed(true)
            .find_all_by_user_id(current_user.id)
        end

        create.after {       self.current_user = @user }

      create.response do |wants|
        wants.html { redirect_back_or_default(products_path) }
      end
    end


Tuesday, December 15, 2009
Controller
    class UsersController < Spree::BaseController
      resource_controller
      before_filter :initialize_extension_partials
      actions :all, :except => [:index, :destroy]

        show.before do
          @orders = Order.checkout_completed(true)
            .find_all_by_user_id(current_user.id)
        end

        create.after {       self.current_user = @user }

      create.response do |wants|
        wants.html { redirect_back_or_default(products_path) }
      end
    end


Tuesday, December 15, 2009
“Beautiful Code”


Tuesday, December 15, 2009
@Transient
                                                                 public BigDecimal getTotal()
      //$Id: Booking.java 5579 2007-06-27 00:06:49Z gavin $      {
      package org.jboss.seam.example.booking;                       return hotel.getPrice().multiply( new BigDecimal( getNights() ) );
                                                                 }
      import   java.io.Serializable;
      import   java.math.BigDecimal;                             @Transient
      import   java.text.DateFormat;                             public int getNights()
      import   java.util.Date;                                   {
                                                                    return (int) ( checkoutDate.getTime() - checkinDate.getTime() ) /
      import   javax.persistence.Basic;                       1000 / 60 / 60 / 24;
      import   javax.persistence.Entity;                         }
      import   javax.persistence.GeneratedValue;
      import   javax.persistence.Id;                             @Id @GeneratedValue
      import   javax.persistence.ManyToOne;                      public Long getId()
      import   javax.persistence.Temporal;                       {
      import   javax.persistence.TemporalType;                      return id;
      import   javax.persistence.Transient;                      }
                                                                 public void setId(Long id)
      import   org.hibernate.validator.Length;                   {
      import   org.hibernate.validator.NotNull;                     this.id = id;
      import   org.hibernate.validator.Pattern;                  }
      import   org.jboss.seam.annotations.Name;
                                                                 @NotNull
      @Entity                                                    @Basic @Temporal(TemporalType.DATE)
      @Name("booking")                                           public Date getCheckinDate()
      public class Booking implements Serializable               {
      {                                                             return checkinDate;
         private Long id;                                        }
         private User user;                                      public void setCheckinDate(Date datetime)
         private Hotel hotel;                                    {
         private Date checkinDate;                                  this.checkinDate = datetime;
         private Date checkoutDate;                              }
         private String creditCard;
         private String creditCardName;                          @ManyToOne @NotNull
         private int creditCardExpiryMonth;                      public Hotel getHotel()
         private int creditCardExpiryYear;                       {
         private boolean smoking;                                   return hotel;
         private int beds;                                       }
                                                                 public void setHotel(Hotel hotel)
         public Booking() {}                                     {
                                                                    this.hotel = hotel;
         public Booking(Hotel hotel, User user)                  }
         {
            this.hotel = hotel;                                  @ManyToOne @NotNull
            this.user = user;                                    public User getUser()
         }                                                       {
                                                                    return user;
                                                                 }

Tuesday, December 15, 2009
public int getBeds()
  public void setUser(User user)
                                                                                  {
  {
                                                                                     return beds;
     this.user = user;
                                                                                  }
  }

                                                                                  public void setBeds(int beds)
  @Basic @Temporal(TemporalType.DATE)
                                                                                  {
  @NotNull
                                                                                     this.beds = beds;
  public Date getCheckoutDate()
                                                                                  }
  {
                                                                                  @NotNull(message="Credit card name is required")
     return checkoutDate;
                                                                                  @Length(min=3, max=70, message="Credit card name is required")
  }
                                                                                  public String getCreditCardName()
  public void setCheckoutDate(Date checkoutDate)
                                                                                  {
  {
                                                                                     return creditCardName;
     this.checkoutDate = checkoutDate;
                                                                                  }
  }

                                                                                  public void setCreditCardName(String creditCardName)
  @NotNull(message="Credit card number is required")
                                                                                  {
  @Length(min=16, max=16, message="Credit card number must 16 digits long")
                                                                                     this.creditCardName = creditCardName;
  @Pattern(regex="^d*$", message="Credit card number must be numeric")
                                                                                  }
  public String getCreditCard()
  {
                                                                                  public int getCreditCardExpiryMonth()
     return creditCard;
                                                                                  {
  }
                                                                                     return creditCardExpiryMonth;
                                                                                  }
  public void setCreditCard(String creditCard)
  {
                                                                                  public void setCreditCardExpiryMonth(int creditCardExpiryMonth)
     this.creditCard = creditCard;
                                                                                  {
  }
                                                                                     this.creditCardExpiryMonth = creditCardExpiryMonth;
                                                                                  }
  @Transient
  public String getDescription()
                                                                                  public int getCreditCardExpiryYear()
  {
                                                                                  {
     DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
                                                                                     return creditCardExpiryYear;
     return hotel==null ? null : hotel.getName() +
                                                                                  }
           ", " + df.format( getCheckinDate() ) +
           " to " + df.format( getCheckoutDate() );
                                                                                  public void setCreditCardExpiryYear(int creditCardExpiryYear)
  }
                                                                                  {
                                                                                     this.creditCardExpiryYear = creditCardExpiryYear;
  public boolean isSmoking()
                                                                                  }
  {
     return smoking;
                                                                                  @Override
  }
                                                                                  public String toString()
                                                                                  {
  public void setSmoking(boolean smoking)
                                                                                     return "Booking(" + user + ","+ hotel + ")";
  {
                                                                                  }
     this.smoking = smoking;
  }
                                                                              }


Tuesday, December 15, 2009
class Booking < ActiveRecord::Base
               belongs_to :hotel
               belongs_to :user
               validates_presence_of :hotel
               validates_presence_of :user
               validates_presence_of :credit_card
               validates_presence_of :credit_card_name
               validates_length_of :credit_card, :within => 16..16
               validates_format_of :credit_card, :with => /^d*$/
               validates_length_of :credit_card_name, :within => 3..70

                def total
                  hotel.price * nights
                end

                def nights
                  ((checkout_date - checkin_date) / 1.day).round
                end

               def to_s
                 "Booking(#{user},#{hotel})"
               end
             end
Tuesday, December 15, 2009
class Booking < ActiveRecord::Base
               belongs_to :hotel
               belongs_to :user
               validates_presence_of :hotel
               validates_presence_of :user
               validates_presence_of :credit_card
               validates_presence_of :credit_card_name
               validates_length_of :credit_card, :within => 16..16
               validates_format_of :credit_card, :with => /^d*$/
               validates_length_of :credit_card_name, :within => 3..70

                def total
                  hotel.price * nights
                end

                def nights
                  ((checkout_date - checkin_date) / 1.day).round
                end

               def to_s
                 "Booking(#{user},#{hotel})"
               end
             end
Tuesday, December 15, 2009
class CreateBookings < ActiveRecord::Migration
                        def self.up
                          create_table :bookings do |t|
                            t.references :user
                            t.references :hotel
                            t.datetime :checkin
                            t.datetime :checkout
                            t.string :credit_card
                            t.string :credit_card_name
                            t.integer :credit_card_expiry_month
                            t.integer :credit_card_expiry_year
                            t.boolean :smoking
                            t.integer :beds

                                 t.timestamps
                               end
                             end

                        def self.down
                          drop_table :bookings
                        end
                      end

Tuesday, December 15, 2009
class CreateBookings < ActiveRecord::Migration
                        def self.up
                          create_table :bookings do |t|
                            t.references :user
                            t.references :hotel
                            t.datetime :checkin
                            t.datetime :checkout
                            t.string :credit_card
                            t.string :credit_card_name
                            t.integer :credit_card_expiry_month
                            t.integer :credit_card_expiry_year
                            t.boolean :smoking
                            t.integer :beds

                                 t.timestamps
                               end
                             end

                        def self.down
                          drop_table :bookings
                        end
                      end

Tuesday, December 15, 2009
class CreateBookings < ActiveRecord::Migration
                        def self.up
                          create_table :bookings do |t|
                            t.references :user
                            t.references :hotel
                            t.datetime :checkin
                            t.datetime :checkout
                            t.string :credit_card
                            t.string :credit_card_name
                            t.integer :credit_card_expiry_month
                            t.integer :credit_card_expiry_year
                            t.boolean :smoking
                            t.integer :beds

                                 t.timestamps
                               end
                             end

                        def self.down
                          drop_table :bookings
                        end
                      end

Tuesday, December 15, 2009
190
                             vs
                             40


Tuesday, December 15, 2009
“Eles servem mais de 23 milhões de visitantes/mês. A conversão
             resultou em 20 mil linhas de Ruby em vez de 125 mil linhas de Java e,
              mais importante, facilitou a dificuldade que tinham em manutenção.
              Eles também finalizaram a reescrita do sistema em apenas 3 meses
              com 4 desenvolvedores. Uma vez completo e otimizado, o site deles
                                agora é mais rápido que antes.”




                             http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails




Tuesday, December 15, 2009
“Eles servem mais de 23 milhões de visitantes/mês. A conversão
             resultou em 20 mil linhas de Ruby em vez de 125 mil linhas de Java e,
              mais importante, facilitou a dificuldade que tinham em manutenção.
              Eles também finalizaram a reescrita do sistema em apenas 3 meses
              com 4 desenvolvedores. Uma vez completo e otimizado, o site deles
                                agora é mais rápido que antes.”




                             http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails




Tuesday, December 15, 2009
“Eles servem mais de 23 milhões de visitantes/mês. A conversão
             resultou em 20 mil linhas de Ruby em vez de 125 mil linhas de Java e,
              mais importante, facilitou a dificuldade que tinham em manutenção.
              Eles também finalizaram a reescrita do sistema em apenas 3 meses
              com 4 desenvolvedores. Uma vez completo e otimizado, o site deles
                                agora é mais rápido que antes.”




                             http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails




Tuesday, December 15, 2009
“Eles servem mais de 23 milhões de visitantes/mês. A conversão
             resultou em 20 mil linhas de Ruby em vez de 125 mil linhas de Java e,
              mais importante, facilitou a dificuldade que tinham em manutenção.
              Eles também finalizaram a reescrita do sistema em apenas 3 meses
              com 4 desenvolvedores. Uma vez completo e otimizado, o site deles
                                agora é mais rápido que antes.”




                             http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails




Tuesday, December 15, 2009
Ferramentas
                                Ágeis


Tuesday, December 15, 2009
Gitorious
       Repositórios
                                   Github
       Integração                 Integrity
       Contínua              Cruise Control
                                Capistrano
       Deployment
                                   Puppet

       Monitoramento             New Relic
Tuesday, December 15, 2009
Gitorious
       Repositórios
                                   Github
       Integração                 Integrity
       Contínua              Cruise Control
                                Capistrano
       Deployment
                                   Puppet

       Monitoramento             New Relic
Tuesday, December 15, 2009
Gitorious
       Repositórios
                                   Github
       Integração                 Integrity
       Contínua              Cruise Control
                                Capistrano
       Deployment
                                   Puppet

       Monitoramento             New Relic
Tuesday, December 15, 2009
Gitorious
       Repositórios
                                   Github
       Integração                 Integrity
       Contínua              Cruise Control
                                Capistrano
       Deployment
                                   Puppet

       Monitoramento             New Relic
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Comunidade


Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
O que dizem
                               por aí ...


Tuesday, December 15, 2009
Pouco usado


Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Rails não Escala


Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Blaine Cook

                             http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter


Tuesday, December 15, 2009
Para colocar as coisas em
       perspectiva, o Friendster foi
         escrito em Java e eles
          mudaram para PHP.
         MySpace foi escrito em
       ColdFusion e eles mudaram
             para ASP.NET.




                                                                                  Blaine Cook

                             http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter


Tuesday, December 15, 2009
Para colocar as coisas em
       perspectiva, o Friendster foi
         escrito em Java e eles
          mudaram para PHP.
         MySpace foi escrito em
       ColdFusion e eles mudaram
             para ASP.NET.

     Quando as pessoas caem em
      problemas de escalabilidade,
       normalmente acham que a
     linguagem é o problema, mas
     eu acho que isso raramente é
             a realidade.                                                         Blaine Cook

                             http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter


Tuesday, December 15, 2009
“O The New York Times usou Ruby on Rails
                 para agregar, analizar e mostrar os
              resultados das eleições em quase tempo
             real em um de seus sites mais acessados
                        de todos os tempos.”


                     http://www.computerworld.com.au/article/268003/ruby_rails_rolls_into_enterprise?fp=16&fpid=1




Tuesday, December 15, 2009
“O The New York Times usou Ruby on Rails
                 para agregar, analizar e mostrar os
              resultados das eleições em quase tempo
             real em um de seus sites mais acessados
                        de todos os tempos.”


                     http://www.computerworld.com.au/article/268003/ruby_rails_rolls_into_enterprise?fp=16&fpid=1




Tuesday, December 15, 2009
Ruby é Lento


Tuesday, December 15, 2009
x mais lento que C++




Tuesday, December 15, 2009
x mais lento que C++


                      0      50            100           150   200

  Python 2


  Ruby 1.9


        Perl


      JRuby


   Python 3


        PHP


  Ruby 1.8.6




Tuesday, December 15, 2009
Homepage: 331 ms




Tuesday, December 15, 2009
Homepage: 331 ms

                             Total: 5.45 s

Tuesday, December 15, 2009
Tuesday, December 15, 2009
Performance
                           !=
                     Escalabilidade

Tuesday, December 15, 2009
Outros Mitos?


Tuesday, December 15, 2009
Tuesday, December 15, 2009
Mais Produtivo

                              “Melhor”

                             Anti-legado
Tuesday, December 15, 2009
Sempre se Lembre




             Poderíamos contratar um Macaco Treinado
                     para fazer seu Trabalho!
Tuesday, December 15, 2009
Agilidade


Tuesday, December 15, 2009
Tuesday, December 15, 2009
Robert C. Martin


Tuesday, December 15, 2009
Tuesday, December 15, 2009
Código Limpo


Tuesday, December 15, 2009
Tuesday, December 15, 2009
Test Driven
                        Development


Tuesday, December 15, 2009
Tuesday, December 15, 2009
describe BankAccount do
          before :each do
            @bank_account = BankAccount.new :balance => 250
          end

            it "should not be valid" do
              @bank_account.should be_valid
            end

          it "should transfer funds successfully" do
            @bank_account.should_receive(:transfer)
              .with_args(:amount => 100)
              .and_return(true)
            @bank_account.execute_transaction(:amount => 100)
            @bank_account.balance.should == 150
          end
        end


Tuesday, December 15, 2009
describe BankAccount do
          before :each do
            @bank_account = BankAccount.new :balance => 250
          end

            it "should not be valid" do
              @bank_account.should be_valid
            end

          it "should transfer funds successfully" do
            @bank_account.should_receive(:transfer)
              .with_args(:amount => 100)
              .and_return(true)
            @bank_account.execute_transaction(:amount => 100)
            @bank_account.balance.should == 150
          end
        end


Tuesday, December 15, 2009
describe BankAccount do
          before :each do
            @bank_account = BankAccount.new :balance => 250
          end

            it "should not be valid" do
              @bank_account.should be_valid
            end

          it "should transfer funds successfully" do
            @bank_account.should_receive(:transfer)
              .with_args(:amount => 100)
              .and_return(true)
            @bank_account.execute_transaction(:amount => 100)
            @bank_account.balance.should == 150
          end
        end


Tuesday, December 15, 2009
describe BankAccount do
          before :each do
            @bank_account = BankAccount.new :balance => 250
          end

            it "should not be valid" do
              @bank_account.should be_valid
            end

          it "should transfer funds successfully" do
            @bank_account.should_receive(:transfer)
              .with_args(:amount => 100)
              .and_return(true)
            @bank_account.execute_transaction(:amount => 100)
            @bank_account.balance.should == 150
          end
        end


Tuesday, December 15, 2009
Tuesday, December 15, 2009
Funcionalidade: Adição
               Para evitar erros bobos
               Como um péssimo matemático
               Eu quero saber como somar dois números

                 Cenário: Adicionar dois números
                   Dado que eu digitei 50 na calculadora
                   E que eu digitei 70 na calculadora
                   Quando eu aperto o botão de soma
                   Então o resultado na calculadora deve ser 120




Tuesday, December 15, 2009
Funcionalidade: Adição
               Para evitar erros bobos
               Como um péssimo matemático
               Eu quero saber como somar dois números

                 Cenário: Adicionar dois números
                   Dado que eu digitei 50 na calculadora
                   E que eu digitei 70 na calculadora
                   Quando eu aperto o botão de soma
                   Então o resultado na calculadora deve ser 120




Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Não é mais
                             demorado?


Tuesday, December 15, 2009
Produtividade
                             Cowboy    Profissional




Tuesday, December 15, 2009
Produtividade
                                  Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1     2     3      4           5          6      7   8
                                               Tempo
 Tuesday, December 15, 2009
Produtividade
                                  Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1     2     3      4           5          6      7   8
                                               Tempo
 Tuesday, December 15, 2009
Produtividade
                                  Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1     2     3      4           5          6      7   8
                                               Tempo
 Tuesday, December 15, 2009
Produtividade
                                  Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1     2     3      4           5          6      7   8
                                               Tempo
 Tuesday, December 15, 2009
Produtividade
                                  Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1     2     3      4           5          6      7   8
                                               Tempo
 Tuesday, December 15, 2009
Produtividade
                                  Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1     2     3      4           5          6      7   8
                                               Tempo
 Tuesday, December 15, 2009
Produtividade
                                  Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1     2     3      4           5          6      7   8
                                               Tempo
 Tuesday, December 15, 2009
Produtividade
                                  Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1     2     3      4           5          6      7   8
                                               Tempo
 Tuesday, December 15, 2009
Produtividade
                                  Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1     2     3      4           5          6      7   8
                                               Tempo
 Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
237 Equipes
                   137 Finalizadas


Tuesday, December 15, 2009
Tuesday, December 15, 2009
Empreendedorismo

                             Código e “Forma”

                     Ciclo de Vida de Projetos

                  Comunidade Open Source
Tuesday, December 15, 2009
Empreendedorismo

                             Código e “Forma”

                     Ciclo de Vida de Projetos

                  Comunidade Open Source
Tuesday, December 15, 2009
Empreendedorismo

                             Código e “Forma”

                     Ciclo de Vida de Projetos

                  Comunidade Open Source
Tuesday, December 15, 2009
Empreendedorismo

                             Código e “Forma”

                     Ciclo de Vida de Projetos

                  Comunidade Open Source
Tuesday, December 15, 2009
Pro ssionalismo


Tuesday, December 15, 2009
Tuesday, December 15, 2009
Obrigado!
                              akitaonrails.com
                             railssummit.com.br



Tuesday, December 15, 2009
Tuesday, December 15, 2009

Más contenido relacionado

Destacado

New Passenger Cabins In Aircraft
New Passenger Cabins In AircraftNew Passenger Cabins In Aircraft
New Passenger Cabins In Aircraftpaumove
 
Itpub电子杂志(第五期)
Itpub电子杂志(第五期)Itpub电子杂志(第五期)
Itpub电子杂志(第五期)yiditushe
 
M O R E A B O U T E Q U A L I T Y D R
M O R E  A B O U T  E Q U A L I T Y  D RM O R E  A B O U T  E Q U A L I T Y  D R
M O R E A B O U T E Q U A L I T Y D Rbanothkishan
 
Moodle dodicesima parte: gestire le attività - diario, sondaggio e database
Moodle dodicesima parte: gestire le attività - diario, sondaggio e databaseMoodle dodicesima parte: gestire le attività - diario, sondaggio e database
Moodle dodicesima parte: gestire le attività - diario, sondaggio e databaseAngelo Panini
 
COMO MEJORAR LA PRODUCCION DE UNA EMPRESA
COMO MEJORAR LA PRODUCCION DE UNA EMPRESACOMO MEJORAR LA PRODUCCION DE UNA EMPRESA
COMO MEJORAR LA PRODUCCION DE UNA EMPRESAUTPL
 
Dissertation Conference Poster
Dissertation Conference PosterDissertation Conference Poster
Dissertation Conference PosterChris Hughes
 
Yogasana Demonstration Dr Shriniwas Kashalikar
Yogasana Demonstration Dr  Shriniwas KashalikarYogasana Demonstration Dr  Shriniwas Kashalikar
Yogasana Demonstration Dr Shriniwas Kashalikarbanothkishan
 
Thematic_Mapping_Engine
Thematic_Mapping_EngineThematic_Mapping_Engine
Thematic_Mapping_Enginetutorialsruby
 

Destacado (17)

lecture%204
lecture%204lecture%204
lecture%204
 
New Passenger Cabins In Aircraft
New Passenger Cabins In AircraftNew Passenger Cabins In Aircraft
New Passenger Cabins In Aircraft
 
1 6 Cacti & Succulents
1 6 Cacti & Succulents1 6 Cacti & Succulents
1 6 Cacti & Succulents
 
Itpub电子杂志(第五期)
Itpub电子杂志(第五期)Itpub电子杂志(第五期)
Itpub电子杂志(第五期)
 
I Am Not Able Dr
I Am Not Able  DrI Am Not Able  Dr
I Am Not Able Dr
 
M O R E A B O U T E Q U A L I T Y D R
M O R E  A B O U T  E Q U A L I T Y  D RM O R E  A B O U T  E Q U A L I T Y  D R
M O R E A B O U T E Q U A L I T Y D R
 
Moodle dodicesima parte: gestire le attività - diario, sondaggio e database
Moodle dodicesima parte: gestire le attività - diario, sondaggio e databaseMoodle dodicesima parte: gestire le attività - diario, sondaggio e database
Moodle dodicesima parte: gestire le attività - diario, sondaggio e database
 
25_Create_swatches
25_Create_swatches25_Create_swatches
25_Create_swatches
 
COMO MEJORAR LA PRODUCCION DE UNA EMPRESA
COMO MEJORAR LA PRODUCCION DE UNA EMPRESACOMO MEJORAR LA PRODUCCION DE UNA EMPRESA
COMO MEJORAR LA PRODUCCION DE UNA EMPRESA
 
Image%20Tutorial
Image%20TutorialImage%20Tutorial
Image%20Tutorial
 
Dissertation Conference Poster
Dissertation Conference PosterDissertation Conference Poster
Dissertation Conference Poster
 
1 6 Flower Sales
1 6 Flower Sales1 6 Flower Sales
1 6 Flower Sales
 
Yogasana Demonstration Dr Shriniwas Kashalikar
Yogasana Demonstration Dr  Shriniwas KashalikarYogasana Demonstration Dr  Shriniwas Kashalikar
Yogasana Demonstration Dr Shriniwas Kashalikar
 
PS-Science
PS-SciencePS-Science
PS-Science
 
tutorials
tutorialstutorials
tutorials
 
lecture2_public
lecture2_publiclecture2_public
lecture2_public
 
Thematic_Mapping_Engine
Thematic_Mapping_EngineThematic_Mapping_Engine
Thematic_Mapping_Engine
 

Similar a Latinoware Rails 2009

Software livre e padrões abertos no desenvolvimento Web
Software livre e padrões abertos no desenvolvimento WebSoftware livre e padrões abertos no desenvolvimento Web
Software livre e padrões abertos no desenvolvimento WebFelipe Ribeiro
 
Ceara On Rails 2009
Ceara On Rails 2009Ceara On Rails 2009
Ceara On Rails 2009Fabio Akita
 
2009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
2009, o ano do Ruby on Rails no Brasil - CaelumDay 20092009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
2009, o ano do Ruby on Rails no Brasil - CaelumDay 2009Caue Guerra
 
Fórum de Software Livre do Serpro RJ 2009
Fórum de Software Livre do Serpro RJ 2009Fórum de Software Livre do Serpro RJ 2009
Fórum de Software Livre do Serpro RJ 2009Fabio Akita
 
Oxente on Rails 2009
Oxente on Rails 2009Oxente on Rails 2009
Oxente on Rails 2009Fabio Akita
 
2nd Annual Start-up Launches with Dr. Werner Vogels (SPOT101) | AWS re:Invent...
2nd Annual Start-up Launches with Dr. Werner Vogels (SPOT101) | AWS re:Invent...2nd Annual Start-up Launches with Dr. Werner Vogels (SPOT101) | AWS re:Invent...
2nd Annual Start-up Launches with Dr. Werner Vogels (SPOT101) | AWS re:Invent...Amazon Web Services
 
Angrybirds - Overview for a High Performance Shop
Angrybirds - Overview for a High Performance ShopAngrybirds - Overview for a High Performance Shop
Angrybirds - Overview for a High Performance ShopAOE
 
Diving Into the New AWS SDK for Ruby (TLS305) | AWS re:Invent 2013
Diving Into the New AWS SDK for Ruby (TLS305) | AWS re:Invent 2013Diving Into the New AWS SDK for Ruby (TLS305) | AWS re:Invent 2013
Diving Into the New AWS SDK for Ruby (TLS305) | AWS re:Invent 2013Amazon Web Services
 
DjangoCon 2009 Keynote
DjangoCon 2009 KeynoteDjangoCon 2009 Keynote
DjangoCon 2009 KeynoteTed Leung
 
And the Greatest of These Is ... Space
And the Greatest of These Is ... SpaceAnd the Greatest of These Is ... Space
And the Greatest of These Is ... SpaceBen Scofield
 
Chad Udell - Developers are from Mars, Designers are from Venus
Chad Udell - Developers are from Mars, Designers are from VenusChad Udell - Developers are from Mars, Designers are from Venus
Chad Udell - Developers are from Mars, Designers are from Venus360|Conferences
 
Using AWS to Build a Graph-Based Product Recommendation System (BDT303) | AWS...
Using AWS to Build a Graph-Based Product Recommendation System (BDT303) | AWS...Using AWS to Build a Graph-Based Product Recommendation System (BDT303) | AWS...
Using AWS to Build a Graph-Based Product Recommendation System (BDT303) | AWS...Amazon Web Services
 
Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...
Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...
Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...Amazon Web Services
 
Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...
Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...
Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...Amazon Web Services
 

Similar a Latinoware Rails 2009 (20)

OPET 2009
OPET 2009OPET 2009
OPET 2009
 
Software livre e padrões abertos no desenvolvimento Web
Software livre e padrões abertos no desenvolvimento WebSoftware livre e padrões abertos no desenvolvimento Web
Software livre e padrões abertos no desenvolvimento Web
 
Ceara On Rails 2009
Ceara On Rails 2009Ceara On Rails 2009
Ceara On Rails 2009
 
Claretiano 2009
Claretiano 2009Claretiano 2009
Claretiano 2009
 
2009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
2009, o ano do Ruby on Rails no Brasil - CaelumDay 20092009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
2009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
 
Fórum de Software Livre do Serpro RJ 2009
Fórum de Software Livre do Serpro RJ 2009Fórum de Software Livre do Serpro RJ 2009
Fórum de Software Livre do Serpro RJ 2009
 
Oxente on Rails 2009
Oxente on Rails 2009Oxente on Rails 2009
Oxente on Rails 2009
 
100% JS
100% JS100% JS
100% JS
 
2nd Annual Start-up Launches with Dr. Werner Vogels (SPOT101) | AWS re:Invent...
2nd Annual Start-up Launches with Dr. Werner Vogels (SPOT101) | AWS re:Invent...2nd Annual Start-up Launches with Dr. Werner Vogels (SPOT101) | AWS re:Invent...
2nd Annual Start-up Launches with Dr. Werner Vogels (SPOT101) | AWS re:Invent...
 
Angrybirds - Overview for a High Performance Shop
Angrybirds - Overview for a High Performance ShopAngrybirds - Overview for a High Performance Shop
Angrybirds - Overview for a High Performance Shop
 
Diving Into the New AWS SDK for Ruby (TLS305) | AWS re:Invent 2013
Diving Into the New AWS SDK for Ruby (TLS305) | AWS re:Invent 2013Diving Into the New AWS SDK for Ruby (TLS305) | AWS re:Invent 2013
Diving Into the New AWS SDK for Ruby (TLS305) | AWS re:Invent 2013
 
DjangoCon 2009 Keynote
DjangoCon 2009 KeynoteDjangoCon 2009 Keynote
DjangoCon 2009 Keynote
 
And the Greatest of These Is ... Space
And the Greatest of These Is ... SpaceAnd the Greatest of These Is ... Space
And the Greatest of These Is ... Space
 
Road to Rails
Road to RailsRoad to Rails
Road to Rails
 
Chad Udell - Developers are from Mars, Designers are from Venus
Chad Udell - Developers are from Mars, Designers are from VenusChad Udell - Developers are from Mars, Designers are from Venus
Chad Udell - Developers are from Mars, Designers are from Venus
 
Using AWS to Build a Graph-Based Product Recommendation System (BDT303) | AWS...
Using AWS to Build a Graph-Based Product Recommendation System (BDT303) | AWS...Using AWS to Build a Graph-Based Product Recommendation System (BDT303) | AWS...
Using AWS to Build a Graph-Based Product Recommendation System (BDT303) | AWS...
 
Cross platform development
Cross platform developmentCross platform development
Cross platform development
 
Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...
Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...
Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...
 
Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...
Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...
Running Lean and Mean: Designing Cost-efficient Architectures on AWS (ARC313)...
 
Cloudera Desktop
Cloudera DesktopCloudera Desktop
Cloudera Desktop
 

Más de Fabio Akita

Devconf 2019 - São Carlos
Devconf 2019 - São CarlosDevconf 2019 - São Carlos
Devconf 2019 - São CarlosFabio Akita
 
Meetup Nerdzão - English Talk about Languages
Meetup Nerdzão  - English Talk about LanguagesMeetup Nerdzão  - English Talk about Languages
Meetup Nerdzão - English Talk about LanguagesFabio Akita
 
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018Fabio Akita
 
Desmistificando Blockchains - 20o Encontro Locaweb SP
Desmistificando Blockchains - 20o Encontro Locaweb SPDesmistificando Blockchains - 20o Encontro Locaweb SP
Desmistificando Blockchains - 20o Encontro Locaweb SPFabio Akita
 
Desmistificando Blockchains - Insiter Goiania
Desmistificando Blockchains - Insiter GoianiaDesmistificando Blockchains - Insiter Goiania
Desmistificando Blockchains - Insiter GoianiaFabio Akita
 
Blockchain em 7 minutos - 7Masters
Blockchain em 7 minutos - 7MastersBlockchain em 7 minutos - 7Masters
Blockchain em 7 minutos - 7MastersFabio Akita
 
Elixir -Tolerância a Falhas para Adultos - GDG Campinas
Elixir  -Tolerância a Falhas para Adultos - GDG CampinasElixir  -Tolerância a Falhas para Adultos - GDG Campinas
Elixir -Tolerância a Falhas para Adultos - GDG CampinasFabio Akita
 
Desmistificando Mitos de Tech Startups - Intercon 2017
Desmistificando Mitos de Tech Startups - Intercon 2017Desmistificando Mitos de Tech Startups - Intercon 2017
Desmistificando Mitos de Tech Startups - Intercon 2017Fabio Akita
 
30 Days to Elixir and Crystal and Back to Ruby
30 Days to Elixir and Crystal and Back to Ruby30 Days to Elixir and Crystal and Back to Ruby
30 Days to Elixir and Crystal and Back to RubyFabio Akita
 
Uma Discussão sobre a Carreira de TI
Uma Discussão sobre a Carreira de TIUma Discussão sobre a Carreira de TI
Uma Discussão sobre a Carreira de TIFabio Akita
 
THE CONF - Opening Keynote
THE CONF - Opening KeynoteTHE CONF - Opening Keynote
THE CONF - Opening KeynoteFabio Akita
 
A Journey through New Languages - Rancho Dev 2017
A Journey through New Languages - Rancho Dev 2017A Journey through New Languages - Rancho Dev 2017
A Journey through New Languages - Rancho Dev 2017Fabio Akita
 
Desmistificando Mitos de Startups - Sebrae - AP
Desmistificando Mitos de Startups - Sebrae - APDesmistificando Mitos de Startups - Sebrae - AP
Desmistificando Mitos de Startups - Sebrae - APFabio Akita
 
A Journey through New Languages - Guru Sorocaba 2017
A Journey through New Languages - Guru Sorocaba 2017A Journey through New Languages - Guru Sorocaba 2017
A Journey through New Languages - Guru Sorocaba 2017Fabio Akita
 
A Journey through New Languages - Insiter 2017
A Journey through New Languages - Insiter 2017A Journey through New Languages - Insiter 2017
A Journey through New Languages - Insiter 2017Fabio Akita
 
A Journey through New Languages - Locaweb Tech Day
A Journey through New Languages - Locaweb Tech DayA Journey through New Languages - Locaweb Tech Day
A Journey through New Languages - Locaweb Tech DayFabio Akita
 
A Journey through new Languages - Intercon 2016
A Journey through new Languages - Intercon 2016A Journey through new Languages - Intercon 2016
A Journey through new Languages - Intercon 2016Fabio Akita
 
Premature Optimization 2.0 - Intercon 2016
Premature Optimization 2.0 - Intercon 2016Premature Optimization 2.0 - Intercon 2016
Premature Optimization 2.0 - Intercon 2016Fabio Akita
 
Conexão Kinghost - Otimização Prematura
Conexão Kinghost - Otimização PrematuraConexão Kinghost - Otimização Prematura
Conexão Kinghost - Otimização PrematuraFabio Akita
 
The Open Commerce Conference - Premature Optimisation: The Root of All Evil
The Open Commerce Conference - Premature Optimisation: The Root of All EvilThe Open Commerce Conference - Premature Optimisation: The Root of All Evil
The Open Commerce Conference - Premature Optimisation: The Root of All EvilFabio Akita
 

Más de Fabio Akita (20)

Devconf 2019 - São Carlos
Devconf 2019 - São CarlosDevconf 2019 - São Carlos
Devconf 2019 - São Carlos
 
Meetup Nerdzão - English Talk about Languages
Meetup Nerdzão  - English Talk about LanguagesMeetup Nerdzão  - English Talk about Languages
Meetup Nerdzão - English Talk about Languages
 
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
 
Desmistificando Blockchains - 20o Encontro Locaweb SP
Desmistificando Blockchains - 20o Encontro Locaweb SPDesmistificando Blockchains - 20o Encontro Locaweb SP
Desmistificando Blockchains - 20o Encontro Locaweb SP
 
Desmistificando Blockchains - Insiter Goiania
Desmistificando Blockchains - Insiter GoianiaDesmistificando Blockchains - Insiter Goiania
Desmistificando Blockchains - Insiter Goiania
 
Blockchain em 7 minutos - 7Masters
Blockchain em 7 minutos - 7MastersBlockchain em 7 minutos - 7Masters
Blockchain em 7 minutos - 7Masters
 
Elixir -Tolerância a Falhas para Adultos - GDG Campinas
Elixir  -Tolerância a Falhas para Adultos - GDG CampinasElixir  -Tolerância a Falhas para Adultos - GDG Campinas
Elixir -Tolerância a Falhas para Adultos - GDG Campinas
 
Desmistificando Mitos de Tech Startups - Intercon 2017
Desmistificando Mitos de Tech Startups - Intercon 2017Desmistificando Mitos de Tech Startups - Intercon 2017
Desmistificando Mitos de Tech Startups - Intercon 2017
 
30 Days to Elixir and Crystal and Back to Ruby
30 Days to Elixir and Crystal and Back to Ruby30 Days to Elixir and Crystal and Back to Ruby
30 Days to Elixir and Crystal and Back to Ruby
 
Uma Discussão sobre a Carreira de TI
Uma Discussão sobre a Carreira de TIUma Discussão sobre a Carreira de TI
Uma Discussão sobre a Carreira de TI
 
THE CONF - Opening Keynote
THE CONF - Opening KeynoteTHE CONF - Opening Keynote
THE CONF - Opening Keynote
 
A Journey through New Languages - Rancho Dev 2017
A Journey through New Languages - Rancho Dev 2017A Journey through New Languages - Rancho Dev 2017
A Journey through New Languages - Rancho Dev 2017
 
Desmistificando Mitos de Startups - Sebrae - AP
Desmistificando Mitos de Startups - Sebrae - APDesmistificando Mitos de Startups - Sebrae - AP
Desmistificando Mitos de Startups - Sebrae - AP
 
A Journey through New Languages - Guru Sorocaba 2017
A Journey through New Languages - Guru Sorocaba 2017A Journey through New Languages - Guru Sorocaba 2017
A Journey through New Languages - Guru Sorocaba 2017
 
A Journey through New Languages - Insiter 2017
A Journey through New Languages - Insiter 2017A Journey through New Languages - Insiter 2017
A Journey through New Languages - Insiter 2017
 
A Journey through New Languages - Locaweb Tech Day
A Journey through New Languages - Locaweb Tech DayA Journey through New Languages - Locaweb Tech Day
A Journey through New Languages - Locaweb Tech Day
 
A Journey through new Languages - Intercon 2016
A Journey through new Languages - Intercon 2016A Journey through new Languages - Intercon 2016
A Journey through new Languages - Intercon 2016
 
Premature Optimization 2.0 - Intercon 2016
Premature Optimization 2.0 - Intercon 2016Premature Optimization 2.0 - Intercon 2016
Premature Optimization 2.0 - Intercon 2016
 
Conexão Kinghost - Otimização Prematura
Conexão Kinghost - Otimização PrematuraConexão Kinghost - Otimização Prematura
Conexão Kinghost - Otimização Prematura
 
The Open Commerce Conference - Premature Optimisation: The Root of All Evil
The Open Commerce Conference - Premature Optimisation: The Root of All EvilThe Open Commerce Conference - Premature Optimisation: The Root of All Evil
The Open Commerce Conference - Premature Optimisation: The Root of All Evil
 

Latinoware Rails 2009

  • 1. Ruby on Rails Tuesday, December 15, 2009
  • 3. www.slideshare.net/akitaonrails fabio.akita@locaweb.com.br Tuesday, December 15, 2009
  • 5. Ruby on Rails 2.3 Ruby 1.8 “Novo” Ruby 1.9 Tuesday, December 15, 2009
  • 6. Ruby on Rails 2.3 Ruby 1.8 “Novo” Ruby 1.9 Tuesday, December 15, 2009
  • 7. Ruby on Rails 2.3 Ruby 1.8 “Novo” Ruby 1.9 Tuesday, December 15, 2009
  • 8. “Matz” 1993 Tuesday, December 15, 2009
  • 10. “Prag Dave” 2001 Tuesday, December 15, 2009
  • 12. “DHH” 2004 Tuesday, December 15, 2009
  • 17. Charles Nutter 2006 Tuesday, December 15, 2009
  • 22. “Tornar as coisas simples fáceis e as coisas complexas possíveis” Filoso a Ruby Tuesday, December 15, 2009
  • 27. Orientação a Objetos? Tuesday, December 15, 2009
  • 29. Alan Kay Dan Ingalls Tuesday, December 15, 2009
  • 32. Eu inventei o termo ‘orientação a objetos’, e posso lhes dizer que não estava pensando em C++ Alan Kay Tuesday, December 15, 2009
  • 33. Meta- programação Tuesday, December 15, 2009
  • 34. Meta- apresentação Tuesday, December 15, 2009
  • 36. Ruby on Rails Tuesday, December 15, 2009
  • 37. Código que gera Código Convention over Con guration Don’t Repeat Yourself Extreme Programming Tuesday, December 15, 2009
  • 38. Código que gera Código Convention over Con guration Don’t Repeat Yourself Extreme Programming Tuesday, December 15, 2009
  • 39. Código que gera Código Convention over Con guration Don’t Repeat Yourself Extreme Programming Tuesday, December 15, 2009
  • 40. Código que gera Código Convention over Con guration Don’t Repeat Yourself Extreme Programming Tuesday, December 15, 2009
  • 41. Restful Resources Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection) Rack Support (Middlewares) Tuesday, December 15, 2009
  • 42. Restful Resources Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection) Rack Support (Middlewares) Tuesday, December 15, 2009
  • 43. Restful Resources Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection) Rack Support (Middlewares) Tuesday, December 15, 2009
  • 44. Restful Resources Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection) Rack Support (Middlewares) Tuesday, December 15, 2009
  • 57. Model class Product < ActiveRecord::Base after_create :set_initial_inventory has_many :variants, :dependent => :destroy has_many :images, :as => :viewable, :order => :position, :dependent => :destroy has_many :properties, :through => :product_properties belongs_to :tax_category validates_presence_of :name validates_presence_of :master_price validates_presence_of :description make_permalink :with => :name, :field => :permalink end Tuesday, December 15, 2009
  • 58. Model class Product < ActiveRecord::Base after_create :set_initial_inventory has_many :variants, :dependent => :destroy has_many :images, :as => :viewable, :order => :position, :dependent => :destroy has_many :properties, :through => :product_properties belongs_to :tax_category validates_presence_of :name validates_presence_of :master_price validates_presence_of :description make_permalink :with => :name, :field => :permalink end Tuesday, December 15, 2009
  • 59. Model class Product < ActiveRecord::Base after_create :set_initial_inventory has_many :variants, :dependent => :destroy has_many :images, :as => :viewable, :order => :position, :dependent => :destroy has_many :properties, :through => :product_properties belongs_to :tax_category validates_presence_of :name validates_presence_of :master_price validates_presence_of :description make_permalink :with => :name, :field => :permalink end Tuesday, December 15, 2009
  • 60. Model class Product < ActiveRecord::Base after_create :set_initial_inventory has_many :variants, :dependent => :destroy has_many :images, :as => :viewable, :order => :position, :dependent => :destroy has_many :properties, :through => :product_properties belongs_to :tax_category validates_presence_of :name validates_presence_of :master_price validates_presence_of :description make_permalink :with => :name, :field => :permalink end Tuesday, December 15, 2009
  • 61. Model class Product < ActiveRecord::Base after_create :set_initial_inventory has_many :variants, :dependent => :destroy has_many :images, :as => :viewable, :order => :position, :dependent => :destroy has_many :properties, :through => :product_properties belongs_to :tax_category validates_presence_of :name validates_presence_of :master_price validates_presence_of :description make_permalink :with => :name, :field => :permalink end Tuesday, December 15, 2009
  • 62. Model class Product < ActiveRecord::Base after_create :set_initial_inventory has_many :variants, :dependent => :destroy has_many :images, :as => :viewable, :order => :position, :dependent => :destroy has_many :properties, :through => :product_properties belongs_to :tax_category validates_presence_of :name validates_presence_of :master_price validates_presence_of :description make_permalink :with => :name, :field => :permalink end Tuesday, December 15, 2009
  • 63. Model class Product < ActiveRecord::Base after_create :set_initial_inventory has_many :variants, :dependent => :destroy has_many :images, :as => :viewable, :order => :position, :dependent => :destroy has_many :properties, :through => :product_properties belongs_to :tax_category validates_presence_of :name validates_presence_of :master_price validates_presence_of :description make_permalink :with => :name, :field => :permalink end Tuesday, December 15, 2009
  • 64. Views ERB <div id="product-listing"> <%= breadcrumbs(@taxon) %> <br/> <%= render :partial => "shared/products.html.erb", :locals => {:products => @products, :taxon => @taxon } %> </div> <% content_for :sidebar do %> <td id="shop-by-col" valign="top"> <%= render :partial => "shared/taxonomies" %> </td> <% end %> <%= render :partial => 'shared/paginate', :locals => {:collection => @products, :options => {}} unless @products.empty? %> Tuesday, December 15, 2009
  • 65. Views ERB <div id="product-listing"> <%= breadcrumbs(@taxon) %> <br/> <%= render :partial => "shared/products.html.erb", :locals => {:products => @products, :taxon => @taxon } %> </div> <% content_for :sidebar do %> <td id="shop-by-col" valign="top"> <%= render :partial => "shared/taxonomies" %> </td> <% end %> <%= render :partial => 'shared/paginate', :locals => {:collection => @products, :options => {}} unless @products.empty? %> Tuesday, December 15, 2009
  • 66. Views ERB <div id="product-listing"> <%= breadcrumbs(@taxon) %> <br/> <%= render :partial => "shared/products.html.erb", :locals => {:products => @products, :taxon => @taxon } %> </div> <% content_for :sidebar do %> <td id="shop-by-col" valign="top"> <%= render :partial => "shared/taxonomies" %> </td> <% end %> <%= render :partial => 'shared/paginate', :locals => {:collection => @products, :options => {}} unless @products.empty? %> Tuesday, December 15, 2009
  • 67. Rotas RESTFul ActionController::Routing::Routes.draw do |map| map.resources :products map.resources :addresses map.resources :orders, :has_many => [:line_items] map.namespace :admin do |admin| admin.resources :users admin.resources :products end end Tuesday, December 15, 2009
  • 68. Rotas RESTFul ActionController::Routing::Routes.draw do |map| map.resources :products map.resources :addresses map.resources :orders, :has_many => [:line_items] map.namespace :admin do |admin| admin.resources :users admin.resources :products end end Tuesday, December 15, 2009
  • 69. Rotas RESTFul ActionController::Routing::Routes.draw do |map| map.resources :products map.resources :addresses map.resources :orders, :has_many => [:line_items] map.namespace :admin do |admin| admin.resources :users admin.resources :products end end Tuesday, December 15, 2009
  • 70. Rotas RESTFul ActionController::Routing::Routes.draw do |map| map.resources :products map.resources :addresses map.resources :orders, :has_many => [:line_items] map.namespace :admin do |admin| admin.resources :users admin.resources :products end end Tuesday, December 15, 2009
  • 71. Rotas RESTFul GET /products/new ActionController::Routing::Routes.draw do |map| GET /products map.resourcesPOST /products :products map.resources :addresses map.resourcesGET /products/1 => [:line_items] :orders, :has_many map.namespaceGET /products/1/edit :admin do |admin| admin.resources :users PUT /products/1 admin.resources :products end DESTROY /products/1 end Tuesday, December 15, 2009
  • 72. Controller class UsersController < Spree::BaseController resource_controller before_filter :initialize_extension_partials actions :all, :except => [:index, :destroy] show.before do @orders = Order.checkout_completed(true) .find_all_by_user_id(current_user.id) end create.after { self.current_user = @user } create.response do |wants| wants.html { redirect_back_or_default(products_path) } end end Tuesday, December 15, 2009
  • 73. Controller class UsersController < Spree::BaseController resource_controller before_filter :initialize_extension_partials actions :all, :except => [:index, :destroy] show.before do @orders = Order.checkout_completed(true) .find_all_by_user_id(current_user.id) end create.after { self.current_user = @user } create.response do |wants| wants.html { redirect_back_or_default(products_path) } end end Tuesday, December 15, 2009
  • 74. Controller class UsersController < Spree::BaseController resource_controller before_filter :initialize_extension_partials actions :all, :except => [:index, :destroy] show.before do @orders = Order.checkout_completed(true) .find_all_by_user_id(current_user.id) end create.after { self.current_user = @user } create.response do |wants| wants.html { redirect_back_or_default(products_path) } end end Tuesday, December 15, 2009
  • 76. @Transient public BigDecimal getTotal() //$Id: Booking.java 5579 2007-06-27 00:06:49Z gavin $ { package org.jboss.seam.example.booking; return hotel.getPrice().multiply( new BigDecimal( getNights() ) ); } import java.io.Serializable; import java.math.BigDecimal; @Transient import java.text.DateFormat; public int getNights() import java.util.Date; { return (int) ( checkoutDate.getTime() - checkinDate.getTime() ) / import javax.persistence.Basic; 1000 / 60 / 60 / 24; import javax.persistence.Entity; } import javax.persistence.GeneratedValue; import javax.persistence.Id; @Id @GeneratedValue import javax.persistence.ManyToOne; public Long getId() import javax.persistence.Temporal; { import javax.persistence.TemporalType; return id; import javax.persistence.Transient; } public void setId(Long id) import org.hibernate.validator.Length; { import org.hibernate.validator.NotNull; this.id = id; import org.hibernate.validator.Pattern; } import org.jboss.seam.annotations.Name; @NotNull @Entity @Basic @Temporal(TemporalType.DATE) @Name("booking") public Date getCheckinDate() public class Booking implements Serializable { { return checkinDate; private Long id; } private User user; public void setCheckinDate(Date datetime) private Hotel hotel; { private Date checkinDate; this.checkinDate = datetime; private Date checkoutDate; } private String creditCard; private String creditCardName; @ManyToOne @NotNull private int creditCardExpiryMonth; public Hotel getHotel() private int creditCardExpiryYear; { private boolean smoking; return hotel; private int beds; } public void setHotel(Hotel hotel) public Booking() {} { this.hotel = hotel; public Booking(Hotel hotel, User user) } { this.hotel = hotel; @ManyToOne @NotNull this.user = user; public User getUser() } { return user; } Tuesday, December 15, 2009
  • 77. public int getBeds() public void setUser(User user) { { return beds; this.user = user; } } public void setBeds(int beds) @Basic @Temporal(TemporalType.DATE) { @NotNull this.beds = beds; public Date getCheckoutDate() } { @NotNull(message="Credit card name is required") return checkoutDate; @Length(min=3, max=70, message="Credit card name is required") } public String getCreditCardName() public void setCheckoutDate(Date checkoutDate) { { return creditCardName; this.checkoutDate = checkoutDate; } } public void setCreditCardName(String creditCardName) @NotNull(message="Credit card number is required") { @Length(min=16, max=16, message="Credit card number must 16 digits long") this.creditCardName = creditCardName; @Pattern(regex="^d*$", message="Credit card number must be numeric") } public String getCreditCard() { public int getCreditCardExpiryMonth() return creditCard; { } return creditCardExpiryMonth; } public void setCreditCard(String creditCard) { public void setCreditCardExpiryMonth(int creditCardExpiryMonth) this.creditCard = creditCard; { } this.creditCardExpiryMonth = creditCardExpiryMonth; } @Transient public String getDescription() public int getCreditCardExpiryYear() { { DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); return creditCardExpiryYear; return hotel==null ? null : hotel.getName() + } ", " + df.format( getCheckinDate() ) + " to " + df.format( getCheckoutDate() ); public void setCreditCardExpiryYear(int creditCardExpiryYear) } { this.creditCardExpiryYear = creditCardExpiryYear; public boolean isSmoking() } { return smoking; @Override } public String toString() { public void setSmoking(boolean smoking) return "Booking(" + user + ","+ hotel + ")"; { } this.smoking = smoking; } } Tuesday, December 15, 2009
  • 78. class Booking < ActiveRecord::Base belongs_to :hotel belongs_to :user validates_presence_of :hotel validates_presence_of :user validates_presence_of :credit_card validates_presence_of :credit_card_name validates_length_of :credit_card, :within => 16..16 validates_format_of :credit_card, :with => /^d*$/ validates_length_of :credit_card_name, :within => 3..70 def total hotel.price * nights end def nights ((checkout_date - checkin_date) / 1.day).round end def to_s "Booking(#{user},#{hotel})" end end Tuesday, December 15, 2009
  • 79. class Booking < ActiveRecord::Base belongs_to :hotel belongs_to :user validates_presence_of :hotel validates_presence_of :user validates_presence_of :credit_card validates_presence_of :credit_card_name validates_length_of :credit_card, :within => 16..16 validates_format_of :credit_card, :with => /^d*$/ validates_length_of :credit_card_name, :within => 3..70 def total hotel.price * nights end def nights ((checkout_date - checkin_date) / 1.day).round end def to_s "Booking(#{user},#{hotel})" end end Tuesday, December 15, 2009
  • 80. class CreateBookings < ActiveRecord::Migration def self.up create_table :bookings do |t| t.references :user t.references :hotel t.datetime :checkin t.datetime :checkout t.string :credit_card t.string :credit_card_name t.integer :credit_card_expiry_month t.integer :credit_card_expiry_year t.boolean :smoking t.integer :beds t.timestamps end end def self.down drop_table :bookings end end Tuesday, December 15, 2009
  • 81. class CreateBookings < ActiveRecord::Migration def self.up create_table :bookings do |t| t.references :user t.references :hotel t.datetime :checkin t.datetime :checkout t.string :credit_card t.string :credit_card_name t.integer :credit_card_expiry_month t.integer :credit_card_expiry_year t.boolean :smoking t.integer :beds t.timestamps end end def self.down drop_table :bookings end end Tuesday, December 15, 2009
  • 82. class CreateBookings < ActiveRecord::Migration def self.up create_table :bookings do |t| t.references :user t.references :hotel t.datetime :checkin t.datetime :checkout t.string :credit_card t.string :credit_card_name t.integer :credit_card_expiry_month t.integer :credit_card_expiry_year t.boolean :smoking t.integer :beds t.timestamps end end def self.down drop_table :bookings end end Tuesday, December 15, 2009
  • 83. 190 vs 40 Tuesday, December 15, 2009
  • 84. “Eles servem mais de 23 milhões de visitantes/mês. A conversão resultou em 20 mil linhas de Ruby em vez de 125 mil linhas de Java e, mais importante, facilitou a dificuldade que tinham em manutenção. Eles também finalizaram a reescrita do sistema em apenas 3 meses com 4 desenvolvedores. Uma vez completo e otimizado, o site deles agora é mais rápido que antes.” http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails Tuesday, December 15, 2009
  • 85. “Eles servem mais de 23 milhões de visitantes/mês. A conversão resultou em 20 mil linhas de Ruby em vez de 125 mil linhas de Java e, mais importante, facilitou a dificuldade que tinham em manutenção. Eles também finalizaram a reescrita do sistema em apenas 3 meses com 4 desenvolvedores. Uma vez completo e otimizado, o site deles agora é mais rápido que antes.” http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails Tuesday, December 15, 2009
  • 86. “Eles servem mais de 23 milhões de visitantes/mês. A conversão resultou em 20 mil linhas de Ruby em vez de 125 mil linhas de Java e, mais importante, facilitou a dificuldade que tinham em manutenção. Eles também finalizaram a reescrita do sistema em apenas 3 meses com 4 desenvolvedores. Uma vez completo e otimizado, o site deles agora é mais rápido que antes.” http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails Tuesday, December 15, 2009
  • 87. “Eles servem mais de 23 milhões de visitantes/mês. A conversão resultou em 20 mil linhas de Ruby em vez de 125 mil linhas de Java e, mais importante, facilitou a dificuldade que tinham em manutenção. Eles também finalizaram a reescrita do sistema em apenas 3 meses com 4 desenvolvedores. Uma vez completo e otimizado, o site deles agora é mais rápido que antes.” http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails Tuesday, December 15, 2009
  • 88. Ferramentas Ágeis Tuesday, December 15, 2009
  • 89. Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Capistrano Deployment Puppet Monitoramento New Relic Tuesday, December 15, 2009
  • 90. Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Capistrano Deployment Puppet Monitoramento New Relic Tuesday, December 15, 2009
  • 91. Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Capistrano Deployment Puppet Monitoramento New Relic Tuesday, December 15, 2009
  • 92. Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Capistrano Deployment Puppet Monitoramento New Relic Tuesday, December 15, 2009
  • 115. O que dizem por aí ... Tuesday, December 15, 2009
  • 123. Rails não Escala Tuesday, December 15, 2009
  • 126. Blaine Cook http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter Tuesday, December 15, 2009
  • 127. Para colocar as coisas em perspectiva, o Friendster foi escrito em Java e eles mudaram para PHP. MySpace foi escrito em ColdFusion e eles mudaram para ASP.NET. Blaine Cook http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter Tuesday, December 15, 2009
  • 128. Para colocar as coisas em perspectiva, o Friendster foi escrito em Java e eles mudaram para PHP. MySpace foi escrito em ColdFusion e eles mudaram para ASP.NET. Quando as pessoas caem em problemas de escalabilidade, normalmente acham que a linguagem é o problema, mas eu acho que isso raramente é a realidade. Blaine Cook http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter Tuesday, December 15, 2009
  • 129. “O The New York Times usou Ruby on Rails para agregar, analizar e mostrar os resultados das eleições em quase tempo real em um de seus sites mais acessados de todos os tempos.” http://www.computerworld.com.au/article/268003/ruby_rails_rolls_into_enterprise?fp=16&fpid=1 Tuesday, December 15, 2009
  • 130. “O The New York Times usou Ruby on Rails para agregar, analizar e mostrar os resultados das eleições em quase tempo real em um de seus sites mais acessados de todos os tempos.” http://www.computerworld.com.au/article/268003/ruby_rails_rolls_into_enterprise?fp=16&fpid=1 Tuesday, December 15, 2009
  • 131. Ruby é Lento Tuesday, December 15, 2009
  • 132. x mais lento que C++ Tuesday, December 15, 2009
  • 133. x mais lento que C++ 0 50 100 150 200 Python 2 Ruby 1.9 Perl JRuby Python 3 PHP Ruby 1.8.6 Tuesday, December 15, 2009
  • 134. Homepage: 331 ms Tuesday, December 15, 2009
  • 135. Homepage: 331 ms Total: 5.45 s Tuesday, December 15, 2009
  • 137. Performance != Escalabilidade Tuesday, December 15, 2009
  • 140. Mais Produtivo “Melhor” Anti-legado Tuesday, December 15, 2009
  • 141. Sempre se Lembre Poderíamos contratar um Macaco Treinado para fazer seu Trabalho! Tuesday, December 15, 2009
  • 144. Robert C. Martin Tuesday, December 15, 2009
  • 148. Test Driven Development Tuesday, December 15, 2009
  • 150. describe BankAccount do before :each do @bank_account = BankAccount.new :balance => 250 end it "should not be valid" do @bank_account.should be_valid end it "should transfer funds successfully" do @bank_account.should_receive(:transfer) .with_args(:amount => 100) .and_return(true) @bank_account.execute_transaction(:amount => 100) @bank_account.balance.should == 150 end end Tuesday, December 15, 2009
  • 151. describe BankAccount do before :each do @bank_account = BankAccount.new :balance => 250 end it "should not be valid" do @bank_account.should be_valid end it "should transfer funds successfully" do @bank_account.should_receive(:transfer) .with_args(:amount => 100) .and_return(true) @bank_account.execute_transaction(:amount => 100) @bank_account.balance.should == 150 end end Tuesday, December 15, 2009
  • 152. describe BankAccount do before :each do @bank_account = BankAccount.new :balance => 250 end it "should not be valid" do @bank_account.should be_valid end it "should transfer funds successfully" do @bank_account.should_receive(:transfer) .with_args(:amount => 100) .and_return(true) @bank_account.execute_transaction(:amount => 100) @bank_account.balance.should == 150 end end Tuesday, December 15, 2009
  • 153. describe BankAccount do before :each do @bank_account = BankAccount.new :balance => 250 end it "should not be valid" do @bank_account.should be_valid end it "should transfer funds successfully" do @bank_account.should_receive(:transfer) .with_args(:amount => 100) .and_return(true) @bank_account.execute_transaction(:amount => 100) @bank_account.balance.should == 150 end end Tuesday, December 15, 2009
  • 155. Funcionalidade: Adição Para evitar erros bobos Como um péssimo matemático Eu quero saber como somar dois números Cenário: Adicionar dois números Dado que eu digitei 50 na calculadora E que eu digitei 70 na calculadora Quando eu aperto o botão de soma Então o resultado na calculadora deve ser 120 Tuesday, December 15, 2009
  • 156. Funcionalidade: Adição Para evitar erros bobos Como um péssimo matemático Eu quero saber como somar dois números Cenário: Adicionar dois números Dado que eu digitei 50 na calculadora E que eu digitei 70 na calculadora Quando eu aperto o botão de soma Então o resultado na calculadora deve ser 120 Tuesday, December 15, 2009
  • 159. Não é mais demorado? Tuesday, December 15, 2009
  • 160. Produtividade Cowboy Profissional Tuesday, December 15, 2009
  • 161. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 162. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 163. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 164. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 165. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 166. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 167. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 168. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 169. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 172. 237 Equipes 137 Finalizadas Tuesday, December 15, 2009
  • 174. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Tuesday, December 15, 2009
  • 175. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Tuesday, December 15, 2009
  • 176. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Tuesday, December 15, 2009
  • 177. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Tuesday, December 15, 2009
  • 180. Obrigado! akitaonrails.com railssummit.com.br Tuesday, December 15, 2009