SlideShare une entreprise Scribd logo
1  sur  155
Télécharger pour lire hors ligne
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
www.slideshare.net/akitaonrails

                             fabio.akita@locaweb.com.br




Tuesday, December 15, 2009
Tuesday, December 15, 2009
Ruby on Rails             2.3
                         Ruby   1.8
        “Novo” Ruby             1.9


Tuesday, December 15, 2009
Ruby on Rails             2.3
                         Ruby   1.8
        “Novo” Ruby             1.9


Tuesday, December 15, 2009
Ruby on Rails             2.3
                         Ruby   1.8
        “Novo” Ruby             1.9


Tuesday, December 15, 2009
“Matz”


                             1993


Tuesday, December 15, 2009
“Prag Dave”

                             2001


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
Alan Kay




                                        Eu inventei o termo
                                            ‘orientação a
                                          objetos’, e posso
                                         lhes dizer que não
                                        estava pensando em
                                                 C++



Tuesday, December 15, 2009
Meta-programação


Tuesday, December 15, 2009
Sim, faz
                        praticamente
                            tudo

Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Demo


Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
Charles Nutter

                                2006


Tuesday, December 15, 2009
“DHH”


                             2004
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
@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, December 15, 2009
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, 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})"
               end
             end
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})"
               end
             end
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
                        end
                      end

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
                        end
                      end

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
                        end
                      end

Tuesday, December 15, 2009
190
                             vs
                             40


Tuesday, December 15, 2009
“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, December 15, 2009
“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, December 15, 2009
“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, December 15, 2009
“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, December 15, 2009
Ferramentas
                                Ágeis


Tuesday, December 15, 2009
Gitorious
       Repositórios
                                   Github
                                  Integrity
       Integração Contínua
                             Cruise Control
                                Capistrano
       Deployment
                                   Puppet

       Monitoramento             New Relic




Tuesday, December 15, 2009
Gitorious
       Repositórios
                                   Github
                                  Integrity
       Integração Contínua
                             Cruise Control
                                Capistrano
       Deployment
                                   Puppet

       Monitoramento             New Relic




Tuesday, December 15, 2009
Gitorious
       Repositórios
                                   Github
                                  Integrity
       Integração Contínua
                             Cruise Control
                                Capistrano
       Deployment
                                   Puppet

       Monitoramento             New Relic




Tuesday, December 15, 2009
Gitorious
       Repositórios
                                   Github
                                  Integrity
       Integração Contínua
                             Cruise Control
                                Capistrano
       Deployment
                                   Puppet

       Monitoramento             New Relic




Tuesday, December 15, 2009
Mitos?


Tuesday, December 15, 2009
Tuesday, December 15, 2009
Mais Produtivo
                              “Melhor”
                             Anti-legado

Tuesday, December 15, 2009
Sempre se Lembre




             Poderíamos contratar um Macaco Treinado
                     para 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
Fracasso Total       Sucesso
                                 24%               32%




                                 Fracasso Médio
                                      44%




                    Standish Group - CHAOS Report 2009
Tuesday, December 15, 2009
Quebre Regras!


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 Patton
Tuesday, December 15, 2009
crédito: Jeff Patton
Tuesday, December 15, 2009
crédito: Jeff Patton
Tuesday, December 15, 2009
crédito: Jeff Patton
Tuesday, December 15, 2009
crédito: Jeff Patton
Tuesday, December 15, 2009
crédito: Jeff Patton
Tuesday, December 15, 2009
crédito: Jeff Patton
Tuesday, December 15, 2009
crédito: Jeff Patton
Tuesday, December 15, 2009
crédito: Jeff Patton
Tuesday, December 15, 2009
crédito: Jeff Patton
Tuesday, December 15, 2009
crédito: Jeff Patton
Tuesday, December 15, 2009
“Soft”ware exige
                  té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 Session
            Properties props = new Properties();
            props.put("mail.smtp.host", _smtpHost);
            Session session = Session.getDefaultInstance(props, null);

            // create a message
            Address 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 newMessage
            Transport 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



                             Qualidade
                             Variável
              Prazo                      Custo



Tuesday, December 15, 2009
Qualidade



                              Escopo
                               Variável
              Prazo                       Custo



Tuesday, December 15, 2009
Qualidade



                              Escopo
                               Variável
              Prazo                       Custo



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
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
          end
        end


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
          end
        end


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
          end
        end


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
          end
        end


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
Produtividade
                             Cowboy    Profissional




Tuesday, December 15, 2009
Produtividade
                                   Cowboy                   Profissional

                70.00


                52.50
Produtividade




                35.00


                17.50


                   0
                        1      2     3      4           5          6      7   8
                                                Tempo




  Tuesday, December 15, 2009
Produtividade
                                   Cowboy                   Profissional

                70.00


                52.50
Produtividade




                35.00


                17.50


                   0
                        1      2     3      4           5          6      7   8
                                                Tempo




  Tuesday, December 15, 2009
Produtividade
                                   Cowboy                   Profissional

                70.00


                52.50
Produtividade




                35.00


                17.50


                   0
                        1      2     3      4           5          6      7   8
                                                Tempo




  Tuesday, December 15, 2009
Produtividade
                                   Cowboy                   Profissional

                70.00


                52.50
Produtividade




                35.00


                17.50


                   0
                        1      2     3      4           5          6      7   8
                                                Tempo




  Tuesday, December 15, 2009
Produtividade
                                   Cowboy                   Profissional

                70.00


                52.50
Produtividade




                35.00


                17.50


                   0
                        1      2     3      4           5          6      7   8
                                                Tempo




  Tuesday, December 15, 2009
Produtividade
                                   Cowboy                   Profissional

                70.00


                52.50
Produtividade




                35.00


                17.50


                   0
                        1      2     3      4           5          6      7   8
                                                Tempo




  Tuesday, December 15, 2009
Produtividade
                                   Cowboy                   Profissional

                70.00


                52.50
Produtividade




                35.00


                17.50


                   0
                        1      2     3      4           5          6      7   8
                                                Tempo




  Tuesday, December 15, 2009
Produtividade
                                   Cowboy                   Profissional

                70.00


                52.50
Produtividade




                35.00


                17.50


                   0
                        1      2     3      4           5          6      7   8
                                                Tempo




  Tuesday, December 15, 2009
Produtividade
                                   Cowboy                   Profissional

                70.00


                52.50
Produtividade




                35.00


                17.50


                   0
                        1      2     3      4           5          6      7   8
                                                Tempo




  Tuesday, December 15, 2009
Tuesday, December 15, 2009
Tuesday, December 15, 2009
237 Equipes
                   137 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
Tuesday, December 15, 2009
Obrigado!
                              akitaonrails.com
                             railssummit.com.br




Tuesday, December 15, 2009

Contenu connexe

En vedette

Publicity Dr. Shriniwas Kashalikar
Publicity Dr. Shriniwas KashalikarPublicity Dr. Shriniwas Kashalikar
Publicity Dr. Shriniwas Kashalikarbanothkishan
 
Family Deity (Kuladevata) Dr Shriniwas Kashalikar
Family Deity (Kuladevata) Dr  Shriniwas KashalikarFamily Deity (Kuladevata) Dr  Shriniwas Kashalikar
Family Deity (Kuladevata) Dr Shriniwas Kashalikarbanothkishan
 
Empowering Developers - MWC 2010
Empowering Developers - MWC 2010Empowering Developers - MWC 2010
Empowering Developers - MWC 2010Paul Golding
 
Whats Your Status Net 2.0 (Updates like Identi.ca)
Whats Your Status Net 2.0 (Updates like Identi.ca)Whats Your Status Net 2.0 (Updates like Identi.ca)
Whats Your Status Net 2.0 (Updates like Identi.ca)Jon Phillips
 
M U S I C A N D S U P E R H E A L T H D R
M U S I C  A N D  S U P E R H E A L T H  D RM U S I C  A N D  S U P E R H E A L T H  D R
M U S I C A N D S U P E R H E A L T H D Rbanothkishan
 
R E F E L C T I O N S A N D C R E A T I O N S Dr
R E F E L C T I O N S A N D  C R E A T I O N S  DrR E F E L C T I O N S A N D  C R E A T I O N S  Dr
R E F E L C T I O N S A N D C R E A T I O N S Drbanothkishan
 
R E V O L U T I O N D R
R E V O L U T I O N  D RR E V O L U T I O N  D R
R E V O L U T I O N D Rbanothkishan
 
F R E E D O M F R O M G O D D R
F R E E D O M  F R O M  G O D  D RF R E E D O M  F R O M  G O D  D R
F R E E D O M F R O M G O D D Rbanothkishan
 
基于J2 Ee的Web应用
基于J2 Ee的Web应用基于J2 Ee的Web应用
基于J2 Ee的Web应用yiditushe
 
Trends In Onderwijs 2010 en hun relevantie voor de Open Universiteit
Trends In Onderwijs 2010 en hun relevantie voor de Open UniversiteitTrends In Onderwijs 2010 en hun relevantie voor de Open Universiteit
Trends In Onderwijs 2010 en hun relevantie voor de Open UniversiteitSteven Verjans
 
Using Master Data in Business Intelligence
Using Master Data in Business IntelligenceUsing Master Data in Business Intelligence
Using Master Data in Business IntelligenceFindWhitePapers
 
Holistic Education, Economy And Health Dr
Holistic  Education,  Economy And  Health  DrHolistic  Education,  Economy And  Health  Dr
Holistic Education, Economy And Health Drbanothkishan
 
Diga draft session plan module 2
Diga draft session plan module 2Diga draft session plan module 2
Diga draft session plan module 2Dragan Danilovski
 
Oracle数据库中大型表查询优化研究
Oracle数据库中大型表查询优化研究Oracle数据库中大型表查询优化研究
Oracle数据库中大型表查询优化研究yiditushe
 
has_many_and_belongs_to_many
has_many_and_belongs_to_manyhas_many_and_belongs_to_many
has_many_and_belongs_to_manytutorialsruby
 
11 M Attacks Adrià Flores Moliner
11 M Attacks Adrià Flores Moliner11 M Attacks Adrià Flores Moliner
11 M Attacks Adrià Flores MolinerDaniversus
 
Mobile Device Sales Training
Mobile Device Sales TrainingMobile Device Sales Training
Mobile Device Sales Trainingemaginative
 

En vedette (20)

Publicity Dr. Shriniwas Kashalikar
Publicity Dr. Shriniwas KashalikarPublicity Dr. Shriniwas Kashalikar
Publicity Dr. Shriniwas Kashalikar
 
Dentelle
DentelleDentelle
Dentelle
 
Family Deity (Kuladevata) Dr Shriniwas Kashalikar
Family Deity (Kuladevata) Dr  Shriniwas KashalikarFamily Deity (Kuladevata) Dr  Shriniwas Kashalikar
Family Deity (Kuladevata) Dr Shriniwas Kashalikar
 
Empowering Developers - MWC 2010
Empowering Developers - MWC 2010Empowering Developers - MWC 2010
Empowering Developers - MWC 2010
 
Whats Your Status Net 2.0 (Updates like Identi.ca)
Whats Your Status Net 2.0 (Updates like Identi.ca)Whats Your Status Net 2.0 (Updates like Identi.ca)
Whats Your Status Net 2.0 (Updates like Identi.ca)
 
Audicion Mozart
Audicion MozartAudicion Mozart
Audicion Mozart
 
M U S I C A N D S U P E R H E A L T H D R
M U S I C  A N D  S U P E R H E A L T H  D RM U S I C  A N D  S U P E R H E A L T H  D R
M U S I C A N D S U P E R H E A L T H D R
 
R E F E L C T I O N S A N D C R E A T I O N S Dr
R E F E L C T I O N S A N D  C R E A T I O N S  DrR E F E L C T I O N S A N D  C R E A T I O N S  Dr
R E F E L C T I O N S A N D C R E A T I O N S Dr
 
Alfredo-PUMEX
Alfredo-PUMEXAlfredo-PUMEX
Alfredo-PUMEX
 
R E V O L U T I O N D R
R E V O L U T I O N  D RR E V O L U T I O N  D R
R E V O L U T I O N D R
 
F R E E D O M F R O M G O D D R
F R E E D O M  F R O M  G O D  D RF R E E D O M  F R O M  G O D  D R
F R E E D O M F R O M G O D D R
 
基于J2 Ee的Web应用
基于J2 Ee的Web应用基于J2 Ee的Web应用
基于J2 Ee的Web应用
 
Trends In Onderwijs 2010 en hun relevantie voor de Open Universiteit
Trends In Onderwijs 2010 en hun relevantie voor de Open UniversiteitTrends In Onderwijs 2010 en hun relevantie voor de Open Universiteit
Trends In Onderwijs 2010 en hun relevantie voor de Open Universiteit
 
Using Master Data in Business Intelligence
Using Master Data in Business IntelligenceUsing Master Data in Business Intelligence
Using Master Data in Business Intelligence
 
Holistic Education, Economy And Health Dr
Holistic  Education,  Economy And  Health  DrHolistic  Education,  Economy And  Health  Dr
Holistic Education, Economy And Health Dr
 
Diga draft session plan module 2
Diga draft session plan module 2Diga draft session plan module 2
Diga draft session plan module 2
 
Oracle数据库中大型表查询优化研究
Oracle数据库中大型表查询优化研究Oracle数据库中大型表查询优化研究
Oracle数据库中大型表查询优化研究
 
has_many_and_belongs_to_many
has_many_and_belongs_to_manyhas_many_and_belongs_to_many
has_many_and_belongs_to_many
 
11 M Attacks Adrià Flores Moliner
11 M Attacks Adrià Flores Moliner11 M Attacks Adrià Flores Moliner
11 M Attacks Adrià Flores Moliner
 
Mobile Device Sales Training
Mobile Device Sales TrainingMobile Device Sales Training
Mobile Device Sales Training
 

Similaire à Ceara On Rails 2009

Semcomp de São Carlos
Semcomp de São CarlosSemcomp de São Carlos
Semcomp de São CarlosFabio Akita
 
Latinoware Rails 2009
Latinoware Rails 2009Latinoware Rails 2009
Latinoware Rails 2009Fabio Akita
 
a Running Tour of Cloud Foundry
a Running Tour of Cloud Foundrya Running Tour of Cloud Foundry
a Running Tour of Cloud FoundryJoshua Long
 
Fórum de Software Livre do Serpro RJ 2009
Fórum de Software Livre do Serpro RJ 2009Fórum de Software Livre do Serpro RJ 2009
Fórum de Software Livre do Serpro RJ 2009Fabio Akita
 
Rails For Kids 2009
Rails For Kids 2009Rails For Kids 2009
Rails For Kids 2009Fabio Akita
 
Software livre e padrões abertos no desenvolvimento Web
Software livre e padrões abertos no desenvolvimento WebSoftware livre e padrões abertos no desenvolvimento Web
Software livre e padrões abertos no desenvolvimento WebFelipe Ribeiro
 
Asterisk, HTML5 and NodeJS; a world of endless possibilities
Asterisk, HTML5 and NodeJS; a world of endless possibilitiesAsterisk, HTML5 and NodeJS; a world of endless possibilities
Asterisk, HTML5 and NodeJS; a world of endless possibilitiesDan Jenkins
 
Cloud Foundry, Spring and Vaadin
Cloud Foundry, Spring and VaadinCloud Foundry, Spring and Vaadin
Cloud Foundry, Spring and VaadinJoshua Long
 
2009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
2009, o ano do Ruby on Rails no Brasil - CaelumDay 20092009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
2009, o ano do Ruby on Rails no Brasil - CaelumDay 2009Caue Guerra
 
DjangoCon 2009 Keynote
DjangoCon 2009 KeynoteDjangoCon 2009 Keynote
DjangoCon 2009 KeynoteTed Leung
 
Progressive Advancement, by way of progressive enhancement
Progressive Advancement, by way of progressive enhancementProgressive Advancement, by way of progressive enhancement
Progressive Advancement, by way of progressive enhancementPaul Irish
 
Spring in the Cloud - using Spring with Cloud Foundry
Spring in the Cloud - using Spring with Cloud FoundrySpring in the Cloud - using Spring with Cloud Foundry
Spring in the Cloud - using Spring with Cloud FoundryJoshua Long
 
Objective-C A Beginner's Dive
Objective-C A Beginner's DiveObjective-C A Beginner's Dive
Objective-C A Beginner's DiveAltece
 

Similaire à Ceara On Rails 2009 (14)

Semcomp de São Carlos
Semcomp de São CarlosSemcomp de São Carlos
Semcomp de São Carlos
 
Latinoware Rails 2009
Latinoware Rails 2009Latinoware Rails 2009
Latinoware Rails 2009
 
a Running Tour of Cloud Foundry
a Running Tour of Cloud Foundrya Running Tour of Cloud Foundry
a Running Tour of Cloud Foundry
 
Fórum de Software Livre do Serpro RJ 2009
Fórum de Software Livre do Serpro RJ 2009Fórum de Software Livre do Serpro RJ 2009
Fórum de Software Livre do Serpro RJ 2009
 
Claretiano 2009
Claretiano 2009Claretiano 2009
Claretiano 2009
 
Rails For Kids 2009
Rails For Kids 2009Rails For Kids 2009
Rails For Kids 2009
 
Software livre e padrões abertos no desenvolvimento Web
Software livre e padrões abertos no desenvolvimento WebSoftware livre e padrões abertos no desenvolvimento Web
Software livre e padrões abertos no desenvolvimento Web
 
Asterisk, HTML5 and NodeJS; a world of endless possibilities
Asterisk, HTML5 and NodeJS; a world of endless possibilitiesAsterisk, HTML5 and NodeJS; a world of endless possibilities
Asterisk, HTML5 and NodeJS; a world of endless possibilities
 
Cloud Foundry, Spring and Vaadin
Cloud Foundry, Spring and VaadinCloud Foundry, Spring and Vaadin
Cloud Foundry, Spring and Vaadin
 
2009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
2009, o ano do Ruby on Rails no Brasil - CaelumDay 20092009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
2009, o ano do Ruby on Rails no Brasil - CaelumDay 2009
 
DjangoCon 2009 Keynote
DjangoCon 2009 KeynoteDjangoCon 2009 Keynote
DjangoCon 2009 Keynote
 
Progressive Advancement, by way of progressive enhancement
Progressive Advancement, by way of progressive enhancementProgressive Advancement, by way of progressive enhancement
Progressive Advancement, by way of progressive enhancement
 
Spring in the Cloud - using Spring with Cloud Foundry
Spring in the Cloud - using Spring with Cloud FoundrySpring in the Cloud - using Spring with Cloud Foundry
Spring in the Cloud - using Spring with Cloud Foundry
 
Objective-C A Beginner's Dive
Objective-C A Beginner's DiveObjective-C A Beginner's Dive
Objective-C A Beginner's Dive
 

Plus de Fabio Akita

Devconf 2019 - São Carlos
Devconf 2019 - São CarlosDevconf 2019 - São Carlos
Devconf 2019 - São CarlosFabio Akita
 
Meetup Nerdzão - English Talk about Languages
Meetup Nerdzão  - English Talk about LanguagesMeetup Nerdzão  - English Talk about Languages
Meetup Nerdzão - English Talk about LanguagesFabio Akita
 
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018Fabio Akita
 
Desmistificando Blockchains - 20o Encontro Locaweb SP
Desmistificando Blockchains - 20o Encontro Locaweb SPDesmistificando Blockchains - 20o Encontro Locaweb SP
Desmistificando Blockchains - 20o Encontro Locaweb SPFabio Akita
 
Desmistificando Blockchains - Insiter Goiania
Desmistificando Blockchains - Insiter GoianiaDesmistificando Blockchains - Insiter Goiania
Desmistificando Blockchains - Insiter GoianiaFabio Akita
 
Blockchain em 7 minutos - 7Masters
Blockchain em 7 minutos - 7MastersBlockchain em 7 minutos - 7Masters
Blockchain em 7 minutos - 7MastersFabio Akita
 
Elixir -Tolerância a Falhas para Adultos - GDG Campinas
Elixir  -Tolerância a Falhas para Adultos - GDG CampinasElixir  -Tolerância a Falhas para Adultos - GDG Campinas
Elixir -Tolerância a Falhas para Adultos - GDG CampinasFabio Akita
 
Desmistificando Mitos de Tech Startups - Intercon 2017
Desmistificando Mitos de Tech Startups - Intercon 2017Desmistificando Mitos de Tech Startups - Intercon 2017
Desmistificando Mitos de Tech Startups - Intercon 2017Fabio Akita
 
30 Days to Elixir and Crystal and Back to Ruby
30 Days to Elixir and Crystal and Back to Ruby30 Days to Elixir and Crystal and Back to Ruby
30 Days to Elixir and Crystal and Back to RubyFabio Akita
 
Uma Discussão sobre a Carreira de TI
Uma Discussão sobre a Carreira de TIUma Discussão sobre a Carreira de TI
Uma Discussão sobre a Carreira de TIFabio Akita
 
THE CONF - Opening Keynote
THE CONF - Opening KeynoteTHE CONF - Opening Keynote
THE CONF - Opening KeynoteFabio Akita
 
A Journey through New Languages - Rancho Dev 2017
A Journey through New Languages - Rancho Dev 2017A Journey through New Languages - Rancho Dev 2017
A Journey through New Languages - Rancho Dev 2017Fabio Akita
 
Desmistificando Mitos de Startups - Sebrae - AP
Desmistificando Mitos de Startups - Sebrae - APDesmistificando Mitos de Startups - Sebrae - AP
Desmistificando Mitos de Startups - Sebrae - APFabio Akita
 
A Journey through New Languages - Guru Sorocaba 2017
A Journey through New Languages - Guru Sorocaba 2017A Journey through New Languages - Guru Sorocaba 2017
A Journey through New Languages - Guru Sorocaba 2017Fabio Akita
 
A Journey through New Languages - Insiter 2017
A Journey through New Languages - Insiter 2017A Journey through New Languages - Insiter 2017
A Journey through New Languages - Insiter 2017Fabio Akita
 
A Journey through New Languages - Locaweb Tech Day
A Journey through New Languages - Locaweb Tech DayA Journey through New Languages - Locaweb Tech Day
A Journey through New Languages - Locaweb Tech DayFabio Akita
 
A Journey through new Languages - Intercon 2016
A Journey through new Languages - Intercon 2016A Journey through new Languages - Intercon 2016
A Journey through new Languages - Intercon 2016Fabio Akita
 
Premature Optimization 2.0 - Intercon 2016
Premature Optimization 2.0 - Intercon 2016Premature Optimization 2.0 - Intercon 2016
Premature Optimization 2.0 - Intercon 2016Fabio Akita
 
Conexão Kinghost - Otimização Prematura
Conexão Kinghost - Otimização PrematuraConexão Kinghost - Otimização Prematura
Conexão Kinghost - Otimização PrematuraFabio Akita
 
The Open Commerce Conference - Premature Optimisation: The Root of All Evil
The Open Commerce Conference - Premature Optimisation: The Root of All EvilThe Open Commerce Conference - Premature Optimisation: The Root of All Evil
The Open Commerce Conference - Premature Optimisation: The Root of All EvilFabio Akita
 

Plus de Fabio Akita (20)

Devconf 2019 - São Carlos
Devconf 2019 - São CarlosDevconf 2019 - São Carlos
Devconf 2019 - São Carlos
 
Meetup Nerdzão - English Talk about Languages
Meetup Nerdzão  - English Talk about LanguagesMeetup Nerdzão  - English Talk about Languages
Meetup Nerdzão - English Talk about Languages
 
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
 
Desmistificando Blockchains - 20o Encontro Locaweb SP
Desmistificando Blockchains - 20o Encontro Locaweb SPDesmistificando Blockchains - 20o Encontro Locaweb SP
Desmistificando Blockchains - 20o Encontro Locaweb SP
 
Desmistificando Blockchains - Insiter Goiania
Desmistificando Blockchains - Insiter GoianiaDesmistificando Blockchains - Insiter Goiania
Desmistificando Blockchains - Insiter Goiania
 
Blockchain em 7 minutos - 7Masters
Blockchain em 7 minutos - 7MastersBlockchain em 7 minutos - 7Masters
Blockchain em 7 minutos - 7Masters
 
Elixir -Tolerância a Falhas para Adultos - GDG Campinas
Elixir  -Tolerância a Falhas para Adultos - GDG CampinasElixir  -Tolerância a Falhas para Adultos - GDG Campinas
Elixir -Tolerância a Falhas para Adultos - GDG Campinas
 
Desmistificando Mitos de Tech Startups - Intercon 2017
Desmistificando Mitos de Tech Startups - Intercon 2017Desmistificando Mitos de Tech Startups - Intercon 2017
Desmistificando Mitos de Tech Startups - Intercon 2017
 
30 Days to Elixir and Crystal and Back to Ruby
30 Days to Elixir and Crystal and Back to Ruby30 Days to Elixir and Crystal and Back to Ruby
30 Days to Elixir and Crystal and Back to Ruby
 
Uma Discussão sobre a Carreira de TI
Uma Discussão sobre a Carreira de TIUma Discussão sobre a Carreira de TI
Uma Discussão sobre a Carreira de TI
 
THE CONF - Opening Keynote
THE CONF - Opening KeynoteTHE CONF - Opening Keynote
THE CONF - Opening Keynote
 
A Journey through New Languages - Rancho Dev 2017
A Journey through New Languages - Rancho Dev 2017A Journey through New Languages - Rancho Dev 2017
A Journey through New Languages - Rancho Dev 2017
 
Desmistificando Mitos de Startups - Sebrae - AP
Desmistificando Mitos de Startups - Sebrae - APDesmistificando Mitos de Startups - Sebrae - AP
Desmistificando Mitos de Startups - Sebrae - AP
 
A Journey through New Languages - Guru Sorocaba 2017
A Journey through New Languages - Guru Sorocaba 2017A Journey through New Languages - Guru Sorocaba 2017
A Journey through New Languages - Guru Sorocaba 2017
 
A Journey through New Languages - Insiter 2017
A Journey through New Languages - Insiter 2017A Journey through New Languages - Insiter 2017
A Journey through New Languages - Insiter 2017
 
A Journey through New Languages - Locaweb Tech Day
A Journey through New Languages - Locaweb Tech DayA Journey through New Languages - Locaweb Tech Day
A Journey through New Languages - Locaweb Tech Day
 
A Journey through new Languages - Intercon 2016
A Journey through new Languages - Intercon 2016A Journey through new Languages - Intercon 2016
A Journey through new Languages - Intercon 2016
 
Premature Optimization 2.0 - Intercon 2016
Premature Optimization 2.0 - Intercon 2016Premature Optimization 2.0 - Intercon 2016
Premature Optimization 2.0 - Intercon 2016
 
Conexão Kinghost - Otimização Prematura
Conexão Kinghost - Otimização PrematuraConexão Kinghost - Otimização Prematura
Conexão Kinghost - Otimização Prematura
 
The Open Commerce Conference - Premature Optimisation: The Root of All Evil
The Open Commerce Conference - Premature Optimisation: The Root of All EvilThe Open Commerce Conference - Premature Optimisation: The Root of All Evil
The Open Commerce Conference - Premature Optimisation: The Root of All Evil
 

Dernier

DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024The Digital Insurer
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfOverkill Security
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKJago de Vreede
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusZilliz
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 

Dernier (20)

DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 

Ceara On Rails 2009

  • 2. Filoso a Ruby on Rails Tuesday, December 15, 2009
  • 15. www.slideshare.net/akitaonrails fabio.akita@locaweb.com.br Tuesday, December 15, 2009
  • 17. Ruby on Rails 2.3 Ruby 1.8 “Novo” Ruby 1.9 Tuesday, December 15, 2009
  • 18. Ruby on Rails 2.3 Ruby 1.8 “Novo” Ruby 1.9 Tuesday, December 15, 2009
  • 19. Ruby on Rails 2.3 Ruby 1.8 “Novo” Ruby 1.9 Tuesday, December 15, 2009
  • 20. “Matz” 1993 Tuesday, December 15, 2009
  • 21. “Prag Dave” 2001 Tuesday, December 15, 2009
  • 26. Orientação a Objetos? Tuesday, December 15, 2009
  • 28. Alan Kay Dan Ingalls Tuesday, December 15, 2009
  • 29. Alan Kay Eu inventei o termo ‘orientação a objetos’, e posso lhes dizer que não estava pensando em C++ Tuesday, December 15, 2009
  • 31. Sim, faz praticamente tudo Tuesday, December 15, 2009
  • 37. Charles Nutter 2006 Tuesday, December 15, 2009
  • 38. “DHH” 2004 Tuesday, December 15, 2009
  • 41. Ruby on Rails Tuesday, December 15, 2009
  • 42. Código que gera Código Convention over Con guration Extreme Programming Tuesday, December 15, 2009
  • 43. Código que gera Código Convention over Con guration Extreme Programming Tuesday, December 15, 2009
  • 44. Código que gera Código Convention over Con guration Extreme Programming Tuesday, December 15, 2009
  • 45. 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
  • 46. 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
  • 47. 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
  • 48. 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
  • 49. 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
  • 50. gem install rails Tuesday, December 15, 2009
  • 52. @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, December 15, 2009
  • 53. 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, December 15, 2009
  • 54. 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, December 15, 2009
  • 55. 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, December 15, 2009
  • 56. 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, December 15, 2009
  • 57. 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, December 15, 2009
  • 58. 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, December 15, 2009
  • 59. 190 vs 40 Tuesday, December 15, 2009
  • 60. “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, December 15, 2009
  • 61. “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, December 15, 2009
  • 62. “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, December 15, 2009
  • 63. “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, December 15, 2009
  • 64. Ferramentas Ágeis Tuesday, December 15, 2009
  • 65. Gitorious Repositórios Github Integrity Integração Contínua Cruise Control Capistrano Deployment Puppet Monitoramento New Relic Tuesday, December 15, 2009
  • 66. Gitorious Repositórios Github Integrity Integração Contínua Cruise Control Capistrano Deployment Puppet Monitoramento New Relic Tuesday, December 15, 2009
  • 67. Gitorious Repositórios Github Integrity Integração Contínua Cruise Control Capistrano Deployment Puppet Monitoramento New Relic Tuesday, December 15, 2009
  • 68. Gitorious Repositórios Github Integrity Integração Contínua Cruise Control Capistrano Deployment Puppet Monitoramento New Relic Tuesday, December 15, 2009
  • 71. Mais Produtivo “Melhor” Anti-legado Tuesday, December 15, 2009
  • 72. Sempre se Lembre Poderíamos contratar um Macaco Treinado para fazer seu Trabalho! Tuesday, December 15, 2009
  • 74. Como é feito um software? Tuesday, December 15, 2009
  • 80. Análise Codi cação Tuesday, December 15, 2009
  • 81. Programação “Compilação” Tuesday, December 15, 2009
  • 84. Standish Group - CHAOS Report 2009 Tuesday, December 15, 2009
  • 85. Fracasso Total Sucesso 24% 32% Fracasso Médio 44% Standish Group - CHAOS Report 2009 Tuesday, December 15, 2009
  • 88. Prazo Custo Tuesday, December 15, 2009
  • 89. Escopo Prazo Custo Tuesday, December 15, 2009
  • 92. Winston W. Royce - 1970 Tuesday, December 15, 2009
  • 93. “Eu acredito neste conceito mas a implementação descrita acima é arriscada e convida falhas.” Winston W. Royce - 1970 Tuesday, December 15, 2009
  • 94. “Eu acredito neste conceito mas a implementação descrita acima é arriscada e convida falhas.” Winston W. Royce - 1970 Tuesday, December 15, 2009
  • 95. “Eu acredito neste conceito mas a implementação descrita acima é arriscada e convida falhas.” Winston W. Royce - 1970 Tuesday, December 15, 2009
  • 96. crédito: Jeff Patton Tuesday, December 15, 2009
  • 97. crédito: Jeff Patton Tuesday, December 15, 2009
  • 98. crédito: Jeff Patton Tuesday, December 15, 2009
  • 99. crédito: Jeff Patton Tuesday, December 15, 2009
  • 100. crédito: Jeff Patton Tuesday, December 15, 2009
  • 101. crédito: Jeff Patton Tuesday, December 15, 2009
  • 102. crédito: Jeff Patton Tuesday, December 15, 2009
  • 103. crédito: Jeff Patton Tuesday, December 15, 2009
  • 104. crédito: Jeff Patton Tuesday, December 15, 2009
  • 105. crédito: Jeff Patton Tuesday, December 15, 2009
  • 106. crédito: Jeff Patton Tuesday, December 15, 2009
  • 107. “Soft”ware exige técnica e criatividade Tuesday, December 15, 2009
  • 110. // create some properties and get the default Session Properties props = new Properties(); props.put("mail.smtp.host", _smtpHost); Session session = Session.getDefaultInstance(props, null); // create a message Address 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 newMessage Transport transport = session.getTransport(SMTP_MAIL); transport.connect(_smtpHost, _user, _password); transport.sendMessage(newMessage, _toList); Tuesday, December 15, 2009
  • 111. 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
  • 112. Escopo Prazo Custo Tuesday, December 15, 2009
  • 113. Escopo Qualidade Variável Prazo Custo Tuesday, December 15, 2009
  • 114. Qualidade Escopo Variável Prazo Custo Tuesday, December 15, 2009
  • 115. Qualidade Escopo Variável Prazo Custo Tuesday, December 15, 2009
  • 117. Agilidade não é Rapidez Tuesday, December 15, 2009
  • 119. Robert C. Martin Tuesday, December 15, 2009
  • 123. Test Driven Development Tuesday, December 15, 2009
  • 125. 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, December 15, 2009
  • 126. 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, December 15, 2009
  • 127. 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, December 15, 2009
  • 128. 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, December 15, 2009
  • 130. 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
  • 131. 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
  • 134. Não é mais demorado? Tuesday, December 15, 2009
  • 135. Produtividade Cowboy Profissional Tuesday, December 15, 2009
  • 136. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 137. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 138. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 139. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 140. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 141. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 142. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 143. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 144. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Tuesday, December 15, 2009
  • 147. 237 Equipes 137 Finalizadas Tuesday, December 15, 2009
  • 149. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Tuesday, December 15, 2009
  • 150. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Tuesday, December 15, 2009
  • 151. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Tuesday, December 15, 2009
  • 152. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Tuesday, December 15, 2009
  • 155. Obrigado! akitaonrails.com railssummit.com.br Tuesday, December 15, 2009