Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br




     Extreme Programming
@rodrigobranas
   rodrigo.branas@gmail.com

Formação Acadêmica
Ciências da Computação – UFSC
Gerenciamento de Projetos - FGV

Certificações

SCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM
Rodrigo Branas – rodrigo.branas@gmail.com
10 anos de experiência na plataforma Java
1000 horas em sala de aula
Mais de 50 palestras em eventos

Líder da área de desenvolvimento na Gennera
Autor da revista Java Magazine
Palestrante
Instrutor da Academia Java e Agile da Globalcode
Criador dos treinamentos de Clean Code, Selenium e
Maven da Agile Code

Trabalhou com as empresas:
EDS, HP, GM, Citibank, OnCast, Globalcode, V.Office, Dígitr
o, Softplan, Unimed, Suntech, Vale do Rio
1995 – Projeto C3
Chrysler Comprehensive Compensation
Payroll System
Migrar a base de código legada
escrita em COBOL e integrar com
         outros sistemas
Com a complexidade, a situação
ficou caótica e o software instável
Kent Beck
 (Criador do Extreme
    Programming)

É chamado para ajudar
   a salvar o projeto!
Parando de cavar...
Praticamente todo o código
foi jogado fora!
Reescrever tudo em menos
    tempo e com metade
da equipe trabalhando de forma
          diferente!
O conjunto de práticas
    propostas por Kent para
escrever o código deram origem
   ao Extreme Programming
Entre as principais práticas
     utilizadas estão:

Pair Programming
Entre as principais práticas
     utilizadas estão:

Pair Programming
TDD
Entre as principais práticas
     utilizadas estão:

Pair Programming
TDD
Refactoring
Entre as principais práticas
     utilizadas estão:

Pair Programming
TDD
Refactoring
Build automatizado
Entre as principais práticas
     utilizadas estão:

Pair Programming
TDD
Refactoring
Build automatizado
Integração contínua
Em 1997 o Projeto C3 foi para
produção! Mais de 10.000
funcionários foram pagos por
meio do novo software!
Extreme Programming
é uma mudança social!
Abandonar velhos hábitos
Foco em técnicas de
programação
Na comunicação aberta e direta!
Muito trabalho em equipe!
Buscando a excelência em
desenvolvimento de software
Como fica o Extreme Programming
no contexto da agilidade em geral?
Valores do Extreme Programming
Comunicação
Face-a-face
Simplicidade
YAGNI
(You Ain’t Gonna Need It)
YAGNI (You Ain’t Gonna Need It)

Tempo gasto adicionando, testando e
corrigindo novas funcionalidades.
Tempo gasto adicionando novas
 funcionalidades são apenas a
       ponta do iceberg!
YAGNI (You Ain’t Gonna Need It)

Tempo gasto adicionando, testando e
corrigindo novas funcionalidades.
Novas funcionalidades precisam ser
debugadas, documentadas e suportadas.
YAGNI (You Ain’t Gonna Need It)

Tempo gasto adicionando, testando e
corrigindo novas funcionalidades.
Novas funcionalidades precisam ser
debugadas, documentadas e suportadas.
Seu código ocupa espaço e aumenta a
complexidade do software como um todo.
YAGNI (You Ain’t Gonna Need It)

Tempo gasto adicionando, testando e
corrigindo novas funcionalidades.
Novas funcionalidades precisam ser
debugadas, documentadas e suportadas.
Seu código ocupa espaço e aumenta a
complexidade do software como um todo.
Novas funcionalidades geram novas
necessidades e o Snowball Effect.
Cuidado com o Snowball Effect
O caso da Agenda
    Telefônica
Feedback
Fail Fast
Perdendo as chaves...
Coragem
Assumir responsabilidades
Trabalhar de formas diferentes
Se adaptar as mudanças
Reconhecer as falhas
“Não importa o quão longe você
 andou na direção errada, volte
       imediatamente.”

       (Provérbio turco)
Primary Practices
Sit Together
Desenvolver software envolve o
         aprendizado
Compartilhar o conhecimento
Barreiras na comunicação
Times distribuidos podem ser ágeis?
Whole Team
Que tipo de profissionais são
        necessários?
Problemas na comunicação entre
       diferentes setores
Teoria das restrições
Equipes multi-disciplinares!
Diferença entre equipes e pessoas
        multi-disciplinares
Informative Workspace
Irradiadores de informação
Ferramentas Eletrônicas x Físicas
Energized Work
Desenvolvimento envolve estimular
a criatividade, idéias e o raciocínio
Condições ideais de trabalho
Produtividade x Carga Horária
Horário fixo para entrar e sair
Baixa motivação com o trabalho
Ficou doente?
Pair Programming
Piloto + Copiloto
Será que a velocidade do projeto
         será reduzida?
Era uma vez um cliente: “Sem pair
programming por favor!”
Onde está o gargalo no
desenvolvimento de software?
O caso dos digitadores
Vantagens do Pair Programming:

 Código de melhor qualidade
Vantagens do Pair Programming:

 Código de melhor qualidade
 Aumento do foco
Vantagens do Pair Programming:

 Código de melhor qualidade
 Aumento do foco
 Disseminação de conhecimento
 na equipe
Vantagens do Pair Programming:

 Código de melhor qualidade
 Aumento do foco
 Disseminação de conhecimento
 na equipe
 Melhora na produtividade
É obrigatório trabalhar em par
     durante todo o dia?
Técnica do Pomodoro!
Escolha a tarefa
Acerte o seu Pomodoro para 25
           minutos
Trabalhe até o fim do Pomodoro
Faça um intervalo de 5 minutos
A cada 4 Pomodoros faça um
intervalo longo de 15 a 20 minutos
A importância da rotação dos
           pares
Dica: Não se apaixone pelo seu par!
Slack
“Aliviar a tensão”

   (Babylon)
Problemas com o overcommitment
Frustração por não atingir a meta!
Atolado?
É necessário finalizar todas as user
  stories para atingir uma meta?
Decompor as user stories deixando
 os detalhes menos importantes
           para o final
Incluir tarefas técnicas importantes
  mas que possam ser canceladas
Reservar um tempo livre caso seja
       necessário utilizá-lo
Ten-Minute Build
Ainda existe build manual?
Tarefas mecânicas e repetitivas
     são desperdício puro!
Desperdício Puro


Desperdício Incidental




          Valor
Gestão de dependências
Ao baixar o código do repositório
  pela primeira vez, funciona?
Por que realizar o build em no
máximo “10 minutos”?
Se demorar demais o build
 começará a ser evitado
Perda da oportunidade de feedback
Exercício: Quanto tempo dura o
build em seu ambiente atual? O que
  pode ser feito para melhorá-lo?
Estratégias para reduzir a demora
       no processo de build:

  Modularizar o build
Estratégias para reduzir a demora
       no processo de build:

  Modularizar o build
  Distribuir ou delegar a execução
  do build (CI)
Estratégias para reduzir a demora
       no processo de build:

  Modularizar o build
  Distribuir ou delegar a execução
  do build (CI)
  Otimizar os testes
Estratégias para reduzir a demora
       no processo de build:

  Modularizar o build
  Distribuir ou delegar a execução
  do build (CI)
  Otimizar os testes
  Utilizar a base se possível em
  memória
Continuous Integration
Feedback integrado e
    instantâneo!
Desenvolvendo uma cultura
     “Stop-the-line”
Por que eu não realizo esse
processo apenas na minha própria
           maquina?
Evitando a síndrome do...
Última versão
sempre pronta
para o cliente!
Ferramentas para integração
         contínua
Test-First Programming
Qual é a vantagem de escrever o
          teste antes?
Escopo limitado evita escrever
  código além do necessário
Acoplamento e coesão
Confiança no código
Ganhando ritmo
Teste, Código e Refactoring
Métricas
Como é a cobertura de testes dos
softwares em que vocês trabalham
           atualmente?
Incremental Design
Investir apenas o necessário para
 implementar as funcionalidades
Como evitar que o projeto da
aplicação vire uma bagunça?
Refactoring
As práticas primárias são
    responsáveis pela base da
comunicação e feedback. Os times
 podem usá-las para aumentar a
 confiança e a competência para
construir relacionamentos dentro e
            fora do time.
Corollary Practices
O que aconteceria se você
 começasse a realizar o Daily
Deployment tendo uma taxa de
     defeitos ainda alta?

As práticas a seguir devem ser
utilizadas quando a confiança
      estiver consolidada.
Real customer involvement
Metáfora do Alfaiate
O que são clientes reais?
Agile Anti-Pattern: Customer Proxy
Fábrica de salsichas
Beta testers
Incremental Deployment
Antecipar o ROI
Guiar o desenvolvimento do
produto com base em feedbacks
Mitigar riscos na hora de virar a
              chave
Definindo uma versão mínima para
       colocar em produção
Cuidado com o resultado caso o
   produto esteja muito crú
Sistemas legados
Vai doer!
Team Continuity
“Value in software is created not
 only just by people know and do
but also by their relationships and
 what they accomplish together.”
            (Kent Beck)
Problemas nas empresas grandes
Move people around!
Shrinking Teams
Qual é o tamanho ideal de uma
           equipe?
Manter a capacidade produtiva
reduzindo o tamanho da equipe
Root-Cause Analysis
Eliminar a causa raiz do defeito
Escreva um teste que evidencie o
            defeito
Corrija o defeito
Descubra porque o defeito foi
inserido chegando a sua causa raiz
Trabalhe na causa raiz previnindo a
ocorrência de defeito semelhantes
Shared Code
De quem é a responsabilidade pelo
       código produzido?
Ao encontrar um defeito, corrija!
Quais são os problemas
relacionados a falta de compartilhar
 a responsabilidade sobre o código
          fonte? (10 min.)
Code and Tests
Os únicos artefatos criados são
       código e testes
Toda documentação precisa ser
          gerada
Single Code Base
Por que utilizar um SCM
(Source Code Management)?

   CVS, SVN, SourceSafe, ...
Apenas medo de perder os
        dados?
Quando e como são realizados
    commits de código?
A importância do versionamento a
          cada commit
Baby Steps
Always shippable code!
Estratégias de branching
Nunca criar branches
Prós:

Fácil de seguir
Prós:

Fácil de seguir
Menos barreiras para novos
desenvolvedores
Prós:

Fácil de seguir
Menos barreiras para novos
desenvolvedores
Ninguém precisa saber criar
branches
Contras:

Baseline pode se tornar instável
a qualquer momento
Contras:

Baseline pode se tornar instável
a qualquer momento
Desenvolvimento caótico
Sempre criar branches
Prós:

Baseline sempre estável
Prós:

Baseline sempre estável
Nenhum desenvolvedor precisa
manter código em suas
maquinas por muito tempo
Contras:

Desenvolvedores isolados
Contras:

Desenvolvedores isolados
Criação de muitos conflitos
Contras:

Desenvolvedores isolados
Criação de muitos conflitos
Muito tempo gasto com merges
Estratégia híbrida
(também conhecida como bom senso)
Regras:

1. O código do baseline deve
   sempre passar nos testes
Regras:

1. O código do baseline deve
   sempre passar nos testes
2. Uma operação de commit
   não pode ser muito grande
   ao ponto de desestimular a
   revisão de um colega
Daily Deployment
Quanto maior a distância entre o
  que está em produção e em
desenvolvimento maior é o risco!
Quais são as maiores dificuldades
  para viabilizar essa prática?
Riscos:

Baixo número de defeitos
Riscos:

Baixo número de defeitos
Ambiente totalmente
automatizado
Riscos:

Baixo número de defeitos
Ambiente totalmente
automatizado
Estratégias de recovery
Ambiente de Stagging
Negotiated Scope Contract
A maioria dos projetos fracassam!
                    (Standish Chaos Report – 2009)
24% são simplesmente cancelados!
                   (Standish Chaos Report – 2009)
44% fora do prazo, custo ou escopo!
                     (Standish Chaos Report – 2009)
Apenas 32% tem sucesso!
              (Standish Chaos Report – 2009)
Sucesso?
Quantos % do Microsoft Word você
        realmente utiliza?
A maioria das funcionalidades não
          são utilizadas!
Por que?
Necessidade de segurança!
Quanto custa?
Quando fica pronto?
Tentando prever o futuro!
Fechar o escopo para tentar
responder a essas perguntas!
Qual é o maior risco de um projeto
          de software?
Não era nada disso que eu queria!
O que toda essa segurança
        garante?
A quantidade de dinheiro que
poderá ser jogada fora no final do
             projeto!
Tipos de Contrato
Contrato de Tempo e Material
Alto risco para o cliente
Fornecedor não tem incentivo
   para finalizar o escopo
Custos fora de controle
Desentendimentos constantes
entre o cliente e o fornecedor
Contrato de Preço Fixo
Alto custo para montar o contrato
Risco por conta do fornecedor
Engessado
Qualidade pode ser negligenciada
       em caso de atrasos
Contratos Híbridos
Custos parcialmente fixos e
    adicional reduzido

           Exemplo:

80hs com 200 reais por hora =16k

   8k fixo e 100 reais por hora
Pré-Pago

Um orçamento é definido no início
         do projeto.

   Conforme as entregas vão
 acontecendo, um determinado
      valor é descontado.
Preço Fixo por Release

XP - Extreme Programming