169
Ruby on Rails Thursday, June 4, 2009

ERECOMPI

Embed Size (px)

DESCRIPTION

Palestra de Ruby on Rails que dei no evento ERECOMPI, em Teresina, no Piauí.

Citation preview

Page 1: ERECOMPI

Ruby on RailsThursday, June 4, 2009

Page 2: ERECOMPI

AkitaOnRails.comslideshare.net/akitaonrails

Thursday, June 4, 2009

Page 3: ERECOMPI

2008Thursday, June 4, 2009

Page 4: ERECOMPI

2008Thursday, June 4, 2009

Page 5: ERECOMPI

13 e 14Outubro

2009Thursday, June 4, 2009

Page 6: ERECOMPI

Thursday, June 4, 2009

Page 7: ERECOMPI

~108 slides~90 min

Thursday, June 4, 2009

Page 9: ERECOMPI

Thursday, June 4, 2009

Page 10: ERECOMPI

Thursday, June 4, 2009

Page 11: ERECOMPI

Thursday, June 4, 2009

Page 12: ERECOMPI

“Especialista em

uma coisa só é um

amador em todo o

resto.”

Thursday, June 4, 2009

Page 13: ERECOMPI

Thursday, June 4, 2009

Page 14: ERECOMPI

Ruby on Rails 2.3

Ruby 1.8

Novo Ruby 1.9

Thursday, June 4, 2009

Page 15: ERECOMPI

Ruby on Rails 2.3

Ruby 1.8

Novo Ruby 1.9

Thursday, June 4, 2009

Page 16: ERECOMPI

Ruby on Rails 2.3

Ruby 1.8

Novo Ruby 1.9

Thursday, June 4, 2009

Page 17: ERECOMPI

1993

“Matz”

Thursday, June 4, 2009

Page 18: ERECOMPI

2001

“Prag Dave”

Thursday, June 4, 2009

Page 19: ERECOMPI

2004

“DHH”

Thursday, June 4, 2009

Page 20: ERECOMPI

2006

Charles Nutter

Thursday, June 4, 2009

Page 21: ERECOMPI

Thursday, June 4, 2009

Page 22: ERECOMPI

Thursday, June 4, 2009

Page 23: ERECOMPI

“Tornar as coisas

simples fáceis e as

coisas complexas

possíveis”

Filosofia Ruby

Thursday, June 4, 2009

Page 24: ERECOMPI

Thursday, June 4, 2009

Page 25: ERECOMPI

O que dizempor aí ...

Thursday, June 4, 2009

Page 26: ERECOMPI

Pouco usado

Thursday, June 4, 2009

Page 27: ERECOMPI

Rails não Escala

Thursday, June 4, 2009

Page 28: ERECOMPI

Ruby é Lento

Thursday, June 4, 2009

Page 29: ERECOMPI

WTF!?

Thursday, June 4, 2009

Page 30: ERECOMPI

Pouco usado

Thursday, June 4, 2009

Page 31: ERECOMPI

Thursday, June 4, 2009

Page 32: ERECOMPI

Thursday, June 4, 2009

Page 33: ERECOMPI

Thursday, June 4, 2009

Page 34: ERECOMPI

Thursday, June 4, 2009

Page 35: ERECOMPI

Thursday, June 4, 2009

Page 36: ERECOMPI

Thursday, June 4, 2009

Page 37: ERECOMPI

Thursday, June 4, 2009

Page 38: ERECOMPI

Thursday, June 4, 2009

Page 39: ERECOMPI

Thursday, June 4, 2009

Page 40: ERECOMPI

Thursday, June 4, 2009

Page 41: ERECOMPI

Thursday, June 4, 2009

Page 42: ERECOMPI

Thursday, June 4, 2009

Page 43: ERECOMPI

Thursday, June 4, 2009

Page 44: ERECOMPI

Thursday, June 4, 2009

Page 45: ERECOMPI

Thursday, June 4, 2009

Page 46: ERECOMPI

Thursday, June 4, 2009

Page 47: ERECOMPI

Rails não Escala

Thursday, June 4, 2009

Page 48: ERECOMPI

Thursday, June 4, 2009

Page 49: ERECOMPI

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

Thursday, June 4, 2009

Page 50: ERECOMPI

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

“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.”

Thursday, June 4, 2009

Page 51: ERECOMPI

Ruby é Lento

Thursday, June 4, 2009

Page 52: ERECOMPI

x mais lento que C++

Thursday, June 4, 2009

Page 53: ERECOMPI

0

50

100

150

200

Python 2

Ruby 1.9

Perl

JRuby

Python 3

PHP

Ruby 1.8.6

x mais lento que C++

Thursday, June 4, 2009

Page 54: ERECOMPI

Homepage: 331 ms

Thursday, June 4, 2009

Page 55: ERECOMPI

Homepage: 331 ms

Total: 5.45 s

Thursday, June 4, 2009

Page 56: ERECOMPI

Thursday, June 4, 2009

Page 57: ERECOMPI

Thursday, June 4, 2009

Page 58: ERECOMPI

PHP “puro” 331 req/s

CakePHP 4 a 8 req/s*

Code Igniter 22 a 98 req/s*

Rails (2008) 88 req/s

Thursday, June 4, 2009

Page 59: ERECOMPI

PHP “puro” 331 req/s

CakePHP 4 a 8 req/s*

Code Igniter 22 a 98 req/s*

Rails (2008) 88 req/s

Thursday, June 4, 2009

Page 60: ERECOMPI

PHP “puro” 331 req/s

CakePHP 4 a 8 req/s*

Code Igniter 22 a 98 req/s*

Rails (2008) 88 req/s

Thursday, June 4, 2009

Page 61: ERECOMPI

PHP “puro” 331 req/s

CakePHP 4 a 8 req/s*

Code Igniter 22 a 98 req/s*

Rails (2008) 88 req/s

Thursday, June 4, 2009

Page 62: ERECOMPI

Thursday, June 4, 2009

Page 63: ERECOMPI

PHP Reload

Java Persistente

Ruby Misto

Thursday, June 4, 2009

Page 64: ERECOMPI

PHP Reload

Java Persistente

Ruby Misto

Thursday, June 4, 2009

Page 65: ERECOMPI

PHP Reload

Java Persistente

Ruby Misto

Thursday, June 4, 2009

Page 66: ERECOMPI

Browser

Rails

Banco de DadosBanco Slave

Thursday, June 4, 2009

Page 67: ERECOMPI

Browser

Rails

Banco de Dados Banco Slave

Thursday, June 4, 2009

Page 68: ERECOMPI

Browser

Rails

Banco de Dados Banco Slave

Thursday, June 4, 2009

Page 69: ERECOMPI

Browser

Rails

Banco de Dados

Banco Slave

Thursday, June 4, 2009

Page 70: ERECOMPI

Browser

Rails

Banco de Dados Banco Slave

Thursday, June 4, 2009

Page 71: ERECOMPI

Browser

Rails

Banco de Dados Banco Slave

Memcached

Thursday, June 4, 2009

Page 72: ERECOMPI

Browser

Rails

Banco de Dados Banco Slave

Memcached

Thursday, June 4, 2009

Page 73: ERECOMPI

Browser

Rails

Banco de Dados Banco Slave

Memcached

Memcached

Thursday, June 4, 2009

Page 74: ERECOMPI

Browser

Rails

Banco de Dados Banco Slave

Memcached

Memcached Web Caches

Thursday, June 4, 2009

Page 75: ERECOMPI

Performance

!=Escalabilidade

Thursday, June 4, 2009

Page 76: ERECOMPI

Performance

Ghz“Vertical”

Thursday, June 4, 2009

Page 77: ERECOMPI

Escalabilidade

MultiCore“Horizontal”

Thursday, June 4, 2009

Page 78: ERECOMPI

Ruby on Rails

Thursday, June 4, 2009

Page 79: ERECOMPI

RUBY

Thursday, June 4, 2009

Page 80: ERECOMPI

ActiveSupportRails

RUBY

Thursday, June 4, 2009

Page 81: ERECOMPI

ActionPack

ActionController

ActionView

ActiveSupportRails

RUBY

Thursday, June 4, 2009

Page 82: ERECOMPI

ActiveRecord

ActionPack

ActionController

ActionView

ActiveSupportRails

RUBY

Thursday, June 4, 2009

Page 83: ERECOMPI

ActiveRecord

ActionPack

ActionMailer

ActionController

ActionView

ActiveSupportRails

RUBY

Thursday, June 4, 2009

Page 84: ERECOMPI

ActiveRecord

ActionPack

ActiveResource

ActionMailer

ActionController

ActionView

ActiveSupportRails

ActionWebService

RUBY

Thursday, June 4, 2009

Page 85: ERECOMPI

Thursday, June 4, 2009

Page 86: ERECOMPI

Thursday, June 4, 2009

Page 87: ERECOMPI

Thursday, June 4, 2009

Page 88: ERECOMPI

Thursday, June 4, 2009

Page 89: ERECOMPI

Thursday, June 4, 2009

Page 90: ERECOMPI

Thursday, June 4, 2009

Page 91: ERECOMPI

Thursday, June 4, 2009

Page 92: ERECOMPI

Thursday, June 4, 2009

Page 93: ERECOMPI

describe Product do include ProductSpecHelper

before(:each) do @product = Product.new end

it "should not be valid when empty" do @product.should_not be_valid end

it "should be valid when having correct information" do @product.attributes = valid_product_attributes @product.should be_valid endend

RSpec

Thursday, June 4, 2009

Page 94: ERECOMPI

describe Product do include ProductSpecHelper

before(:each) do @product = Product.new end

it "should not be valid when empty" do @product.should_not be_valid end

it "should be valid when having correct information" do @product.attributes = valid_product_attributes @product.should be_valid endend

RSpec

rake spec

Thursday, June 4, 2009

Page 95: ERECOMPI

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 => :permalinkend

Model

Thursday, June 4, 2009

Page 96: ERECOMPI

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 => :permalinkend

Model

Product.find(1)

Thursday, June 4, 2009

Page 97: ERECOMPI

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

Controller

Thursday, June 4, 2009

Page 98: ERECOMPI

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

Controller

/users/1

Thursday, June 4, 2009

Page 99: ERECOMPI

<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? %>

Views ERB

Thursday, June 4, 2009

Page 100: ERECOMPI

#product-listing =breadcrumbs(@taxon) %br =render :partial => "shared/products.html.erb", :locals => {:products => @products, :taxon => @taxon}

-content_for :sidebar do %td#shop-by-col(:valign => "top") =render :partial => "shared/taxonomies" =render :partial => 'shared/paginate', :locals => {:collection => @products, :options => {}} unless @products.empty?

Views HAML

Thursday, June 4, 2009

Page 101: ERECOMPI

ActionController::Routing::Routes.draw do |map| map.connect ':controller/service.wsdl', :action => 'wsdl'

map.resources :products, :member => {:change_image => :post} map.resources :addresses map.resources :orders, :has_many => [:line_items]

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

Rotas RESTFul

Thursday, June 4, 2009

Page 102: ERECOMPI

ActionController::Routing::Routes.draw do |map| map.connect ':controller/service.wsdl', :action => 'wsdl'

map.resources :products, :member => {:change_image => :post} map.resources :addresses map.resources :orders, :has_many => [:line_items]

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

Rotas RESTFul

GET /products/newGET /productsPOST /productsGET /products/1GET /products/1/editPUT /products/1DESTROY /products/1

Thursday, June 4, 2009

Page 103: ERECOMPI

class RenameAppConfiguration < ActiveRecord::Migration def self.up rename_table :app_configurations, :configurations change_table :configurations do |t| t.string :type end end

def self.down change_table :configurations do |t| t.remove :type end rename_table :configurations, :app_configurations endend

Migrations

Thursday, June 4, 2009

Page 104: ERECOMPI

class RenameAppConfiguration < ActiveRecord::Migration def self.up rename_table :app_configurations, :configurations change_table :configurations do |t| t.string :type end end

def self.down change_table :configurations do |t| t.remove :type end rename_table :configurations, :app_configurations endend

Migrations

rake db:migrate

Thursday, June 4, 2009

Page 105: ERECOMPI

“Beautiful Code”

Thursday, June 4, 2009

Page 106: ERECOMPI

//$Id: Booking.java 5579 2007-06-27 00:06:49Z gavin $package org.jboss.seam.example.booking;

import java.io.Serializable;import java.math.BigDecimal;import java.text.DateFormat;import java.util.Date;

import javax.persistence.Basic;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.ManyToOne;import javax.persistence.Temporal;import javax.persistence.TemporalType;import javax.persistence.Transient;

import org.hibernate.validator.Length;import org.hibernate.validator.NotNull;import org.hibernate.validator.Pattern;import org.jboss.seam.annotations.Name;

@Entity@Name("booking")public class Booking implements Serializable{ private Long id; private User user; private Hotel hotel; private Date checkinDate; private Date checkoutDate; private String creditCard; private String creditCardName; private int creditCardExpiryMonth; private int creditCardExpiryYear; private boolean smoking; private int beds; public Booking() {} public Booking(Hotel hotel, User user) { this.hotel = hotel; this.user = user; }

@Transient public BigDecimal getTotal() { return hotel.getPrice().multiply( new BigDecimal( getNights() ) ); }

@Transient public int getNights() { return (int) ( checkoutDate.getTime() - checkinDate.getTime() ) / 1000 / 60 / 60 / 24; }

@Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @NotNull @Basic @Temporal(TemporalType.DATE) public Date getCheckinDate() { return checkinDate; } public void setCheckinDate(Date datetime) { this.checkinDate = datetime; }

@ManyToOne @NotNull public Hotel getHotel() { return hotel; } public void setHotel(Hotel hotel) { this.hotel = hotel; } @ManyToOne @NotNull public User getUser() { return user; }

Thursday, June 4, 2009

Page 107: ERECOMPI

public void setUser(User user) { this.user = user; } @Basic @Temporal(TemporalType.DATE) @NotNull public Date getCheckoutDate() { return checkoutDate; } public void setCheckoutDate(Date checkoutDate) { this.checkoutDate = checkoutDate; } @NotNull(message="Credit card number is required") @Length(min=16, max=16, message="Credit card number must 16 digits long") @Pattern(regex="^\\d*$", message="Credit card number must be numeric") public String getCreditCard() { return creditCard; }

public void setCreditCard(String creditCard) { this.creditCard = creditCard; } @Transient public String getDescription() { DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); return hotel==null ? null : hotel.getName() + ", " + df.format( getCheckinDate() ) + " to " + df.format( getCheckoutDate() ); }

public boolean isSmoking() { return smoking; }

public void setSmoking(boolean smoking) { this.smoking = smoking; }

public int getBeds() { return beds; }

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

public void setCreditCardName(String creditCardName) { this.creditCardName = creditCardName; }

public int getCreditCardExpiryMonth() { return creditCardExpiryMonth; }

public void setCreditCardExpiryMonth(int creditCardExpiryMonth) { this.creditCardExpiryMonth = creditCardExpiryMonth; }

public int getCreditCardExpiryYear() { return creditCardExpiryYear; }

public void setCreditCardExpiryYear(int creditCardExpiryYear) { this.creditCardExpiryYear = creditCardExpiryYear; } @Override public String toString() { return "Booking(" + user + ","+ hotel + ")"; }

}

Thursday, June 4, 2009

Page 108: ERECOMPI

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})" endend

Thursday, June 4, 2009

Page 109: ERECOMPI

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 endend

Thursday, June 4, 2009

Page 110: ERECOMPI

190vs

40

Thursday, June 4, 2009

Page 111: ERECOMPI

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

“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. Uma vez completo e otimizado, o site deles agora é mais rápido que antes. Eles também

finalizaram a reescrita do sistema em apenas 3 meses com 4 desenvolvedores.”

Thursday, June 4, 2009

Page 112: ERECOMPI

Thursday, June 4, 2009

Page 113: ERECOMPI

11 mil

classes!

46 só de

coleções!

Thursday, June 4, 2009

Page 114: ERECOMPI

• Modules:

• Enumerable

• Comparable

• Classes:

• Array

• Hash

• Set

• Sorted Set

Thursday, June 4, 2009

Page 115: ERECOMPI

• Modules:

• Enumerable

• Comparable

• Classes:

• Array

• Hash

• Set

• Sorted Set

1.400

classes

só 6 de

coleções!

Thursday, June 4, 2009

Page 116: ERECOMPI

Ferramentas Ágeis

Thursday, June 4, 2009

Page 117: ERECOMPI

Gerenciamento

Thursday, June 4, 2009

Page 118: ERECOMPI

Thursday, June 4, 2009

Page 119: ERECOMPI

Thursday, June 4, 2009

Page 120: ERECOMPI

Thursday, June 4, 2009

Page 121: ERECOMPI

Repositórios

Thursday, June 4, 2009

Page 122: ERECOMPI

Thursday, June 4, 2009

Page 123: ERECOMPI

Thursday, June 4, 2009

Page 124: ERECOMPI

Thursday, June 4, 2009

Page 125: ERECOMPI

Thursday, June 4, 2009

Page 126: ERECOMPI

Thursday, June 4, 2009

Page 127: ERECOMPI

Thursday, June 4, 2009

Page 128: ERECOMPI

Integração Contínua

Thursday, June 4, 2009

Page 129: ERECOMPI

Thursday, June 4, 2009

Page 130: ERECOMPI

Thursday, June 4, 2009

Page 131: ERECOMPI

Manutenção

Thursday, June 4, 2009

Page 132: ERECOMPI

Thursday, June 4, 2009

Page 133: ERECOMPI

Thursday, June 4, 2009

Page 134: ERECOMPI

Thursday, June 4, 2009

Page 135: ERECOMPI

Open Source

Thursday, June 4, 2009

Page 136: ERECOMPI

Thursday, June 4, 2009

Page 137: ERECOMPI

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 endend

Thursday, June 4, 2009

Page 138: ERECOMPI

Thursday, June 4, 2009

Page 139: ERECOMPI

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

Thursday, June 4, 2009

Page 140: ERECOMPI

Before do @calc = Calculadora.newend Dado /que eu digitei (\d+) na calculadora/ do |n| @calc.push n.to_iend Quando 'eu aperto o botão de soma' do @result = @calc.somaend Então /o resultado na calculadora deve ser (\d*)/ do |result| @result.should == result.to_iend

Thursday, June 4, 2009

Page 141: ERECOMPI

class SignupTest < ActionController::IntegrationTest

def test_trial_account_sign_up visit home_path click_link "Sign up" fill_in "Email", :with => "[email protected]" select "Free account" click_button "Register" end

end

Thursday, June 4, 2009

Page 142: ERECOMPI

rspec rspec.info

cucumber cukes.info

shoulda thoughtbot.com/projects/shoulda

webrat github.com/brynary/webrat

integrity integrityapp.com

ZenTest zenspider.com

Thursday, June 4, 2009

Page 143: ERECOMPI

• plugins de Active Record

• plugins de Views

• plugins de Localização

• CMS

• Parsers

• Autenticadores/Autorizadores

Thursday, June 4, 2009

Page 144: ERECOMPI

Comunidade

Thursday, June 4, 2009

Page 145: ERECOMPI

Geoffrey

peepcode.com

Thursday, June 4, 2009

Page 146: ERECOMPI

Jason e Gregg

railsenvy.com

Thursday, June 4, 2009

Page 147: ERECOMPI

Ryan Bates

railscasts.com

Thursday, June 4, 2009

Page 148: ERECOMPI

Pratik Naik

guias.rubyonrails.pro.br

Thursday, June 4, 2009

Page 149: ERECOMPI

Satish Talim

rubylearning.org

Thursday, June 4, 2009

Page 150: ERECOMPI

Peter Cooper

rubyinside.com.br

Thursday, June 4, 2009

Page 151: ERECOMPI

_why

why.nomedojogo.com

Thursday, June 4, 2009

Page 152: ERECOMPI

Thursday, June 4, 2009

Page 153: ERECOMPI

Thursday, June 4, 2009

Page 154: ERECOMPI

Thursday, June 4, 2009

Page 155: ERECOMPI

Thursday, June 4, 2009

Page 156: ERECOMPI

Thursday, June 4, 2009

Page 157: ERECOMPI

Thursday, June 4, 2009

Page 158: ERECOMPI

Uma pulga ...

Thursday, June 4, 2009

Page 159: ERECOMPI

Standish Group - CHAOS Report 2009

Thursday, June 4, 2009

Page 160: ERECOMPI

Sucesso32%

Fracasso Médio44%

Fracasso Total24%

Standish Group - CHAOS Report 2009

Thursday, June 4, 2009

Page 161: ERECOMPI

Winston W. Royce - 1970

Thursday, June 4, 2009

Page 162: ERECOMPI

“Eu acredito neste conceito mas a implementação descrita acima é arriscada

e convida falhas.”

Winston W. Royce - 1970

Thursday, June 4, 2009

Page 163: ERECOMPI

“Eu acredito neste conceito mas a implementação descrita acima é arriscada

e convida falhas.”

Winston W. Royce - 1970

Thursday, June 4, 2009

Page 164: ERECOMPI

“Eu acredito neste conceito mas a implementação descrita acima é arriscada

e convida falhas.”

Winston W. Royce - 1970

Thursday, June 4, 2009

Page 165: ERECOMPI

Insanidade

Thursday, June 4, 2009

Page 166: ERECOMPI

“Querer resultados

melhores fazendo a

mesma coisa.”

Thursday, June 4, 2009

Page 167: ERECOMPI

“Think Different”

Thursday, June 4, 2009

Page 168: ERECOMPI

“Think Different”

Thursday, June 4, 2009

Page 169: ERECOMPI

Obrigado!akitaonrails.com

Thursday, June 4, 2009