dev in rio 2009

Post on 18-May-2015

1.445 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Minha palestra sobre Ruby on Rails, Cultura e Ecossistema na Dev in Rio 2009. Vejam alguns dos meus vídeos dessa palestra em http://vimeo.com/akitaonrails

TRANSCRIPT

Monday, September 14, 2009

Ruby on RailsMonday, September 14, 2009

AkitaOnRails.comslideshare.net/akitaonrails

Monday, September 14, 2009

Monday, September 14, 2009

> 100 slides< 1 hora

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Ruby on Rails 2.3

Ruby 1.8

“Novo” Ruby 1.9Monday, September 14, 2009

Ruby on Rails 2.3

Ruby 1.8

“Novo” Ruby 1.9Monday, September 14, 2009

Ruby on Rails 2.3

Ruby 1.8

“Novo” Ruby 1.9Monday, September 14, 2009

1993

“Matz”

Monday, September 14, 2009

Monday, September 14, 2009

2001

“Prag Dave”

Monday, September 14, 2009

Monday, September 14, 2009

2004“DHH”

Monday, September 14, 2009

Monday, September 14, 2009

07/2004 0.512/2005 1.003/2006 1.101/2007 1.212/2007 2.006/2008 2.111/2008 2.203/2009 2.32009? 3.0

Monday, September 14, 2009

Monday, September 14, 2009

2006

Charles Nutter

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

“Tornar as coisas simples fáceis e as coisas complexas

possíveis”

Filosofia Ruby

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Orientação a Objetos?

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

“Eu inventei o termo ʻorientação a

objetosʼ, e posso lhes dizer que eu

não estava pensando em C++.”

Monday, September 14, 2009

Meta-programação

Monday, September 14, 2009

Meta-apresentação

Monday, September 14, 2009

Monday, September 14, 2009

Ruby on Rails

Monday, September 14, 2009

Código que gera Código

Convention over Configuration

Don’t Repeat Yourself

Extreme Programming

Monday, September 14, 2009

Código que gera Código

Convention over Configuration

Don’t Repeat Yourself

Extreme Programming

Monday, September 14, 2009

Código que gera Código

Convention over Configuration

Don’t Repeat Yourself

Extreme Programming

Monday, September 14, 2009

Código que gera Código

Convention over Configuration

Don’t Repeat Yourself

Extreme Programming

Monday, September 14, 2009

Restful Resources

Unicode, Time Zone, i18n

Segurança (XSS, CSRF, Injection)

Rack Support (Middlewares)

Monday, September 14, 2009

Restful Resources

Unicode, Time Zone, i18n

Segurança (XSS, CSRF, Injection)

Rack Support (Middlewares)

Monday, September 14, 2009

Restful Resources

Unicode, Time Zone, i18n

Segurança (XSS, CSRF, Injection)

Rack Support (Middlewares)

Monday, September 14, 2009

Restful Resources

Unicode, Time Zone, i18n

Segurança (XSS, CSRF, Injection)

Rack Support (Middlewares)

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

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

Monday, September 14, 2009

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

Monday, September 14, 2009

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

Monday, September 14, 2009

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

Monday, September 14, 2009

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

Monday, September 14, 2009

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

Monday, September 14, 2009

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

Monday, September 14, 2009

<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

Monday, September 14, 2009

<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

Monday, September 14, 2009

<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

Monday, September 14, 2009

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 endend

Rotas RESTFul

Monday, September 14, 2009

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 endend

Rotas RESTFul

Monday, September 14, 2009

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 endend

Rotas RESTFul

Monday, September 14, 2009

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 endend

Rotas RESTFul

Monday, September 14, 2009

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 endend

Rotas RESTFul

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

Monday, September 14, 2009

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

Monday, September 14, 2009

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

Monday, September 14, 2009

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

Monday, September 14, 2009

“Beautiful Code”

Monday, September 14, 2009

//$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; }

Monday, September 14, 2009

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 + ")"; }

}

Monday, September 14, 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})" endend

Monday, September 14, 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})" endend

Monday, September 14, 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 endend

Monday, September 14, 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 endend

Monday, September 14, 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 endend

Monday, September 14, 2009

190vs40

Monday, September 14, 2009

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

Monday, September 14, 2009

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

Monday, September 14, 2009

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

Monday, September 14, 2009

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

Monday, September 14, 2009

Ferramentas Ágeis

Monday, September 14, 2009

Repositórios GitoriousGithub

Integração Contínua

IntegrityCruise Control

Deployment CapistranoPuppet

Monitoramento New Relic

Monday, September 14, 2009

Repositórios GitoriousGithub

Integração Contínua

IntegrityCruise Control

Deployment CapistranoPuppet

Monitoramento New Relic

Monday, September 14, 2009

Repositórios GitoriousGithub

Integração Contínua

IntegrityCruise Control

Deployment CapistranoPuppet

Monitoramento New Relic

Monday, September 14, 2009

Repositórios GitoriousGithub

Integração Contínua

IntegrityCruise Control

Deployment CapistranoPuppet

Monitoramento New Relic

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Comunidade

Monday, September 14, 2009

Geoffrey

peepcode.com

Monday, September 14, 2009

Jason e Gregg

railsenvy.com

Monday, September 14, 2009

Ryan Bates

railscasts.com

Monday, September 14, 2009

Satish Talim

rubylearning.org

Monday, September 14, 2009

Peter Cooper

rubyinside.com.br

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

O que dizempor aí ...

Monday, September 14, 2009

Pouco usado

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Rails não Escala

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 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

Monday, September 14, 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

Quando as pessoas caem em problemas de escalabilidade, normalmente acham que a

linguagem é o problema, mas eu acho que isso raramente é

a realidade.

Monday, September 14, 2009

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

Monday, September 14, 2009

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

Monday, September 14, 2009

Ruby é Lento

Monday, September 14, 2009

x mais lento que C++

Monday, September 14, 2009

0 50 100 150 200

Python 2

Ruby 1.9

Perl

JRuby

Python 3

PHP

Ruby 1.8.6

x mais lento que C++

Monday, September 14, 2009

Homepage: 331 ms

Monday, September 14, 2009

Homepage: 331 ms

Total: 5.45 sMonday, September 14, 2009

Monday, September 14, 2009

Performance!=

Escalabilidade

Monday, September 14, 2009

Outros Mitos?

Monday, September 14, 2009

Monday, September 14, 2009

Mais Produtivo

“Melhor”

Anti-legadoMonday, September 14, 2009

Monday, September 14, 2009

Agilidade

Monday, September 14, 2009

Monday, September 14, 2009

Robert C. Martin

Monday, September 14, 2009

“Uncle Bob”

Monday, September 14, 2009

Código Limpo

Monday, September 14, 2009

Monday, September 14, 2009

Test Driven Development

Monday, September 14, 2009

Monday, September 14, 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 endend

Monday, September 14, 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 endend

Monday, September 14, 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 endend

Monday, September 14, 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 endend

Monday, September 14, 2009

Monday, September 14, 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

Monday, September 14, 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

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

Não é mais demorado?

Monday, September 14, 2009

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

1 2 3 4 5 6 7 8 9 100

17.50

35.00

52.50

70.00

Produtividade

Tempo

Cowboy Profissional

Produtividade

Monday, September 14, 2009

Monday, September 14, 2009

Monday, September 14, 2009

237 Equipes137 Finalizadas

Monday, September 14, 2009

Monday, September 14, 2009

Empreendedorismo

Código e “Forma”

Ciclo de Vida de Projetos

Comunidade Open Source

Monday, September 14, 2009

Empreendedorismo

Código e “Forma”

Ciclo de Vida de Projetos

Comunidade Open Source

Monday, September 14, 2009

Empreendedorismo

Código e “Forma”

Ciclo de Vida de Projetos

Comunidade Open Source

Monday, September 14, 2009

Empreendedorismo

Código e “Forma”

Ciclo de Vida de Projetos

Comunidade Open Source

Monday, September 14, 2009

Monday, September 14, 2009

Profissionalismo

Monday, September 14, 2009

Monday, September 14, 2009

one more thing ...

Monday, September 14, 2009

2008Monday, September 14, 2009

2008Monday, September 14, 2009

13 e 14Outubro

2009Monday, September 14, 2009

Monday, September 14, 2009

Obrigado!akitaonrails.com

railssummit.com.br

Monday, September 14, 2009

top related