OPET 2009

Post on 18-May-2015

570 views 1 download

Tags:

description

Ruby on Rails e Agilidade, na OPET de Curitiba, dia 13/nov.

transcript

Tuesday, December 15, 2009

Filoso!a Ruby on Rails

Tuesday, December 15, 2009

AkitaOnRails.com

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Ruby on Rails 2.3

Ruby 1.8

“Novo” Ruby 1.9Tuesday, December 15, 2009

Ruby on Rails 2.3

Ruby 1.8

“Novo” Ruby 1.9Tuesday, December 15, 2009

Ruby on Rails 2.3

Ruby 1.8

“Novo” Ruby 1.9Tuesday, December 15, 2009

1993“Matz”

Tuesday, December 15, 2009

2001“Prag Dave”

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Orientação a Objetos?

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Alan Kay Dan Ingalls

Tuesday, December 15, 2009

Eu inventei o termo ‘orientação a

objetos’, e posso lhes dizer que não

estava pensando em C++

Alan Kay

Tuesday, December 15, 2009

Meta-programação

Tuesday, December 15, 2009

Meta-apresentação

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Sim, faz praticamente

tudo

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

2006Charles Nutter

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

2004“DHH”

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Ruby on Rails

Tuesday, December 15, 2009

Código que gera Código

Convention over Con!guration

Extreme Programming

Tuesday, December 15, 2009

Código que gera Código

Convention over Con!guration

Extreme Programming

Tuesday, December 15, 2009

Código que gera Código

Convention over Con!guration

Extreme Programming

Tuesday, December 15, 2009

Restful Resources

Unicode, Time Zone, i18n

Segurança (XSS, CSRF, Injection)

Suporte a vários bancos de dados

Envio/Recebimento de e-mails

Tuesday, December 15, 2009

Restful Resources

Unicode, Time Zone, i18n

Segurança (XSS, CSRF, Injection)

Suporte a vários bancos de dados

Envio/Recebimento de e-mails

Tuesday, December 15, 2009

Restful Resources

Unicode, Time Zone, i18n

Segurança (XSS, CSRF, Injection)

Suporte a vários bancos de dados

Envio/Recebimento de e-mails

Tuesday, December 15, 2009

Restful Resources

Unicode, Time Zone, i18n

Segurança (XSS, CSRF, Injection)

Suporte a vários bancos de dados

Envio/Recebimento de e-mails

Tuesday, December 15, 2009

Restful Resources

Unicode, Time Zone, i18n

Segurança (XSS, CSRF, Injection)

Suporte a vários bancos de dados

Envio/Recebimento de e-mails

Tuesday, December 15, 2009

gem install rails

Tuesday, December 15, 2009

“Beautiful Code”

Tuesday, December 15, 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; }

Tuesday, December 15, 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 + ")"; }

}

Tuesday, December 15, 2009

class Booking < ActiveRecord::Base belongs_to :hotel belongs_to :user validates_presence_of :hotel validates_presence_of :user validates_presence_of :credit_card validates_presence_of :credit_card_name validates_length_of :credit_card, :within => 16..16 validates_format_of :credit_card, :with => /^\\d*$/ validates_length_of :credit_card_name, :within => 3..70 def total hotel.price * nights end def nights ((checkout_date - checkin_date) / 1.day).round end def to_s "Booking(#{user},#{hotel})" endend

Tuesday, December 15, 2009

class Booking < ActiveRecord::Base belongs_to :hotel belongs_to :user validates_presence_of :hotel validates_presence_of :user validates_presence_of :credit_card validates_presence_of :credit_card_name validates_length_of :credit_card, :within => 16..16 validates_format_of :credit_card, :with => /^\\d*$/ validates_length_of :credit_card_name, :within => 3..70 def total hotel.price * nights end def nights ((checkout_date - checkin_date) / 1.day).round end def to_s "Booking(#{user},#{hotel})" endend

Tuesday, December 15, 2009

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

t.timestamps end end

def self.down drop_table :bookings endend

Tuesday, December 15, 2009

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

t.timestamps end end

def self.down drop_table :bookings endend

Tuesday, December 15, 2009

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

t.timestamps end end

def self.down drop_table :bookings endend

Tuesday, December 15, 2009

190vs

40

Tuesday, December 15, 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.”

Tuesday, December 15, 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.”

Tuesday, December 15, 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.”

Tuesday, December 15, 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.”

Tuesday, December 15, 2009

Ferramentas Ágeis

Tuesday, December 15, 2009

Repositórios GitoriousGithub

Integração Contínua IntegrityCruise Control

Deployment CapistranoPuppet

Monitoramento New Relic

Tuesday, December 15, 2009

Repositórios GitoriousGithub

Integração Contínua IntegrityCruise Control

Deployment CapistranoPuppet

Monitoramento New Relic

Tuesday, December 15, 2009

Repositórios GitoriousGithub

Integração Contínua IntegrityCruise Control

Deployment CapistranoPuppet

Monitoramento New Relic

Tuesday, December 15, 2009

Repositórios GitoriousGithub

Integração Contínua IntegrityCruise Control

Deployment CapistranoPuppet

Monitoramento New Relic

Tuesday, December 15, 2009

O que dizempor aí ...

Tuesday, December 15, 2009

Pouco usado

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Rails não Escala

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Para colocar as coisas em perspectiva, o Friendster foi

escrito em Java e eles mudaram para PHP.

MySpace foi escrito em ColdFusion e eles mudaram

para ASP.NET.

Blaine Cook

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

Tuesday, December 15, 2009

Para colocar as coisas em perspectiva, o Friendster foi

escrito em Java e eles mudaram para PHP.

MySpace foi escrito em ColdFusion e eles mudaram

para ASP.NET.

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.

Tuesday, December 15, 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.”

Tuesday, December 15, 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.”

Tuesday, December 15, 2009

Outros Mitos?

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Mais Produtivo

“Melhor”

Anti-legadoTuesday, December 15, 2009

Sempre se Lembre

Poderíamos contratar um Macaco Treinadopara fazer seu Trabalho!

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Como é feito um software?

Tuesday, December 15, 2009

“Engenharia”

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Análise Codi!cação

Tuesday, December 15, 2009

Programação “Compilação”

Tuesday, December 15, 2009

“Codi!cador”

Tuesday, December 15, 2009

“Arquiteto”

Tuesday, December 15, 2009

Standish Group - CHAOS Report 2009

Tuesday, December 15, 2009

Sucesso32%

Fracasso Médio44%

Fracasso Total24%

Standish Group - CHAOS Report 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Prazo Custo

Tuesday, December 15, 2009

Escopo

Prazo Custo

Tuesday, December 15, 2009

Futuro Previsível?

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Winston W. Royce - 1970

Tuesday, December 15, 2009

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

arriscada e convida falhas.”

Winston W. Royce - 1970

Tuesday, December 15, 2009

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

arriscada e convida falhas.”

Winston W. Royce - 1970

Tuesday, December 15, 2009

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

arriscada e convida falhas.”

Winston W. Royce - 1970

Tuesday, December 15, 2009

crédito: Jeff PattonTuesday, December 15, 2009

crédito: Jeff PattonTuesday, December 15, 2009

crédito: Jeff PattonTuesday, December 15, 2009

crédito: Jeff PattonTuesday, December 15, 2009

crédito: Jeff PattonTuesday, December 15, 2009

crédito: Jeff PattonTuesday, December 15, 2009

crédito: Jeff PattonTuesday, December 15, 2009

crédito: Jeff PattonTuesday, December 15, 2009

crédito: Jeff PattonTuesday, December 15, 2009

crédito: Jeff PattonTuesday, December 15, 2009

crédito: Jeff PattonTuesday, December 15, 2009

“Soft”ware exigetécnica e

criatividade

Tuesday, December 15, 2009

Trabalho Previsível?

Tuesday, December 15, 2009

Tuesday, December 15, 2009

// create some properties and get the default SessionProperties props = new Properties();props.put("mail.smtp.host", _smtpHost);Session session = Session.getDefaultInstance(props, null); // create a messageAddress replyToList[] = { new InternetAddress(replyTo) };Message newMessage = new MimeMessage(session);if (_fromName != null) newMessage.setFrom(new InternetAddress(from, _fromName + " on behalf of " + replyTo));else newMessage.setFrom(new InternetAddress(from)); newMessage.setReplyTo(replyToList); newMessage.setRecipients(Message.RecipientType.BCC, _toList); newMessage.setSubject(subject); newMessage.setSentDate(sentDate); // send newMessageTransport transport = session.getTransport(SMTP_MAIL);transport.connect(_smtpHost, _user, _password);transport.sendMessage(newMessage, _toList);

Tuesday, December 15, 2009

new EmailMessage() .from("demo@guilhermechapiewski.com") .to("destination@address.com") .withSubject("Fluent Mail API") .withBody("Demo message") .send();

crédito: Guilherme Chapiewski

Tuesday, December 15, 2009

Escopo

Prazo Custo

Tuesday, December 15, 2009

Escopo

Prazo Custo

QualidadeVariável

Tuesday, December 15, 2009

Qualidade

Prazo Custo

EscopoVariável

Tuesday, December 15, 2009

Qualidade

Prazo Custo

EscopoVariável

Tuesday, December 15, 2009

Agilidade

Tuesday, December 15, 2009

Agilidade NÃO é Rapidez

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Robert C. Martin

Tuesday, December 15, 2009

“Uncle Bob”

Tuesday, December 15, 2009

Código Limpo

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Test Driven Development

Tuesday, December 15, 2009

Tuesday, December 15, 2009

describe BankAccount do before :each do @bank_account = BankAccount.new :balance => 250 end it "should not be valid" do @bank_account.should be_valid end it "should transfer funds successfully" do @bank_account.should_receive(:transfer) .with_args(:amount => 100) .and_return(true) @bank_account.execute_transaction(:amount => 100) @bank_account.balance.should == 150 endend

Tuesday, December 15, 2009

describe BankAccount do before :each do @bank_account = BankAccount.new :balance => 250 end it "should not be valid" do @bank_account.should be_valid end it "should transfer funds successfully" do @bank_account.should_receive(:transfer) .with_args(:amount => 100) .and_return(true) @bank_account.execute_transaction(:amount => 100) @bank_account.balance.should == 150 endend

Tuesday, December 15, 2009

describe BankAccount do before :each do @bank_account = BankAccount.new :balance => 250 end it "should not be valid" do @bank_account.should be_valid end it "should transfer funds successfully" do @bank_account.should_receive(:transfer) .with_args(:amount => 100) .and_return(true) @bank_account.execute_transaction(:amount => 100) @bank_account.balance.should == 150 endend

Tuesday, December 15, 2009

describe BankAccount do before :each do @bank_account = BankAccount.new :balance => 250 end it "should not be valid" do @bank_account.should be_valid end it "should transfer funds successfully" do @bank_account.should_receive(:transfer) .with_args(:amount => 100) .and_return(true) @bank_account.execute_transaction(:amount => 100) @bank_account.balance.should == 150 endend

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Funcionalidade: Adição Para evitar erros bobos Como um péssimo matemático Eu quero saber como somar dois números Cenário: Adicionar dois números Dado que eu digitei 50 na calculadora E que eu digitei 70 na calculadora Quando eu aperto o botão de soma Então o resultado na calculadora deve ser 120

Tuesday, December 15, 2009

Funcionalidade: Adição Para evitar erros bobos Como um péssimo matemático Eu quero saber como somar dois números Cenário: Adicionar dois números Dado que eu digitei 50 na calculadora E que eu digitei 70 na calculadora Quando eu aperto o botão de soma Então o resultado na calculadora deve ser 120

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Não é mais demorado?

Tuesday, December 15, 2009

Cowboy Profissional Ágil

Produtividade

Tuesday, December 15, 2009

1 2 3 4 5 6 7 80

17.50

35.00

52.50

70.00

Prod

utiv

idad

e

Tempo

Cowboy Profissional Ágil

Produtividade

Tuesday, December 15, 2009

1 2 3 4 5 6 7 80

17.50

35.00

52.50

70.00

Prod

utiv

idad

e

Tempo

Cowboy Profissional Ágil

Produtividade

Tuesday, December 15, 2009

1 2 3 4 5 6 7 80

17.50

35.00

52.50

70.00

Prod

utiv

idad

e

Tempo

Cowboy Profissional Ágil

Produtividade

Tuesday, December 15, 2009

1 2 3 4 5 6 7 80

17.50

35.00

52.50

70.00

Prod

utiv

idad

e

Tempo

Cowboy Profissional Ágil

Produtividade

Tuesday, December 15, 2009

1 2 3 4 5 6 7 80

17.50

35.00

52.50

70.00

Prod

utiv

idad

e

Tempo

Cowboy Profissional Ágil

Produtividade

Tuesday, December 15, 2009

1 2 3 4 5 6 7 80

17.50

35.00

52.50

70.00

Prod

utiv

idad

e

Tempo

Cowboy Profissional Ágil

Produtividade

Tuesday, December 15, 2009

1 2 3 4 5 6 7 80

17.50

35.00

52.50

70.00

Prod

utiv

idad

e

Tempo

Cowboy Profissional Ágil

Produtividade

Tuesday, December 15, 2009

1 2 3 4 5 6 7 80

17.50

35.00

52.50

70.00

Prod

utiv

idad

e

Tempo

Cowboy Profissional Ágil

Produtividade

Tuesday, December 15, 2009

1 2 3 4 5 6 7 80

17.50

35.00

52.50

70.00

Prod

utiv

idad

e

Tempo

Cowboy Profissional Ágil

Produtividade

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Tuesday, December 15, 2009

237 Equipes137 Finalizadas

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Empreendedorismo

Código e “Forma”

Ciclo de Vida de Projetos

Comunidade Open Source

Tuesday, December 15, 2009

Empreendedorismo

Código e “Forma”

Ciclo de Vida de Projetos

Comunidade Open Source

Tuesday, December 15, 2009

Empreendedorismo

Código e “Forma”

Ciclo de Vida de Projetos

Comunidade Open Source

Tuesday, December 15, 2009

Empreendedorismo

Código e “Forma”

Ciclo de Vida de Projetos

Comunidade Open Source

Tuesday, December 15, 2009

Pro!ssionalismo

Tuesday, December 15, 2009

Quebre Regras!

Tuesday, December 15, 2009

Tuesday, December 15, 2009

Obrigado!akitaonrails.com

railssummit.com.br

Tuesday, December 15, 2009