Desenvolvimento Ágil com Ruby on
        Rails na GoNow
             Rafael Rosa
           Ricardo Almeida
Quem Somos?
            Rafael Rosa          Ricardo Almeida
14 anos na área           Atua na área desde 2002. Atualmente trabalha
Ruby Inside Brasil        com projetos em Ruby on Rails. Escreve para os
Guru-SP                   blogs manifestonaweb.wordpress.com e
                          visaoagil.wordpress.com. Trabalha como editor
                          técnico do Infoq Brasil. Escreve para a revista
                          técnica Java Magazine.
Quem Somos?
            Rafael Rosa          Ricardo Almeida
14 anos na área           Atua na área desde 2002. Atualmente trabalha
Ruby Inside Brasil        com projetos em Ruby on Rails. Escreve para os
Guru-SP                   blogs manifestonaweb.wordpress.com e
                          visaoagil.wordpress.com. Trabalha como editor
                          técnico do Infoq Brasil. Escreve para a revista
                          técnica Java Magazine.
Vamos Experimentar!
               Try Ruby
    http://tryruby.sophrinix.com/
O Que é Ruby

• Desde 1995
• Simples, poderosa e expressiva
• Orientada a Objetos
• Dinâmica e fortemente tipada
Por que Ruby?
O que é Ruby on Rails?

• Framework web
• Criado em 2004
• David Heinemeier Hanson
• Vulgo: DHH
O que é Ruby on Rails?

• Framework web
• Criado em 2004
• David Heinemeier Hanson
• Vulgo: DHH
• Ele tinha 21 anos
O que é Ruby on Rails?
• MVC (Model View Controller)
O que é Ruby on Rails?
• Convention over configuration
 • Pronta para ser usada (full stack)
 • Estrutura
 • ORM - ActiveRecord
 • Javascript - Prototype
O que é Agilidade
O que é Agilidade
Scrum
Por que Rails?
• Produtividade
 • E no início havia o Java...
   • XML
   • Complexo
 • Práticas ágeis
 • Mais resultado em menos tempo
Por que Rails?
• Código de boa qualidade
 • Boa cobertura de Testes
 • Flexibilidade
 • Fácil manutenção
 • DRY
 • Pensado para a web
Exemplos Reais
• Social
• Goin-ads
Como fazemos? Testes
Rspec
describe Account do
  context "transfering money" do
    it "deposits transfer amount to the other account" do
      source = Account.new(50, :USD)
      target = mock('target account')
      target.should_receive(:deposit).with(Money.new(5, :USD))
      source.transfer(5, :USD).to(target)
    end

    it "reduces its balance by the transfer amount" do
      source = Account.new(50, :USD)
      target = stub('target account')
      source.transfer(5, :USD).to(target)
      source.balance.should == Money.new(45, :USD)
    end
  end
end
Cucumber
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
Cucumber
Funcionalidade: Cadastrar Business Owner
  Como product owner
  Desejo que os donos de cada negócio se cadastrem
  De modo que consiga segmentar seus dados
 
  Cenário: Padrão
    Dado que estou na página de cadastro
    Quando preencher o email com labs@gonow.com.br
    E clicar Enviar
    Então devo ver a mensagem "Bem vindo ao Goin-Ads"
    E devo ver o token na tela
    E devo ver o email na tela
Remarkable
describe Advertise do
  should_belong_to :business_owner
  should_validate_presence_of :business_owner
  should_have_one :local
  should_have_many :dynamic_attributes,
                   :dependent => :destroy
end
Como Fazemos?
• Ferramentas
 • Kanban
 • Pivotal
 • Git - Versionamento de Código
 • Continuous Integration (Signal)
 • Hoptoad
 • New Relic
Como? InheritedResources
   class PerfisController < ApplicationController
     def index
       @perfis = Perfil.all

       respond_to do |format|
         format.html # index.html.erb
         format.xml  { render :xml => @perfis }
       end
     end

     def show
       @perfil = Perfil.find(params[:id])

       respond_to do |format|
         format.html # show.html.erb
         format.xml  { render :xml => @perfil }
       end
     end

     def new
       @perfil = Perfil.new

       respond_to do |format|
         format.html # new.html.erb
         format.xml  { render :xml => @perfil }
       end
     end
    
     def edit
       @perfil = Perfil.find(params[:id])
     end
     .......
Como? InheritedResources

class PerfisController < InheritedResources::Base
  respond_to :html, :xml
end
Como?


• HTML => HAML
• CSS => LESS
Resultado



• Cobertura de Testes
• Duplicação
• Complexidade
Resultado
•   ROI - Return Over Investment
    •   Entregar antes
    •   Entregar o que importa
Resultado

• Reviews
 • Melhoria Contínua
 • Comunicação
Resultado

• Retrospectiva
 • Inspecionar e Adaptar
 • Aprender
 • Motivação
 • Linha do Tempo
Resultado
• Documentação
 • Viva
 • Útil
 • Atualizada
 • Executável
• Cucumber
Serve para mim?
Serve para mim?
Serve para mim?
• Programação poliglota
 • Melhora habilidades em todas
• Integração com o mundo corporativo
Serve para mim?
• Programação poliglota
 • Melhora habilidades em todas
• Integração com o mundo corporativo
E agora?
•   Fácil de aprender
•   Comunidade
    •   Rails Guides
    •   Github
    •   Ruby Inside Brasil
    •   Ruby Onda
    •   Guru-SP
    •   Listas e fóruns
    •   Vídeos e Screencasts
E agora?
•   Fácil de aprender
•   Comunidade
    •   Rails Guides
    •   Github
    •   Ruby Inside Brasil
    •   Ruby Onda
    •   Guru-SP
    •   Listas e fóruns
    •   Vídeos e Screencasts
E agora?
•   Fácil de aprender
•   Comunidade
    •   Rails Guides
    •   Github
    •   Ruby Inside Brasil
    •   Ruby Onda
    •   Guru-SP
    •   Listas e fóruns
    •   Vídeos e Screencasts
E agora?
•   Fácil de aprender
•   Comunidade
    •   Rails Guides
    •   Github
    •   Ruby Inside Brasil
    •   Ruby Onda
    •   Guru-SP
    •   Listas e fóruns
    •   Vídeos e Screencasts
E agora?
•   Fácil de aprender
•   Comunidade
    •   Rails Guides
    •   Github
    •   Ruby Inside Brasil
    •   Ruby Onda
    •   Guru-SP
    •   Listas e fóruns
    •   Vídeos e Screencasts
Obrigado!
• http://www.gonow.com.br/treinamentos
• http://manifestonaweb.wordpress.com
• @almeidaricardo
• @rafaelrosafu
• ricardoluiz1.almeida@gmail.com
• rafaelrosafu@gmail.com

Palestra Fatec

  • 1.
    Desenvolvimento Ágil comRuby on Rails na GoNow Rafael Rosa Ricardo Almeida
  • 2.
    Quem Somos? Rafael Rosa Ricardo Almeida 14 anos na área Atua na área desde 2002. Atualmente trabalha Ruby Inside Brasil com projetos em Ruby on Rails. Escreve para os Guru-SP blogs manifestonaweb.wordpress.com e visaoagil.wordpress.com. Trabalha como editor técnico do Infoq Brasil. Escreve para a revista técnica Java Magazine.
  • 3.
    Quem Somos? Rafael Rosa Ricardo Almeida 14 anos na área Atua na área desde 2002. Atualmente trabalha Ruby Inside Brasil com projetos em Ruby on Rails. Escreve para os Guru-SP blogs manifestonaweb.wordpress.com e visaoagil.wordpress.com. Trabalha como editor técnico do Infoq Brasil. Escreve para a revista técnica Java Magazine.
  • 4.
    Vamos Experimentar! Try Ruby http://tryruby.sophrinix.com/
  • 5.
    O Que éRuby • Desde 1995 • Simples, poderosa e expressiva • Orientada a Objetos • Dinâmica e fortemente tipada
  • 6.
  • 7.
    O que éRuby on Rails? • Framework web • Criado em 2004 • David Heinemeier Hanson • Vulgo: DHH
  • 8.
    O que éRuby on Rails? • Framework web • Criado em 2004 • David Heinemeier Hanson • Vulgo: DHH • Ele tinha 21 anos
  • 11.
    O que éRuby on Rails? • MVC (Model View Controller)
  • 12.
    O que éRuby on Rails? • Convention over configuration • Pronta para ser usada (full stack) • Estrutura • ORM - ActiveRecord • Javascript - Prototype
  • 13.
    O que éAgilidade
  • 14.
    O que éAgilidade
  • 16.
  • 17.
    Por que Rails? •Produtividade • E no início havia o Java... • XML • Complexo • Práticas ágeis • Mais resultado em menos tempo
  • 18.
    Por que Rails? •Código de boa qualidade • Boa cobertura de Testes • Flexibilidade • Fácil manutenção • DRY • Pensado para a web
  • 19.
  • 20.
  • 21.
    Rspec describe Account do context "transfering money" do it "deposits transfer amount to the other account" do source = Account.new(50, :USD) target = mock('target account') target.should_receive(:deposit).with(Money.new(5, :USD)) source.transfer(5, :USD).to(target) end it "reduces its balance by the transfer amount" do source = Account.new(50, :USD) target = stub('target account') source.transfer(5, :USD).to(target) source.balance.should == Money.new(45, :USD) end end end
  • 22.
    Cucumber Funcionalidade: Adição   Para evitarerros 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
  • 23.
    Cucumber Funcionalidade: Cadastrar BusinessOwner   Como product owner   Desejo que os donos de cada negócio se cadastrem   De modo que consiga segmentar seus dados     Cenário: Padrão     Dado que estou na página de cadastro     Quando preencher o email com labs@gonow.com.br     E clicar Enviar     Então devo ver a mensagem "Bem vindo ao Goin-Ads" E devo ver o token na tela E devo ver o email na tela
  • 24.
    Remarkable describe Advertise do  should_belong_to :business_owner   should_validate_presence_of :business_owner   should_have_one :local   should_have_many :dynamic_attributes,                    :dependent => :destroy end
  • 25.
    Como Fazemos? • Ferramentas • Kanban • Pivotal • Git - Versionamento de Código • Continuous Integration (Signal) • Hoptoad • New Relic
  • 33.
    Como? InheritedResources class PerfisController < ApplicationController   def index     @perfis = Perfil.all     respond_to do |format|       format.html # index.html.erb       format.xml  { render :xml => @perfis }     end   end   def show     @perfil = Perfil.find(params[:id])     respond_to do |format|       format.html # show.html.erb       format.xml  { render :xml => @perfil }     end   end   def new     @perfil = Perfil.new     respond_to do |format|       format.html # new.html.erb       format.xml  { render :xml => @perfil }     end   end     def edit     @perfil = Perfil.find(params[:id])   end   .......
  • 34.
    Como? InheritedResources class PerfisController< InheritedResources::Base respond_to :html, :xml end
  • 35.
    Como? • HTML =>HAML • CSS => LESS
  • 36.
    Resultado • Cobertura deTestes • Duplicação • Complexidade
  • 37.
    Resultado • ROI - Return Over Investment • Entregar antes • Entregar o que importa
  • 38.
    Resultado • Reviews •Melhoria Contínua • Comunicação
  • 39.
    Resultado • Retrospectiva •Inspecionar e Adaptar • Aprender • Motivação • Linha do Tempo
  • 40.
    Resultado • Documentação •Viva • Útil • Atualizada • Executável • Cucumber
  • 41.
  • 42.
  • 43.
    Serve para mim? •Programação poliglota • Melhora habilidades em todas • Integração com o mundo corporativo
  • 44.
    Serve para mim? •Programação poliglota • Melhora habilidades em todas • Integração com o mundo corporativo
  • 45.
    E agora? • Fácil de aprender • Comunidade • Rails Guides • Github • Ruby Inside Brasil • Ruby Onda • Guru-SP • Listas e fóruns • Vídeos e Screencasts
  • 46.
    E agora? • Fácil de aprender • Comunidade • Rails Guides • Github • Ruby Inside Brasil • Ruby Onda • Guru-SP • Listas e fóruns • Vídeos e Screencasts
  • 47.
    E agora? • Fácil de aprender • Comunidade • Rails Guides • Github • Ruby Inside Brasil • Ruby Onda • Guru-SP • Listas e fóruns • Vídeos e Screencasts
  • 48.
    E agora? • Fácil de aprender • Comunidade • Rails Guides • Github • Ruby Inside Brasil • Ruby Onda • Guru-SP • Listas e fóruns • Vídeos e Screencasts
  • 49.
    E agora? • Fácil de aprender • Comunidade • Rails Guides • Github • Ruby Inside Brasil • Ruby Onda • Guru-SP • Listas e fóruns • Vídeos e Screencasts
  • 50.
    Obrigado! • http://www.gonow.com.br/treinamentos • http://manifestonaweb.wordpress.com •@almeidaricardo • @rafaelrosafu • ricardoluiz1.almeida@gmail.com • rafaelrosafu@gmail.com