Post on 19-Oct-2014
description
Agilidade no Mundo Real
Christiano Milfont2010, João Pessoa-PBCopyleft 2010 Milfont.org
O que funcionou nos últimos 2 anos em
consultorias da Milfont Consulting... e como
melhorar!
Milfont Consulting
2006 - 2008
Desenvolvimento – Treinamento - MentoringResgate de Projetos - Code Review
O que é agilidade?
Estamos descobrindo maneiras melhores de desenvolver software fazendo-o nós mesmos e ajudando outros a fazê-lo.
O que é agilidade?
O que é agilidade?
Ciclo de vida de um Software
DesenvolvimentoDesenvolvimento ManutençãoManutenção
O que é agilidade?
Ciclo de vida de um Software
DesenvolvimentoDesenvolvimento ManutençãoManutenção
1º Deploy - Transição
O que é agilidade?
Business Modeling
Implementation
Test
Analysis & Design
Preliminary Iteration(s)
Iter.#1
Process Disciplines
Iterations
Iter.#2
Iter.#n
Iter.#n+1
Iter.#n+2
Iter.#m
Iter.#m+1
Deployment
Requirements
Elaboration TransitionInception Construction
O que é agilidade?
Business Modeling
Implementation
Test
Analysis & Design
Preliminary Iteration(s)
Iter.#1
Process Disciplines
Iterations
Iter.#2
Iter.#n
Iter.#n+1
Iter.#n+2
Iter.#m
Iter.#m+1
Deployment
Requirements
Elaboration TransitionInception Construction
BusinessBusiness RequirementsRequirements AnalysisAnalysis DesignDesign ImplementationImplementation TestTest DeploymentDeployment
O que é agilidade?
Business Modeling
Implementation
Test
Analysis & Design
Preliminary Iteration(s)
Iter.#1
Process Disciplines
Iterations
Iter.#2
Iter.#n
Iter.#n+1
Iter.#n+2
Iter.#m
Iter.#m+1
Deployment
Requirements
Elaboration TransitionInception Construction
BusinessBusiness RequirementsRequirements AnalysisAnalysis DesignDesign ImplementationImplementation TestTest DeploymentDeployment
O que é agilidade?
Business Modeling
Implementation
Test
Analysis & Design
Preliminary Iteration(s)
Iter.#1
Process Disciplines
Iterations
Iter.#2
Iter.#n
Iter.#n+1
Iter.#n+2
Iter.#m
Iter.#m+1
Deployment
Requirements
Elaboration TransitionInception Construction
BusinessBusiness RequirementsRequirements AnalysisAnalysis DesignDesign ImplementationImplementation TestTest DeploymentDeployment
Se mudar ou o processo for compreendido de forma errada?
O que é agilidade?
Business Modeling
Implementation
Test
Analysis & Design
Preliminary Iteration(s)
Process Disciplines
Deployment
Requirements
Elaboration TransitionInception Construction
BusinessBusiness RequirementsRequirements AnalysisAnalysis DesignDesign ImplementationImplementation TestTest DeploymentDeployment
Nunca há tempo suficiente ou está funcionando!
Iter.#1
Iterations
Iter.#2
Iter.#n
Iter.#n+1
Iter.#n+2
Iter.#m
Iter.#m+1
O que é agilidade?
Business Modeling
Implementation
Test
Analysis & Design
Preliminary Iteration(s)
Iter.#1
Process Disciplines
Iterations
Iter.#2
Iter.#n
Iter.#n+1
Iter.#n+2
Iter.#m
Iter.#m+1
Deployment
Requirements
Elaboration TransitionInception Construction
O que é agilidade?
Business Modeling
Implementation
Test
Analysis & Design
Preliminary Iteration(s)
Iter.#1
Process Disciplines
Iterations
Iter.#2
Iter.#n
Iter.#n+1
Iter.#n+2
Iter.#m
Iter.#m+1
Deployment
Requirements
Elaboration TransitionInception Construction
O que é agilidade?
Business Modeling
Implementation
Test
Analysis & Design
Preliminary Iteration(s)
Iter.#1
Process Disciplines
Iterations
Iter.#2
Iter.#n
Iter.#n+1
Iter.#n+2
Iter.#m
Iter.#m+1
Deployment
Requirements
Elaboration TransitionInception Construction
O que é agilidade?
Ciclo de vida de um Software
DesenvolvimentoDesenvolvimento ManutençãoManutenção
Fronteira de Transição não faz
mais sentido
Deploy Deploy Deploy
Deploy Deploy
Deploy DeployDeploy
O que é agilidade?
Business Modeling
Implementation
TestAnalysis & Design
Preliminary Iteration(s)
Iter.#1
Iterations
Iter.#2
Iter.#n
Iter.#n+1
Iter.#n+2
Iter.#m
Iter.#m+1
Deployment
Requirements
Elaboration TransitionInception ConstructionProcess Disciplines
Dar Ordem ao Caos
InformativeWorspace
Sit Together
Pair Programming
Whole Team
Energized Work
Move People Around
Stories
Share Code
O que é difícil?
Single Code Base
Dar Ordem ao Caos
Trabalho Energizado
Pair Programming
“Não é adequado para trabalhos repetitivos”“Não é adequado a todo momento”
Pair Programming
“Não é adequado para trabalhos repetitivos”“Não é adequado a todo momento”
DeployCreate, Insert...
Commit Push
Development
- 2 horas produtivas por dia, - R$
DeployCreate, Insert...
Commit Push
Development
Trabalhos repetitivos, aonde?
Deploy
Trabalhos repetitivos, aonde?
Create, Insert...
Commit Push
Development
Merge from Hell
Começou[cmilfont] /projetos/agilidadenomundoreal (master)$ git pull origin master
[cmilfont] /projetos/agilidadenomundoreal (master)$ git checkout -b feature-1 mastercodificando...[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git commit -a -m “bla bla bla”codificando...[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git commit -a -m “bla bla bla”
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git checkout master
[cmilfont] /projetos/agilidadenomundoreal (master)$ git pull origin master
[cmilfont] /projetos/agilidadenomundoreal (master)$ git checkout feature-1
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git rebase master feature-1codificando...[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git commit -a -m “bla bla bla”
Agora vai terminar
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git checkout master
[cmilfont] /projetos/agilidadenomundoreal (master)$ git pull origin master
[cmilfont] /projetos/agilidadenomundoreal (master)$ git checkout feature-1
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git rebase master feature-1
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git checkout master
[cmilfont] /projetos/agilidadenomundoreal (master)$ git merge --squash feature-1
[cmilfont] /projetos/agilidadenomundoreal (master)$ git commit -a -v
[cmilfont] /projetos/agilidadenomundoreal (master)$ git push origin master
Identificar padrão[cmilfont] /projetos/agilidadenomundoreal (master)$ git pull origin master
[cmilfont] /projetos/agilidadenomundoreal (master)$ git checkout -b feature-1 mastercodificando...[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git commit -a -m “bla bla bla”codificando...[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git commit -a -m “bla bla bla”
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git checkout master
[cmilfont] /projetos/agilidadenomundoreal (master)$ git pull origin master
[cmilfont] /projetos/agilidadenomundoreal (master)$ git checkout feature-1
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git rebase master feature-1codificando...[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git commit -a -m “bla bla bla”
Automatizar[cmilfont] /projetos/agilidadenomundoreal (master)$ hack feature-1
codificando...[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git commit -a -m “bla bla bla”codificando...[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git commit -a -m “bla bla bla”
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ sink
codificando...[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git commit -a -m “bla bla bla”
Já tenho parte Automatizada
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git checkout master
[cmilfont] /projetos/agilidadenomundoreal (master)$ git pull origin master
[cmilfont] /projetos/agilidadenomundoreal (master)$ git checkout feature-1
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git rebase master feature-1
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git checkout master
[cmilfont] /projetos/agilidadenomundoreal (master)$ git merge --squash feature-1
[cmilfont] /projetos/agilidadenomundoreal (master)$ git commit -a -v
[cmilfont] /projetos/agilidadenomundoreal (master)$ git push origin master
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ sink
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git checkout master
[cmilfont] /projetos/agilidadenomundoreal (master)$ git merge --squash feature-1
[cmilfont] /projetos/agilidadenomundoreal (master)$ git commit -a -v
[cmilfont] /projetos/agilidadenomundoreal (master)$ git push origin master
Identifico outra
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ sink
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ ship
Automatizo de novo
Automatizado[cmilfont] /projetos/agilidadenomundoreal (master)$ hack feature-1
codificando...[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git commit -a -m “bla bla bla”codificando...[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git commit -a -m “bla bla bla”
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ sink
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ rake spec
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ ship
[cmilfont] /projetos/agilidadenomundoreal (master)$ hack feature-2
codificando...[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git commit -a -m “bla bla bla”
Automatizado[cmilfont] /projetos/agilidadenomundoreal (master)$ hack feature-1
codificando...[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git commit -a -m “bla bla bla”codificando...[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git commit -a -m “bla bla bla”
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ sink
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ rake spec
[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ ship
[cmilfont] /projetos/agilidadenomundoreal (master)$ hack feature-2
codificando...[cmilfont] /projetos/agilidadenomundoreal (feature-1)$ git commit -a -m “bla bla bla”
Deploy
Trabalhos repetitivos, aonde?
Create, Insert...
Commit Push
Development
Merge from Hell i h8 SQL
Insano[cmilfont] /projetos/agilidadenomundoreal (master)$ script/servercodificando...falhou por não existir empresa como dependência...[cmilfont] /projetos/agilidadenomundoreal (master)$ script/consoleLoading development environment (Rails 2.3.5)>>empresa = Empresa.new :razao_social => “Milfont Consulting”, :nome_fantasia => “Milfont Consulting”=> #<Empresa id: 1, razao_social: “Milfont Consulting”, nome_fantasia: “Milfont Consulting”, endereco: nil, created_at: "2010-06-22 19:39:36", updated_at: "2010-06-22 19:39:36">>> empresa.save!=> true>> exit[cmilfont] /projetos/agilidadenomundoreal (master)$ script/servercodificando...
Perdedores de tempo
[cmilfont] /projetos/agilidadenomundoreal (master)$ pg_restore -h localhost -p 5432 -U postgres -d agilidade_development -l "/home/cmilfont/agilidade.backup"codificando...
Não consigo reproduzir, me passa o
banco!
Ok, vou colocar na pasta X
Ganhadores de tempo
[cmilfont] /projetos/agilidadenomundoreal (master)$ sink && rake db:reset && rake db:seed
Não consigo reproduzir, me passa o
banco!
Faz pull, roda o seed pois atualizei os dados
Deploy
Trabalhos repetitivos, aonde?
Create, Insert...
Commit Push
Development
Merge from Hell i h8 SQL Feedback
Daily Deployment
Deploy
Continuous Deployment
Daily Deployment
Deploy
Continuous Deployment
XP
Daily Deployment
Real Customer [and user] Involved
Deploy
Continuous Deployment
Vou deployar
[cmilfont] ~$ ssh cmilfont@192.168.0.10chrismilfont@milfont.org's password: Last login: Mon Jun 28 16:18:25 2010 from 192.168.0.10
cmilfont@192.168.0.10:/home/cmilfont$ cd /projeto
cmilfont@192.168.0.10:/projeto$ git pull
cmilfont@192.168.0.10:/projeto$ rake war
cmilfont@192.168.0.10:/projeto$ /etc/init.d/jetty stop
cmilfont@192.168.0.10:/projeto$ mysqldump --user=root --password=root --result-file=projeto.sql projeto
cmilfont@192.168.0.10:/projeto$ mv projeto.war /opt/webapps/
cmilfont@192.168.0.10:/projeto$ /etc/init.d/jetty start
Vou deployar
[cmilfont] ~$ ssh cmilfont@192.168.0.10chrismilfont@milfont.org's password: Last login: Mon Jun 28 16:18:25 2010 from 192.168.0.10
cmilfont@192.168.0.10:/home/cmilfont$ cd /projeto
cmilfont@192.168.0.10:/projeto$ git pull
cmilfont@192.168.0.10:/projeto$ rake war
cmilfont@192.168.0.10:/projeto$ /etc/init.d/jetty stop
cmilfont@192.168.0.10:/projeto$ mysqldump --user=root --password=root --result-file=projeto.sql projeto
cmilfont@192.168.0.10:/projeto$ mv projeto.war /opt/webapps/
cmilfont@192.168.0.10:/projeto$ /etc/init.d/jetty start
Há quem faça pior
Vou deployar
[cmilfont] ~$ cd /projeto
[cmilfont] ~/projeto (master)$ cap deploy
Deploy
Trabalhos repetitivos, aonde?
Create, Insert...
Commit Push
Development
Merge from Hell i h8 SQL
U need tests
Feedback
Se você não testa, está errado em todas as metodologias conhecidas
Testa
Codifica
TDD aumenta o tempo de entrega e o time tende a se desmotivar
Refatora
Testa
Codifica
BDD facilita o Test First mas não faz milagres
Refatora
Teste de Aceitação
Codifica Refatora
BDD é fácil de adotar mas ...
# language: ptFuncionalidade: Selecionar curriculo Como um empregador Eu quero selecionar um curriculo Para que eu possa organizar e listar os currículos recebidos que preferi
Contexto: Dado um curriculo enviado de "Christiano Milfont"
Cenário: Selecionar currículos Dado que eu estou logado como empregador E eu clicar em "Vagas abertas" E eu clicar em "Programador Rails" E eu clicar em "Currículos encaminhados" Quando eu selecionar o curriculo de "Christiano Milfont" Então o curriculo de "Christiano Milfont" deve estar na lista de selecionados
Testa
Codifica
Test First continua difícil
Refatora
Teste de Aceitação
Codifica Refatora
Fosso
Testa
Codifica
Test First continua difícil
Refatora
Teste de Aceitação
Codifica Refatora
Fosso
Imanutenível
Não há tempo suficiente
Princípio da Cobertura 100% de Clavius Tales
Quero 100%
Feature entregue
Cliente satisfeito
Done
100% cobertura
Feature em produção
Automatizar
Forçar testes
} Feedback diário
Pair Programming
“Não é adequado para trabalhos repetitivos”“Não é adequado a todo momento”
Trabalho Energizado
cap deployrake db:seed
Hack, Sink, ship
rake rcov:all
2 Features por dia, 40 por mês, + R$
Dar Caos a Ordem
phpJavaRuby
Arquitetura de referência
PhpDrupal
Plugins/temas
JavaJasper
Solr
RubyRails
Sunspot
Site com artigos, busca textual e relatórios
PhpDrupal
Plugins/temas
JavaJasper
Solr
RubyRails
Sunspot
Site com artigos, busca textual e relatóriosÉ possivel?
+ +
PMBOK de Jeans
Rup / XP / Scrum / Whatever
PMBOK
CMMi
PMBOK de Jeans
Rup / XP / Scrum / Whatever
PMBOK
CMMi
Rup / XP / Scrum / Whatever
Iteração
Release e Iteration Planning
Release
Condições de satisfação (user stories, budget, schedule)
Release Planning
Condições de satisfação (user stories + Acceptance Tests)
Iteration Planning
Desenvolvimento Incremento no produto
Release e Iteration Planning
# language: ptFuncionalidade: Selecionar curriculo Como um empregador Eu quero selecionar um curriculo Para que eu possa organizar e listar os currículos recebidos que preferi
Contexto: Dado um curriculo enviado de "Christiano Milfont"
Cenário: Selecionar currículos Dado que eu estou logado como empregador E eu clicar em "Vagas abertas" E eu clicar em "Programador Rails" E eu clicar em "Currículos encaminhados" Quando eu selecionar o curriculo de "Christiano Milfont" Então o curriculo de "Christiano Milfont" deve estar na lista de selecionados
Perguntas?