Edted 2010 Ruby on Rails
Upcoming SlideShare
Loading in...5
×
 

Edted 2010 Ruby on Rails

on

  • 1,631 views

Palestra de introdução à Cultura e Ecossistema Ruby on Rails no EDTED 2010 Rio de Janeiro

Palestra de introdução à Cultura e Ecossistema Ruby on Rails no EDTED 2010 Rio de Janeiro

Statistics

Views

Total Views
1,631
Slideshare-icon Views on SlideShare
1,613
Embed Views
18

Actions

Likes
3
Downloads
50
Comments
0

1 Embed 18

http://www.slideshare.net 18

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Edted 2010 Ruby on Rails Edted 2010 Ruby on Rails Presentation Transcript

    • A apresentação comecará em alguns minutos ... Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Ruby on Rails Saturday, March 20, 2010
    • AkitaOnRails.com Saturday, March 20, 2010
    • ~ 50 min ~ 110 slides Saturday, March 20, 2010
    • www.slideshare.net/akitaonrails fabioakita@gmail.com Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Ruby on Rails 2.3.x Ruby on Rails 3.0-pre Ruby 1.8.x Ruby 1.9.x Saturday, March 20, 2010
    • Ruby on Rails 2.3.x Ruby on Rails 3.0-pre Ruby 1.8.x Ruby 1.9.x Saturday, March 20, 2010
    • Ruby on Rails 2.3.x Ruby on Rails 3.0-pre Ruby 1.8.x Ruby 1.9.x Saturday, March 20, 2010
    • Ruby on Rails 2.3.x Ruby on Rails 3.0-pre Ruby 1.8.x Ruby 1.9.x Saturday, March 20, 2010
    • “Matz” 1993 Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • “DHH” 2004 Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Charles Nutter 2006 Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • http://github.com/akitaonrails/jruby_calculator_demo/ Saturday, March 20, 2010
    • http://github.com/akitaonrails/jruby_calculator_demo/ Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • “Tornar as coisas simples fáceis e as coisas complexas possíveis” Filoso a Ruby Saturday, March 20, 2010
    • Ruby on Rails Saturday, March 20, 2010
    • Código que gera Código Convention over Con guration Don’t Repeat Yourself Extreme Programming Saturday, March 20, 2010
    • Código que gera Código Convention over Con guration Don’t Repeat Yourself Extreme Programming Saturday, March 20, 2010
    • Código que gera Código Convention over Con guration Don’t Repeat Yourself Extreme Programming Saturday, March 20, 2010
    • Código que gera Código Convention over Con guration Don’t Repeat Yourself Extreme Programming Saturday, March 20, 2010
    • Restful Resources Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection) Saturday, March 20, 2010
    • Restful Resources Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection) Saturday, March 20, 2010
    • Restful Resources Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection) Saturday, March 20, 2010
    • Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação Authlogic, Devise MySQL, PostgreSQL, Oracle, Bancos de Dados MongoDB, CouchDB ActiveRecord, DataMapper, ORMs MongoMapper, Sequel Prototype, jQuery, Javascript SproutCore Apache 2, NginX, Web Servers Lighty, Litespeed Saturday, March 20, 2010
    • Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação Authlogic, Devise MySQL, PostgreSQL, Oracle, Bancos de Dados MongoDB, CouchDB ActiveRecord, DataMapper, ORMs MongoMapper, Sequel Prototype, jQuery, Javascript SproutCore Apache 2, NginX, Web Servers Lighty, Litespeed Saturday, March 20, 2010
    • Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação Authlogic, Devise MySQL, PostgreSQL, Oracle, Bancos de Dados MongoDB, CouchDB ActiveRecord, DataMapper, ORMs MongoMapper, Sequel Prototype, jQuery, Javascript SproutCore Apache 2, NginX, Web Servers Lighty, Litespeed Saturday, March 20, 2010
    • Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação Authlogic, Devise MySQL, PostgreSQL, Oracle, Bancos de Dados MongoDB, CouchDB ActiveRecord, DataMapper, ORMs MongoMapper, Sequel Prototype, jQuery, Javascript SproutCore Apache 2, NginX, Web Servers Lighty, Litespeed Saturday, March 20, 2010
    • Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação Authlogic, Devise MySQL, PostgreSQL, Oracle, Bancos de Dados MongoDB, CouchDB ActiveRecord, DataMapper, ORMs MongoMapper, Sequel Prototype, jQuery, Javascript SproutCore Apache 2, NginX, Web Servers Lighty, Litespeed Saturday, March 20, 2010
    • Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação Authlogic, Devise MySQL, PostgreSQL, Oracle, Bancos de Dados MongoDB, CouchDB ActiveRecord, DataMapper, ORMs MongoMapper, Sequel Prototype, jQuery, Javascript SproutCore Apache 2, NginX, Web Servers Lighty, Litespeed Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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? %> Saturday, March 20, 2010
    • 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? %> Saturday, March 20, 2010
    • 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? %> Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • “Beautiful Code” Saturday, March 20, 2010
    • @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; } Saturday, March 20, 2010
    • 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; } } Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 190 vs 40 Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • “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 Saturday, March 20, 2010
    • “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 Saturday, March 20, 2010
    • “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 Saturday, March 20, 2010
    • “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 Saturday, March 20, 2010
    • Ferramentas Saturday, March 20, 2010
    • Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Chef Deployment Puppet Monitoramento New Relic Saturday, March 20, 2010
    • Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Chef Deployment Puppet Monitoramento New Relic Saturday, March 20, 2010
    • Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Chef Deployment Puppet Monitoramento New Relic Saturday, March 20, 2010
    • Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Chef Deployment Puppet Monitoramento New Relic Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Comunidade Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • O que dizem por aí ... Saturday, March 20, 2010
    • Ruby é Lento Saturday, March 20, 2010
    • Existem mentiras, mentiras malditas e estatísticas. Saturday, March 20, 2010
    • Existem mentiras, mentiras malditas e estatísticas. Saturday, March 20, 2010
    • Existem mentiras, mentiras malditas e estatísticas. Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • x mais lento que C++ Saturday, March 20, 2010
    • x mais lento que C++ 0 32.5 65 97.5 130 Python 2 Ruby 1.9 JRuby Perl Python 3 PHP Ruby 1.8 Saturday, March 20, 2010
    • Homepage: 331 ms Saturday, March 20, 2010
    • Homepage: 331 ms Total: 5.45 s Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Performance != Escalabilidade Saturday, March 20, 2010
    • Rails não Escala Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Blaine Cook http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • “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 Saturday, March 20, 2010
    • “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 Saturday, March 20, 2010
    • Browser Web Server MySQL Saturday, March 20, 2010
    • Browser Varnish/HAProxy Web Server MySQL Saturday, March 20, 2010
    • Browser Varnish/HAProxy Web Server Memcached MySQL Saturday, March 20, 2010
    • Browser Varnish/HAProxy Web Server Memcached MySQL CouchDB/MongoDB Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Outros Mitos? Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Mais Produtivo “Melhor” Anti-legado Saturday, March 20, 2010
    • Sempre se Lembre Poderíamos contratar um Macaco Treinado para fazer seu Trabalho! Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Agilidade Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Robert C. Martin Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Código Limpo Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Test Driven Development Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • 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 Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Não é mais demorado? Saturday, March 20, 2010
    • Produtividade Cowboy Profissional Saturday, March 20, 2010
    • Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, March 20, 2010
    • Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, March 20, 2010
    • Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, March 20, 2010
    • Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, March 20, 2010
    • Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, March 20, 2010
    • Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, March 20, 2010
    • Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, March 20, 2010
    • Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, March 20, 2010
    • Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • 237 Equipes 137 Finalizadas Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Saturday, March 20, 2010
    • Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Saturday, March 20, 2010
    • Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Saturday, March 20, 2010
    • Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Saturday, March 20, 2010
    • Pro ssionalismo Saturday, March 20, 2010
    • Saturday, March 20, 2010
    • Obrigado! akitaonrails.com Saturday, March 20, 2010