Enecomp 2009

852 views

Published on

Minha palestra de introdução à cultura e ecossistema Ruby on Rails que dei na Enecomp 2009, em Curitiba, Paraná.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
852
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
26
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Enecomp 2009

  1. 1. Ruby on Rails Tuesday, September 8, 2009
  2. 2. AkitaOnRails.com slideshare.net/akitaonrails Tuesday, September 8, 2009
  3. 3. 2008 Tuesday, September 8, 2009
  4. 4. 2008 Tuesday, September 8, 2009
  5. 5. 13 e 14 Outubro 2009 Tuesday, September 8, 2009
  6. 6. Tuesday, September 8, 2009
  7. 7. > 100 slides < 1 hora Tuesday, September 8, 2009
  8. 8. www.slideshare.net/akitaonrails fabio.akita@locaweb.com.br Tuesday, September 8, 2009
  9. 9. Tuesday, September 8, 2009
  10. 10. Tuesday, September 8, 2009
  11. 11. Tuesday, September 8, 2009
  12. 12. Ruby on Rails 2.3 Ruby 1.8 “Novo” Ruby 1.9 Tuesday, September 8, 2009
  13. 13. Ruby on Rails 2.3 Ruby 1.8 “Novo” Ruby 1.9 Tuesday, September 8, 2009
  14. 14. Ruby on Rails 2.3 Ruby 1.8 “Novo” Ruby 1.9 Tuesday, September 8, 2009
  15. 15. “Matz” 1993 Tuesday, September 8, 2009
  16. 16. Tuesday, September 8, 2009
  17. 17. “Prag Dave” 2001 Tuesday, September 8, 2009
  18. 18. Tuesday, September 8, 2009
  19. 19. “DHH” 2004 Tuesday, September 8, 2009
  20. 20. Tuesday, September 8, 2009
  21. 21. Tuesday, September 8, 2009
  22. 22. Charles Nutter 2006 Tuesday, September 8, 2009
  23. 23. Tuesday, September 8, 2009
  24. 24. Tuesday, September 8, 2009
  25. 25. Tuesday, September 8, 2009
  26. 26. Tuesday, September 8, 2009
  27. 27. “Tornar as coisas simples fáceis e as coisas complexas possíveis” Filosofia Ruby Tuesday, September 8, 2009
  28. 28. Tuesday, September 8, 2009
  29. 29. Tuesday, September 8, 2009
  30. 30. Tuesday, September 8, 2009
  31. 31. Tuesday, September 8, 2009
  32. 32. Orientação a Objetos Tuesday, September 8, 2009
  33. 33. Tuesday, September 8, 2009
  34. 34. Tuesday, September 8, 2009
  35. 35. Tuesday, September 8, 2009
  36. 36. “Eu inventei o termo ‘orientação a objetos’, e posso lhes dizer que eu não estava pensando em C++.” Tuesday, September 8, 2009
  37. 37. Meta-programação Tuesday, September 8, 2009
  38. 38. Meta-apresentação Tuesday, September 8, 2009
  39. 39. Tuesday, September 8, 2009
  40. 40. Ruby on Rails Tuesday, September 8, 2009
  41. 41. Código que gera Código Convention over Configuration Don’t Repeat Yourself Extreme Programming Tuesday, September 8, 2009
  42. 42. Código que gera Código Convention over Configuration Don’t Repeat Yourself Extreme Programming Tuesday, September 8, 2009
  43. 43. Código que gera Código Convention over Configuration Don’t Repeat Yourself Extreme Programming Tuesday, September 8, 2009
  44. 44. Código que gera Código Convention over Configuration Don’t Repeat Yourself Extreme Programming Tuesday, September 8, 2009
  45. 45. Tuesday, September 8, 2009
  46. 46. Tuesday, September 8, 2009
  47. 47. Tuesday, September 8, 2009
  48. 48. Tuesday, September 8, 2009
  49. 49. Tuesday, September 8, 2009
  50. 50. Tuesday, September 8, 2009
  51. 51. Tuesday, September 8, 2009
  52. 52. Tuesday, September 8, 2009
  53. 53. Tuesday, September 8, 2009
  54. 54. Tuesday, September 8, 2009
  55. 55. Tuesday, September 8, 2009
  56. 56. Tuesday, September 8, 2009
  57. 57. Tuesday, September 8, 2009
  58. 58. Tuesday, September 8, 2009
  59. 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, September 8, 2009
  60. 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, September 8, 2009
  61. 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, September 8, 2009
  62. 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, September 8, 2009
  63. 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, September 8, 2009
  64. 64. 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, September 8, 2009
  65. 65. 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, September 8, 2009
  66. 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, September 8, 2009
  67. 67. 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, September 8, 2009
  68. 68. 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, September 8, 2009
  69. 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, September 8, 2009
  70. 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, September 8, 2009
  71. 71. 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, September 8, 2009
  72. 72. 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, September 8, 2009
  73. 73. Rotas RESTFul GET /products/new ActionController::Routing::Routes.draw do |map| GET /products POST /products map.resources :products map.resources :addresses map.resourcesGET /products/1 => [:line_items] :orders, :has_many map.namespaceGET /products/1/edit :admin do |admin| PUT /products/1 admin.resources :users admin.resources :products end DESTROY /products/1 end Tuesday, September 8, 2009
  74. 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, September 8, 2009
  75. 75. 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, September 8, 2009
  76. 76. 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, September 8, 2009
  77. 77. “Beautiful Code” Tuesday, September 8, 2009
  78. 78. @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, September 8, 2009
  79. 79. 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, September 8, 2009
  80. 80. 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, September 8, 2009
  81. 81. 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, September 8, 2009
  82. 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, September 8, 2009
  83. 83. 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, September 8, 2009
  84. 84. 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, September 8, 2009
  85. 85. 190 vs 40 Tuesday, September 8, 2009
  86. 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, September 8, 2009
  87. 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, September 8, 2009
  88. 88. “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, September 8, 2009
  89. 89. “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, September 8, 2009
  90. 90. Ferramentas Ágeis Tuesday, September 8, 2009
  91. 91. Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Capistrano Deployment Puppet Monitoramento New Relic Tuesday, September 8, 2009
  92. 92. Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Capistrano Deployment Puppet Monitoramento New Relic Tuesday, September 8, 2009
  93. 93. Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Capistrano Deployment Puppet Monitoramento New Relic Tuesday, September 8, 2009
  94. 94. Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Capistrano Deployment Puppet Monitoramento New Relic Tuesday, September 8, 2009
  95. 95. Comunidade Tuesday, September 8, 2009
  96. 96. peepcode.com Geoffrey Tuesday, September 8, 2009
  97. 97. railsenvy.com Jason e Gregg Tuesday, September 8, 2009
  98. 98. railscasts.com Ryan Bates Tuesday, September 8, 2009
  99. 99. rubylearning.org Satish Talim Tuesday, September 8, 2009
  100. 100. rubyinside.com.br Peter Cooper Tuesday, September 8, 2009
  101. 101. Tuesday, September 8, 2009
  102. 102. Tuesday, September 8, 2009
  103. 103. Tuesday, September 8, 2009
  104. 104. Tuesday, September 8, 2009
  105. 105. Tuesday, September 8, 2009
  106. 106. O que dizem por aí ... Tuesday, September 8, 2009
  107. 107. Pouco usado Tuesday, September 8, 2009
  108. 108. Tuesday, September 8, 2009
  109. 109. Tuesday, September 8, 2009
  110. 110. Tuesday, September 8, 2009
  111. 111. Tuesday, September 8, 2009
  112. 112. Tuesday, September 8, 2009
  113. 113. Tuesday, September 8, 2009
  114. 114. Rails não Escala Tuesday, September 8, 2009
  115. 115. Tuesday, September 8, 2009
  116. 116. Tuesday, September 8, 2009
  117. 117. Blaine Cook http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter Tuesday, September 8, 2009
  118. 118. 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, September 8, 2009
  119. 119. 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, September 8, 2009
  120. 120. “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, September 8, 2009
  121. 121. “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, September 8, 2009
  122. 122. Ruby é Lento Tuesday, September 8, 2009
  123. 123. x mais lento que C++ Tuesday, September 8, 2009
  124. 124. x mais lento que C++ 0 50 100 Python 2 150 Ruby 1.9 200 Perl JRuby Python 3 PHP Ruby 1.8.6 Tuesday, September 8, 2009
  125. 125. Homepage: 331 ms Tuesday, September 8, 2009
  126. 126. Homepage: 331 ms Total: 5.45 s Tuesday, September 8, 2009
  127. 127. Tuesday, September 8, 2009
  128. 128. Performance != Escalabilidade Tuesday, September 8, 2009
  129. 129. Outros Mitos? Tuesday, September 8, 2009
  130. 130. Tuesday, September 8, 2009
  131. 131. Mais Produtivo “Melhor” Anti-legado Tuesday, September 8, 2009
  132. 132. Mais Produtivo “Melhor” Anti-legado Tuesday, September 8, 2009
  133. 133. Mais Produtivo “Melhor” Anti-legado Tuesday, September 8, 2009
  134. 134. Agilidade Tuesday, September 8, 2009
  135. 135. Tuesday, September 8, 2009
  136. 136. Robert C. Martin Tuesday, September 8, 2009
  137. 137. “Uncle Bob” Tuesday, September 8, 2009
  138. 138. Código Limpo Tuesday, September 8, 2009
  139. 139. Tuesday, September 8, 2009
  140. 140. Test Driven Development Tuesday, September 8, 2009
  141. 141. Tuesday, September 8, 2009
  142. 142. 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, September 8, 2009
  143. 143. 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, September 8, 2009
  144. 144. 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, September 8, 2009
  145. 145. 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, September 8, 2009
  146. 146. Tuesday, September 8, 2009
  147. 147. 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, September 8, 2009
  148. 148. 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, September 8, 2009
  149. 149. Tuesday, September 8, 2009
  150. 150. Tuesday, September 8, 2009
  151. 151. Não é mais demorado? Tuesday, September 8, 2009
  152. 152. Cowboy Profissional Tuesday, September 8, 2009
  153. 153. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  154. 154. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  155. 155. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  156. 156. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  157. 157. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  158. 158. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  159. 159. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  160. 160. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  161. 161. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  162. 162. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  163. 163. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  164. 164. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  165. 165. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  166. 166. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  167. 167. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  168. 168. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  169. 169. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  170. 170. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  171. 171. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  172. 172. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  173. 173. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  174. 174. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  175. 175. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  176. 176. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  177. 177. Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 9 10 11 12 Tempo Tuesday, September 8, 2009
  178. 178. Tuesday, September 8, 2009
  179. 179. Tuesday, September 8, 2009
  180. 180. 237 Equipes 137 Finalizadas Tuesday, September 8, 2009
  181. 181. Tuesday, September 8, 2009
  182. 182. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Tuesday, September 8, 2009
  183. 183. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Tuesday, September 8, 2009
  184. 184. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Tuesday, September 8, 2009
  185. 185. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Tuesday, September 8, 2009
  186. 186. Profissionalismo Tuesday, September 8, 2009
  187. 187. Tuesday, September 8, 2009
  188. 188. Obrigado! akitaonrails.com railssummit.com.br Tuesday, September 8, 2009

×