Escolar Documentos
Profissional Documentos
Cultura Documentos
CDU 004.457XP
Programação
e trema
(XP)
e plicada
Acolha as mudanças
Tradução:
Adriana Picoral Sarandy Machado
Natália Nunes Pinto Lopes
Versão impressa
desta obra: 2004
2008
Obra originalmente publicada sob o título
Extreme programing explained: embrace change, 1/e
Kent Beck
© 2000, Addison-Wesley
ISBN: 0-201-61641-6
Muitas das designações utilizadas por fabricantes ou vendedores para distinguir seus pro-
dutos são marcas registradas. Das que tínhamos ciência, foram impressas com letra inicial
maiúscula, ou com todas as letras maiúsculas.
O autor e a editora dedicaram-se na preparação deste documento, mas não oferecem
qualquer tipo de garantia expressa ou implícita e não assumem responsabilidade por
eventuais erros ou omissões. Nenhuma responsabilidade é assumida por danos aciden-
tais ou conseqüentes associados ou originados do uso das informações ou dos programas
aqui contidos.
SÃO PAULO
Av. Angélica, 1091 - Higienópolis
01227-100 São Paulo SP
Fone (11) 3665-1100 Fax (11) 3667-1333
IMPRESSO NO BRASIL
PRINTED IN BRAZIL
Ao meu Pai
Obrigado a Cindee Andrews, minha mulher e companheira, por
insistir que eu a ignorasse e escrevesse. Obrigado a Bethany, Lin-
coln, Lindsey, Forrest e Joelle por abrirem mão de passar tempo co-
migo a fim de que eu pudesse digitar.
AGRADECIMENTOS
E
screvo em primeira pessoa aqui não porque estas sejam as minhas idéias, mas
porque esta é a minha perspectiva sobre essas idéias. A maioria das práticas da
XP são tão velhas quanto a programação.
Ward Cunningham é minha fonte imediata de muito do que você lerá aqui. De
muitas formas, eu passei os últimos 15 anos tentando explicar para outras pessoas o
que ele faz com naturalidade. Agradeço a Ron Jeffries por experimentar as práticas
(de XP) e torná-las muito melhores. Agradeço a Martin Fowler por explicá-las de ma-
neira não assustadora. Agradeço a Erich Gamma pelas longas conversas diante dos
cisnes no rio Limmat e por não me deixar pensar de forma medíocre. E ainda, nada
disto teria acontecido se eu não tivesse observado meu pai, Doug Beck, exercer seu
ofício de programador por todos esses anos.
Agradeço ao time C3 da Chrysler por me seguir pela montanha e então me ultra-
passar no caminho do topo. E agradeço especialmente aos nossos gerentes Sue Un-
ger e Ron Savage pela coragem de nos dar a chance de tentar.
Agradeço à Daedalos Consulting por apoiar a elaboração deste livro.
O prêmio de melhor revisor vai para Paul Chisholm por seus comentários ricos,
abrangentes, cuidadosos e muitas vezes simplesmente chatos. Este livro não seria
metade do que é sem o seu feedback.
Eu realmente gostei de interagir com todos os meus revisores. Bem, pelo menos
eles me ajudaram enormemente. Não há como agradecê-los o suficiente por revisar
a versão 1.0 da minha prosa, alguns deles em língua estrangeira. Agradeço (listados
na ordem aleatória em que li suas revisões) Greg Hutchinson, Massimo Arnoldi, Da-
ve Cleal, Sames Schuster, Don Wells, Joshua Kerievsky, Thorsten Dittmar, Moritz
Becker, Daniel Gubler, Christoph Henrici, Thomas Zang, Dierk Koenig, Miroslav No-
viii AGRADECIMENTOS
vak, Rodney Ryan, Frank Westphal, Paul Trunz, Steve Hayes, Kevin Bradtke, Jeani-
ne De Guzman, Tom Kubit, Falk Bruegmann, Hasko Heinecke, Peter Merel, Rob
Mee, Pete McBreen, Thomas Ernst, Guido Haechler, Dieter Holz, Martin Knecht,
Dierk König, Dirk Krampe, Patrick Lisser, Elisabeth Maier, Thomas Mancini, Alexio
Moreno, Rolf Pfenninger e Matthias Ressel.
A P R E S E N TA Ç Ã O
A
Programação eXtrema (XP) define a codificação como a principal atividade de
um projeto de software. É impossível que isso funcione!
*N. de T. Best practices, traduzido neste livro por práticas-modelo, tem o significado de práticas confiáveis que foram
validadas e consolidadas por experimentos.
x PREFÁCIO
Erich Gamma
PREFÁCIO
E
ste livro é sobre Programação eXtrema (XP). A XP é uma metodologia leve para
times de tamanho pequeno a médio, que desenvolvem software em face a requi-
sitos vagos que se modificam rapidamente. Este livro pretende ajudá-lo a deci-
dir se a XP serve para você.
Para algumas pessoas, a XP parece ser apenas bom senso. Então por que o “eXtre-
ma” no nome? A XP leva princípios e práticas do senso comum a níveis extremos:
Na primeira vez em que eu articulei a XP, eu tinha uma imagem mental de botões em
uma mesa de controle. Cada botão representava uma prática que, por experiência, eu
xii PREFÁCIO
sabia que funcionava bem. Eu giraria todos os botões para o máximo e veria o que ia
acontecer. Fiquei um tanto surpreso ao descobrir que o conjunto das práticas era es-
tável, previsível e flexível.
A XP faz dois conjuntos de promessas:
Este Livro
Este livro fala sobre o que está por detrás da XP – suas raízes, filosofia, histórias, mi-
tos. Ele pretende ajudá-lo a tomar uma decisão consciente quanto a usar ou não a XP
em seu projeto. Se você ler este livro e decidir corretamente não usar XP em seu pro-
jeto, eu terei atingido meu objetivo tanto quanto se você decidir corretamente usá-la.
Um segundo objetivo deste livro é ajudar aqueles entre vocês que já estão usando XP
a entendê-la melhor.
Este não é um livro sobre como precisamente aplicar a Programação eXtrema. Vo-
cê não encontrará aqui uma pilha de checklists, nem lerá muitos exemplos ou muitas
histórias de programação. Para isso, você precisará procurar na rede, conversar com
alguns dos treinadores aqui mencionados, esperar pelos livros mais detalhados, do
tipo “como fazer”, ou simplesmente inventar sua própria versão.
O próximo passo da aceitação da XP está nas mãos de um grupo de pessoas (vo-
cê pode ser uma delas) que estão insatisfeitas com o desenvolvimento de software co-
mo ele é praticado atualmente. Você quer uma maneira melhor de desenvolver soft-
ware, quer melhores relacionamentos com seus clientes, quer programadores mais fe-
lizes, estáveis e produtivos. Em resumo, você está procurando maior retorno e não
está com medo de experimentar novas idéias para obtê-lo. Mas se você vai correr o
risco, você prefere ser convencido de que não está simplesmente sendo estúpido.
A XP pede que você faça as coisas de forma diferente. Às vezes, a orientação da
XP é completamente contrária ao senso comum. Eu até espero que aqueles que esco-
lhem a XP exijam razões convincentes para fazer as coisas diferentemente, mas se as
razões existem, espero que eles simplesmente sigam em frente. Eu escrevi este livro
para lhe dar essas razões.
PREFÁCIO xiii
O que é a XP?
O que é a XP? A XP é uma maneira leve, eficiente, de baixo risco, flexível, previsível,
científica e divertida de desenvolver software. Ela se distingue das outras metodolo-
gias por:
O Suficiente
Nos livros The Forest People e The Mountain People, o antropólogo Colin Turnbull des-
creve duas sociedades contrastantes. Nas montanhas, os recursos eram escassos, e as
pessoas estavam sempre à beira da inanição. A cultura desenvolvida por eles era hor-
xiv PREFÁCIO
rível. Mães abandonavam seus bebês para bandos nômades de crianças selvagens
tão-logo tivessem uma pequena chance de sobreviver. Violência, brutalidade e trai-
ção eram a ordem do dia.
Por outro lado, a floresta tinha muitos recursos. Uma pessoa gastava apenas meia
hora por dia cuidando de suas necessidades básicas. A cultura da floresta era exata-
mente o oposto da cultura das montanhas. Adultos compartilhavam a criação das
crianças, que eram alimentadas e amadas até que fossem capazes de cuidar de si pró-
prias. Se uma pessoa matasse outra por acidente (homicídio intencional era desco-
nhecido), ela era exilada, mas precisava se afastar apenas um pouco no interior da
floresta e apenas por uns poucos meses, e mesmo assim outros integrantes da tribo
lhe levavam comida.
A XP é um experimento em resposta à pergunta: “Como você programaria se ti-
vesse tempo suficiente?”. Na verdade, você não pode ter tempo extra, porque, no fim
das contas, estamos tratando de negócios e certamente estamos jogando para ganhar.
Mas se você tivesse tempo suficiente, escreveria testes; você reestruturaria o sistema
quando aprendesse algo novo; conversaria muito com seus colegas programadores e
com o cliente.
Tal “mentalidade de suficiência” é humana, ao contrário do cruel e penoso traba-
lho de prazos impossíveis e impostos, que afastam muitos talentos do ramo da pro-
gramação. A mentalidade de suficiência é também um bom negócio. Ela cria suas pró-
prias eficiências, assim como a mentalidade de escassez cria seu próprio desperdício.
Resumo
O livro é escrito como se você e eu estivéssemos criando uma nova disciplina de de-
senvolvimento juntos. Começamos examinando nossos pressupostos básicos sobre
desenvolvimento de software. Então, criamos a disciplina em si. Concluímos exami-
nando as implicações do que criamos – como ela pode ser adotada, quando ela não
deveria ser adotada e que oportunidade ela cria para os negócios.
O livro é dividido em três seções:
• O Problema – Os capítulos que vão desde “Risco: O Problema Básico” até “De
Volta ao Básico” definem o problema que a Programação eXtrema está tentan-
do resolver e apresenta critérios para avaliar a solução. Esta seção lhe dará
uma idéia geral de como Programação eXtrema vê o mundo.
• A Solução – Os capítulos que vão desde “Uma Rápida Visão Geral” até “Estra-
tégia de Testes” transformam as idéias abstratas da primeira seção em práticas
de uma metodologia concreta. Esta seção não lhe dirá exatamente como exe-
cutar as práticas; em vez disto, apresentará sua forma geral. A discussão de ca-
da prática a relaciona com os problemas e princípios introduzidos na primei-
ra seção.
• Implementando a XP – Os capítulos que vão desde “Adotando a XP” até “A
XP em Ação” descrevem uma variedade de tópicos sobre a implementação da
XP – como adotá-la, o que é esperado das várias pessoas em um projeto eXtre-
mo, qual a aparência da XP para o pessoal de negócios.
SUMÁRIO
E
sta seção prepara o terreno para a Programação eXtrema por meio da discussão
de vários aspectos do problema a ser resolvido ao inventarmos uma nova disci-
plina de desenvolvimento de software. A seção discute os pressupostos básicos
que usaremos na escolha de práticas que cubram os vários aspectos de desenvolvi-
mento de software – a metáfora da condução, os quatro valores, os princípios deriva-
dos desses valores e as atividades a serem estruturadas por uma nova disciplina de
desenvolvimento.
CAPÍTULO 1
Risco: O Problema Básico
O
problema básico no desenvolvimento de software é o risco. A seguir estão al-
guns exemplos de risco:
Nestas páginas, você lerá sobre Programação eXtrema (XP), uma disciplina de de-
senvolvimento de software que aborda o risco em todas as etapas do processo de de-
senvolvimento. A XP é também muito produtiva, gerando um software de alta quali-
dade, e é muito divertida de se colocar em prática.
Como a XP aborda os riscos listados acima?
Nossa Missão
Se nós aceitarmos o risco do projeto como o problema a ser resolvido, onde vamos
procurar a solução? O que precisamos fazer é inventar um estilo de desenvolvimen-
to de software que trate desses riscos. Precisamos comunicar esta disciplina da manei-
ra mais clara possível para programadores, gerentes e clientes. Precisamos definir re-
comendações (guidelines) para adaptá-lo às condições locais (ou seja, comunicar o
que é fixo e o que é variável).
Isso é o que abordaremos nas Seções I e II deste livro. Nós seguiremos passo a
passo através dos aspectos do problema de criar um novo estilo ou método de desen-
volvimento, e então resolveremos o problema. De um conjunto de pressupostos bá-
sicos, iremos derivar soluções que ditam como as várias atividades no desenvolvi-
mento de software – planejamento, testes, desenvolvimento, projeto e implantação –
devem ocorrer.
CAPÍTULO 2
Um Episódio de Desenvolvimento
A
ntes, porém, daremos uma pequena amostra de aonde estamos indo. Este ca-
pítulo é a história do pulso da XP – o episódio de desenvolvimento. Aqui o
programador implementa uma tarefa de engenharia (a menor unidade do cro-
nograma) e a integra com o resto do sistema.
Eu olho para a minha pilha de cartões de tarefas. O primeiro deles diz “Exportar
retenções deste trimestre”. Na reunião em pé desta manhã, lembro de você ter dito
que tinha terminado o cálculo do trimestre. Eu pergunto se você (meu colega hipoté-
tico) tem tempo para me ajudar a exportar. “Claro”, você responde. A regra diz que
se você recebe um pedido de ajuda, você precisa dizer “sim”. Nós acabamos de nos
tornar parceiros de programação.
Passamos alguns minutos discutindo o trabalho que você fez ontem. Você fala so-
bre os bins* que adicionou, sobre como são os testes, talvez um pouco sobre como vo-
cê notou ontem que a programação em pares funcionou melhor quando você afastou
o monitor em uns 30 centímetros.
Você pergunta: “Quais são os casos de teste para esta tarefa?”
Eu respondo: “Quando rodamos a estação de exportação, os valores no registro
de exportação devem bater com os valores nos bins”.
“Que campos precisam ser preenchidos?”, você pergunta.
“Não sei. Vamos perguntar ao Eddie.”
Nós interrompemos Eddie por 30 segundos. Ele explica quais os cinco campos
que ele sabe estarem relacionados com o trimestre.
*N. de R. T.
Bin, mantido como no original para preservar a informalidade do texto, é uma gíria para “código do pro-
grama” ou “código que se transfornará em código binário”.
26 PROGRAMAÇÃO EXTREMA EXPLICADA
Damos uma olhada na estrutura de alguns dos casos de teste de exportação que
existem. Encontramos um que é quase o de que precisamos. Abstraindo uma super-
classe, podemos implementar facilmente nosso caso de teste. Fazemos a refatoração.
Rodamos os testes já existentes. Todos rodam.
Nós notamos que diversos outros casos de teste de exportação poderiam tirar
vantagem da superclasse que acabamos de criar. Queremos ver alguns resultados na
tarefa, então apenas escrevemos “Retroalimentar Testes Superclasse Exportação” em
nossos cartões de coisas a fazer.
Agora, escrevemos nosso caso de teste. Como acabamos de fazer a superclasse do
caso de teste, escrever o novo caso de teste é fácil. Terminamos em alguns minutos.
Quando estamos na metade, eu digo: “Já posso até imaginar como vamos implemen-
tar isso. Nós podemos...”.
“Vamos terminar o caso de teste primeiro”, você interrompe. Enquanto estamos
escrevendo, surgem idéias para três variações. Você as escreve nos cartões de coisas
a fazer.
Terminamos o caso de teste e o rodamos. Ele falha. É claro. Nós não implementa-
mos nada ainda. “Espere um minuto”, você diz. “Ontem Ralph e eu estávamos tra-
balhando em uma calculadora pela manhã. Escrevemos cinco casos de teste que pen-
sávamos que não iam funcionar. Apenas um deles não rodou de cara.”
Nós utilizamos um depurador no caso de teste. Olhamos para os objetos com que
temos de computar.
Eu escrevo o código. (Ou você escreve, quem quer que tenha uma idéia mais clara.)
Enquanto estamos implementando, notamos alguns outros casos de teste que devería-
mos escrever. Nós os colocamos nos cartões de coisas a fazer. O caso de teste roda.
Vamos para um próximo caso de teste, e depois outro. Eu os implemento. Você re-
para que o código poderia ser mais simples. Você tenta me explicar como simplificar.
Eu fico frustrado ao tentar escutá-lo e implementar ao mesmo tempo, então eu pas-
so o teclado para você. Você refatora o código. Você roda os casos de teste. Tudo OK.
Você implementa os próximos casos de teste.
Depois de algum tempo, olhamos os cartões de coisas a fazer e o único item é
reestruturar os outros casos de teste. As coisas andaram bem, então nós continuamos
e os reestruturamos, verificando se eles rodam ao terminar cada um deles.
Agora nossa lista de coisas a fazer está vazia. Notamos que a máquina de integra-
ção está livre. Nós carregamos a última versão. Então carregamos nossas alterações.
Nós rodamos todos os casos de teste, tanto os novos como todos os testes que os ou-
tros já haviam criado. Um deles falha. “Isso é estranho. Faz quase um mês que os ca-
sos de teste não falham durante a integração”, você diz. Sem problemas. Depuramos
o caso de teste e corrigimos o código. Rodamos tudo novamente. Dessa vez eles pas-
sam. Nós liberamos nosso código.
Este é todo o ciclo de desenvolvimento da XP. Note que:
• Os pares não fazem apenas os casos de teste rodarem. Eles também evoluem o
projeto do sistema. Alterações não são restritas a nenhuma área em particular.
Os pares acrescentam valor à análise, ao projeto, à implementação e ao teste do
sistema. Eles agregam esse valor onde quer que o sistema precise.
• A integração ocorre imediatamente após o desenvolvimento, incluindo teste
de integração.
CAPÍTULO 3
A Economia no
Desenvolvimento de Software
S
omando as entradas e saídas do fluxo de caixa do projeto, podemos analisar de
forma simples o que torna o projeto de software valioso. Levando em considera-
ção o efeito das taxas de juros, podemos calcular o valor líquido atualizado dos
fluxos de caixa. Podemos refinar nossas análises multiplicando os fluxos de caixa
descontados pela probabilidade do projeto sobreviver para pagar ou ganhar aqueles
fluxos de caixa.
Com estes três fatores,
podemos criar uma estratégia para maximizar o valor econômico do projeto. Pode-
mos fazer isso:
• gastando menos, o que é difícil porque todo mundo começa com mais ou me-
nos as mesmas ferramentas e habilidades;
• ganhando mais, o que só é possível com uma organização de vendas e um
marketing superior, tópicos que não serão abordados neste livro (graças a Deus);
• gastando mais tarde e ganhando mais cedo, pagando, assim, menos juros so-
bre o dinheiro que gastamos e ganhando mais juros sobre o dinheiro que rece-
bemos;
1
Agradeço a John Favaro pela análise da XP com estimativa de valores das opções.
30 PROGRAMAÇÃO EXTREMA EXPLICADA
Opções
Existe uma outra maneira de ver a economia de um projeto de software – como uma
série de opções. O gerenciamento de um projeto de software pode ser visto como ten-
do quatro tipos de opção:
• Opção de abandonar – você pode obter algo do projeto mesmo se você o can-
celar. Quanto mais você conseguir obter do projeto sem realmente entregá-lo
na forma prevista, melhor.
• Opção de trocar – você pode mudar a direção de um projeto. Uma estratégia
de gerenciamento de projeto é mais valiosa se, no meio dele, os clientes pude-
rem mudar os requisitos. Quanto mais freqüente e drasticamente os requisitos
puderem mudar, melhor.
• Opção de adiar – você pode esperar até a situação se resolver antes de inves-
tir. Uma estratégia de gerenciamento de software é mais valiosa se você puder
esperar para gastar dinheiro sem perder completamente a oportunidade de in-
vestir. Quanto maior o adiamento e maior a quantidade de dinheiro que puder
ser retida, melhor.
• Opção de crescer – se o mercado parece estar decolando, você pode crescer ra-
pidamente para tirar vantagem dele. Uma estratégia de gerenciamento de pro-
jeto é mais valiosa se puder aumentar graciosamente para, com maiores inves-
timentos, produzir cada vez mais. Quanto mais rápido o projeto puder crescer,
melhor. Quanto mais tempo ele puder crescer, também.
Calculando o valor das opções, temos duas partes de arte, cinco partes de mate-
mática e uma parte da boa e velha intuição.
Existem cinco fatores envolvidos:
Dentre esses, o valor das opções geralmente é controlado pelo último dos fatores:
a incerteza. A partir dela, podemos fazer uma previsão concreta. Suponha que criás-
A ECONOMIA NO DESENVOLVIMENTO DE SOFTWARE 31
Exemplo
Suponha que você esteja programando alegremente e percebe que poderia acrescen-
tar uma funcionalidade que lhe custaria $ 10. Você estima que o retorno para essa
funcionalidade (seu valor líquido atual) é de aproximadamente $ 15. Então o valor lí-
quido atual por se acrescentar essa funcionalidade é $ 5.
Suponha agora que na verdade não estivesse bem claro o quanto essa nova fun-
cionalidade valeria – você estava apenas adivinhando, não tinha certeza de que va-
leria $ 15 para o cliente. Na verdade, você estima que o valor dela para o cliente po-
deria variar em até 100% da sua estimativa. Além disso, suponha (veja o Capítulo 5,
O Custo das Modificações,) que ainda lhe custaria em torno de $ 10 acrescentar essa
funcionalidade daqui a um ano.
Qual seria o valor da estratégia de apenas esperar e não implementar a funciona-
lidade agora? Ora, com as taxas de juros normais de aproximadamente 5%*, a calcu-
ladora da teoria das opções devolve um valor de $7,87.
A opção de esperar vale mais do que investir agora para acrescentar a funcionali-
dade. Por quê? Com tanta incerteza, a funcionalidade certamente pode ser muito
mais valiosa para o cliente e, neste caso, você não está tendo mais prejuízo imple-
mentando-a agora do que estaria se esperasse. Ou ela poderia não valer nada – nes-
te caso, você eliminou o problema de um exercício inútil.
No jargão das negociações, opções “eliminam risco negativo”.
*N. de R. Tais juros são realidade nos EUA. É sabido que, no Brasil, os juros são maiores.
CAPÍTULO 4
Quatro Variáveis
T
emos aqui um modelo de desenvolvimento de software através da perspectiva
de um sistema de variáveis de controle. Neste modelo, existem quatro variáveis
no desenvolvimento de software:
• custo
• tempo
• qualidade
• escopo
ciente quais delas controlar. Se eles não gostarem do resultado obtido para a quarta
variável, poderão alterar os valores de entrada, ou escolher três variáveis diferentes
para controlar.
Existe um efeito humano gerado pela qualidade. Todos querem fazer um bom tra-
balho, e trabalham muito melhor se sentem que estão fazendo um bom serviço. Se
você deliberadamente baixar a qualidade, sua equipe pode ir mais rapidamente a
princípio, mas logo a desmoralização de produzir um produto ruim vai superar
qualquer ganho temporário decorrente de não testar, não revisar ou não seguir pa-
drões.
Foco no Escopo
Muitas pessoas conhecem custo, qualidade e tempo como variáveis de controle, mas
ignoram a quarta. Para desenvolvimento de software, a variável mais importante de
se estar ciente é o escopo. Nem os programadores nem os empresários têm mais do
que uma vaga noção do que é valioso no software em desenvolvimento. Uma das de-
cisões mais importantes do gerenciamento de projetos é eliminar o escopo. Se você
controlar ativamente o escopo, poderá fornecer aos gerentes e aos clientes o controle
sobre custo, qualidade e tempo.
Uma das melhores coisas sobre o escopo é que ele é uma variável de grande va-
riação. Durante décadas, os programadores reclamaram: “Os clientes não conse-
guem nos dizer o que eles querem. Quando nós lhes damos o que eles dizem que
querem, eles não gostam”. Essa é uma verdade absoluta do desenvolvimento de soft-
ware. Os requisitos nunca estão claros de início. Clientes nunca conseguem dizer a
você exatamente o que eles querem.
O desenvolvimento de um software qualquer altera seus próprios requisitos. As-
sim que os clientes vêem o primeiro protótipo, eles percebem o que querem na se-
gunda versão... ou o que eles realmente queriam na primeira. E é um aprendizado
valioso, porque não poderia ter ocorrido baseado simplesmente em especulação. É
um aprendizado que só pode vir da experiência. Mas os clientes não conseguem che-
gar lá sozinhos. Eles precisam de pessoas que saibam programar, e que sirvam não
como guias, mas como parceiros.
E se nós encarássemos a indefinição maleável dos requisitos como uma oportuni-
dade, e não um problema? Então nós podemos encarar o escopo como a mais fácil de
nossas quatro variáveis de controle. Por ele ser tão maleável, podemos moldá-lo – um
pouquinho aqui, um pouquinho lá. Se o tempo para a data de entrega for curto, sem-
pre existe algo que pode ser postergado para a próxima versão. Ao não tentar fazer
demais, preservamos nossa habilidade de produzir a qualidade desejada em tempo.
Se criássemos um método de desenvolvimento baseado neste modelo, fixaríamos
a data, a qualidade e o custo de um software qualquer. Nós encararíamos o escopo co-
mo resultado das três primeiras variáveis. Então, com o avanço do desenvolvimen-
to, nós continuamente ajustaríamos o escopo para ele se ajustar às condições que en-
contrássemos.
Esse deveria ser um processo que tolerasse modificações com facilidade, porque
o projeto mudaria de direção com freqüência. Você não iria querer gastar muito em
um software que depois não pudesse ser usado. Você não iria querer construir uma
nova estrada só porque errou o caminho. Além disso, você precisaria ter um proces-
so que mantivesse o custo das mudanças condizente com a vida do sistema.
QUATRO VARIÁVEIS 37
U
m dos pressupostos universais sobre engenharia de software é que o custo de
modificar um programa aumenta exponencialmente ao longo do tempo. Eu
consigo me lembrar de estar sentado em uma grande sala de aula com piso de
linóleo na época da faculdade vendo o professor desenhar no quadro a curva encon-
trada na Figura 1.
“O custo de consertar um problema em um software qualquer aumenta exponen-
cialmente ao longo do tempo. Um problema que talvez custe um dólar para ser con-
sertado se você o encontrou durante a análise de requisitos pode custar milhares de
dólares quando o software estiver em produção.”
Custo das modificações
Eu decidi naquele momento que nunca deixaria um problema chegar até a fase de
produção. Não senhor, eu iria encontrar os problemas o mais cedo possível. Resolve-
ria cada possível problema antecipadamente. Eu iria ver e rever meu código. De jei-
to nenhum eu iria custar ao meu empregador U$ 100.000.
O problema é que essa curva não é mais válida. Ou melhor, com uma combinação
de tecnologia e práticas de programação, é possível obter uma curva que é bem o
contrário disso. Hoje em dia, as histórias são possivelmente como a seguinte, que
aconteceu comigo recentemente em um sistema de gerenciamento de contratos de
seguro de vida.
17:00 – Descubro que aparentemente a maravilhosa função do nosso sistema com
a qual uma única transação pode ter débitos de muitas contas e créditos para muitas
contas simplesmente não é usada. Cada transição vem de uma conta e vai para ou-
tra. É possível simplificar o sistema como mostra a Figura 2?
17:02 – Peço para Massimo sentar-se comigo para examinar a situação. Escreve-
mos uma consulta. Cada uma das 300 mil transações no sistema tem uma única con-
ta de débito e uma única conta de crédito.
17:05 – Se fôssemos consertar o erro, como poderíamos fazer isso? Poderíamos
mudar a interface da transação e mudar a implementação. Escrevemos os quatro mé-
todos necessários e começamos os testes.
17:15 – Os testes (mais de 1.000 testes de unidade e de função) ainda rodam 100%.
Não conseguimos pensar em nenhuma razão para as modificações não darem certo.
Começamos a trabalhar no código de migração do banco de dados.
17:20 – Os batches noturnos estão terminados, e fizemos o back-up do banco de da-
dos. Instalamos as novas versões do código e rodamos a migração.
17:30 – Rodamos alguns testes de sanidade. Tudo em que podíamos pensar fun-
ciona. Incapazes de pensar em alguma outra coisa para fazer, vamos para casa*.
O dia seguinte – O log de erros está limpo. Sem reclamações dos usuários. A mo-
dificação deu certo.
Durante as duas semanas seguintes, descobrimos uma série de outras simplifica-
ções que só foram possíveis pela nova estrutura, que nos permitia expandir a parte
de contabilidade do sistema para uma funcionalidade inteiramente nova, tudo isso
tornando o sistema mais simples, mais claro e menos redundante.
A comunidade de desenvolvimento de software gastou inúmeros recursos nas úl-
timas décadas tentando reduzir o custo das modificações – melhores linguagens, me-
lhores tecnologias de banco de dados, melhores práticas de programação, melhores
ambientes e ferramentas, novas notações.
débitos*
Transação créditos* Componente de Transação
débito 1
Transação crédito 1 Componente de Transação
Tempo
Figura 3 O custo das modificações talvez não aumente drasticamente ao longo do tempo.
42 PROGRAMAÇÃO EXTREMA EXPLICADA
O que não quer dizer que você tenha de ter objetos para ter flexibilidade. Eu
aprendi os fundamentos da XP assistindo ao meu pai escrever código de controle de
processos em tempo real em assembler. Ele desenvolveu um estilo que lhe possibilita-
va refinar continuamente o projeto de seus programas. No entanto, pela minha expe-
riência, o custo de modificações cresce mais abruptamente sem objetos do que com
eles.
O que não quer dizer que objetos sejam suficientes. Eu já vi (e provavelmente es-
crevi, para dizer a verdade) muitos códigos orientados a objetos que ninguém queria
tocar.
Muitos fatores surgiram da história sobre o que tornou nosso código fácil de mo-
dificar, mesmo depois de anos de produção:
• um projeto simples, sem elementos extras – sem idéias que ainda não eram
usadas, mas que se esperava que fossem usadas no futuro;
• testes automatizados, para que pudéssemos ter a certeza de que saberíamos se
acidentalmente modificássemos o comportamento atual do sistema;
• muita prática em modificar o projeto, para que, quando fosse necessário mu-
dar o sistema, nós não tivéssemos medo de tentar.
Com esses elementos definidos – projeto simples, testes e uma atitude de constan-
te refinamento do projeto – nós experimentamos a curva achatada da Figura 3. Uma
modificação que teria levado poucos minutos antes que muito código tivesse sido es-
crito levou 30 minutos depois de ter estado em produção por dois anos. E eu vejo
projetos gastando dias ou semanas tomando o mesmo tipo de decisão, em vez de fa-
zer o que eles precisam fazer ainda hoje e confiar neles mesmos para consertar isso
amanhã se for preciso.
Com essa mudança de pressuposto sobre o custo das modificações, vem a opor-
tunidade de abordar o desenvolvimento de software de uma forma completamente
diferente. É uma abordagem tão disciplinada quanto qualquer outra, mas é discipli-
nada em outras dimensões. Em vez de se ter o cuidado de tomar grandes decisões
mais cedo e pequenas decisões mais tarde, nós podemos criar uma abordagem para
o desenvolvimento de software que toma cada decisão rapidamente, mas apóia cada
decisão com testes automatizados, e que prepara você para efetivamente melhorar o
projeto do software quando você aprende uma maneira melhor de fazê-lo.
Porém, criar tal abordagem não será fácil. Nós teremos de reexaminar nossos
pressupostos mais enraizados sobre o que faz o desenvolvimento de software ser
bom. Nós podemos fazer essa jornada em etapas. Começaremos com uma história,
uma história que irá ancorar tudo mais que fazemos.
CAPÍTULO 6
Aprendendo a Dirigir
A
gora nós já temos a forma geral do problema – o custo extremamente elevado
do risco e a oportunidade de gerenciar esse risco por meio de opções – e do re-
curso necessário para formar a solução: a liberdade para fazer modificações
mais tarde durante o ciclo sem aumentar o custo significativamente. Agora precisa-
mos nos focar na solução. A primeira coisa de que precisamos é uma metáfora, uma
história compartilhada, para a qual podemos voltar em períodos de estresse ou de
decisão nos ajudar a mantermos o caminho certo.
Lembro-me claramente do dia em que comecei a aprender a dirigir. Minha mãe e
eu estávamos na Rodovia Interestadual 5, perto de Chico, na Califórnia, um trecho
de estrada reto e nivelado que se perde no horizonte. Eu estava no assento do passa-
geiro e minha mãe fez com que eu segurasse o volante. Ela me deixou sentir como o
movimento do volante afetava a direção do carro. E então ela me disse: “É assim que
se dirige. Alinhe o carro no meio da pista, em direção ao horizonte”.
Eu segui cuidadosamente pela rodovia, mantendo o carro exatamente no meio da
pista. Estava me saindo bem. Comecei então a divagar um pouquinho...
De repente voltei a prestar atenção quando o carro entrou no acostamento. Minha
mãe (sua coragem hoje me surpreende) suavemente colocou o carro de novo na es-
trada. E então ela realmente me ensinou sobre dirigirir: “Dirigir não é fazer o carro
andar na direção certa. Dirigir é prestar atenção constantemente, fazendo uma pe-
quena correção para um lado, outra pequena correção para o outro.”
Esse é o paradigma da XP. Mesmo que as coisas pareçam andar perfeitamente
bem, você não tira os olhos da estrada. A mudança é a única constante. Esteja sempre
preparado para ir um pouco para um lado, um pouco para o outro e, às vezes, para
ir para uma direção completamente diferente. Essa é a vida do programador.
44 PROGRAMAÇÃO EXTREMA EXPLICADA
A
ntes que possamos transformar a história sobre aprender a dirigir em um con-
junto de práticas para desenvolvimento de software, precisamos de algum pa-
râmetro para saber se estamos no caminho certo. De nada adiantaria inventar
um novo estilo de desenvolvimento para, no final, descobrir que não gostamos dele
ou que ele não funciona.
Metas individuais de curto prazo freqüentemente entram em conflito com metas
sociais de longo prazo. As sociedades aprenderam a lidar com esse problema desen-
volvendo um conjunto de valores a serem compartilhados, apoiados por mitos, ri-
tuais, punições e recompensas. Sem esses valores, o homem tende a voltar-se para
seus próprios interesses de curto prazo.
Os quatro valores da XP são:
• comunicação
• simplicidade
• feedback
• coragem
Comunicação
O primeiro valor da XP é a comunicação. Quando analisamos os problemas que ocor-
reram nos projetos, vemos que muitos deles foram provocados por alguém que não
conversou com outro alguém sobre alguma coisa importante. Algumas vezes, o pro-
gramador não fala para os outros sobre uma mudança fundamental no projeto.
Outras vezes, o programador não faz a pergunta certa para o cliente, fazendo com
que uma importante decisão de domínio seja prejudicada. Às vezes um gerente não
46 PROGRAMAÇÃO EXTREMA EXPLICADA
Simplicidade
O segundo valor da XP é a simplicidade. O treinador XP pergunta ao time: “Qual a
coisa mais simples que poderia funcionar?”.
Simplicidade não é fácil. É muito difícil não antecipar aquilo que você precisará
implementar amanhã ou na próxima semana ou no próximo mês. Mas antecipar as
coisas compulsivamente é ser influenciado pelo medo do custo exponencial da cur-
va das modificações. Algumas vezes o treinador precisa gentilmente lembrar o time
de que eles estão sendo influenciados pelos seus medos: “Talvez você seja tão mais
inteligente do que eu que possa fazer essa tal de árvore dinamicamente balanceada
funcionar. Eu iria ingenuamente assumir que uma buscar linear funcionaria”.
Greg Hutchinson escreveu:
A XP está fazendo uma aposta. Está apostando que é melhor fazer uma coisa sim-
ples hoje e pagar um pouco mais amanhã para fazer alguma modificação nela se for
necessário do que fazer uma coisa mais complicada hoje que talvez nunca será usada.
Simplicidade e comunicação têm uma maravilhosa relação de suporte mútuo.
Quando mais você se comunica, mais claramente você vê o que precisa ser feito e tem
mais certeza sobre o que não precisa. Quanto mais simples for o sistema, menos vo-
cê precisa comunicar sobre ele. O que nos leva a uma comunicação mais completa,
especialmente se você pode simplificar o sistema o suficiente para precisar de menos
programadores.
Feedback
O terceiro valor na XP é o feedback. Outras frases do treinador são: “Não pergunte pa-
ra mim, pergunte ao sistema” e “Você já escreveu um caso de teste para isso?”. Feed-
back concreto sobre o estado atual do sistema é absolutamente inestimável. Otimismo
é uma doença profissional da programação. Feedback é o tratamento.
O feedback funciona em diferentes escalas de tempo. Primeiramente, o feedback
funciona na escala de minutos e dias. Os programadores escrevem testes de unidade
para toda a lógica do sistema que poderia não funcionar. Os programadores têm feed-
back concreto de minuto a minuto sobre o estado do sistema. Quando os clientes es-
crevem novas “histórias” (descrições das características), os programadores as ava-
liam imediatamente. Assim os clientes têm feedback concreto sobre a qualidade de
suas histórias. A pessoa que rastreia o progresso observa o término das tarefas para
dar, a todo o time, feedback sobre a probabilidade de eles terminarem tudo o que foi
definido para um dado período de tempo.
O feedback também funciona na escala de semanas e meses. Os clientes e testado-
res escrevem testes de funcionalidade para todas as histórias (que na verdade são
“casos de uso simplificados”) implementadas pelo sistema. Eles têm feedback concre-
to sobre o estado atual do sistema. Os clientes revisam o cronograma a cada duas ou
três semanas para ver se a velocidade geral do time fecha com o plano e também pa-
ra reajustar o plano. O sistema é colocado em produção assim que ele fizer sentido,
para que os negócios possam começar a sentir como o sistema se comporta em ação
e a descobrir como ele pode ser melhor explorado.
Produções precoces precisam de uma pequena explicação. Uma das estratégias
no processo de planejamento é o time colocar em produção as histórias mais impor-
tantes assim que possível. Isso dá aos programadores feedback concreto sobre a quali-
dade de suas decisões e sobre o processo de desenvolvimento que só é possível quan-
do colocamos a mão na massa. Alguns programadores nunca experimentaram um
sistema em produção. Como eles podem aprender a melhorar seu trabalho?
A maioria dos projetos parece ter uma estratégia exatamente oposta. O pensa-
mento parece ser: “Quando o sistema entra em produção, você não pode fazer alte-
rações interessantes, então mantenha o sistema em desenvolvimento o maior tempo
possível”.
Na verdade, é o contrário. “Em desenvolvimento” é um estado temporário, em
que o projeto fica uma pequena parte de sua vida. É muito melhor dar ao sistema
uma vida independente, fazendo-o sobreviver por si mesmo. Você terá que simulta-
neamente gerenciar a produção e desenvolver novas funcionalidades. É melhor se
acostumar mais cedo a equilibrar a produção e o desenvolvimento do que fazê-lo tar-
de demais.
48 PROGRAMAÇÃO EXTREMA EXPLICADA
Coragem
Dentro do contexto dos três primeiros valores – comunicação, simplicidade e feedback
– é hora de acelerar o passo. Se você não correr na sua velocidade máxima, uma ou-
tra pessoa o fará e ganhará a corrida.
Aqui está uma história de coragem em ação. No meio da oitava iteração das 10
iterações agendadas (25 semanas das 30) da primeira versão do primeiro grande pro-
jeto XP, o time descobre uma falha em uma parte essencial da arquitetura. Os escores
do teste funcional vinham crescendo adequadamente, mas de repente pararam de
crescer de modo que ficavam bem abaixo de onde deveriam estar. O conserto de um
defeito causava um outro. O problema era uma falha na arquitetura.
(Para os curiosos, o sistema computava folhas de pagamento. “Vencimentos” re-
presentava aquilo que a companhia devia aos empregados. “Descontos” representa-
va o que os empregados deviam a outras pessoas. Algumas pessoas estavam usando
Vencimentos negativos quando elas deveriam estar usando Descontos positivos).
O time fez exatamente a coisa certa. Quando descobriram que não tinham mais
como seguir a diante, eles consertaram a falha. Isso imediatamente fez com que me-
tade dos testes que estavam executando falhassem. Alguns dias de muito esforço, no
entanto, fizeram com que os escores dos testes estivessem novamente seguindo para
a meta final. Foi preciso coragem para isso.
Outro ato corajoso é jogar o código fora. Você sabe quando algumas vezes você
trabalha todo o dia em cima de algo que não está indo muito bem e a máquina trava?
E na manhã seguinte você chega e em meia hora refaz todo o trabalho do dia ante-
rior, mas desta vez de maneira organizada e simples?
Faça assim: se o final do dia chega e o código está um pouco fora do controle, jo-
gue-o fora. Guarde talvez os casos de teste, se você gostou da interface que projetou,
mas talvez não. Você pode recomeçar tudo do nada.
Ou você pode ter três alternativas de projeto. Assim, trabalhe em cima de cada al-
ternativa por um dia, só para experimentá-las. Livre-se do código e recomece em ci-
ma do projeto mais promissor.
A estratégia de projeto da XP se parece com um algoritmo para escalar uma coli-
na (hill-climbling). Você começa com um projeto simples, então você o transforma em
algo um pouco mais complexo, e depois em um pouco mais simples, para então dei-
xá-lo um pouco mais complexo. O problema com algoritmos para escalar colinas é al-
cançar um local ótimo, onde uma pequena mudança não consegue melhorar a situa-
ção, mas uma grande mudança consegue.
O que garante que você nunca chegará a uma rua sem saída? Coragem. De vez
em quando, alguém no time irá ter uma idéia louca que talvez acabe com a comple-
xidade de todo o sistema. Se eles tiverem coragem, irão colocar essa idéia em produ-
ção. Agora você está escalando uma colina inteiramente nova.
QUATRO VALORES 49
Se você não tiver definido os três primeiro valores, coragem por si só é apenas fu-
çar em seu próprio sistema (hacking). No entanto, quando combinada com comuni-
cação, simplicidade e feedback concreto, a coragem se torna extremamente valiosa.
A comunicação dá suporte à coragem porque abre a possibilidade para mais ex-
periências de alto risco e alta recompensa. “Você não gosta disso? Eu odeio esse có-
digo. Vamos ver o quanto dele podemos substituir em uma tarde.” A simplicidade dá
suporte à coragem porque você pode se dar o luxo de ser muito mais corajoso com
um sistema simples. É muito menos provável que você estrague o sistema inadverti-
damente. Coragem dá suporte à simplicidade porque, assim que a oportunidade de
simplificar o sistema é percebida, você a experimenta. O feedback concreto dá supor-
te à coragem porque você se sente muito mais seguro experimentando algo extremo
no código se você puder pressionar um botão e ver resultados positivos nos testes
(ou não, no caso de você jogar o código fora).
Os Valores em Prática
Eu pedi ao time C3 (aquele primeiro grande projeto XP que eu mencionei anterior-
mente) para me contar histórias sobre o momento mais marcante durante o projeto.
Eu esperava ouvir histórias sobre grandes refatorações, ou sobre como testes salva-
ram o projeto, ou sobre um cliente satisfeito. Em vez disso eu recebi isto:
Isso nos leva a um valor muito mais profundo, aquele que se esconde por baixo
dos outros quatro – respeito. Se os membros do time não se importarem uns com os
outros e com o que eles estão fazendo, a XP estará condenada. Da mesma forma, a
maioria das outras abordagens de desenvolvimento de software (ou de qualquer ou-
tra coisa) também estará. Porém, a XP é muito mais sensível a isso. Com um pouco
de compaixão e interesse, a XP talvez dê alguma lubrificação para todas aquelas pe-
ças se movendo juntas. Se os membros de um time não se importarem com o projeto,
nada mais poderá salvá-lo. Com um mínimo de paixão, a XP já dá algum feedback po-
sitivo. Isso não é manipulação; isso é gostar de fazer parte de algo que dá certo, em
vez de fazer parte de algo que não funciona.
Toda essa filosofia é muito boa, mas se não há uma maneira de colocá-la em prá-
tica, de reforçá-la e de tornar seus valores um hábito natural, então não passará de
uma outra tentativa frustrada na história das boas intenções metodológicas. A seguir
precisaremos ter um guia mais concreto que nos levará a práticas que satisfazem e
reúnem os quatro valores – comunicação, simplicidade, feedback e coragem.
CAPÍTULO 8
Princípios Básicos
O
capítulo Aprendendo a Dirigir nos aconselha a fazer diversas pequenas mu-
danças e a nunca desviar os olhos da estrada. Os quatro valores – comunica-
ção, simplicidade, feedback e coragem – nos dão os critérios para uma solução
de sucesso. No entanto, os valores são muito vagos para nos ajudar a decidir quais
práticas usar. Precisamos transformar os valores em princípios concretos que possam
ser usados.
Esses princípios vão nos ajudar a escolher entre as alternativas. Daremos prefe-
rência às alternativas que melhor atendam aos princípios. Cada princípio incorpora
os valores. Um valor pode ser vago. O que é simples para uma pessoa pode ser com-
plexo para outra. Um princípio é mais concreto. Ou você tem feedback rápido ou não.
Aqui estão os princípios fundamentais:
• feedback rápido
• simplicidade presumida
• mudanças incrementais
• aceitação das mudanças
• alta qualidade
• ensinar aprendendo;
• investimento inicial pequeno;
• jogar para ganhar;
• experimentação concreta;
• comunicação honesta e franca;
• trabalhar a favor dos instintos do pessoal, e não contra eles;
• aceitação de responsabilidades;
• adaptação local;
• viajar com pouca bagagem;
• métricas genuínas.
PRINCÍPIOS BÁSICOS 53
*N. de R.T. O termo original design foi aqui traduzido por projeto quando seu significado é basicamente “um conjun-
to de atividades de concepção de um sistema que antecede (em verdade, prepara) a implementação”. Estas atividades
envolvem decisões do espaço- solução como uso de determinada arquitetura ou adoção de determinados padrões (pat-
terns). O termo “desenho” nos parece inapropriado para isto. Nas raras vezes em que o significado é diverso, adota-
mos traduções que julgamos adequadas caso a caso.
**N. de R. T. A expressão original CYA é uma forma abreviada difundida na Internet para See ya, ou mais completa-
mente, See you later cuja tradução: Vejo você depois, é o mundo dos negócios, a expressão costuma ser usada com um
significado adicional aproximado de “passe bem” ou “e eu com isso?”.
54 PROGRAMAÇÃO EXTREMA EXPLICADA
veria ser uma série de experimentos voltados às questões levantadas durante a ses-
são, e não um projeto pronto. O resultado de uma discussão sobre os requisitos tam-
bém deveria ser uma série de experimentos. Toda decisão abstrata deve ser testada.
Comunicação honesta e franca – Esta é uma afirmação tão básica que eu quase a dei-
xei de fora. Quem não ia querer se comunicar de maneira franca e honesta? Aparen-
temente, todos que eu visito. Os programadores precisam ter liberdade de explicar as
conseqüências das decisões que outros fazem: “Você violou o encapsulamento aqui
e isso gerou uma bagunça!”. Eles têm de poder indicar uns aos outros onde o código
está com problemas. Eles precisam ter liberdade para expressar seus receios e preci-
sam receber apoio. Eles devem poder dar más notícias aos clientes e à gerência, e fa-
zê-lo cedo, e não serem punidos.
Se eu percebo que alguém está olhando em volta para saber quem o está escutan-
do antes de responder uma pergunta, eu vejo isso como um sinal de sérios problemas
no projeto. Se assuntos pessoais precisam ser discutidos, eu entendo que seja neces-
sária privacidade. Mas decidir qual modelo de objetos usar não é assunto que mere-
ça um carimbo de “confidencial”.
Trabalhar a favor dos instintos do pessoal e não contra eles – As pessoas gostam de
ganhar. Elas gostam de aprender. Gostam de interagir com outras pessoas. Pessoas
gostam de fazer parte de um time. Gostam de estar no controle. Gostam que con-
fiem nelas. Gostam de fazer um bom trabalho. Gostam que seu software funcione.
Paul Chilsolm escreveu certa vez:
estivessem cooperando. Com o tempo, uma pessoa a quem mandaram fazer alguma
coisa encontrará muitas maneiras de expressar sua frustração, a maior parte em de-
trimento do time e muitas delas em detrimento pessoal.
A alternativa é que a responsabilidade seja aceita, e não dada. Isso não quer di-
zer que você fará apenas o que você quiser. Você faz parte de um time, e se o time
conclui que uma certa tarefa precisa ser feita, alguém escolherá fazê-la, por pior
que seja.
Adaptação local – Você precisa adaptar às suas condições locais tudo o que ler nes-
te livro. Isso é a aplicação do princípio da aceitação de responsabilidades ao proces-
so de desenvolvimento. Adotar a XP não significa que eu vá decidir como você vai
desenvolver software. Significa que você irá decidir como desenvolver. Eu posso lhe
contar o que eu descobri que funciona bem. Eu posso apontar as conseqüências de
você se desviar disso. Porém, no final das contas, este é o seu processo. Você precisa
tomar uma decisão hoje. Você precisa saber se ela ainda funcionará amanhã. Você
precisa modificar e adaptar. Não leia este livro pensando: “Até que enfim, agora eu
sei como desenvolver”. Você vai terminar dizendo: “Eu preciso decidir tudo isso e
ainda programar?”. Sim, você precisa. Mas vale a pena.
Viajar com pouca bagagem – Você não pode esperar que carregando muita bagagem
ainda possa andar rápido. Os artefatos que mantemos devem ser:
• poucos,
• simples,
• valiosos.
O
capítulo Aprendendo a Dirigir mais os quatro valores – comunicação, sim-
plicidade, feedback e coragem – nos fornecem diversos princípios. Agora es-
tamos prontos para começar a construir uma disciplina de desenvolvimento
de software. O primeiro passo é decidir sobre o escopo. O que tentaremos prescrever?
Que tipo de problemas iremos abordar e que tipo de problemas iremos ignorar?
Lembro-me de quando comecei a programar em BASIC. Eu tinha alguns livros de
exercícios que cobriam os fundamentos da programação. Quando eu terminei todos
os exercícios (o que não demorou muito) eu queria tentar resolver um problema mais
desafiador. Resolvi que tentaria escrever um jogo tipo Star Trek, parecido com o que
eu tinha jogado no Lawrence Hall of Science em Berkeley, mas mais divertido.
Meu processo de escrever programas para resolver os exercícios dos livros era
olhar para o problema por alguns minutos, digitar o código para resolvê-lo, e então
lidar com qualquer problema que aparecesse. Então eu sentei confiante para escrever
o meu jogo. Nada me ocorreu. Eu não tinha a mínima idéia de como escrever uma
aplicação com mais de 20 linhas. Decidi, então, escrever todo o programa no papel
antes de digitar o código. Escrevi três linhas e não consegui seguir a diante.
Eu precisava fazer algo além de programar. Mas eu não sabia o que mais poderia
fazer.
E se voltássemos a esse estado, mas sob a luz da experiência? O que poderíamos
fazer? Sabemos que não podemos simplesmente “codificar até terminar”. Que ativi-
dades devemos adicionar ao processo? O que extrairíamos de cada atividade se o ex-
perimentássemos novamente?
58 PROGRAMAÇÃO EXTREMA EXPLICADA
Codificar
No final do dia é preciso haver um programa. Por isso eu denominei “codificar”
aquela atividade que sabemos não poder contornar. Seja através de diagramas que
geram código ou pela entrada do código em um navegador, você está codificando.
O que é que queremos extrair do código? O mais importante é o aprendizado. A
maneira com que aprendo é ter uma idéia e depois testá-la para ver se ela é boa ou
não. Escrever código é a melhor maneira que eu conheço para fazer isso. O código
não é controlado pelo poder ou pela lógica da retórica. O código não se impressiona
por diplomas de graduação ou salários robustos. O código fica parado no seu lugar,
fazendo alegremente aquilo que você diz para ele fazer. Se ele não está fazendo o que
você achava que disse para ele fazer, isso é problema seu.
Quando você codifica alguma coisa, você também tem a oportunidade de com-
preender a melhor estrutura para o código. Existem certos sinais no código que lhe
dizem que você ainda não compreende a estrutura necessária.
O código também lhe dá a chance de se comunicar de forma clara e sucinta. Se vo-
cê explicar para mim uma idéia que você teve, eu posso não entendê-la. Porém, se
nós a codificarmos juntos, eu poderei ver na lógica em que você escreve o formato
preciso de suas idéias. Eu vejo o formato de suas idéias não como você o tem em sua
mente, mas sim como ele se expressa no mundo real.
Essa comunicação facilmente se transforma em aprendizado. Eu entendo a sua
idéia e acabo tendo uma outra. Eu não consigo explicá-la para você, então eu tam-
bém a transformo em código. Já que é uma idéia relacionada com a sua, nós usamos
código relacionado. Você vê a minha idéia e tem uma outra.
Por fim, o código é um artefato sem o qual o desenvolvimento não consegue vi-
ver. Eu já ouvi histórias sobre sistemas cujo código-fonte foi perdido, mas mesmo as-
sim eles continuaram em produção. No entanto, fenômenos desse tipo são cada vez
mais raros. Para um sistema viver, ele precisa manter o seu código-fonte.
Já que necessitamos de um código-fonte, devemos usá-lo para tantos propósitos
de engenharia de software quanto possível. Acontece que o código serve como meio
de comunicação – expressando intenções táticas, descrevendo algoritmos, apontan-
do para pontos que poderão ser expandidos ou reduzidos no futuro. O código tam-
bém pode ser usado para expressar testes, que não apenas testam objetivamente o
sistema mas também provêm uma valiosa especificação operacional do sistema em
todos os aspectos.
Testar
Os filósofos positivistas ingleses Locke, Berkeley e Hume disseram que tudo o que
não puder ser mensurado não existe. Quando se trata de código, eu concordo comple-
tamente com eles. As funções do software que não podem ser demonstradas por sim-
ples testes automatizados não existem. Eu tenho a tendência de acreditar que tudo o
que escrevi reflete exatamente o que eu queria dizer. Eu também tenho a tendência de
acreditar que tudo o que eu queria dizer é o que eu deveria querer dizer. Então eu não
confio em nada que escrevo até que eu teste o que eu fiz. Os testes me dão a chance de
pensar sobre o que eu quero independentemente da implementação. Assim, os testes
me dizem se eu implementei aquilo que eu pensei ter implementado.
Quando as pessoas pensam em testes automatizados, elas pensam em testar fun-
cionalidade – ou seja, quais números são computados. Quanto mais experiência ob-
DE VOLTA AO BÁSICO 59
tenho escrevendo testes, mais eu descubro que eu posso testar requisitos não-funcio-
nais – como performance ou fidelidade do código aos padrões.
Erich Gamma cunhou a expressão “infectado por testes” para descrever aquelas
pessoas que não escrevem código se elas ainda não têm um teste. Os testes lhe dizem
quando você terminou – quando os testes executam, você por enquanto terminou de
codificar. Quando você não consegue pensar em nenhum outro teste que talvez fa-
lhe, você terminou por completo.
Os testes são tanto um recurso quanto uma responsabilidade. Você não faz ape-
nas um teste, executa-o e declara que você terminou. Você é responsável por escrever
todo teste que se supõe não executam de imediato. Depois de um tempo, você ficará
bom em julgar o número de testes – se os dois primeiros testes funcionam, você po-
de seguramente concluir que o terceiro executará sem que você precise escrevê-lo.
Claro que esse é exatamente o tipo de julgamento que leva a erros nos programas, as-
sim é preciso ser cuidadoso ao julgar. Se mais tarde aparecerem problemas que pode-
riam ter sido evitados caso aquele terceiro teste tivesse sido escrito, você precisa es-
tar preparado para aprender a lição e escrevê-lo na próxima vez.
A maioria dos softwares é entregue sem ter sido desenvolvida com testes automa-
tizados abrangentes. Testes automatizados claramente não são essenciais. Então, por
que não deixá-los fora da minha lista de atividades essenciais? Eu tenho duas respos-
tas: uma a curto e outra a longo prazo.
A resposta a longo prazo é que testes mantêm o programa vivo por mais tempo
(se os testes são executados e mantidos). Se você tem testes, você pode fazer mais
modificações por mais tempo. Se você continua escrevendo os testes, sua confiança
no sistema aumenta ao longo do tempo.
Um de nossos princípios é trabalhar a favor da natureza humana, e não contra. Se
tudo o que você pôde fazer foi argumentar a longo prazo a favor dos testes, esqueça.
Algumas pessoas escreveriam testes por obrigação ou porque alguém está as obser-
vando. Tão-logo a sua atenção desviasse ou a pressão aumentasse, nenhum novo tes-
te seria escrito, os que foram escritos não executariam e tudo desabaria. Assim, se vo-
cê quiser ir a favor da natureza humana e se quisermos testes, então devemos achar
uma razão para testar que seja de curto prazo.
Felizmente, existe uma razão de curto prazo para escrever testes. Programar
quando você tem testes é mais divertido do que programar sem eles. Você codifica
com muito mais confiança. Você não precisa ignorar aqueles pensamentos inoportu-
nos como “Bem, esta é a coisa certa a fazer agora, mas será que estraguei algo?”.
Aperte o botão. Execute todos os testes. Se aparecer a luz verde, você está pronto pa-
ra continuar seu trabalho com confiança renovada.
Uma vez eu me vi fazendo isso em uma demonstração pública de programação.
Toda vez que eu me desviava da platéia para recomeçar a programar, eu pressiona-
va meu botão de testes. Eu não tinha modificado nada no código. Nada no ambiente
tinha mudado. Eu só queria um pequeno empurrão na minha confiança. Ver que os
testes ainda executavam me dava isso.
Programar e testar ao mesmo tempo é mais rápido do que só programar. Eu não
esperava esse efeito quando comecei a fazer isso, mas eu certamente notei a diferen-
ça e ouvi várias outras pessoas dizerem o mesmo. Você talvez ganhe produtividade
por meia hora sem usar testes. Mas uma vez que você se acostumou a testar, rapida-
mente notará a diferença na produtividade. O ganho em produtividade vem da re-
dução no tempo de depuração – você não precisa mais gastar uma hora inteira pro-
curando a causa de um bug – você a encontra em poucos minutos. Algumas vezes,
60 PROGRAMAÇÃO EXTREMA EXPLICADA
você simplesmente não consegue fazer um teste funcionar. Então você provavelmen-
te tem um problema muito maior e precisa repensar a situação. É preciso certificar-se
que seus testes estão certos ou se o projeto precisa de refinamento.
No entanto, existe um perigo ao se fazer isso. Testes malfeitos fazem você acredi-
tar erroneamente que tudo é um mar de rosas. Você ganha confiança em seu sistema
porque todos os testes executam. Porém, você segue adiante sem perceber que dei-
xou para trás uma armadilha, pronta para lhe capturar na próxima vez que você pas-
sar por ela.
O truque dos testes é achar um nível de erros que você esteja disposto a tolerar. Se
puder suportar apenas uma reclamação de cliente por mês, então invista em testes e
melhore seu processo de teste até que você obtenha este nível. Assim, usando esse
padrão, se todos os testes executaram, siga adiante como se o sistema estivesse bem.
Adiantando as coisas um pouco, teremos dois conjuntos de testes. Teremos testes
de unidade, escritos pelos programadores para convencer a si mesmos que seus pro-
gramas funcionam do jeito que eles esperavam. Também teremos testes funcionais
escritos (ou pelo menos especificados) por clientes para convencer a si próprios de
que o sistema como um todo funciona do jeito que eles acham que deveria funcionar.
Existem dois públicos-alvo para os testes: os programadores, que precisam con-
cretizar sua confiança na forma de testes para que todo mundo possa compartilhar
essa confiança; e os clientes, que precisam preparar um conjunto de testes que repre-
sentam a sua confiança, pensando “Bem, eu acho que se você consegue computar to-
dos esses casos, então o sistema deve funcionar”.
Ouvir
Programadores não sabem de nada. Na verdade, programadores não sabem nada
que as pessoas de negócios consideram interessante. Acredite, se aquelas pessoas de
negócios pudessem viver sem programadores, elas nos mandariam embora em um
segundo.
Aonde eu quero chegar com isso? Bem, se você resolveu testar, você tem de obter
as respostas de algum lugar. Já que você (como um programador) não sabe nada, vo-
cê precisa perguntar para alguém. Eles lhe dirão quais são as respostas esperadas e
quais são os casos incomuns sob a perspectiva dos negócios.
Se você fizer perguntas, então é melhor você estar preparado para ouvir as res-
postas. Assim, ouvir é a terceira atividade no desenvolvimento de software.
Os programadores também devem ouvir abertamente. Eles ouvem o que o clien-
te afirma ser o problema de negócios. Eles ajudam o cliente a entender o que é difícil
e o que é fácil, ouvindo-o ativamente. Assim, o feedback dado pelo programador aju-
da o cliente a entender melhor o seu problema.
Apenas dizer “Vocês deveriam ouvir uns aos outros e ao cliente” não ajuda muito.
As pessoas tentam fazer isso e não dá certo. Nós precisamos achar uma maneira de es-
truturar essa comunicação para que as coisas que precisam ser comunicadas o sejam
na quantidade de detalhes e no momento certos. De maneira parecida, as regras que
desenvolvemos também precisam desencorajar comunicação que não ajuda, ou que é
feita antes da compreensão real daquilo que será comunicado ou ainda que é feita em
tal grau de detalhamento que encobre a parte importante da comunicação.
DE VOLTA AO BÁSICO 61
Projetar
Por que não podemos apenas ouvir, escrever um caso de teste, executá-lo, ouvir no-
vamente, escrever um outro caso de teste, executá-lo e continuar repetindo esses pas-
sos eternamente? Porque sabemos que isso não funciona assim. Você pode fazer isso
por um tempo. Em uma linguagem generosa, você talvez possa fazer isso por algum
tempo. No entanto, algum dia, você não terá como prosseguir. A única maneira de fa-
zer o próximo caso de teste executar é fazer um outro falhar. Ou a única maneira de
fazer um caso de teste executar é complicada demais para valer a pena. A entropia
faz uma nova vítima.
A única maneira de evitar isso é projetar. Projetar é criar uma estrutura que orga-
niza a lógica do sistema. Um bom projeto organiza a lógica de maneira que uma mo-
dificação em uma parte do sistema nem sempre requeira uma modificação em uma
outra parte. Um bom projeto garante que todas as peças da lógica do sistema tenham
uma e apenas uma origem. Um bom projeto também coloca a lógica perto dos dados
com os quais ela opera. Um bom projeto permite a extensão do sistema modificando
apenas um local.
Um projeto ruim é exatamente o contrário. Uma modificação conceitual requer
modificações em muitas partes do sistema. A lógica precisa ser duplicada. Conse-
qüentemente, o custo de um projeto ruim se torna grande demais. Você não consegue
mais lembrar onde todas modificações implicitamente conectadas precisam estar.
Você não consegue adicionar uma nova função sem estragar uma outra já existente.
A complexidade é uma outra fonte de um projeto ruim. Se um projeto requer qua-
tro camadas de vias secundárias para descobrir o que realmente está acontecendo, e
se essas camadas não têm nenhum propósito funcional ou explanatório, então o pro-
jeto é ruim.
Assim, a última atividade que temos de estruturar em nossa nova disciplina é
projetar. Nós precisamos prover um contexto no qual bons projetos são criados, pro-
jetos ruins são consertados e o projeto atual é aprendido por todos aqueles que pre-
cisam aprendê-lo.
Como vocês verão nos capítulos seguintes, a maneira com a qual a XP produz um
projeto é bem diferente da de muitos outros processos de software. O projeto faz par-
te das funções diárias de todos os programadores XP em meio a sua codificação. Mas
independentemente da estratégia usada para produzi-lo, a atividade de projetar não
é uma opção. É preciso pensar seriamente para que o desenvolvimento de software
seja obtido.
Conclusão
Então você codifica porque se você não codificar você não terá nada. Você testa por-
que se você não testar você não saberá quando você terminou de codificar. Você ou-
ve porque se você não ouvir você não saberá o que codificar ou o que testar. E você
projeta para que você possa codificar, testar e ouvir indefinidamente. Isso é tudo. Es-
tas são as atividades que devemos ajudar a estruturar:
• codificar
• testar
• ouvir
• projetar
SEÇÃO II
A Solução
A
gora nós já preparamos o terreno. Conhecemos o problema que precisamos re-
solver: decidir como devem ser executadas as atividades básicas do desenvol-
vimento de software – codificar, testar, ouvir e projetar. Temos um conjunto de
valores e princípios para nos guiar assim como escolhemos estratégias para cada
uma dessas atividades. E temos a curva de custos achatada como nossa carta na
manga para simplificar as estratégias que escolhermos.
CAPÍTULO 10
Uma Rápida Visão Geral
Nós nos basearemos na sinergia entre práticas simples, que muitas ve-
zes foram abandonadas décadas atrás por serem consideradas simpló-
rias, simples demais ou impraticáveis.
A
s matérias-primas do nosso novo método de desenvolvimento de software são:
Nosso trabalho é estruturar as quatro atividades. Teremos não apenas que estru-
turar as atividades, mas fazer isso sob a ótica da longa lista de princípios por vezes
contraditórios. E ao mesmo tempo precisamos tentar melhorar a performance econô-
mica do desenvolvimento de software o suficiente para que alguém nos dê ouvidos.
Ora, sem problemas.
Er, ahm, rom, rahm...
Já que o propósito deste livro é explicar como isso poderia funcionar, eu explica-
rei brevemente as mais importantes áreas de atuação da XP. No próximo capítulo, ve-
remos como soluções tão ridiculamente simples poderiam funcionar. Onde uma prá-
tica é fraca, os pontos fortes das outras práticas compensarão essa fraqueza. Os capí-
tulos seguintes abordarão alguns dos tópicos em maiores detalhes.
66 PROGRAMAÇÃO EXTREMA EXPLICADA
O Jogo do Planejamento
Nem as considerações do negócio nem as considerações técnicas devem prevalecer.
O desenvolvimento de software é sempre um diálogo evolutivo entre o possível e o
desejável. A natureza do diálogo é tal que ele altera o que parece ser possível e o que
parece ser desejável.
UMA RÁPIDA VISÃO GERAL 67
• Escopo – Quanto de um problema precisa ser resolvido para que o sistema te-
nha valor em produção? A pessoa da área de negócios está em posição de en-
tender o quanto não é suficiente e o quanto é demais.
• Prioridade – Se em um primeiro momento você só pudesse ter A ou B, qual vo-
cê escolheria? A pessoa da área de negócios está em posição de decidir isso,
muito mais do que um programador.
• Composição das versões – O quanto precisa ser feito para que o(s) negócio(s)
esteja(m) em melhor situação com o desenvolvimento do software do que sem
desenvolvê-lo? A intuição do programador sobre essa questão pode estar com-
pletamente errada.
• Datas de entrega – Quais são as datas importantes, quando a presença do soft-
ware (ou uma parte dele) faria bastante diferença?
A área de negócios não consegue tomar essas decisões no vácuo, a partir de nada. A
área de desenvolvimento precisa tomar as decisões técnicas que fornecem a matéria-
prima para as decisões do negócio.
As pessoas da área técnica decidem sobre:
Entregas Freqüentes
Cada versão entregue deve ter o menor tamanho possível, contendo os requisitos de
maior valor para o negócio. A entrega precisa fazer sentido como um todo – ou seja,
você não pode implementar meia função e entregá-la, só para tornar mais curto o ci-
clo de entrega.
68 PROGRAMAÇÃO EXTREMA EXPLICADA
É muito melhor planejar em um ou dois meses de cada vez do que em seis meses
ou um ano. Uma companhia que entrega software volumoso para seus clientes pode
não ser capaz de manter ciclos de entrega tão curtos. Mesmo assim, deve reduzir seu
ciclo o máximo possível.
Metáfora
Cada projeto de software XP é guiado por uma única metáfora abrangente. Às vezes,
a metáfora é simplória, como um sistema de gerenciamento de contratos que é refe-
rido em termos de contratos, clientes e endossos. Às vezes a metáfora requer algu-
mas explicações, como dizer que o computador deve ser semelhante a uma mesa de
escritório, ou que o cálculo da pensão é como uma planilha de cálculo. Entretanto,
elas são apenas metáforas, porque não queremos dizer literalmente que “o sistema é
uma planilha de cálculo”. A metáfora apenas ajuda todos os envolvidos no projeto a
entenderem os elementos básicos e seus relacionamentos.
As palavras usadas para identificar entidades técnicas devem ser obtidas de for-
ma consistente na metáfora escolhida. Com o andar do desenvolvimento e com o
amadurecimento da metáfora, todo o time encontrará nova inspiração ao examinar
a metáfora.
A metáfora na XP substitui muito daquilo que outras pessoas chamam de “arqui-
tetura”. O problema em chamar a visão panorâmica do sistema de arquitetura é que
arquiteturas não necessariamente acrescentam ao sistema um senso de coesão. Uma
arquitetura consiste em caixas pretas e suas conexões.
Você poderia dizer: “Mas é claro que uma arquitetura malfeita é ruim”. Nós pre-
cisamos enfatizar o objetivo da arquitetura, que é dar a todos uma história coerente
dentro da qual possam trabalhar, uma história que possa ser compartilhada facil-
mente entre o pessoal de negócios e o de desenvolvimento. Ao desejarmos uma me-
táfora, é provável que consigamos uma arquitetura fácil de comunicar e elaborar.
Projeto Simples
O projeto correto para o software em qualquer momento é aquele que:
Cada parte do projeto do sistema precisa justificar sua existência nesses termos. Ed-
ward Tufte1 propõe um exercício para designers gráficos – desenhe um gráfico da for-
ma que você quiser. Então apague todos os elementos, desde que você não remova
nenhuma informação. O que restar quando você não puder apagar mais nada é o de-
sign certo para o gráfico. Projeto simples é isso – remova todos os elementos de pro-
jeto que você conseguir sem violar as regras 1, 2 e 3 acima.
1
Edward Tufte, The Visual Display of Quantitative Information, Graphics Press, 1992.
UMA RÁPIDA VISÃO GERAL 69
Testes
Qualquer aspecto/função do programa que não tenha um teste automatizado sim-
plesmente não existe. Os programadores escrevem teste de unidade para que sua
confiança na operação do programa possa se tornar parte do programa em si. Os
clientes escrevem testes de funcionalidade para que sua confiança na operação do
programa possa também se tornar parte do programa. O resultado é um programa
que se torna cada vez mais confiável com o tempo – ele torna-se mais capaz de acei-
tar modificações, e não menos.
Você não precisa escrever um teste para cada método que programar, apenas mé-
todos de produção que poderiam falhar. Às vezes você só quer descobrir se algo é
possível. Você explora as possibilidades por uma meia hora. Sim, é possível. Agora
você joga fora o seu código e recomeça com testes.
Refatoração
Ao implementar uma função do programa, os programadores sempre se perguntam
se existe uma maneira de alterar o programa existente para fazer com que a adição
da nova função seja simples. Depois que eles a adicionaram, se perguntam como po-
dem simplificar o programa, mantendo ainda todos os testes executando. Isso é a
chamada refatoração (refactoring).
Note que isso significa que algumas vezes você tem de trabalhar mais do que o
absolutamente necessário para acrescentar uma função. Mas, ao trabalhar dessa for-
ma, você garante que poderá adicionar a próxima função com uma quantidade acei-
tável de esforço, e todas as seguintes também. No entanto, você não refatora com ba-
se em especulações; você refatora quando o sistema precisa. Quando o sistema re-
quer código duplicado, ele está precisando de refatoração.
Se um programador percebe uma maneira arriscada de fazer um teste funcionar
em um minuto, e uma maneira de fazê-lo funcionar em dez minutos com um proje-
to simples, a escolha correta é gastar os dez minutos. Felizmente, você pode fazer até
mesmo mudanças radicais no projeto de um sistema em etapas pequenas e de baixo
risco.
Programação em Pares
Todo código de produção é programado com duas pessoas olhando para uma má-
quina, com um teclado e um mouse.
Existem dois papéis em cada par. Um parceiro, aquele com o teclado e o mouse, es-
tá pensando qual é o melhor jeito de implementar este método especifico. O outro
parceiro está pensando mais estrategicamente:
Propriedade Coletiva
A qualquer momento, qualquer um que perceba uma oportunidade de acrescentar
valor a alguma parte do código é obrigado a fazê-lo.
Compare isso com dois outros modelos de propriedade de código – ausência de
propriedade e propriedade individual. Antigamente ninguém possuía nenhum códi-
go em particular. Se alguém quisesse modificar um código, o fazia para servir aos
seus propósitos, quer isso se encaixasse ou não no que já estava pronto. O resultado
era caótico, especialmente com objetos cuja relação entre uma linha de código aqui e
outra lá adiante não era fácil de ser determinada estaticamente. O código crescia ra-
pidamente, mas também ficava cada vez mais instável.
Para controlar essa situação, surgiu a propriedade individual. A única pessoa que
poderia alterar um trecho de código era seu proprietário oficial. Qualquer pessoa que
percebesse que o código precisava de alterações precisava submeter seu pedido ao
proprietário. O resultado dessa propriedade restrita é que o código passa a afastar-se
do entendimento do time, porque as pessoas ficam relutantes em interromper o pro-
prietário do código. Afinal, eles precisam da modificação agora, e não depois. Então
o código permanece estável, mas não evolui tão rapidamente quanto deveria. E en-
tão o proprietário deixa o time...
Na XP, todos são responsáveis pelo sistema inteiro. Nem todos conhecem todas as
partes igualmente bem, mas todos sabem um pouco sobre cada parte. Se um par es-
tá trabalhando e vê uma oportunidade de melhorar o código, eles vão em frente e o
melhoram se isso facilitar suas vidas.
Integração Contínua
O código é integrado e testado após algumas horas – no máximo um dia de desen-
volvimento. Uma maneira simples de fazer isso é ter uma máquina dedicada apenas
à integração. Quando a máquina estiver livre, um par com código para ser integrado
a ocupa, baixa a versão atual, baixa as modificações (conferindo e resolvendo qual-
quer colisão) e executa os testes até que eles passem (100% corretos).
Integrar apenas um conjunto de modificações de cada vez é uma prática que fun-
ciona bem porque fica óbvio quem deve fazer as correções quando um teste falha –
nós devemos, já que fomos nós que estragamos, afinal o último par tinha deixado to-
dos os testes a 100%. E se não conseguirmos deixar os testes a 100%, devemos jogar
fora o que tínhamos feito e começar tudo de novo, já que obviamente não sabíamos
o suficiente para programar aquela função (entretanto, é possível que já saibamos o
suficiente agora).
UMA RÁPIDA VISÃO GERAL 71
Semana de 40 Horas
Eu quero estar disposto e animado a cada manhã, e cansado e satisfeito todas as noi-
tes. Na sexta-feira, eu quero estar cansado e satisfeito o suficiente para me sentir bem
com dois dias para pensar em algo que não seja trabalho. E então na segunda-feira eu
quero chegar cheio de energia e idéias.
O fato de isso se traduzir em precisamente 40 horas por semana no local de traba-
lho ou não não é extremamente importante. Pessoas diferentes têm tolerâncias dife-
rentes para o trabalho. Uma pessoa é capaz de agüentar 35 horas concentradas, ou-
tra, 45. Mas ninguém consegue agüentar 60 horas por semana durante muitas sema-
nas, e ainda estar disposto, criativo, cuidadoso e confiante. Não faça isso.
Horas extras são o sintoma de um problema sério no projeto. A regra da XP é sim-
ples – você não pode trabalhar uma segunda semana com horas extras. Por uma se-
mana, tudo bem, vá adiante e trabalhe algumas horas extras. Se você chega na segun-
da e diz: “Para completar nossos objetivos, vamos ter de trabalhar até tarde de no-
vo”, então você já tem um problema que não pode ser resolvido com horas extras.
Uma questão relacionada são as férias. Os europeus geralmente tiram duas, três
ou quatro semanas seguidas de férias. Os norte-americanos raramente tiram mais do
que alguns dias. Se fosse a minha companhia, eu insistiria para que o pessoal tirasse
férias de duas semanas seguidas todo ano, com pelo menos uma ou duas outras se-
manas disponíveis para pausas mais curtas.
Cliente Presente
Um cliente real deve ficar com o time, estar disponível para responder questões, resol-
ver disputas e definir prioridades de menor escala. Por “cliente real”, eu quero dizer
alguém que vá realmente usar o sistema quando ele estiver em produção. Se você es-
tá construindo um sistema para o serviço de atendimento ao consumidor, então o
cliente será um representante do serviço de atendimento. Se você está construindo um
sistema de negociação de penhores, o consumidor será um negociador de penhores.
A maior objeção a essa regra é que usuários reais do sistema em desenvolvimen-
to são muito valiosos para ser emprestados ao time. Os gerentes terão de decidir o
que vale mais – ter o software acabado mais cedo e melhor ou acumular o trabalho de
uma ou duas pessoas. Se ter o sistema não agrega mais valor ao negócio do que ter
uma pessoa a mais trabalhando, talvez o sistema não devesse ser desenvolvido.
Também não quer dizer que o cliente no time não consiga trabalhar em sua fun-
ção habitual. Nem os programadores conseguem gerar 40 horas de questões a cada
semana. O cliente presente terá a desvantagem de estar fisicamente separado dos ou-
tros clientes, mas é provável que ele tenha tempo para fazer seu trabalho habitual.
A desvantagem de ter um cliente presente ocorre quando ele já passou centenas
de horas ajudando os programadores e então o projeto é cancelado. Dessa forma, vo-
cê perdeu o trabalho que ele fez, e também o trabalho que ele poderia ter feito se não
estivesse contribuindo em um projeto fracassado. A XP faz o possível para garantir
que o projeto não fracassará.
72 PROGRAMAÇÃO EXTREMA EXPLICADA
Padrões de Codificação
Se você terá todos esses programadores trabalhando em tantas partes diferentes do
sistema, trocando de dupla várias vezes por dia e refatorando os códigos uns dos ou-
tros constantemente, você não pode ter conjuntos diferentes de práticas de codifica-
ção. Com um pouco de prática, será impossível dizer qual pessoa do time escreveu
que código.
O padrão adotado deve exigir a menor quantidade de trabalho possível, consis-
tente com a regra do “uma e somente uma vez” (sem código duplicado). O padrão
deve enfatizar a comunicação. Finalmente, o padrão deve ser adotado voluntaria-
mente por todo o time.
CAPÍTULO 11
Como Isso Poderia Dar Certo?
M
as espere aí! Nenhuma das práticas descritas anteriormente é única ou ori-
ginal. Todas têm sido usadas desde a codificação dos primeiros programas.
Quando os seus pontos fortes tornaram-se aparentes, a maioria deles foi
abandonada por práticas mais complicadas e mais caras. Então por que a XP não é
uma abordagem simplista do software? Antes de continuarmos, é melhor convencer-
mos a nós mesmos de que essas práticas simples não nos prejudicarão como prejudi-
caram os projetos de software a décadas atrás.
O colapso da curva exponencial do custo das modificações trouxe todas essas
práticas de volta ao jogo. Cada uma dessas práticas tem os mesmos pontos fracos de
antes, mas e se esses pontos fracos fossem agora compensados pelos pontos fortes
das outras práticas? Nós talvez possamos ir adiante fazendo as coisas de maneira
simples.
Este capítulo apresentará as práticas sob uma outra perspectiva, desta vez focada
no que normalmente torna a prática insustentável e mostrando como as outras prá-
ticas impedem que os seus efeitos negativos sobrecarreguem o projeto. Este capítulo
também apresenta como toda a história da XP poderia dar certo.
O Jogo do Planejamento
Seria impossível começar o desenvolvimento com apenas um esboço de plano. Você
não conseguiria atualizar constantemente o plano – isso levaria muito tempo e inco-
modaria os clientes. A não ser que:
• você tivesse, no início, um plano que desse uma idéia ao cliente do que pode-
ria acontecer nos próximos dois anos;
• você definisse pequenos ciclos de entrega para que qualquer erro no plano ti-
vesse um impacto de algumas semanas ou meses no máximo;
• seu cliente estivesse trabalhando junto com o time, possibilitando o rápido reco-
nhecimento de potenciais modificações e oportunidades para melhoramentos.
Dessa forma, talvez seja possível começar o desenvolvimento com um plano sim-
ples e refiná-lo constantemente ao longo do tempo.
Metáfora
Seria impossível começar o desenvolvimento com uma metáfora apenas. Ela não
apresenta detalhes suficientes e, além disso, o que acontece se ela estiver errada? A
não ser que:
• você tenha feedback concreto rapidamente do código real e testes para verificar
se a metáfora está funcionando na prática;
• seu cliente sinta-se à vontade falando sobre o sistema utilizando a metáfora;
• você refatorasse para refinar continuamente o seu entendimento do que a me-
táfora quer dizer na prática.
Dessa forma, talvez seja possível começar o desenvolvimento com apenas uma
metáfora.
COMO ISTO PODERIA DAR CERTO? 75
Projeto Simples
Seria impossível ter apenas um projeto que fosse suficiente para a codificação de ho-
je. A limitação levaria você a um beco sem saída, deixando-o incapaz de prosseguir
na evolução do sistema. A não ser que:
• você estivesse acostumado a refatorar, fazendo com que modificações não fos-
sem uma preocupação;
• você tivesse uma metáfora global clara para certificar-se de que modificações
futuras tenderiam a seguir um caminho convergente;
• você estivesse programando com um parceiro, assim você teria certeza de es-
tar fazendo um projeto simples, e não um estúpido.
Dessa forma, talvez seja possível trabalhar com um projeto para hoje.
Testes
Seria impossível escrever todos aqueles testes. Levaria tempo demais. Os programa-
dores não escreverão testes. A não ser que:
• o projeto seja o mais simples possível, fazendo com que escrever testes não se-
ja tão difícil;
• você esteja programando com um parceiro, de forma que, se você não conse-
guir imaginar um novo teste, o seu parceiro conseguirá, e se ele quiser mandar
todos os testes longe, você gentilmente tirará o teclado dele.
• você se sinta bem ao ver todos os testes executando;
• seus clientes se sintam bem em relação ao sistema ao ver todos os testes deles
executando.
Dessa forma, talvez programadores e clientes escrevam testes. Além disso, se vo-
cê não escrever testes automatizados, o resto da XP não funcionará tão bem.
Refatoração
Seria impossível refatorar o projeto do sistema freqüentemente. Demoraria muito tem-
po, seria muito difícil controlar e provavelmente estragaria o sistema. A não ser que:
• você tenha testes, fazendo com que seja menos provável que você estrague al-
go sem perceber;
• você tenha integração freqüente, de modo que, se você acidentalmente estra-
gar algo sem perceber, ou se uma de suas refatorações entrar em conflito com
o código de outra pessoa, você ficará sabendo em poucas horas;
• você esteja tranqüilo, o que lhe dará mais coragem e diminuirá a probabilida-
de de cometer erros.
Dessa forma, talvez seja possível refatorar sempre que você perceber uma opor-
tunidade de simplificar o sistema, de reduzir as duplicações e de comunicar algo
mais claramente.
Programação em Pares
É impossível escrever todo o código de produção em pares. Será muito lento. E se
duas pessoas não se entenderem? A não ser que:
Dessa forma, talvez seja possível escrever todo o código de produção em pares.
Além disso, é mais provável a ocorrência de erros, o reprojeto e o desrespeito às prá-
ticas quando as pessoas programam sozinhas, principalmente sob pressão.
Propriedade Coletiva
Seria impossível que todos pudessem mudar qualquer coisa em qualquer parte do
sistema. O pessoal estaria sempre estragando algo, e o custo de integração subiria
drasticamente. A não ser que:
Dessa forma, talvez seja possível que todos alterem código em qualquer lugar do
sistema assim que perceberem uma chance de melhorá-lo. Além disso, sem proprie-
dade coletiva, a taxa de evolução do projeto diminui drasticamente.
Integração Contínua
Seria impossível integrar depois de apenas algumas horas de trabalho. Integração
demora muito tempo e há muitos conflitos e chances de se estragar algo acidental-
mente. A não ser que:
• você possa executar testes rapidamente para certificar-se de que não estragou
nada;
• você programe em pares, diminuindo pela metade as quantidades de modifi-
cações que precisam ser integradas;
• você refatore para que haja mais pedaços pequenos, reduzindo a probabilida-
de de conflito.
Dessa forma, talvez seja possível integrar depois de algumas horas. Além disso,
se você não integrar rapidamente, a probabilidade de haver conflitos cresce, e o cus-
to de integração aumenta acentuadamente.
Semana de 40 horas
Seria impossível trabalhar 40 horas por semana. Você não consegue produzir algo
que tenha valor em apenas 40 horas. A não ser que:
Dessa forma, talvez seja possível produzir algo suficientemente valioso em 40 ho-
ras semanais. Além disso, se o time não tiver vigor e energia, ele não será capaz de
executar o resto das práticas.
Cliente Presente
Seria impossível ter um cliente real junto ao time durante todo o tempo. Eles podem
agregar muito mais valor ao negócio se estiverem em outro lugar. A não ser que:
Cliente presente
Jogo do Planejamento
Semana de 40 horas
Metáfora
Padrões de
codificação
Integração contínua
Propriedade coletiva
Figura 4 As práticas reforçam umas as outras.
Dessa forma, talvez os clientes possam agregar mais valor à empresa ao contri-
buír com o projeto. Além disso, se não for incluído um cliente no time, será preciso
adicionar risco ao projeto. Afinal, eles precisarão planejar de forma antecipada e co-
dificar sem saber exatamente que testes precisam ser satisfeitos e quais podem ser ig-
norados.
Padrões de Codificação
Seria impossível pedir ao time para codificar seguindo um padrão comum. Progra-
madores são profundamente individualistas e prefeririam desistir do projeto a mu-
dar seu estilo de indentação. A não ser que:
• a XP como um todo faça com que eles desejem fazer parte de um time vence-
dor.
Dessa forma, talvez eles possam estar mais dispostos a mudar um pouco o seu es-
tilo. Além disso, sem padrões de codificação, os atritos adicionais dificultarão a pro-
gramação em pares e a refatoração de maneira significativa.
Conclusão
Nenhuma prática consegue se manter por si só (com exceção dos testes). Elas reque-
rem outras práticas para manter-se equilibradas. O diagrama da Figura 4 resume as
práticas. Uma linha conectando duas práticas mostra que elas reforçam uma à outra.
Eu não queria apresentar essa figura no começo porque ela faz a XP parecer compli-
cada. As peças individuais são simples. A riqueza vem da interação entre as partes.
CAPÍTULO 12
Estratégia de Gerenciamento
O
dilema do gerenciamento: por um lado, você gostaria que o gerente tomasse
todas as decisões. Não há degradação de comunicação porque há apenas
uma pessoa. Uma pessoa será responsável pelo gerenciamento superior.
Uma pessoa terá a visão. Mais ninguém precisa estar a par disso, porque todas as de-
cisões virão de uma só pessoa.
Sabemos que essa estratégia não funciona, porque uma única pessoa não sabe o
suficiente para tomar todas as decisões corretas. Estratégias de gerenciamento que
são balanceadas no sentido de um controle centralizado são também difíceis de exe-
cutar, porque requerem muito desgaste daqueles que estão sendo gerenciados.
Por outro lado, a estratégia oposta também não funciona. Você não pode simples-
mente deixar que todos façam o que quiserem, sem supervisão. As pessoas inevita-
velmente saem pela tangente. Alguém precisa ter uma visão maior do projeto e ser
capaz de influenciá-lo quando ele sai de curso.
Mais uma vez, nós podemos contar com os princípios para nos ajudar a navegar
entre estes dois extremos:
A estratégia que emerge desta avaliação está mais para tomada de decisões des-
centralizada do que controle centralizado. O papel do gerente é fazer o Jogo do Pla-
nejamento acontecer, coletar métricas, garantir que as métricas sejam vistas por aque-
les cujo trabalho está sendo medido e, ocasionalmente, intervir em situações que não
podem ser resolvidas de forma distribuída.
Métricas
A métrica é a ferramenta básica de gerenciamento da XP. Por exemplo, a razão entre
tempo estimado de desenvolvimento e tempo de calendário é a medida básica para
fazer o Jogo do Planejamento acontecer. Ela deixa que o time defina a velocidade do
projeto. Se a razão aumenta (menos tempo de calendário para uma dada quantidade
estimada de desenvolvimento), isso pode significar que o processo do time está indo
bem. Ou pode significar que o time não está fazendo outras coisas além de cumprir
com as exigências (como refatoração e programação em pares), e que, a longo prazo,
um preço será pago por isso.
O meio de comunicação das métricas é o Grande e Visível Mural. Em vez de man-
dar e-mail a todos, que eles aprendem a ignorar, o gerente periodicamente (pelo me-
nos uma vez por semana) atualiza um proeminente mural. Esta é geralmente toda a
intervenção necessária. Você acha que não estão escrevendo testes suficientes? Colo-
que um gráfico do número de testes escritos até agora, e atualize-o diariamente.
Não utilize muitas métricas e esteja preparado para retirar as métricas que já ser-
viram ao seu propósito. Três ou quatro métricas a cada vez são geralmente o que o ti-
me agüenta.
As métricas tendem a se deteriorar com o tempo. Particularmente, é provável que
qualquer métrica que se aproxime dos 100% seja inútil. Para os escores dos testes de
unidade, que devem ser de 100%, esse conselho não se aplica, mas aí os escores de
teste de unidade estão mais para um pressuposto do que para uma métrica. No en-
tanto, você não pode concluir que, ao ter 97% de escore nos testes funcionais, lhe fal-
tem 3% de trabalho a ser feito. Se uma métrica se aproxima dos 100%, você deve
substituí-la por uma outra que inicie bem abaixo.
ESTRATÉGIA DE GERENCIAMENTO 81
Isso tudo não sugere que você possa gerenciar um projeto XP através dos núme-
ros apenas. Na verdade, os números são uma maneira sutil e não-coerciva de comu-
nicar a necessidade de mudar. O barômetro mais apurado do gerente XP para a ne-
cessidade de mudança é a consciência de suas próprias sensações, tanto físicas quan-
to emocionais. Se você fica com um nó no estômago quando entra no carro pela ma-
nhã, algo está errado com o projeto e é sua função fazer as mudanças.
Funções do Treinador
O que a maioria das pessoas entende por gerenciamento é dividido em dois papéis
na XP: o treinador e o rastreador (que podem ser desempenhados ou não pela mes-
ma pessoa). O treinador está envolvido principalmente com a execução (e a evolu-
ção) técnica do processo. O treinador ideal é um bom comunicador, alguém que não
entra em pânico facilmente, com habilidades técnicas (apesar de que este não é um
requisito absoluto) e confiante. É provável que você queira usar como treinador a
pessoa que em outros times teria sido o programador líder ou o arquiteto do sistema.
No entanto, o papel de treinador na XP é muito diferente.
As expressões “programador líder” e “arquiteto do sistema” invocam a idéia de
gênios isolados tomando as decisões importantes do projeto. O treinador é exatamen-
te o oposto. A medida de um treinador é quão poucas são as decisões técnicas que ele
ou ela toma: sua função é fazer com que todos os outros tomem boas decisões.
O treinador não assume a responsabilidade por muitas tarefas de desenvolvimen-
to. Na verdade, suas ocupações são as seguintes:
A comida é também uma marca da XP. Existe algo de poderoso em dividir o pão
com alguém. Você tem uma discussão completamente diferente com ele se vocês es-
tiverem mastigando ao mesmo tempo. Então os projetos XP têm sempre comida à
sua volta. (Eu recomendo particularmente as barras de chocolate Frigor Noir, se vo-
cê encontrá-las, mas alguns projetos parecem sobreviver com barrinhas licorosas
Twizzler. Você pode desenvolver um menu local.)
Rob Mee escreve:
Rastreamento
O rastreamento é o outro principal componente do gerenciamento na XP. Você pode
fazer quantas estimativas quiser, mas se você não comparar o que realmente aconte-
ceu com o que você previu que aconteceria, você nunca aprenderá.
É função do rastreador reunir todas as métricas que estão sendo rastreadas no
momento e garantir que o time conheça aquilo que foi efetivamente mensurado (e se
lembre daquilo que foi previsto e desejado).
Fazer o Jogo do Planejamento acontecer faz parte do rastreamento. O rastreador
precisa conhecer as regras do jogo de cor e estar preparado para as impor mesmo em
situações emocionais (o planejamento é sempre emocional).
O rastreamento precisa ocorrer sem muito desgaste. Se a pessoa que está reco-
lhendo o tempo real de desenvolvimento pergunta aos programadores sobre seu sta-
tus duas vezes ao dia, logo os programadores fugirão das interrupções. O rastreador
deve experimentar qual o mínimo de mensuração que ele pode fazer e ainda ser efe-
tivo. Recolher dados reais de desenvolvimento real duas vezes por semana é sufi-
ciente. Mais mensurações provavelmente não lhe darão melhores resultados.
Intervenção
Gerenciar um time XP não é mamão com açúcar. Algumas vezes, o problema sim-
plesmente não pode ser resolvido pelo brilhantismo emergente do time, encorajado
por um dedicado e cuidadoso gerente. Em momentos como esse, o gerente XP preci-
sa se sentir confortável para intervir, tomando decisões – até mesmo algumas impo-
pulares – e observando as conseqüências até o fim.
Mas, em primeiro lugar o gerente deve investigar cuidadosamente para descobrir
se havia algo que eles deveriam ter sabido ou feito mais cedo e que pudesse ter evi-
tado o problema. O momento da intervenção não é para a autopromoção do gerente.
Na verdade, é um momento para se aproximar do time dizer: “Eu não sei como dei-
xei as coisas chegarem a esse ponto, mas agora preciso fazer XXX”. Humildade é a re-
gra para uma intervenção.
Um assunto sério o suficiente para uma intervenção é a troca de pessoal. Se um
membro do time não está funcionando, o gerente precisa pedir para que ele saia.
ESTRATÉGIA DE GERENCIAMENTO 83
Uma decisão como esta é melhor ser feita cedo do que tarde. Tão-logo você puder
imaginar um cenário em que a demissão seria mais uma ajuda do que um obstáculo,
você deve efetuá-la.
Uma função um pouco mais agradável é a intervenção quando o processo do ti-
me precisa de alterações. Geralmente não é dever do gerente ditar aquilo que deve
ser alterado nem como, mas apenas indicar a necessidade de alteração. O time deve
criar um ou mais experimentos a serem tentados. Então o gerente reporta as mudan-
ças mensuradas, causadas pelo experimento.
A última função intervencionista do gerente é matar o projeto. O time provavel-
mente nunca o mataria por si só. Mas virá o dia em que mais investimento de enge-
nharia no sistema atual é menos atrativo do que alguma outra alternativa, como co-
meçar um projeto de substituição. O gerente tem a responsabilidade de estar ciente
do momento em que esse limite foi ultrapassado e de informar o gerenciamento su-
perior da necessidade de mudança.
CAPÍTULO 13
Estratégia de Ambiente de Trabalho
Criaremos uma área de trabalho aberta para o nosso time, com pequenos
espaços privados nas áreas periféricas e uma área comum de programa-
ção no meio.
S
obre a Figura 5, Ron Jeffries comenta:
Se você não tem um bom lugar para trabalhar, o seu projeto não será bem sucedido.
A diferença entre um lugar bom e um mau lugar para o time é gritante e imediata.
Um dos momentos decisivos em minha carreira de consultor foi quando me pe-
diram para revisar o projeto orientado a objetos para um sistema. Eu olhei o sistema
e estava realmente uma bagunça. Então, eu reparei onde cada um se sentava. O time
era composto por quatro programadores seniores. Todos tinham seu próprio escritó-
rio, cada um ocupando um dos quatro cantos de uma sala de tamanho médio. Eu lh-
es disse que eles deveriam juntar os escritórios. Consultaram-me por causa de meus
conhecimentos em Smalltalk e objetos, e a sugestão mais valiosa que eu tinha era que
eles deveriam reorganizar a mobília.
Organizar o ambiente de trabalho é uma tarefa difícil em qualquer situação, pois
sempre há muitas restrições conflitantes. O planejador do ambiente de trabalho é
avaliado pelo quão pouco de dinheiro ele gasta e em quanta flexibilidade ele man-
tém. As pessoas que utilizam as instalações querem trabalhar perto do restante do ti-
me, mas ao mesmo tempo precisam de privacidade para telefonar e marcar uma con-
sulta com o seu médico.
ESTRATÉGIA DE AMBIENTE DE TRABALHO 87
E
xistem dois modos comuns de errar na relação entre os Negócios e o Desenvol-
vimento. Se um deles ganha tiver demais, o projeto é prejudicado.
Os Negócios
Se os Negócios têm o poder, eles sentem que é apropriado determinar todas as qua-
tro variáveis para o Desenvolvimento. “Isto é o que você vai fazer. Esta é a data em
que tem que estar pronto. Não, você não vai ter nenhuma workstation nova. E é bom
que seja da mais alta qualidade, ou vai sobrar pra você, malandro!”.
Neste cenário, os Negócios sempre definem demais. Alguns dos itens da lista de
requisitos são absolutamente essenciais. Mas outros não são. E se o Desenvolvimen-
to não tiver nenhum poder, ele não pode se opor; não podem forçar os Negócios a
decidir qual é qual. Então o Desenvolvimento vai trabalhar obedientemente, de ca-
beça baixa, na tarefa impossível que lhe foi dada.
Parece estar na natureza dos requisitos menos importantes o fato de eles acarreta-
rem os mais altos riscos. São tipicamente os menos compreendidos, logo há grande
risco de que os requisitos mudem completamente durante o desenvolvimento. De al-
guma maneira, eles também tendem a ser os tecnicamente mais arriscados.
O resultado do cenário “Negócios no comando” é que o projeto demanda muito
esforço e um risco tremendamente alto, para um retorno muito pequeno.
90 PROGRAMAÇÃO EXTREMA EXPLICADA
Desenvolvimento
Agora, quando o Desenvolvimento tem sua chance no comando, você imagina que a
situação melhoraria. Mas não. O efeito final é exatamente o mesmo.
Quando o Desenvolvimento está no comando, eles colocam em dia todo o proces-
so e tecnologia para o qual eles não tinham tempo quando os “engravatados” esta-
vam controlando-os. Eles instalam novas ferramentas, linguagens e tecnologias. E es-
sas ferramentas, linguagens e tecnologias são escolhidas porque são interessantes e
modernas. Modernismo implica risco. (Se nós ainda não aprendemos isso, quando
iremos aprender?)
Então, o resultado do cenário “Desenvolvimento no comando” é também muito
esforço e um risco tremendamente alto para um retorno muito pequeno.
O que Fazer?
A solução é, de alguma forma, dividir a responsabilidade e o poder entre Negócios e
Desenvolvimento. Pessoas de Negócios devem tomar as decisões que lhes cabem.
Programadores devem tomar as decisões que lhes cabem. Cada decisão tomada por
uma das partes deve ser informada à outra. Nenhuma das partes deve poder decidir
unilateralmente coisa alguma.
Manter esse equilíbrio político pode parecer impossível. Se as Nações Unidas não
conseguem fazê-lo, que chances você pode ter? Bom, se tudo que você tivesse fosse o
vago objetivo de “balancear o poder político”, você não teria chance. A primeira pes-
soa de personalidade forte que aparecesse atrapalharia o equilíbrio. Felizmente, o ob-
jetivo pode ser bem mais concreto do que isso.
Primeiramente, uma história. Se alguém me pergunta se eu prefiro uma Ferrari
ou uma minivan, eu com certeza escolheria a Ferrari. Será inevitavelmente mais di-
vertido. No entanto, assim que alguém diz: “Você quer a Ferrari por 200.000 francos
ou a minivan por 40.000 francos?”, eu posso tomar uma decisão mais bem-informa-
do. Acrescentar novos requisitos como “Eu preciso ser capaz de levar cinco crianças”
ou “Ele precisa correr a 200 km/h” esclarece ainda mais as coisas. Há casos em que
ambas as decisões fazem sentido, mas você não pode tomar uma boa decisão com ba-
se apenas em propaganda. Você precisa saber que recursos você tem, quais as limita-
ções e quanto cada uma delas custa.
De acordo com esse modelo, pessoas de Negócios devem decidir sobre:
Já que as decisões de negócios são tomadas durante todo o ciclo de vida do proje-
to, dar às pessoas de negócios a responsabilidade pelas decisões de negócios implica
que um cliente faz parte do time XP tanto quanto um programador. Particularmente,
para obter melhores resultados, eles deveriam ficar junto ao time e estar disponíveis
em tempo integral para responder a questões.
A Escolha da Tecnologia
Mesmo que a escolha de uma tecnologia pareça ser em princípio uma decisão técni-
ca, ela é na verdade uma decisão de negócios, mas que deve ser tomada levando em
conta informações do Desenvolvimento. O cliente precisará viver com um fornece-
dor de um banco de dados ou de uma linguagem por muitos anos e ele precisa sen-
tir-se confortável com a relação tanto a nível de negócios quanto no nível técnico.
Se um consumidor me diz: “Nós queremos este sistema, e você precisa usar este
banco de dados relacional e esta IDE Java”, minha função é apontar as conseqüências
dessas decisões. Se eu penso que um banco de dados orientado a objetos e C++ é a
melhor escolha, eu faço estimativas do projeto dos dois jeitos. E então as pessoas de
negócios podem tomar uma decisão de negócios.
Existe ainda um outro aspecto das decisões tecnológicas, que se insere no domí-
nio do Desenvolvimento. Quando uma tecnologia é introduzida em uma compa-
nhia, alguém deve mantê-la viva enquanto ela estiver em uso. Os custos das mais
recentes e melhores tecnologias não ocorrem apenas no início do desenvolvimento
da produção, nem mesmo se restringem ao período de desenvolvimento. Os custos
precisam incluir o preço de construir e preservar a competência que mantém a tec-
nologia viva.
E se for Difícil?
Na maioria das vezes, as decisões que surgem desse processo são surpreendente-
mente simples de implementar. Programadores são bons em enxergar os monstros
escondidos em cada história. As pessoas de negócios dizem: “Eu não sabia que is-
so iria sair tão caro. Reduza isso para um terço do trabalho. Vai ser suficiente por
enquanto”.
Algumas vezes, no entanto, as coisas não funcionam assim. Às vezes, a menor e
mais valiosa parte do desenvolvimento é grande e arriscada na perspectiva dos pro-
gramadores. Quando isso acontece, você não pode nem piscar e precisará ser cuida-
doso. Só poderá arcar com alguns poucos erros. Talvez precise arranjar mais recursos
externos. Mas quando chegar a hora de atacar, então você faz por merecer o seu di-
nheiro. Você faz o possível para estimular um escopo menor. Você faz tudo que pode
imaginar para reduzir o risco. E então, você parte para a luta.
92 PROGRAMAÇÃO EXTREMA EXPLICADA
Outra maneira de dizer isso é que a divisão de poder entre Negócios e Desenvol-
vimento não é uma desculpa para evitar o trabalho duro. Muito pelo contrário. É
uma maneira de diferenciar aqueles trabalhos que são realmente difíceis daqueles
que você ainda não encontrou um jeito de simplificar. Na maior parte, o trabalho se-
rá mais simples do que você imaginou em princípio. Quando não for, de qualquer
forma você o faz, afinal você é pago para isso.
CAPÍTULO 15
Estratégia de Planejamento
P
lanejar é o processo de adivinhar como será desenvolver um software com um
cliente. Alguns dos propósitos do planejamento são:
• unir o time;
• decidir o escopo e as prioridades;
• estimar custo e cronograma;
• dar a todos a confiança de que o sistema realmente pode ser feito;
• prover parâmetros (benchmark) para feedback.
O Jogo do Planejamento
O planejamento da XP abstrai propositalmente o processo de planejamento para dois
participantes – Negócios e Desenvolvimento. Isso ajuda a remover parte do envolvi-
mento emocional desnecessário nas discussões sobre os planos. Em vez de: “Joe, seu
idiota, você me prometeu isso para sexta”, o Jogo do Planejamento diz: “O Desenvol-
vimento aprendeu algo. Ele precisa da ajuda dos Negócios para obter o melhor de-
sempenho”. Mas não há como um simples conjunto de regras eliminar a emoção, e
não é isso o que nós queremos. As regras existem para lembrar a todos de como seria
o ideal, além de fornecer uma referência comum quando as coisas não vão bem.
Os Negócios muitas vezes não gostam do Desenvolvimento. O relacionamento
entre as pessoas que precisam de sistemas e as pessoas que desenvolvem os sistemas
é tão tenso que lembra os relacionamentos entre inimigos de vários séculos. Descon-
fiança, acusações e manipulações sutis e indiretas existem em quantidade. Você não
consegue desenvolver software de qualidade em um ambiente como esse.
Se essa descrição não se aplica ao seu ambiente, sorte sua. O melhor ambiente é
aquele onde existe confiança mútua. Cada parte respeita a outra e acredita que ela
tem as melhores intenções, que visam ao bem da comunidade. Cada parte está dis-
posta a deixar a outra fazer seu trabalho, unindo as habilidades, experiências e pers-
pectiva de ambos.
Você não pode impor esse tipo de relacionamento. Não pode apenas dizer: “Nós
sabemos que estragamos tudo. Realmente sentimos muito. Isso não acontecerá nova-
mente. Vamos trabalhar de maneira totalmente diferente daqui pra frente, começan-
do logo depois do almoço”. O mundo e as pessoas não funcionam desse jeito. Sob es-
tresse, as pessoas regridem ao comportamento anterior, não importando o quão mal
esse comportamento tenha funcionado no passado.
ESTRATÉGIA DE PLANEJAMENTO 95
O Objetivo
O objetivo do jogo é maximizar o valor do software produzido pelo time. Do valor do
software, você precisa tirar o custo do desenvolvimento e o risco a que estamos expos-
tos durante o desenvolvimento.
A Estratégia
A estratégia para o time é investir o mínimo possível para colocar as funcionalidades
mais valiosas em produção o mais cedo possível, mas apenas em conjunto com as es-
tratégias de programação e de projeto criadas para reduzir o risco. Sob a luz das li-
ções de tecnologia e de negócios aprendidas neste primeiro sistema, fica claro para os
Negócios qual a funcionalidade mais valiosa no momento, e o time coloca-a rapida-
mente em produção. E assim por diante.
As Peças
As peças do jogo do planejamento são os cartões de histórias. A Figura 6 mostra um
exemplo.
Os Jogadores
Os dois jogadores no Jogo do Planejamento são Desenvolvimento e Negócios. Desen-
volvimento consiste coletivamente em todas as pessoas que serão responsáveis por
implementar o sistema. Os Negócios consistem coletivamente em todas as pessoas
que tomarão as decisões sobre o que o sistema deve fazer.
Algumas vezes é fácil perceber quem faz o papel de “Negócios” no Jogo do Pla-
nejamento. Se um negociante de contratos está pagando por um software feito sob
medida, então ele representa “os Negócios”. Ele decide o que é mais importante fa-
zer primeiro. E se você está fazendo um produto de prateleira para o grande públi-
co? Quem são os Negócios? Os Negócios precisam tomar decisões de escopo, prio-
ridade e conteúdo das versões. Essas decisões normalmente são feitas pelo depar-
96 PROGRAMAÇÃO EXTREMA EXPLICADA
Alguns dos melhores jogadores dos Negócios que eu já vi foram usuários experien-
tes. Por exemplo, eu trabalhei em um sistema de serviço ao consumidor para fundos
de pensão. Os Negócios eram interpretados principalmente por uma supervisora de
serviços ao consumidor que tinha sido promovida após ter trabalhado com o sistema
anterior por muitos anos. Ela conhecia cada detalhe dele. De tempos em tempos, ela
encontrava problemas para distinguir o que o novo sistema deveria fazer de o que o
outro sistema fazia, mas depois de um tempo trabalhando com histórias, ela aprendeu.
Os Movimentos
Existem três fases no jogo:
• exploração – descubra que novas coisas o sistema pode fazer;
• compromisso – decida que subconjunto de todos os possíveis requisitos será
desbravado a seguir;
• direcionamento – guie o desenvolvimento deixando a realidade moldar o plano.
Os movimentos de cada fase são freqüentemente feitos naquela fase específica,
mas não apenas nela. Você escreverá novas histórias durante a fase de direcionamen-
ESTRATÉGIA DE PLANEJAMENTO 97
to, por exemplo. Além disso, as fases são cíclicas; depois de um tempo direcionando,
você precisa voltar para a exploração.
Fase de Exploração
O objetivo da fase de exploração é dar a ambos os jogadores uma visão de o que o sis-
tema fará. Esta fase tem três movimentos:
Escreva uma história – Os Negócios escrevem uma história descrevendo algo que o
sistema precisa fazer. As histórias são escritas em cartões indexados, com um nome e
um curto parágrafo descrevendo o propósito da história.
Estime uma história – O Desenvolvimento estima quanto tempo levará para imple-
mentar a história. Se o Desenvolvimento não conseguir estimar uma história, pode
solicitar aos Negócios que esclareça ou separe a história em partes. Um método sim-
ples para estimar histórias é perguntar a você mesmo: “Quando tempo levaria para
implementar isto se eu tivesse que implementar apenas esta história e não fosse in-
terrompido e nem tivesse reuniões?”. Na XP, chamamos isso de Tempo Ideal de De-
senvolvimento. Como você verá adiante (em “Defina a Velocidade”), antes de se
comprometer com um cronograma, você mede a razão entre o tempo ideal e o calen-
dário.
Separe a história em partes – Se o Desenvolvimento não consegue estimar uma his-
tória inteira, ou se os Negócios percebem que parte de uma história é mais importan-
te do que o resto, os Negócios podem separá-la em duas ou mais histórias.
Fase de Comprometimento
O propósito da fase de comprometimento é que os Negócios escolham o escopo e a
data da próxima entrega, e que o Desenvolvimento se comprometa a fazer a entrega
com confiança. A fase de comprometimento tem quatro movimentos.
Classificação por valor – Os Negócios classificam as histórias em três pilhas: (1)
aquelas sem as quais o sistema não funciona, (2) aquelas que são menos essenciais
mas proporcionam um valor significativo para os negócios e (3) aquelas que seria in-
teressante ter.
Classificação por risco – O Desenvolvimento classifica as histórias em três pilhas: (1)
aquelas que eles podem estimar precisamente, (2) aquelas que eles podem estimar
razoavelmente bem e (3) aquelas que eles não conseguem estimar.
Definição de velocidade – O Desenvolvimento diz aos Negócios a rapidez com que
o time pode programar em Tempo Ideal de Desenvolvimento por mês de calendário.
Escolha do escopo – Os Negócios escolhem o conjunto de cartões que farão parte da
versão, seja definindo uma data para o desenvolvimento ser terminado e então esco-
lhendo cartões baseados nas suas estimativas e na velocidade do projeto, seja esco-
lhendo cartões e calculando a data.
Fase de Direcionamento
O propósito da fase de direcionamento é atualizar o plano com base no que o Desen-
volvimento e os Negócios aprenderam. A fase de direcionamento tem quatro movi-
mentos:
98 PROGRAMAÇÃO EXTREMA EXPLICADA
Planejamento de Iteração
O Jogo do Planejamento descrito acima fornece ao cliente a capacidade de direcionar
o desenvolvimento a cada três semanas. Dentro de cada iteração, o time de desenvol-
vimento aplica praticamente as mesmas regras para planejar suas atividades.
O Jogo do Planejamento das Iterações é parecido com o Jogo do Planejamento, no
qual cartões são usados como peças. Desta vez, no entanto, em vez de as peças serem
cartões de histórias, são cartões de tarefas. Os jogadores são todos os programadores.
A escala de tempo é mais curta – todo o jogo acontece em uma iteração (período de
uma a quatro semanas). As fases e os movimentos são parecidos.
Fase de Exploração
Escreva uma tarefa – Tome as histórias da iteração e transforme-as em tarefas. Em
geral, as tarefas são menores do que uma história inteira, porque você não consegue
implementar uma historia inteira em alguns poucos dias. Algumas vezes, uma tare-
fa dará suporte para diversas histórias. Outras vezes, uma tarefa não estará relacio-
nada diretamente com nenhuma história em particular – por exemplo, uma migra-
ção para uma nova versão do software do sistema. A Figura 7 mostra um exemplo de
um cartão de tarefas real.
Combine tarefas/separe em partes uma tarefa – Se uma tarefa não puder ser estimada
para uns poucos dias, divida-a em partes menores. Se várias tarefas levam uma hora
cada, combine-as para formarem uma única tarefa maior.
Fase de Comprometimento
Aceite uma tarefa – Um programador aceita a responsabilidade por uma tarefa.
Estime a tarefa – A programador responsável estima o número ideal de dias de de-
senvolvimento para implementar cada tarefa. Com freqüência, isso depende de se
obter ajuda de um outro programador que esteja mais familiarizado com o código a
ESTRATÉGIA DE PLANEJAMENTO 99
ser modificado. As tarefas que demoram mais de alguns dias devem ser separadas
em mais tarefas (você terá de descobrir o seu próprio limiar exato comparando tare-
fas que foram concluídas em tempo com aquelas que não foram).
Você talvez pense que deveria incluir explicitamente os efeitos da programação
em pares nas suas estimativas, mas você precisa ignorar isso. O tempo que você gas-
ta ajudando outros programadores, falando com o cliente e indo a reuniões aparece
no fator de carga de trabalho.
Defina fatores de carga de trabalho – Cada programador define seus próprios fatores
de carga de trabalho para a iteração – a porcentagem de tempo que irão gastar real-
mente desenvolvendo. Este é um número calculado – a relação entre os dias de pro-
gramação ideais e o calendário. Se você completou as ultimas três iterações em o
equivalente a 6, 8 e 7,5 dias ideais de tarefas, então esta é a média que você deve in-
dicar na próxima iteração. O número de dias ideais de tarefas por iteração pode ser
bem baixos para novos membros do time ou para um treinador, chegando a dois ou
três dias em uma iteração de três semanas. Esse fator não pode ser maior do que se-
te ou oito para ninguém, ou eles não passarão tempo suficiente ajudando outros.
Faça o Balanceamento – Cada programador soma suas estimativas de tarefas e mul-
tiplica por seu fator de carga de trabalho. Os programadores que se descobrirem
comprometidos de maneira demasiada devem desistir de algumas tarefas. Se o time
inteiro está sobrecarregado, ele deve achar uma maneira de voltar ao equilíbrio (ve-
ja a seguir “Recuperação”).
100 PROGRAMAÇÃO EXTREMA EXPLICADA
Fase de Direcionamento
Implemente uma tarefa – Um programador toma um cartão de tarefas, acha um parcei-
ro, escreve os casos de teste para a tarefa, os faz funcionar e então integra e libera o
novo código quando o conjunto universal de testes executar.
Registre o progresso – A cada dois ou três dias, um dos membros do time pergunta
para cada programador o tempo que eles gastaram em cada uma das tarefas e quan-
tos dias eles ainda têm.
Recuperação – Os programadores que se descobrirem comprometidos em demasia
pedem por ajuda (1) reduzindo o escopo de algumas tarefas, (2) solicitando que o
cliente reduza o escopo de algumas histórias, (3) largando tarefas não essenciais, (4)
obtendo mais ou melhor ajuda, e como um último recurso, (5) solicitando ao cliente
para postergar algumas histórias para uma iteração posterior.
Verifique a história – Tão-logo os testes funcionais estejam prontos e as tarefas pa-
ra uma história estejam completas, os testes funcionais são executados para verificar
se a história funciona. Os casos interessantes que surgirem durante a implementação
podem ser adicionados ao conjunto de testes funcionais.
As principais diferenças entre o planejamento das iterações e o planejamento de
entrega é que você pode tolerar mais desvios no cronograma de iteração do que no
cronograma de comprometimento. Se uma das três semanas de uma iteração já pas-
sou e o progresso foi muito lento, é possível parar por um dia e fazer uma grande re-
fatoração colaborativa, necessária para o progresso de todos. Nenhum programador
sentirá que todo o projeto estará desabando naquele momento (pelo menos não de-
pois de ter alguma experiência). Porém, se o cliente vir tais modificações aparente-
mente drásticas diariamente, ele rapidamente ficará nervoso.
De certa forma, isso pode parecer uma mentira, pois você está omitindo para o
cliente alguns dos processos do desenvolvimento. É importante que isso não aconte-
ça. Você não omite as coisas deliberadamente. Se um cliente quiser estar presente du-
rante um dia inteiro de refatoração, ele certamente é bem-vindo, mas provavelmen-
te ele tem coisas mais importantes a fazer. A diferença entre os planejamentos de in-
ter e de intra-iteração é uma extensão do princípio de separação das responsabilida-
des técnicas de nogócio. Há modificações em um certo nível de detalhamento que
não dizem mais respeito aos Negócios – os programadores sabem como microgeren-
ciar o tempo de forma melhor do que qualquer pessoa de negócios.
Uma diferença entre o Jogo do Planejamento e o Jogo do Planejamento das Itera-
ções é que os programadores se candidatam a uma tarefa antes de estimá-la. O time
implicitamente assume responsabilidade coletiva pelas histórias, então as estimati-
vas devem ser feitas pelo time coletivamente. Programadores individuais assumem
a responsabilidade por tarefas, então eles devem estimar as tarefas por si mesmos.
Uma outra diferença do planejamento das iterações é que algumas tarefas não es-
tão relacionadas às necessidades do cliente. Se alguém precisa fortalecer as ferramen-
tas de integração, e este trabalho é grande o suficiente para que não seja possível efe-
tuá-lo nas brechas do desenvolvimento, então ele se torna uma tarefa, datada e prio-
rizada como todas as outras.
Vamos relembrar as restrições no processo de planejamento das iterações e como
a estratégia acima as atende.
ESTRATÉGIA DE PLANEJAMENTO 101
• Você não quer gastar muito tempo planejando, já que a realidade nunca fecha-
rá exatamente com o plano. Meio dia em um intervalo de 15 dias não é um
atraso muito grande. Claro que se você pudesse reduzir esse tempo seria me-
lhor, mas não é tanto tempo assim.
• Você quer feedback rápido sobre o seu progresso, então, ao percorrer um terço
do caminho,l você saberá se está com problemas. As respostas às perguntas
que o responsável por rastrear o progresso faz dão a você, no meio da iteração,
uma noção razoável quanto ao cumprimento do cronograma. O tempo restan-
te é geralmente suficiente para reagir localmente aos problemas, sem solicitar
modificações ao cliente.
• Você quer que os indivíduos responsáveis por entregar algo também sejam
responsáveis por estimar esse algo. Desde que os programadores se candida-
tem às tarefas antes de estimá-las, isso funcionará.
• Você quer limitar o seu escopo de desenvolvimento para o que realmente é ne-
cessário. É sempre estranho dizer que você pode trabalhar apenas 7,5 dias em
um período de três semanas (15 dias úteis divididos por um fator de carga de
trabalho de 2). No entanto, enquanto suas estimativas vão ficando cada vez
melhores, você descobrirá que é absolutamente verdade. Essa sensação de que
você não está realmente trabalhando tanto assim faz com que você queira fa-
zer mais tarefas. Mas você sabe que quer manter os padrões e a qualidade ao
fazer isso (e você tem um parceiro olhando para a mesma tela para certificar-
se de que você manterá a qualidade). Assim, você tende a trabalhar de manei-
ra simples, e ainda poder dizer honestamente que acabou a tarefa.
• Você quer um processo que não gere pressão suficiente para forçar as pes-
soas a fazerem coisas estúpidas, somente para atender as necessidades de
um plano de curto prazo. Novamente, isso retorna ao fato de que você pode
trabalhar por 7,5 dias. Você simplesmente não pode assumir tarefas demais.
Se você fizer isso em uma iteração, haverá feedback amplo e público de que
você não deveria ter tentado fazer tanta coisa. Então você não fará isso nova-
mente. Isso faz com que você se comprometa a fazer apenas aquilo que real-
mente pode, com qualidade.
A solução da XP é aceitar mais risco no plano tendo histórias maiores. Escreva his-
tórias que você possa estimar em termos de meses ideais de programação em vez de
semanas ideais de programação. Você pode dar ao cliente a oportunidade de fazer
escolhas ao encolher ou postergar algumas histórias, exatamente como faria no Jogo
de Planejamento normal.
Estimativas deveriam ser baseadas na experiência. Diferentemente do Jogo do Pla-
nejamento, ao responder uma proposta em uma semana, é impossível ter tempo para
adquirir muita experiência. Você deve estimar com base em suas experiências anterio-
res escrevendo sistemas parecidos. Se você não tem experiências anteriores escreven-
do sistemas parecidos, você não tem como aceitar uma oferta com preço fixo.
Uma vez que você fechou o contrato, a primeira coisa a fazer é voltar e jogar os es-
tágios inicias do Jogo do Planejamento. Dessa forma, você confirma imediatamente
a sua capacidade de entrega conforme o contrato.
CAPÍTULO 16
Estratégia de Desenvolvimento
A
XP usa a metáfora da programação para suas atividades – ou seja, tudo que
você faz se parece, de alguma forma, com programação: programar em XP é
como programar, com o acréscimo de algumas pequenas coisas, como testes
automatizados. Entretanto, como o resto da XP, o desenvolvimento XP é enganosa-
mente simples. Todas as partes são simples o suficiente para explicar, mas executá-
las é difícil. O medo surge. Sob pressão, velhos hábitos reaparecem.
A estratégia de desenvolvimento começa com o planejamento de iteração. A inte-
gração contínua reduz conflitos de desenvolvimento e cria um desfecho natural pa-
ra um episódio de desenvolvimento. A propriedade coletiva encoraja todo o time a
fazer todo o sistema de forma melhor. Finalmente, a programação em pares amarra
o processo como um todo.
Integração Contínua
Nenhum código permanece não-integrado por mais do que algumas horas. Ao fim
de cada episódio de desenvolvimento, o código é integrado com a última entrega, e
todos os testes precisam executar a 100%.
No extremo da integração contínua, toda vez que você modificasse um método, a
modificação seria instantaneamente refletida no código de todos os outros. Além da
infra-estrutura e da largura de banda requeridas para suportar esse estilo, a propos-
ta em si não funcionaria bem. Enquanto você está desenvolvendo, você quer fingir
que é o único programador do projeto. Você quer ir adiante com toda velocidade, ig-
norando a relação entre as modificações que você faz e as que os outros estão fazen-
do. Fazer com que as modificações possam ocorrer fora do seu controle imediato des-
truiria essa ilusão.
104 PROGRAMAÇÃO EXTREMA EXPLICADA
Integrar após algumas horas (certamente não mais do que um dia) fornece mui-
tos dos benefícios dos dois estilos – programador único e integração instantânea. En-
quanto você está desenvolvendo, pode fazer de conta que você e seu parceiro são a
única dupla do projeto. Podem fazer modificações onde quiserem. E então vocês tro-
cam de papel: como integradores, vocês sabem (a ferramenta os informa) onde estão
as colisões nas definições de classes e métodos. Ao executar os testes, vocês desco-
brem as colisões semânticas.
Se a integração demorasse algumas horas, não seria possível trabalhar dessa for-
ma. É importante ter ferramentas que suportem um ciclo rápido de integração/con-
figuração (build) de versões/testes. Você também precisa de um conjunto de testes ra-
zoavelmente completos que execute em alguns minutos. O esforço necessário para
corrigir as colisões não pode ser muito grande.
Mas isso não é um problema. A refatoração constante tem o efeito de dividir o sis-
tema em vários pequenos objetos e vários pequenos métodos. Isso minimiza as chan-
ces de que dois pares de programadores mudem a mesma classe ou o mesmo méto-
do ao mesmo tempo. Se eles o fizerem, o esforço necessário para conciliar as modifi-
cações é pequeno, porque cada uma delas representa umas poucas horas de desen-
volvimento.
Outra razão importante para aceitar os custos da integração contínua é que ela re-
duz drasticamente o risco do projeto. Se duas pessoas têm idéias diferentes sobre a
aparência ou a operação de um trecho de código, você estará sabendo em horas.Vo-
cê nunca passará dias procurando um bug que foi criado em um momento qualquer
das últimas semanas. E toda essa prática em integração é muito útil quando chega a
hora de criar o projeto final. A configuração (build) da versão de produção final não é
grande coisa. Todos os membros do time podem fazê-lo dormindo quando chegar o
momento, porque eles estiveram fazendo isso todos os dias durante meses.
A integração contínua fornece também um benefício humano durante o desenvol-
vimento. Enquanto trabalha em uma tarefa, você tem centenas de coisas em mente.
Ao trabalhar até que haja uma interrupção natural – não há mais itens pequenos no
cartão de coisas a fazer – e então integrar, você dá um ritmo ao desenvolvimento.
Aprenda/teste/codifique/entregue. É quase como respirar. Você forma uma idéia, a
expressa e a acrescenta ao sistema. Agora sua mente está limpa, pronta para a nova
idéia.
De tempos em tempos, a integração contínua força você a dividir a implementa-
ção de uma tarefa em dois episódios. Nós aceitamos a sobrecarga causada por isso: a
necessidade de lembrar o que já foi feito e o que ainda precisa ser feito. Nesse ínte-
rim, você pode descobrir o que fez com que o primeiro episódio ocorresse tão deva-
gar. Você começa o próximo episódio com um pouco de refatoração, e o resto do se-
gundo episódio ocorre sem problemas.
Propriedade Coletiva
A propriedade coletiva é esta idéia aparentemente maluca de que qualquer um pode
modificar qualquer trecho de código do sistema, a qualquer hora. Sem os testes, vo-
cê nunca conseguiria fazer isso. Com os testes e com a qualidade de teste que você
obtém após alguns meses escrevendo muitos testes, você pode conseguir. Mas você
só conseguirá se integrar apenas algumas horas de modificações a cada vez. O que,
obviamente, você fará.
ESTRATÉGIA DE DESENVOLVIMENTO 105
Um dos efeitos da propriedade coletiva é que códigos complexos não têm vida
longa. Pelo fato de todos estarem acostumados a olhar o sistema inteiro, esse código
será encontrado logo. E quando for encontrado, alguém tentará simplificá-lo. Se a
simplificação não funcionar, o que é evidenciado pela falha dos testes, então o códi-
go será jogado fora. Mesmo que isso aconteça, haverá alguém além do par original
que compreenda por que o código precisa ser complexo. O mais comum, no entanto,
é que a simplificação funcione, ou pelo menos parte dela.
A propriedade coletiva também previne que um código complexo entre no siste-
ma. Se você sabe que outra pessoa em breve estará olhando o que você está escreven-
do neste momento, você pensará duas vezes antes de colocar uma complexidade que
não possa ser imediatamente justificada.
A propriedade coletiva aumenta a sensação de poder pessoal em um projeto. Em
um time XP, você nunca precisa agüentar a estupidez de outra pessoa. Se algo está no
seu caminho, você tira. Se você escolhe deixar algo como está por enquanto, porque
lhe é conveniente, isso é problema seu. Mas você nunca fica preso. Então você nunca
pensa “Eu poderia fazer o meu trabalho se não tivesse de lidar com esses idiotas”.
Uma frustração a menos. Mais um passo rumo a uma forma mais clara de se pensar.
A propriedade coletiva também tende a espalhar o conhecimento do sistema por
todo o time. É improvável que exista uma parte do sistema que apenas duas pessoas
conhecem (precisa ser ao menos um par, o que já é melhor do que a situação usual,
em que um programador esperto mantém a todos como reféns). Isso reduz ainda
mais o risco do projeto.
Programação em Pares
A programação em pares mereceria o seu próprio livro. É uma habilidade refinada,
que você pode passar o resto da vida aperfeiçoando. Para os propósitos deste capítu-
lo, nós examinaremos apenas por que ela funciona para a XP.
Primeiramente algumas palavras sobre o que a programação em pares não é. Não
é uma pessoa programando enquanto outra assiste. Apenas assistir outra pessoa pro-
gramar é tão interessante quanto assistir grama morrer no deserto. Programação em
pares é um diálogo entre duas pessoas tentando programar simultaneamente (e ana-
lisar, projetar e testar) e entender em conjunto como programar melhor. É uma con-
versação em muitos níveis, assistida por um computador e focada nele .
Programação em pares também não é uma sessão de tutoria. Às vezes os pares
contêm um parceiro com muito mais experiência do que o outro. Quando isso acon-
tece, as primeiras sessões serão parecidas com uma tutoria. O parceiro iniciante fará
muitas perguntas e digitará muito pouco. Rapidamente, entretanto, o parceiro júnior
começará a detectar pequenos erros bobos, como parênteses não-balanceados. O par-
ceiro sênior agradecerá a ajuda. Após mais algumas semanas, o parceiro júnior vai
começar a compreender os padrões (patterns) que o parceiro sênior está usando, e
perceber desvios desses padrões.
Geralmente, em alguns meses, a diferença entre os parceiros não é tão evidente
quanto no princípio. O parceiro júnior digita mais freqüentemente. O par nota que
cada um deles tem pontos fortes e fracos. Produtividade, qualidade e satisfação au-
mentam.
106 PROGRAMAÇÃO EXTREMA EXPLICADA
Programar em pares não é como ser gêmeos siameses. Se você olhar o Capítulo 2,
Um Episódio de Desenvolvimento, notará que a primeira coisa que eu fiz foi pedir
ajuda. Algumas vezes, você está procurando por um parceiro em particular – ao ini-
ciar uma tarefa. No entanto, é mais comum que você apenas ache alguém que esteja
disponível. E se vocês dois têm tarefas a serem feitas, você concordam em trabalhar
em uma delas pela manhã e na outra à tarde.
E se duas pessoas simplesmente não se dão bem? Elas não precisam programar
em pares. O fato de haver duas pessoas que não podem formar pares complica o ar-
ranjo dos outros pares. Se o problema interpessoal for bastante sério, gastar alguns
momentos combinando pares é melhor do que uma briga.
E se alguém se recusar a formar pares? Pode escolher entre aprender a trabalhar
como o resto do time ou procurar trabalho fora dele. A XP não é para todo mundo e
nem todos são para a XP. No entanto, você não precisa formar pares em tempo inte-
gral desde o primeiro dia em que você for trabalhar de forma eXtrema. Como sempre,
você precisa trabalhar pouco a pouco nesta direção. Tente durante uma hora. Se não
funcionar, tente descobrir o que deu errado e tente novamente por mais uma hora.
Afinal, por que a programação em pares funciona para a XP? Bom, o primeiro
valor é a comunicação, e existem poucas formas de comunicação mais intensas do
que face a face. Assim, a programação em pares funciona para a XP porque encoraja
a comunicação. Eu gosto da analogia com uma tanque de água. Quando uma nova e
importante informação é aprendida por alguém do time, é como colocar uma gota de
corante na água. Pelo fato de os pares serem embaralhados o tempo todo, a informa-
ção se difunde rapidamente pelo time, assim como o corante se espalha na água. No
entanto, ao contrário do corante, a informação torna-se mais rica e intensa quando se
espalha e é enriquecida pela experiência e perspicácia de todos no time.
De acordo com a minha experiência, a programação em pares é mais produtiva do
que dividir o trabalho entre dois programadores e então integrar os resultados. A pro-
gramação em pares é geralmente um ponto delicado para o pessoal que quer adotar a
XP. Tudo o que eu posso dizer é que você deve aprender a praticá-la bem e depois ten-
tar fazer uma iteração onde se faz todo o código de produção em pares, e outra onde
o código é feito individualmente. Então você pode tomar sua própria decisão.
Mesmo que não fosse mais produtivo, você ainda ia querer formar pares, porque
a qualidade do código resultante é muito mais alta. Enquanto um parceiro está ocu-
pado digitando, o outro está pensando em um nível mais estratégico. Qual a valida-
de desta linha de desenvolvimento? Ela vai levar a um beco sem saída? Existe uma
estratégia geral melhor? Há oportunidade para refatorar? – Outra característica po-
derosa da programação em pares é que algumas das práticas não funcionariam sem
ela. Sob estresse, as pessoas regridem. Elas deixarão de escrever testes. Desistirão de
refatorar. Evitarão integrar. Entretanto, com o seu parceiro ao seu lado, é provável
que, mesmo que você queira ignorar algumas dessas práticas, seu parceiro não quei-
ra. Isso não quer dizer que os pares nunca cometem erros de processo. Eles certamen-
te o fazem, ou você não precisaria do treinador. Mas as chances de você ignorar seu
compromisso com o resto do time são muito menores em pares do que quando você
está trabalhando sozinho.
ESTRATÉGIA DE DESENVOLVIMENTO 107
D
e muitas maneiras, este é o capítulo mais difícil de escrever. A estratégia de
projeto da XP é sempre ter o projeto mais simples que execute o conjunto de
testes atual.
Bem, não foi tão ruim assim. O que há de errado com simplicidade? O que há de
errado com conjuntos de testes?
• Coragem – O que poderia ser mais corajoso do que parar depois de ter desen-
volvido uma pequena parte do projeto, confiante de que, quando chegar a ho-
ra, você poderá adicionar algo mais, como e quando for necessário?
Essa estratégia funciona se nada mudar entre o agora e o mais tarde. Se você sa-
be exatamente o que vai acontecer, e sabe exatamente como resolver isso, normal-
mente é melhor adicionar aquilo que você precisa agora e também que precisará
mais tarde.
O problema desta estratégia é a incerteza. Em especial:
• algumas vezes, o amanhã nunca chega (ou seja, a funcionalidade que você an-
tecipou no projeto é deixada de lado pelo cliente);
• algumas vezes, você aprende uma maneira melhor de fazer as coisas entre o
agora e o mais tarde.
Em ambos os casos, você deve escolher entre arcar com o custo de retirar o exces-
so de projeto ou com o custo contínuo de carregar um projeto mais complicado e que
não trará benefícios reais.
Eu nunca aposto em que mudanças não ocorrerão, e certamente não aposto con-
tra a possibilidade de eu aprender algo. Neste caso, precisamos mudar o quadro pa-
ra que ele reflita nossa opção por projetar hoje para os problemas de hoje e amanhã
para os problemas de amanhã, como mostra a Figura 9.
Isso nos leva à seguinte estratégia de projeto:
Essa estratégia talvez aparente ser ridiculamente simples. É simples, mas não é ri-
dícula. Ela é capaz de criar sistemas grandes e sofisticados. No entanto, ela não é fá-
Tempo
Tempo
cil. Nada é mais difícil do que trabalhar com um prazo de entrega apertado e ainda
ter de parar para pôr as coisas em ordem enquanto você progride.
Projetando dessa forma, você implementará qualquer coisa de maneira bem sim-
ples na primeira vez que se deparar com ela. Na segunda vez que utilizá-la, você a
tornará mais generalizada. O primeiro uso rende apenas aquilo que é necessário. O
segundo, rende flexibilidade. Desta forma, você nunca paga pela flexibilidade que
não usa e tende a deixar o sistema flexível onde ele precisa ser flexível para a tercei-
ra, quarta e quinta variações.
Produto 1
Contrato Produto
Nem todos as refatorações podem ser realizadas em alguns minutos. Se você des-
cobrir que construiu uma grande e embaralhada hierarquia de heranças, talvez leve
um mês de esforço concentrado para desembaralhá-la. Mas você não dispõe de um
mês de esforço concentrado para gastar; precisa entregar histórias para essa iteração.
Quando enfrentamos uma grande refatoração, precisamos realizá-la em peque-
nos passos (novamente as mudanças incrementais). Você estará no meio de um caso
de teste e perceberá a oportunidade de avançar mais um passo em direção à sua me-
ta maior. Avance este único passo. Modifique um método aqui, uma variável ali. Fi-
nalmente, tudo o que restará da grande refatoração será um pequeno trabalho, e en-
tão você poderá terminá-lo em poucos minutos.
Eu experimentei fazer refatorações de larga escala em um sistema de gerencia-
mento de contratos de seguros avançando um passo de cada vez. Tínhamos a hierar-
quia mostrada na Figura 10.
Este projeto viola a regra once and only once (uma e somente uma vez). Então co-
meçamos a trabalhar para transformar tal projeto no mostrado na Figura 11.
No ano em que eu passei trabalhando no sistema, avançamos pequenos passos
em direção ao projeto desejado. Passamos a responsabilidade das subclasses de Con-
trato para as subclasses ou de Função ou de Produto. Quando meu contrato termi-
nou, ainda não tínhamos eliminado as subclasses de Contrato, mas elas eram muito
mais enxutas do que no começo, e estavam perto de serem eliminadas. E nesse meio
tempo, continuávamos colocando novas funcionalidades em produção.
E isso é tudo. É assim que você projeta de forma eXtrema. Do ponto de vista da
XP, projetar não é desenhar um monte de figuras e depois implementar o sistema
conforme os desenhos. Isso seria como simplesmente alinhar o carro. O capítulo
Aprendendo a Dirigir mostra o caminho para um estilo diferente de projeto – dê a
partida e então direcione o carro um pouco para este lado, depois um pouco para
aquele lado e então para este lado novamente.
Produto 1
Contrato Produto
Fluxo 1
1. o sistema (tanto código quanto testes) deve comunicar tudo aquilo que você
queria comunicar;
2. o sistema não deve conter código duplicado (os itens 1 e 2 juntos constituem
a regra “uma e somente uma vez” – once and only once rule );
3. o sistema deve ter a menor quantidade de classes possível;
4. o sistema deve ter o menor número de métodos possível.
O segredo é que risco é dinheiro da mesma forma que tempo é dinheiro. Se você
acrescentar uma funcionalidade ao projeto hoje e a usar amanhã, você ganha, porque
você paga menos por acrescentá-la hoje. Entretanto, o Capítulo 3, A Economia no De-
senvolvimento de Software, sugere que essa avaliação não é completa. Se existe incer-
teza suficiente, o valor da opção de esperar é alto o suficiente para que seja melhor
esperar.
O projeto não sai de graça. Outro aspecto dessa situação é que, quando você
acrescenta mais ao projeto hoje, você aumenta a sobrecarga do sistema. Há mais coi-
sas para testar, para entender e para explicar. Então todos os dias você não apenas
paga os juros sobre o dinheiro que você gasta, mas paga também uma pequena taxa
de projeto. Com isso em mente, a diferença entre os investimentos de hoje e os de
amanhã pode ser muito maior, e é ainda uma boa idéia projetar amanhã para os pro-
blemas de amanhã.
Como se isso não fosse suficiente, o risco é que nos mata. Como o Capítulo A Eco-
nomia no Desenvolvimento de Software demonstra, você não consegue avaliar o cus-
to de algo que acontecerá amanhã. Você também precisa avaliar a probabilidade isso
acontecer. É claro que eu adoro adivinhar e acertar tanto quanto todo mundo, mas o
que eu descobri quando comecei a prestar atenção foi que minhas suposições não
eram tão corretas quanto eu imaginava. Freqüentemente o projeto maravilhoso que
eu desenvolvi há um ano não tinha praticamente nenhuma suposição correta. Eu
precisava refazer todas as partes do projeto antes do fim do contrato; em algumas si-
tuações, até duas ou três vezes.
Assim, o custo de tomar uma decisão de projeto hoje é igual ao custo de tomar a
decisão somado aos juros que pagamos sobre esse custo mais a inércia que isso adi-
ciona ao sistema. O benefício de tomar uma decisão de projeto hoje é o valor espera-
do decorrente da decisão ser lucrativamente usada no futuro.
Se o custo das decisões de hoje é alto e a probabilidade de elas serem corretas é
baixa, e ainda a probabilidade de descobrirmos uma alternativa melhor amanhã é al-
ta e o custo de adicioná-la ao projeto amanhã é baixo, então podemos concluir que
nunca deveríamos tomar uma decisão de projeto hoje se não precisamos dela hoje.
Na verdade, isso é o que a XP conclui. “Os problemas de hoje já são suficientes”.
Muitos fatores podem tornar a avaliação acima inútil ou vazia. Se o custo de fazer
uma modificação amanhã é extremamente alto, então devemos tomar a decisão hoje
para o caso de estarmos certos. Se a inércia do projeto é suficientemente baixa (por
exemplo, você tem pessoas extremamente inteligentes no time), então os benefícios
de um projeto em cima da hora são menores. Se você é um ótimo adivinho, então vá
em frente e desenvolva todo o projeto hoje. Para o resto de nós, no entanto, eu não
vejo nenhuma alternativa à conclusão de que o projeto de hoje deve ser feito hoje e o
projeto de amanhã deve ser feito amanhã.
dem lhe dar pistas importantes sobre o bem-estar de um projeto. Se você não con-
seguir reduzir o número de elementos em uma figura a um nível gerenciável; se
existir uma assimetria óbvia; se existirem muito mais linhas do que caixas. Tudo is-
so são pistas de um projeto ruim que se tornam evidentes através de sua represen-
tação gráfica.
Outro ponto a favor de projetar com diagramas é a velocidade. No tempo que le-
varia para codificar um projeto, você pode comparar e contrastar três projetos alter-
nativos utilizando diagramas.
O problemas com os diagramas, no entanto, é que eles não podem lhe dar um
feedback concreto. Eles fornecem certos tipos de feedback sobre o projeto, mas o privam
de outros. Infelizmente, o privam exatamente daquele que lhe ensina o mais impor-
tante – Isto executará os casos de teste? Isto suporta código simples? Esse tipo de feed-
back você só consegue codificando.
Então, por um lado, podemos avançar rapidamente quando projetamos com dia-
gramas. Por outro lado, corremos riscos quando desenvolvemos com diagramas.
Precisamos de uma estratégia que nos deixe tirar vantagem dos pontos fortes de pro-
jetar com diagramas, mas que também reduza seus pontos fracos.
Mas não estamos sozinhos. Temos os princípios para nos guiar. Vejamos:
A estratégia XP é que todos possam desenvolver todo o projeto que quiserem com
diagramas, mas tão-logo uma questão que possa ser resolvida com código seja levan-
tada, os desenvolvedores devem voltar-se ao código para achar a resposta. Os dia-
gramas não são mantidos. Por exemplo, os diagramas poderiam ser desenhados em
um quadro branco. Desejar que o quadro não seja apagado é certamente um sinal de
que o projeto não foi bem comunicado, seja para o time ou para o sistema.
Se há um tipo de código-fonte que é mais bem expresso com diagramas, então vo-
cê definitivamente deveria expressá-lo, editá-lo e mantê-lo em diagramas. Ferramen-
tas CASE que permitem que você especifique todo o comportamento do sistema fun-
cionam bem. As pessoas podem chamar o que essas ferramentas fazem de “geração
de código”, mas para mim parece ser uma linguagem de programação. Minha obje-
ção não é aos diagramas, mas à tentativa de manter múltiplos formatos da mesma in-
formação sincronizados.
ESTRATÉGIA DE PROJETO 117
Se você estiver usando uma linguagem de programação textual, siga esse conse-
lho e você nunca passará mais do que 10 a 15 minutos desenhando diagramas. As-
sim, você saberá que pergunta quer fazer ao sistema.
Depois de obter a resposta, você pode desenhar mais alguns diagramas, até que
encontre uma outra pergunta que precise de uma resposta concreta.
O mesmo conselho se aplica para outras notações que não utilizam código, como
cartões CRC. Passe alguns minutos fazendo-os, o suficiente para esclarecer a ques-
tão, e então volte ao sistema para reduzir o risco de você estar se enganando.
Arquitetura do Sistema
Não utilizei essa palavra que começa com “A” em nenhum momento até agora. A ar-
quitetura é tão importante em projetos XP quanto em qualquer outro projeto de soft-
ware. Parte da arquitetura é capturada pela metáfora do sistema. Se você tem uma
boa metáfora, todos os integrantes do time são capazes de dizer de que forma o sis-
tema como um todo funciona.
O próximo passo é ver de que maneira a história se transforma em objetos. As re-
gras do Jogo do Planejamento declaram que o resultado da primeira iteração deve
ser um esqueleto funcional do sistema como um todo. Mas você ainda precisa fazer
a coisa mais simples que possa funcionar. Como você pode conciliar os dois?
Para a primeira iteração, escolha um conjunto de histórias básicas e simples que
você espera que o forcem a criar toda a arquitetura. Então estreite seu horizonte e im-
plemente as histórias da maneira mais simples que possa funcionar. Ao fim desse
exercício você terá sua arquitetura. Talvez não seja a arquitetura que você esperava,
mas você terá aprendido algo.
E se você não conseguir achar um conjunto de histórias que o force a criar, com ab-
soluta certeza, a arquitetura de que irá precisar? Ou você define toda a arquitetura por
especulação ou você define a parte da arquitetura que atende às suas necessidades
atuais, confiando que poderá definir mais coisas mais tarde. Eu defino a arquitetura
de que preciso agora e confio em minha habilidade para modificá-la mais tarde.
CAPÍTULO 18
Estratégia de Testes
Q ue chato. Ninguém quer falar sobre testes. Teste é o enteado feioso do desen-
volvimento de software. A questão é que todos sabem que testar é importan-
te. Todos sabem que não fazem testes suficientes. E nós sentimos isso – nos-
sos projetos não vão tão bem quanto deveriam, e sentimos que mais testes poderiam
resolver o problema. Mas, então, nós lemos um livro sobre testes e ficamos atolados
nos vários tipos e maneiras de testes. Não há como fazer tudo aquilo e ainda conse-
guir desenvolver algo.
Vejamos como são os testes na XP. Toda vez que um programador escreve um có-
digo, ele imagina que vai funcionar. Assim, toda vez que ele imagina que um código
vai funcionar, ele pega essa confiança que surgiu do nada e a transforma em um ar-
tefato que é inserido no programa. A confiança lá fica, para o seu próprio uso. E por-
que ela está no programa, todos os outros também podem usá-la.
A mesma história é válida para o cliente. Toda vez que ele imagina algo concreto
que o programa deveria fazer, ele transforma isso em outra porção de confiança que
vai no programa. Agora a confiança dele está lá, juntamente com a do programador.
O programa fica cada vez mais confiante.
Na verdade, uma pessoa da área de testes iria olhar para os testes XP e debocha-
ria deles. Esse não é o trabalho de uma pessoa que ama testar. Muito pelo contrário.
Este é o trabalho de alguém que ama fazer os programas funcionarem. Então você
deveria escrever os testes que ajudam a fazer o programa funcionar e a mantê-lo fun-
cionando. Nada mais.
Lembre-se do princípio “Trabalhe a favor da natureza humana, e não contra ela”.
Esse é o erro fundamental dos livros de testes que eu li. Eles começam com a premis-
sa de que os testes são o centro do desenvolvimento. Você precisa fazer este teste, e
120 PROGRAMAÇÃO EXTREMA EXPLICADA
este também, e sim, mais este. Se quisermos programadores e clientes que escrevam
testes, é melhor que façamos o processo o menos dolorosamente possível, perceben-
do que os testes existem como instrumentação. É o comportamento do sistema que
está sendo instrumentado que importa, e não os testes em si. Se fosse possível desen-
volver sem testes, nós nos livraríamos deles em um minuto.
Massimo Arnoldi afirma:
• programadores;
• clientes.
• Se a interface de um método não está muito clara, você escreve um teste antes
de escrever o método.
• Se a interface é clara, mas você imagina que a implementação será um pouco
complicada, você escreve um teste antes de escrever o método.
• Se você imagina circunstâncias inusitadas em que o código deve funcionar co-
mo esperado, você escreve um teste para comunicar as circunstâncias.
• Se você descobre um problema depois, você escreve um teste que isole o pro-
blema.
• Se você está prestes a refatorar código, e você não está certo de como ele vai se
comportar, e ainda não existe um teste para esse aspecto do comportamento
em questão, você escreve um teste primeiro.
também usa os testes inspirados no cliente como o ponto de partida para variações
que possivelmente farão o software falhar.
Mesmo que você tenha um testador dedicado, alguém cujo prazer é ver falhar o
software que se imaginava já estar pronto, ele trabalha dentro da mesma estrutura
econômica que os programadores escrevendo testes. O testador está fazendo apostas,
torcendo para que um teste obtenha sucesso quando deveria falhar ou que falhe
quando deveria obter sucesso. Então o testador também está aprendendo a escrever
testes cada vez melhores com o tempo, testes que muito provavelmente valerão a pe-
na. O testador certamente não está lá apenas para fazer o maior número de testes
possível.
Outros Testes
Enquanto os testes funcionais e de unidade são o centro da estratégia de aplicação de
testes XP, existem outros que podem ser úteis de vez em quando. Um time XP reco-
nhecerá quando não está no caminho certo e quando um novo tipo de teste pode aju-
dar. Eles podem escrever qualquer um dos seguintes tipos de teste (ou qualquer ou-
tro teste que você possa encontrar em um livro a esse respeito):
• Teste paralelo – um teste projetado para provar que o novo sistema funciona
exatamente como o sistema antigo. Na verdade, o teste mostra a forma como
o novo sistema difere do sistema antigo, para que uma pessoa de negócios
possa tomar uma decisão de negócios quando a diferença é suficientemente
pequena para colocar o novo sistema em produção.
• Teste de estresse – um teste projetado para simular a pior carga possível. Testes
de estresse são bons para sistemas complexos, em que as características de per-
formance não são fáceis de prever.
• Teste do macaco – um teste projetado para garantir que o sistema reage de for-
ma adequada frente a entradas sem sentido.
SEÇÃO III
Implementando a XP
N
esta seção, discutiremos como colocar em prática as estratégias da última se-
ção. Ao escolher um conjunto de estratégias radicalmente simplificado, você
repentinamente terá muito mais flexibilidade para trabalhar. Você pode usar
essa flexibilidade para muitos propósitos, mas precisa estar ciente de sua existência
e das possibilidades que ela oferece.
CAPÍTULO 19
Adotando a XP
A
gradeço a Don Wells pela resposta simples e obviamente correta para a ques-
tão de como adotar a XP:
Os dois lugares óbvios por onde começar são os testes e o Jogo de Planejamento.
Muitos projetos estão impregnados com problemas de qualidade ou com um dese-
quilíbrio de poder entre negócios e desenvolvimento. O segundo livro sobre a XP, Ex-
treme Programming Applied: Playing to win, irá abordar esses dois tópicos por eles se-
rem lugares tão comuns para começar.
Existem muitas vantagens nesta abordagem. É tão simples que até mesmo eu con-
segui entender (uma vez que Don a elucidou para mim). Visto que você aprenderá
apenas uma prática de cada vez, você pode fazer um bom trabalho ao aprender cada
uma delas. Já que você irá sempre abordar seus problemas mais difíceis, você terá
muita motivação para fazer mudanças e obterá feedback positivo imediato de seus
esforços.
Abordar o problema mais difícil também resolve a objeção que fazem à XP, de que
ela é do tipo “tamanho único”. Ao adotar cada uma das práticas, você irá moldá-la
126 PROGRAMAÇÃO EXTREMA EXPLICADA
de acordo com a sua situação. Se você não tiver um problema, nem mesmo vai con-
siderar resolvê-lo usando XP.
Não subestime a importância do espaço físico quando adotar a XP, mesmo que
você não considere isto um problema. Eu geralmente começo com uma chave de fen-
da e um alicate. Vou adicionar ainda dois passos ao processo.
Projetos que querem alterar sua cultura atual são muito mais comuns
do que projetos que podem criar uma cultura completamente nova. Ado-
te a XP um pouco de cada vez em projetos que já estão acontecendo, co-
meçando com testes ou planejamento.
A
dotar XP com um time novo é um desafio. Adotá-la com um time e uma base
de código já existentes é ainda mais difícil. Você tem todos os desafios que já
existiam – desenvolver as habilidades, treinamento, adaptar o processo as
suas condições. Você também tem a pressão imediata de manter o software de produ-
ção executando. É improvável que o software seja escrito de acordo com seus novos
padrões. É provável que seja mais complexo do que precisa ser. É improvável que se-
ja testado da forma que você gostaria. Em um time novo, você pode selecionar ape-
nas aquelas pessoas que se dispõem a tentar a XP. Em um time já existente, é prová-
vel que haja alguns céticos. Ainda por cima, todas as mesas já estão arrumadas, e vo-
cê nem pode programar em pares.
Você precisará de mais tempo para ajustar a XP em um projeto do que para ado-
tá-la em um time novo equivalente. Essa é a má notícia. A boa notícia é que existem
alguns riscos enfrentados por um desenvolvimento XP com um time novo que você
não precisará enfrentar. Você nunca estará na arriscada situação de pensar que você
tem uma boa idéia para software, mas não tem certeza. Você nunca estará na posição
arriscada de fazer muitas decisões sem o feedback imediato e brutal que você obtém
de clientes reais.
Eu converso com muitos times que dizem: “Sim, claro, já estamos fazendo XP. Tu-
do menos essa história de testes. E temos um documento de requisitos com 200 pá-
ginas. Mas todo o resto é exatamente como fazemos”. É por isso que este capítulo es-
tá arranjado prática a prática. Se você já está fazendo uma dada prática defendida pe-
la XP, pode ignorar a seção correspondente. Se há alguma prática nova que você
queira adotar, confira a seção voltada a essa prática.
128 PROGRAMAÇÃO EXTREMA EXPLICADA
• testes;
• projeto;
• planejamento;
• gerenciamento;
• desenvolvimento.
Testes
Os testes são provavelmente a área mais frustrante quando você está mudando o có-
digo existente para XP. O código escrito antes de haver testes é assustador. Você nun-
ca sabe direito onde está. Esta modificação será segura? Você nunca tem certeza.
Tão-logo você começa a escrever os testes, tudo muda de figura. Você confia no
novo código. Você não se importa em fazer modificações. Na verdade, é até um pou-
co divertido.
Mudar de código velho para novo é como noite e dia. Você começará a evitar o có-
digo velho. Você precisa evitar essa tendência. A única maneira de ter o controle da
situação é trazer todo o código à tona. Do contrário, coisas terríveis crescerão no es-
curo. Você terá riscos de magnitude desconhecida.
Nesta situação, é tentador simplesmente voltar e escrever testes para todo o códi-
go já existente. Não faça isso. Em vez disso, escreva os testes sob demanda.
Projeto
A transição para o projeto XP é muito parecida com a transição para a fase de testes
XP. Você notará que o novo código é completamente diferente do antigo. Você dese-
jará consertar tudo de uma vez. Não faça isso. Faça um pouco de cada vez. Enquan-
to você adiciona uma nova funcionalidade, esteja preparado para primeiro refatorar.
Você está sempre preparado para refatorar antes de implementar no desenvolvimen-
to XP, mas você precisará fazer isso mais freqüentemente quando estiver efetuando a
transição para XP.
AJUSTANDO A XP 129
Bem cedo durante o processo, faça com que o time identifique alguns objetivos de
refatoração em larga escala. Pode haver uma hierarquia de herança particularmente
emaranhada, ou uma funcionalidade qualquer espalhada por todo o sistema que vo-
cê deseja unificar. Defina esses objetivos, coloque-os em cartões, e deixe-os visíveis
de forma destacada. Quando você puder dizer que a refatoração pesada está termi-
nado (o que pode levar meses ou até mesmo um ano de lento progresso), dê uma
grande festa. Queime os cartões como em uma cerimônia. Coma e beba à vontade.
O efeito desta estratégia é muito parecido com o efeito da estratégia de testes sob
demanda. Aquelas partes do sistema que você verifica o tempo todo em suas ativi-
dades de desenvolvimento logo parecerão com o código que você está escrevendo
agora. A sobrecarga da refatoração extra logo desaparecerá.
Planejamento
Você precisará converter a informação de requisitos já existente em cartões de histó-
rias. Você precisará educar seu cliente sobre as regras do jogo. O cliente precisará de-
cidir do que se constitui a próxima entrega.
O maior desafio (e oportunidade) de mudar para o planejamento XP é ensinar ao
cliente o quanto a mais ele pode obter do time. Eles provavelmente nunca tiveram a
experiência de um time de desenvolvimento que aprecia modificações nos requisi-
tos. Demora algum tempo para se acostumar com o quanto a mais o cliente pode
conseguir do time.
Gerenciamento
Uma das transições mais difíceis é acostumar-se com o gerenciamento XP. O geren-
ciamento XP é um jogo de dissimulação e influência. Se você for um gerente, você
provavelmente perceberá que está tomando decisões que deveriam ser tomadas por
programadores ou clientes. Se estiver, não entre em pânico. Apenas lembre a si mes-
mo e a todos presentes que você está aprendendo. E então peça à pessoa certa para
tomar a decisão e informe-se sobre o que ela decidiu.
É improvável que programadores subitamente confrontados com novas respon-
sabilidades façam um bom trabalho imediatamente. Como gerente, você precisa ser
cuidadoso durante o período de transição para lembrar a todos das regras que eles
escolheram. Sob pressão, todos voltarão aos padrões de comportamento anterior,
não importando se esses padrões funcionassem ou não.
A sensação será um pouco como a da transação de projeto ou de testes. No come-
ço, haverá uma sensação estranha. Você saberá que não está indo a toda velocidade.
Ao prestar atenção nas situações que ocorrem no dia-a-dia, você (e os programado-
res e clientes) aprenderá a lidar com elas de forma tranqüila. Rapidamente você co-
meçará a se sentir confortável com seu novo processo. Porém, de vez em quando,
surgirá um a situação que você não tinha enfrentado de maneira eXtrema antes.
Quando isso acontecer, respire fundo. Lembre as regras, os valores e os princípios ao
time. E então decida o que fazer.
Um dos aspectos mais difíceis de gerenciar uma mudança radical para XP é con-
cluir que um dos membros do time não trabalha de maneira satisfatória. Nesta situa-
ção, você estará melhor sem ele. Você deve fazer a alteração assim que estiver certo
de que a situação não irá melhorar.
130 PROGRAMAÇÃO EXTREMA EXPLICADA
Desenvolvimento
A primeira coisa que você tem de fazer é arrumar as mesas direito. Sem brincadeira.
Leia novamente o material sobre programação em pares (Capítulo 16, Estratégia de
Desenvolvimento). Arrume as mesas para que duas pessoas possam se sentar lado a
lado e passar o teclado uma para a outra sem precisar mover suas cadeiras.
Por um lado, quando você está fazendo a transição para XP, você deve ser mais rí-
gido sobre a programação em pares do que normalmente precisaria ser. A programa-
ção em pares pode ser desconfortável no princípio. Force a si mesmo a praticá-la,
mesmo que você não queira. Por outro lado, faça uma pausa de vez em quando. Fi-
que sozinho e programe por algumas horas. Jogue fora o resultado, é claro, mas não
destrua a sua satisfação em programar apenas para poder dizer que você pareou por
30 horas em uma semana.
Vá resolvendo os problemas de teste e projeto aos poucos. Faça com que todo o có-
digo em que vocês tocam fique condizente com os padrões de codificação combina-
dos. Você se surpreenderá com o quanto pode aprender com essa simples atividade .
Com Problemas?
Alguns de vocês lendo este livro terão um time já existente, mas seu software não es-
tá ainda em produção. Seu projeto pode estar em apuros. A XP pode parecer uma sal-
vação possível.
Não conte com isso. Se você tivesse usado XP desde o início, você poderia (ou
não) ter evitado sua situação atual. Se trocar de cavalo no meio de um rio é difícil,
trocar de um cavalo que está se afogando é dez vezes mais difícil. As emoções esta-
rão fortes. O moral estará baixo.
Se a escolha for entre trocar para XP ou ser despedido, primeiramente considere
que suas chances de adotar consistentemente novas práticas não são muito boas. Sob
estresse, você volta para hábitos antigos. Você já está sob muito estresse. Suas chan-
ces de fazer a troca com sucesso são reduzidas drasticamente. Defina um objetivo
mais humilde para você do que salvar todo o projeto. Viva um dia de cada vez. Cele-
bre o quanto você pode aprender sobre testes, ou gerenciar indiretamente, ou quão
bonito você pode deixar um projeto, ou quanto código você pode apagar. Talvez do
caos possa emergir ordem suficiente para que você nem queira vir trabalhar no dia
seguinte.
Mas se você for mudar um projeto problemático para XP, faça disto um gesto dra-
mático. Meias medidas vão deixar todos mais ou menos na mesma situação que es-
tavam antes. Avalie cuidadosamente a base de código atual. Você estaria melhor sem
ela? Se a resposta for sim, livre-se dela. Toda ela. Faça uma fogueira e queime as fitas
antigas. Tire uma semana de férias. Comece novamente tudo de novo.
CAPÍTULO 21
Ciclo de Vida de um Projeto XP Ideal
E
ste capítulo lhe dará uma idéia da história global de um projeto XP. Ele é ideali-
zado – você talvez tenha percebido a essa altura que dois projetos XP não pode-
riam (ou deveriam) ser exatamente iguais. O que eu espero que você obtenha
neste capítulo é uma idéia do fluxo global de um projeto.
Exploração
Pré-produção é um estado não-natural para um sistema e deveria ser tirada do cami-
nho o mais rápido possível. Como foi mesmo a frase que eu ouvi recentemente? “Ir
para a produção é morrer.” A XP diz exatamente o contrário. Não estar em produção
é estar gastando dinheiro sem fazer dinheiro. Talvez seja apenas a minha carteira,
mas eu acho o estado de ter apenas gastos e nenhuma renda muito desconfortável.
Antes de passar para a fase de produção, no entanto, você precisa acreditar que
pode ir para a produção. Você precisa confiar suficientemente em suas ferramentas
para acreditar que conseguirá terminar o programa. Você precisa acreditar que, uma
vez que o código estiver terminado, você poderá executá-lo dia após dia. Você tem de
acreditar que possui (ou pode aprender) as habilidades de que precisa. Os membros
do time precisam aprender a confiar uns nos outros.
A fase de exploração é onde tudo isso acontece. Você terminou a exploração quan-
do o cliente está confiante de que existe material mais do que suficiente nos cartões
de histórias para fazer uma boa primeira entrega, e os programadores estão confian-
tes de que não conseguem estimar melhor sem realmente implementar o sistema.
Durante a exploração, os programadores estão usando toda a tecnologia que será
usada no sistema de produção. Eles estão explorando ativamente as possibilidades
132 PROGRAMAÇÃO EXTREMA EXPLICADA
para a arquitetura do sistema. Eles o fazem passando uma ou duas semanas cons-
truindo um sistema parecido com o que eles irão construir realmente, mas fazendo
isso de três ou quatro maneiras distintas. Pares diferentes podem fazer experimentos
com os sistemas de formas diferentes e depois comparar, ou você pode ter dois pares
experimentando o sistema da mesma forma e ver se alguma diferença emerge.
Se uma semana não for suficiente para fazer funcionar uma determinada tecnolo-
gia, então eu classificaria essa tecnologia como arriscada. Não quer dizer que você
não deva utilizá-la. Mas você deveria explorá-la mais cuidadosamente e considerar
alternativas.
Talvez você considere trazer especialistas em tecnologia durante a fase de ex-
ploração, para que seus experimentos não sejam prejudicados por coisas insignifi-
cantes que poderiam ser resolvidas facilmente por alguém que já tem experiência.
No entanto, seja cauteloso ao aceitar cegamente um conselho para o eventual uso
da tecnologia. Às vezes, os especialistas desenvolvem hábitos baseados em siste-
mas de valores que não estão totalmente em sintonia com a programação eXtrema.
O time precisará sentir-se confortável com as práticas que escolherem. Não é mui-
to agradável dizer: “Os especialistas disseram que é assim” quando o projeto está
saindo de controle.
Os programadores devem também fazer experimentos com os limites de perfor-
mance da tecnologia que eles irão utilizar. Se possível, eles devem simular cargas rea-
lísticas com o hardware e a rede de produção. Você não precisa ter todo o sistema pron-
to para escrever uma simulação de carga. Você pode obter experiência apenas calcu-
lando, por exemplo, quantos bytes por segundo sua rede terá de suportar e então exe-
cutar um experimento para verificar se ela fornece a largura de banda necessária.
Os programadores devem também experimentar idéias de arquiteturas – como
construir um sistema para múltiplos níveis de undo? Implemente isso de três formas
diferentes durante um dia e verifique qual é a melhor. Essas pequenas explorações de
arquitetura são muito importantes quando o usuário apresenta histórias que você
não tem a mínima idéia de como implementar.
Os programadores devem estimar cada tarefa de programação a qual se dedica-
rão durante a exploração. Quando uma tarefa está completa, eles devem reportar o
tempo real de calendário requerido para a tarefa. A prática de estimativas irá aumen-
tar a confiança do time nessa esfera quando chegar a hora de assumir um comprome-
timento público.
Enquanto o time estiver treinando com a tecnologia, o cliente está praticando a es-
crita das histórias. Não espere que isso ocorra sem problemas. Em um primeiro mo-
mento, as histórias não serão o que você precisa. O segredo é dar ao cliente muito feed-
back rápido das primeiras histórias, para que ele possa aprender rapidamente a espe-
cificar o que os programadores precisam e a não especificar o que eles não precisam.
A pergunta-chave é: “Os programadores conseguem estimar com segurança o esfor-
ço requerido pela história?”. Algumas das histórias precisam ser escritas de maneira
diferente; algumas vezes, os programadores precisam fazer mais experimentos.
Se você tem um time que já conhece a tecnologia e cujos membros já se conhecem,
a fase de exploração pode levar apenas algumas semanas. Com um time que não co-
nhece a tecnologia ou o domínio, você talvez precise gastar alguns meses. Se a explo-
ração levar mais tempo do que isso, eu talvez procuraria um projeto pequeno mas
real que eles pudessem concluir facilmente, a fim de dar urgência ao processo.
CICLO DE VIDA DE UM PROJETO XP IDEAL 133
Planejamento
O propósito da fase de planejamento é fazer os clientes e os programadores chega-
rem a um acordo sobre a data na qual o menor e mais valioso conjunto de histórias
estará terminado. Veja no Jogo do Planejamento uma maneira de executar isso. Se vo-
cê se preparar durante a fase de exploração, o planejamento (a produção de um cro-
nograma de comprometimento) deverá levar um ou dois dias.
O plano para a primeira entrega deve ter entre dois e seis meses de duração. Você
provavelmente não será capaz de resolver nenhum problema de negócios significati-
vo em menos tempo do que isso. (Mas se você conseguir, ótimo! Veja Principles of Soft-
ware Engineering Management, de Tom Gilb, para idéias sobre como encolher o prazo
da primeira entrega). Em mais do que alguns meses, o risco será grande demais.
Produção
O jogo final de uma entrega (produção) enfrenta um ciclo de feedback mais apertado.
Em vez de iterações com duração de três semanas, você talvez passará para iterações
com duração de uma semana. Você talvez tenha uma reunião em pé diária para que
todos conheçam aquilo em que todos os outros estão trabalhando.
Tipicamente haverá algum processo para se certificar de que o software está pron-
to para entrar em produção. Esteja preparado para implementar novos testes para
provar que ele está em boa forma. Testes paralelos são freqüentemente aplicados nes-
ta etapa.
134 PROGRAMAÇÃO EXTREMA EXPLICADA
Você talvez precise ajustar o desempenho do sistema durante esta fase. Eu não
falei muito sobre ajustes de desempenho neste livro. Eu acredito fortemente no le-
ma “Faça-o executar, faça-o certo, faça-o rápido”. Mais tarde, durante o jogo, é o mo-
mento perfeito para ajustar, visto que você terá todo o conhecimento possível embu-
tido no projeto do sistema, você terá as estimativas mais realistas possíveis sobre a
carga de produção no sistema e é provável que você tenha o hardware de produção
já disponível.
Durante a produção, você diminuirá o ritmo de evolução do software. O software
não pára de evoluir, mas o risco torna-se mais importante em sua avaliação quanto
às mudanças que merecem ser acrescentadas nesta versão. No entanto, esteja ciente
de que, quanto mais experiência você tiver com um sistema, mais idéias você terá so-
bre como ele deveria ser projetado. Se você começar a ter muitas idéias, mas não en-
contrar justificativas para acrescentá-las ao sistema nesta versão, faça uma lista visí-
vel delas para que todos possam ver qual será o caminho depois que esta versão en-
trar em produção.
Quando o software entrar em produção de fato, dê uma grande festa. Muitos pro-
jetos nunca entram em produção. Um projeto que “ganha vida”* é motivo para co-
memorar. Se você não estiver um pouco assustado ao mesmo tempo, você é maluco,
mas a festa pode ajudá-lo a eliminar um pouco da tensão excessiva que com certeza
se acumulou.
Manutenção
Manutenção é realmente o estado normal de um projeto XP. Você precisa simultanea-
mente produzir novas funcionalidades, manter o sistema existente executando, in-
corporar novas pessoas ao time e dizer adeus aos membros que sairão do time.
Cada versão começa com uma fase de exploração. Você talvez tente grandes refa-
torações que temia inserir na entrega anterior. Você talvez experimente novas tecno-
logias que pretende adicionar na próxima entrega, ou migre para novas versões das
tecnologias que você já está utilizando. Você talvez experimente novas idéias de ar-
quitetura. O cliente talvez tente escrever novas histórias mirabolantes na procura de
um grande trunfo para os negócios.
Desenvolver um sistema que está em produção é muito diferente de desenvolver
um sistema que ainda não está em. Você é mais cuidadoso com as modificações que
você faz. Você precisa estar preparado para interromper o desenvolvimento a fim
reagir a problemas de produção. Você tem dados reais com os quais é necessário ter
cuidado para migrar ao fazer modificações no projeto. Se a pré-produção não fosse
tão perigosa, você evitaria entrar em produção para sempre.
Estar em produção provavelmente modificará sua velocidade de desenvolvimen-
to. Seja conservador em relação às suas novas estimativas. Enquanto você está explo-
rando, meça o efeito que o suporte à produção tem em suas atividades de desenvol-
vimento. Eu tenho visto um aumento de 50% na razão entre o tempo ideal de desen-
volvimento e o tempo de calendário após ter-se entrado em produção (de dois dias
de calendário por dia de desenvolvimento, passou-se a três). Entretanto, não adivi-
nhe: meça.
*N. de T. A expressão “ganha vida” foi usada aqui para traduzir a expressão americana go live significando que o soft-
ware é produzido e passa a ser utilizado por usuários reais).
CICLO DE VIDA DE UM PROJETO XP IDEAL 135
Esteja preparado para modificar a estrutura do time que vai lidar com a produ-
ção. Você talvez queira fazer rodízio no “help desk”, de forma que a maioria dos pro-
gramadores não tenham de lidar com interrupções de produção na maior parte do
tempo. Cuide para circular todos os programadores por todas as posições – existem
coisas que você aprende dando suporte à produção que você não conseguiria apren-
der de nenhuma outra forma. Por outro lado, não é tão divertido quanto desenvol-
ver.
Coloque o software recentemente desenvolvido em produção enquanto você vai
avançando. Você talvez saiba que certas partes de um software não serão executadas.
Coloque-as no sistema em produção mesmo assim. Eu já estive em projetos em que
este ciclo era diário ou semanal. Em qualquer situação, é melhor você não deixar có-
digo parado por mais do que uma iteração. O momento adequado depende de quan-
to custam a verificação e a migração. A última coisa de que você precisa quando está
no fim de uma versão é integrar uma montanha de códigos, que “de forma alguma”
poderiam estragar algo. Se você mantiver a base de código de produção e a base de
código de desenvolvimento praticamente em sincronia, você ficará sabendo de pro-
blemas de integração muito mais cedo.
Quando novos membros entrarem no time, dê a eles duas ou três iterações em
que suas únicas funções sejam fazer muitas perguntas, agir como parceiros de pro-
gramação e ler muitos testes e códigos. Quando eles se sentirem prontos, podem as-
sumir a responsabilidade por algumas tarefas de programação, mas com um fator de
carga de trabalho reduzido. Quando eles demonstrarem que conseguem acompa-
nhar, podem aumentar seus fatores de carga de trabalho.
Se o time mudar gradualmente, em menos de um ano você poderá substituir o ti-
me original de desenvolvimento por novas pessoas sem perturbar o suporte à pro-
dução ou o desenvolvimento em andamento. Esta é uma solução muito menos arris-
cada do que o típico “aqui está uma pilha de papéis que contém toda a informação
de que você precisa”. Na verdade, comunicar a cultura que cerca o projeto é tão im-
portante quanto comunicar os detalhes do projeto e da implementação, e isso só po-
de ser feito pelo de contato pessoal.
Morte
Morrer bem é tão importante quanto viver bem. Isso é verdade tanto para a XP quan-
to para as pessoas.
Se o cliente não consegue produzir novas histórias, então é hora de guardar o sis-
tema no armário. Agora é a hora de escrever um tour pelo sistema que tenha de cin-
co a 10 páginas, o tipo de documento que você deseja encontrar quando for preciso
mudar algo daqui a cinco anos.
Este é o bom motivo para morrer – o cliente está satisfeito com o sistema e não
consegue pensar em nada que gostaria de adicionar em um futuro próximo. (Eu nun-
ca tive essa experiência, mas já ouvi falar, por isso inclui aqui).
Também há um motivo não tão bom para morrer – o sistema não está agregando
valor. O cliente precisa de funcionalidades, e você não consegue adicioná-las de for-
ma econômica. A taxa de erros sobe assustadoramente para um nível intolerável.
136 PROGRAMAÇÃO EXTREMA EXPLICADA
Essa é a morte entrópica contra a qual você lutou por tanto tempo. XP não é má-
gica. A entropia eventualmente alcança projetos XP também. Você apenas prefere que
isso ocorra o mais tarde possível.
De qualquer forma, nós já postulamos o impossível – o sistema precisa morrer.
Todos devem permanecer de olhos abertos quando isso acontecer. O time precisa es-
tar ciente do aspecto econômico da situação. Eles, os clientes e os gerentes, devem ser
capazes de concordar que o time e o sistema não conseguem mais agregar o valor ne-
cessário.
Então é hora de um adeus emocionado. Faça uma festa. Convide todo mundo que
já trabalhou no sistema para vir e trocar reminiscências. Aproveite a oportunidade pa-
ra tentar apontar as razões da queda do sistema, para que você saiba o que procurar
no futuro. Imagine com o time um jeito de fazer as coisas diferentes da próxima vez.
CAPÍTULO 22
Papéis para Pessoas
Certos papéis precisam ser preenchidos para que um time eXtremo fun-
cione – programador, cliente, treinador, rastreador.
U
m time esportivo funciona melhor quando existem certos papéis pelos quais
alguém é responsável. No futebol existem o goleiro, o atacante, o zagueiro,
etc. No basquete existem o armador, o pivô, o ala e outros.
Um jogador que assume uma dessas posições aceita um certo conjunto de respon-
sabilidades – criar condições para que o colega faça o ponto, evitar que o outro time
faça pontos, talvez controlar uma determinada parte do campo. Alguns papéis são
quase solitários. Outros requerem que o jogador corrija os erros dos colegas, ou con-
trole suas interações.
Esses papéis tornam-se habituais, e às vezes se incorporam às regras do jogo, pre-
cisamente porque eles funcionam. É provável que, em algum momento, todas as
outras combinações de responsabilidades já tenham sido tentadas. As que você vê
hoje em dia estão lá porque elas funcionaram, e as outras não.
Bons treinadores são eficientes para fazer que um jogador seja competente em sua
posição. Eles identificam desvios da prática usual das posições e ajudam o jogador a
corrigir o desvio ou entendem porque é aceitável que este jogador em especial faça
as coisas de forma um pouco diferente.
Entretanto, o grande treinador sabe que as posições são apenas um costume, e
não leis da natureza. De tempos em tempos, o jogo ou os jogadores mudam tanto que
novas posições tornam-se possíveis, e as antigas tornam-se obsoletas. Grandes trei-
nadores estão sempre procurando as vantagens que poderiam surgir da criação de
novas posições e da eliminação de existentes.
Outra facilidade dos grandes treinadores esportivos é sua habilidade de moldar
o sistema tático aos seus jogadores, e não o inverso. Se você tem um sistema tático
que funciona maravilhosamente com jogadores rápidos, e o time que se apresenta no
primeiro treino é grande e forte, então será melhor criar um novo esquema tático que
138 PROGRAMAÇÃO EXTREMA EXPLICADA
deixe os talentos do time brilharem. Muitos treinadores não conseguem fazer isso.
Em vez disso, eles ficam tão focados na beleza do “esquema tático” que não perce-
bem que não está funcionando.
Tudo isso é um preâmbulo para um aviso importante sobre o que vem adiante.
Aqui estão alguns papéis que funcionaram bem em projetos anteriores. Se você tem
pessoas que não se adaptam aos papéis, mude os papéis. Não tente mudar as pessoas
(não muito...). Não aja como se não houvesse um problema. Se um papel diz: “Esta
pessoa deve estar disposta a correr riscos” e você não tem uma pessoa assim, você
precisa encontrar uma divisão diferente de responsabilidades, uma que corresponda
aos seus objetivos sem que o papel em questão seja preenchido por alguém inclina-
do a atitudes arriscadas.
Um exemplo. Eu estava conversando com um gerente sobre um de seus times.
Um programador era também o cliente. Eu disse que isso não poderia funcionar, já
que o programador precisa executar o processo, tomar decisões técnicas e delegar de-
cisões de negócios para o cliente (veja o Jogo do Planejamento).
O gerente argumentou: “Esse cara é um verdadeiro negociante de contratos;
acontece que ele também sabe programar. Os outros negociantes de contratos gostam
dele e o respeitam, e estão dispostos a confiar e acreditar nele. Ele tem uma visão ní-
tida do caminho que o sistema deve seguir. Os outros programadores sabem quando
ele está falando como cliente e quando está tomando decisões técnicas”.
Tudo bem. As regras dizem que um programador não pode ser o cliente. Neste
caso, as regras não se aplicam. O que se aplica ainda é a separação das decisões téc-
nicas e de negócios. O time todo, o programador/cliente, e especialmente o treinador
precisam estar cientes de que papel o programador/cliente está assumindo em qual-
quer momento. E o treinador precisa saber que, não importa quão bem o arranjo te-
nha funcionado no passado, se eles tiverem problemas, é provável que o papel duplo
seja a causa dos problemas.
Programador
O programador é o coração da XP. Na verdade, se programadores pudessem sempre
tomar decisões que cuidadosamente balanceassem prioridade de curto e longo pra-
zo, não haveria necessidade de nenhum outro pessoal técnico no projeto além dos
programadores. Obviamente, se o cliente não precisasse realmente do software para
manter seu negócio andando, não haveria necessidade de programadores, então não
fique convencido com essa história de o programador ser vital.
À primeira vista, ser um programador XP é muito parecido com ser um progra-
mador em qualquer outro método de desenvolvimento de software. Você passa o tem-
po trabalhando com programas, tornando-os maiores, mais simples, mais rápidos.
Observando mais atentamente, no entanto, vemos que o foco é bastante diferente.
Seu trabalho não termina quando o computador entende o que fazer. Seu primeiro
valor é a comunicação com outras pessoas. Se o programa executa, mas existe um
componente de comunicação vital que ainda precisa ser feito, você não terminou. Vo-
cê escreve testes que demonstram algum aspecto vital do software. Você divide o pro-
grama em pedaços menores, ou junta pedaços muito pequenos para formar pedaços
maiores e mais coerentes. Você encontra um sistema de nomeação que reflita as suas
intenções mais precisamente.
PAPÉIS PARA PESSOAS 139
Isso pode parecer uma ambiciosa busca pela perfeição. Não é nada disso. Você
procura desenvolver o software mais valioso para o cliente, mas sem desenvolver na-
da que não seja valioso. Se você pode reduzir suficientemente o tamanho do proble-
ma, então você pode se dar ao luxo de ser cuidadoso com o trabalho que resta. E en-
tão, você é cuidadoso por hábito.
Existem habilidades que você precisa ter para ser um programador XP, que não
são necessárias nem enfatizadas em outros estilos de desenvolvimento. A programa-
ção em pares é uma habilidade que se aprende, mas geralmente conflita com as ten-
dências do tipo de pessoa que tipicamente programa. Talvez eu devesse expressar is-
so de maneira menos equívoca – nerds* geralmente não são bons em falar. Claro, exis-
tem algumas exceções, e é possível aprender a falar com outros colegas, mas na ver-
dade, você precisará coordenar-se e comunicar-se intensamente com outros progra-
madores para obter sucesso.
Outra habilidade necessária para um programador eXtremo é o hábito da simpli-
cidade. Quando o cliente diz: “Você precisa fazer isto e aquilo”, você precisa estar
preparado para discutir quais dessas coisas são realmente necessárias e o quanto de
cada. A simplicidade estende-se também ao código que você escreve. Um programa-
dor sempre disposto a utilizar os mais recentes padrões (patterns) de análise e proje-
to provavelmente não terá sucesso na XP. É claro que você pode fazer um serviço me-
lhor se tiver mais ferramentas a sua disposição, mas é muito mais importante ter um
punhado de ferramentas que você sabe quando não usar do que saber tudo sobre tu-
do e arriscar utilizar soluções demais.
Você precisará de habilidades mais orientadas a aspectos técnicos também. Você
precisa ser capaz de programar razoavelmente bem. Você precisa ser capaz de refa-
torar, que é uma habilidade com pelo menos tanta profundidade e sutileza quanto
programar. Você precisa ser capaz de fazer testes de unidade com seu código, o que,
como a refatoração, requer discernimento e bom senso.
Você precisa estar disposto a abrir mão do sentimento de posse individual de par-
te do sistema em troca de uma posse compartilhada do sistema como um todo. Se al-
guém modifica o código que você escreveu, ou qualquer parte do sistema, você pre-
cisa confiar nas alterações e aprender com elas. Obviamente, se as modificações são
para pior, é sua responsabilidade corrigir a situação.
Acima de tudo, você precisa reconhecer seus medos. Todos têm medo:
Sem coragem, a XP simplesmente não funciona. Você passaria o tempo todo ten-
tando desesperadamente não falhar. Em vez disso, se você está disposto, com a aju-
da do time, reconheça seus medos. E então você pode seguir em frente, pertencendo
a um time que se diverte programando um ótimo software.
*N. de T.Nerd é uma gíria norte-americana para pessoas excluídas da sociedade talvez por serem exageradamente afi-
cionadas por tecnologia, computadores e programação).
140 PROGRAMAÇÃO EXTREMA EXPLICADA
Cliente
O cliente é a outra metade da dualidade essencial da programação eXtrema. O pro-
gramador sabe como programar. O cliente sabe o que programar. Bem, não em prin-
cípio, claro, mas o cliente está tão disposto a aprender quanto o programador.
Ser um cliente XP não é fácil. Há habilidades que você precisa aprender, como es-
crever boas histórias, e uma atitude que fará você ter sucesso. Porém, o mais impor-
tante é que você precisará sentir-se confortável em influenciar o projeto sem poder
controlá-lo. Forças que fogem ao seu controle vão moldar o que realmente é desen-
volvido tanto quanto as decisões que você toma. Alterações nas condições de negó-
cios, na tecnologia, na composição e na capacidade do time, todas elas têm um im-
pacto enorme sobre o software que será entregue.
Você precisará tomar decisões. Essa é a habilidade mais difícil para alguns dos
clientes com quem trabalhei. Eles estão acostumados ao fato de a TI não entregar
nem metade do que prometera, e ainda por cima, o que é entregue estar meio errado.
Eles aprenderam a não confiar na TI, já que, de qualquer forma, eles acabariam desa-
pontados. A XP não funcionará com esse tipo de cliente. Se você é um cliente XP, o ti-
me precisa que você afirme com confiança “Isto é mais importante do que aquilo”,
“Esta parte da história já é o bastante”, “Estas histórias aqui já são suficientes”. E
quando os tempos forem difíceis, e eles sempre ficam difíceis, o time precisa ser ca-
paz de fazer você mudar de idéia. “Bem, eu acho que não é tão importante assim ter
isto pronto até o próximo trimestre.” Ser capaz de tomar decisões como esta às vezes
salva o time e reduz o estresse, o bastante para que eles possam dar o melhor de si
para você.
Os melhores clientes são aqueles que de fato usam o sistema que está sendo de-
senvolvido, mas que também têm uma certa visão do problema a ser resolvido. Se
você é um desses clientes, você precisará distinguir se está pensando de uma certa
forma porque as coisas sempre foram feitas desse jeito, ou por alguma característica
intrínseca do problema. Se você não tem tanta intimidade com o sistema, precisará se
esforçar muito para garantir que possa representar as necessidades do usuário real.
Você precisará aprender a escrever histórias. Pode parecer uma tarefa impossível
em princípio, mas o time o beneficiará com grande quantidade de feedback nas pri-
meiras histórias que você escrever, e rapidamente você aprenderá o quanto cada his-
tória deve cobrir e que informações devem ser incluídas ou excluídas.
Você precisará aprender a escrever testes funcionais. Se você é o cliente de uma
aplicação com base matemática, será um trabalho mais fácil – alguns minutos ou ho-
ras com uma planilha serão suficientes para criar os dados de um caso de teste. Ou
talvez seu time construa para você uma ferramenta para facilitar a entrada de novos
casos de teste. Programas com funcionamento já bastante conhecido e popularizado
(como Workflow, por exemplo) também precisam de testes funcionais. Você terá de
trabalhar intensamente com o time para aprender que tipo de coisa é interessante tes-
tar e que tipos de teste são redundantes. Alguns times podem até lhe fornecer uma
ajuda técnica para escolher, escrever e executar os testes. Seu objetivo é escrever tes-
tes que lhe permitam dizer: “Bem, se estes executarem, então eu tenho certeza de que
o sistema vai funcionar”.
PAPÉIS PARA PESSOAS 141
Por fim, você deve demonstrar coragem. Existe um caminho que une o lugar em
que você está hoje e onde você quer chegar. Esse time pode ajudar você a encontrá-
lo, se você também ajudá-los nisso.
Testador
Já que grande parte da responsabilidade pelos testes pertence aos programadores, o
papel do testador em um time XP é, na verdade, focado no cliente. Você é responsá-
vel por ajudar o cliente a escolher e escrever testes funcionais. Se os testes funcionais
não fazem parte do conjunto de integração, você é responsável por executar os testes
funcionais regularmente e apresentar os resultados em um lugar bem visível.
Um testador XP não é uma pessoa separada, que se dedica a fazer o sistema fa-
lhar e a humilhar os programadores. Porém, alguém tem de executar todos os tes-
tes regularmente (se você não puder executar seus testes de unidade e funcionais
juntos), divulgar os resultados dos testes e garantir que as ferramentas para testes
executem bem.
Rastreador
Como um rastreador, você é a consciência do time (pense no Grilo Falante, mas com
roupas melhores).
Fazer boas estimativas é uma questão de prática e feedback.Você precisa fazer mui-
tas estimativas e então verificar se a realidade ajustou-se aos seus palpites. Seu traba-
lho é fechar o ciclo baseado no feedback. A próxima vez que o time estiver fazendo
estimativas, você precisa poder dizer: “Dois terços das nossas estimativas na última
vez estavam pelo menos 50% mais altas do que a realidade”. Em termos individuais,
você precisa poder dizer: “Suas estimativas de tarefas estão ou muito baixas, ou mui-
to altas”. As próximas estimativas a serem dadas ainda são responsabilidade das
pessoas que precisam implementar, seja lá o que está sendo estimado, mas você deu
a elas o feedback para que, quando as estimativas forem divulgadas, elas possam ser
melhores do que as últimas.
Você também é responsável pela visão global do andamento. Na metade de uma
iteração, você deve ser capaz de dizer ao time se eles vão conseguir terminar seguin-
do o curso atual, ou se eles precisam mudar alguma coisa. Algumas poucas iterações
com um cronograma de compromisso e você será capaz de informar ao time se ele
poderá fazer a próxima versão sem grandes mudanças.
Você é o historiador do time. Você mantém um registro dos escores dos testes fun-
cionais. Você mantém um registro dos defeitos que foram reportados, quem assumiu
a responsabilidade por cada um deles e quais casos de testes foram adicionados pa-
ra verificar cada defeito.
A habilidade que você mais precisa cultivar é a capacidade de coletar a informa-
ção de que precisa sem perturbar o processo mais do que o necessário. Você precisa
perturbar o processo pelo menos um pouco, para manter o pessoal ciente de quanto
tempo eles realmente gastam em uma tarefa, de uma forma que não seria possível ca-
so você não perguntasse. Mas você não pode ser tão chato a ponto de fazer as pessoas
evitarem lhe responder.
142 PROGRAMAÇÃO EXTREMA EXPLICADA
Treinador
Como treinador, você é responsável pelo processo como um todo. Você nota quando
as pessoas estão se desviando do processo do time e chama a atenção deste para is-
so. Você permanece calmo quando todos os outros estão entrando em pânico, lem-
brando-se de que, nas próximas duas semanas, você conseguirá o equivalente a duas
semanas de trabalho ou menos, e essas duas semanas serão suficientes, ou não.
Todo participante de um time XP é responsável por compreender sua aplicação
de XP até certo ponto. Você é responsável por entendê-la muito mais profundamen-
te – que práticas alternativas podem ajudar no conjunto de problemas atuais, como
outros times estão usando XP, que idéias estão por trás da XP e como elas se relacio-
nam com a situação atual.
Eu descobri que a coisa mais difícil em ser um treinador é que você trabalha me-
lhor quando trabalha indiretamente. Se você percebe um erro no projeto, primeira-
mente você precisa decidir se ele é importante o bastante para que você tenha de in-
terferir. Toda vez que você guia o time, você os torna um pouco menos autoconfian-
tes. Muito direcionamento e eles perdem a habilidade de trabalhar sem você, resul-
tando na diminuição da produtividade, da qualidade e do moral. Então, primeira-
mente você tem de decidir se o problema que você percebe é grande o suficiente pa-
ra que aceite o risco de interferir.
Se afinal decidir que o melhor é interferir, é preciso que você o faça com a menor
impertinência possível. Por exemplo, é preferível sugerir um caso de teste que para
ser implementado corretamente exija a correção do projeto a simplesmente corrigir o
projeto você mesmo. Não dizer diretamente o que você percebe, mas dizê-lo de for-
ma que o time também perceba, é uma habilidade.
Algumas vezes, no entanto, você precisa ser direto, direto a ponto de ser rude.
Programadores confiantes e ofensivos são valiosos justamente porque são confiantes
e ofensivos. Entretanto, isso os deixa vulneráveis a um certo tipo de cegueira, cuja
única cura é ser curto e grosso. Quando você deixar uma situação se deteriorar a pon-
to de uma mão gentil nas rédeas não funcionar mais, você precisa estar preparado
para agarrá-las com as duas mãos e direcioná-las. Mas apenas o suficiente para que
o time reencontre o caminho. Então você precisa soltar novamente uma das mãos.
Mais uma observação quanto às habilidades do treinador. Eu estou sempre ensi-
nando as habilidades para XP – projeto simples, refatoração, testes. Mas não acredi-
to que elas façam necessariamente parte do trabalho do treinador. Se você tivesse um
time tecnicamente auto-suficiente, mas que precisasse de ajuda com o processo, vo-
cê poderia ser o treinador sem precisar dominar os aspectos técnicos. Você ainda pre-
cisaria convencer os propeller-heads* que eles deveriam escutá-lo. Mas uma vez que
exista a habilidade, meu trabalho é basicamente lembrar o time do que eles haviam
se proposto a fazer em varias situações.
O papel do treinador diminui com o amadurecimento do time. Se aderirmos ao
princípio do controle distribuído e da aceitação de responsabilidades, “o processo” de-
ve ser responsabilidade de todos. No início da transição para XP, isso é pedir demais.
*N. de T.Técnicos que resolvem qualquer problema computacional como se fosse mágica. O nome propeller-head vem
do chapéu colorido com uma hélice que representa este tipo de pessoa nos EUA.
PAPÉIS PARA PESSOAS 143
Consultor
Projetos XP não geram muitos especialistas. Como todos eles formam pares com to-
dos os outros, e os pares mudam tanto, e qualquer um pode assumir a responsabili-
dade por uma tarefa se assim quiser, existem poucas chances de que surjam buracos
negros em que apenas uma ou duas pessoas compreendam o sistema.
Isso é um ponto forte, porque o time é extremamente flexível, mas é também uma
desvantagem, porque às vezes o time precisa de conhecimento técnico aprofundado.
A ênfase na simplicidade do projeto reduz a ocorrência da necessidade de um espe-
cialista, mas isso acontecerá de tempos em tempos.
Quando acontece, o time precisa de um consultor. É provável que, sendo você um
consultor, não esteja acostumado ao trabalho eXtremo. É possível que você encare a
maneira de trabalhar do time com um certo ceticismo. Mas o time precisa ser extre-
mamente claro quanto ao problema que precisam resolver. Serão capazes de lhe for-
necer testes para mostrar exatamente quando ele foi resolvido (na verdade, eles farão
questão dos testes).
O que eles não permitirão é que você resolva o problema sozinho. Se um time pre-
cisa de conhecimento técnico aprofundado em uma área alguma vez, é provável que
eles precisem de novo. O objetivo deles é que você os ensine a resolverem seus pró-
prios problemas. Eles possivelmente lhe farão inúmeras perguntas. Desafiarão seu
projeto e seus pressupostos, para ver se conseguem encontrar algo mais simples e
que ainda funcione.
E quando você terminar, é bem provável que eles joguem fora tudo o que você fez
e refaçam por si mesmos. Não se sinta insultado. Todos os dias eles fazem um pouco
disso consigo mesmos e provavelmente uma vez por mês eles joguem fora um dia in-
teiro de trabalho.
O Chefão
Se você é o chefão, o que o time mais precisa de você é coragem, confiança e insistên-
cia ocasional para que eles façam o que dizem fazer. É possível que, no princípio, se-
ja difícil para você trabalhar com o time. Eles pedirão que você preste atenção neles
freqüentemente. Eles explicarão as conseqüências das modificações na situação. Por
exemplo, se você não fornecer a eles o novo testador que eles solicitaram, eles vão ex-
plicar exatamente como eles pensam que isso influenciará o cronograma. Se você não
gostar da resposta deles, eles vão sugerir que você reduza o escopo do projeto.
Vindo de um time XP, isso constitui comunicação franca. Eles realmente não estão
choramingando. Querem que você saiba o mais cedo possível quando as coisas estão
diferindo do plano, para que você tenha o maior tempo possível para reagir.
O time precisa que você tenha coragem, porque o que eles fazem às vezes parece-
rá loucura, especialmente se você já tem experiência em desenvolvimento de soft-
ware. Algumas idéias você irá aceitar e aprovar, como a forte ênfase nos testes. Algu-
mas não parecem fazer sentido à primeira vista, como o fato de a programação em
pares ser um modo mais efetivo de programar, e refinar constantemente o projeto ser
uma forma de baixo risco de projetar. Mas observe e veja como eles produzem. Se
não funcionar, você pode intervir. Se funcionar, você está com tudo, porque terá um
time que está trabalhando de forma produtiva, que mantém os clientes satisfeitos e
que faz o possível para não surpreendê-lo.
144 PROGRAMAÇÃO EXTREMA EXPLICADA
Isso não quer dizer que o time não vá se atrapalhar de vez em quando. Eles vão.
Você observará o que eles estão fazendo e isso não fará o menor sentido para você, e
você pedirá que eles expliquem, e a explicação não fará sentido. Nesse momento, o
time está contando com você para fazê-los parar e analisar o que estão fazendo. Vo-
cê chegou na posição em que está hoje por alguma razão. O time quer colocar essa
habilidade funcionando para eles quando precisarem. E, francamente, querem man-
tê-la distante quando não precisarem dela.
CAPÍTULO 23
A Regra 20-80
O valor total da XP não virá até que todas as práticas estejam sendo efe-
tuadas. Muitas das práticas podem ser adotadas em pequenas porções,
mas seus efeitos serão multiplicados quando elas estiverem ocorrendo
juntas.
O
s programadores de software estão acostumados a lidar com a regra 20-80 –
80% dos benefícios vêm de 20% do trabalho. A XP também faz uso desta re-
gra – coloque os 20% de funcionalidades mais valiosos em produção, faça os
20% de projeto mais valiosos, conte com a regra 20-80 para adiar otimizações.
Para que a regra 20-80 se aplique, o sistema em questão precisa ter controles que
sejam relativamente independentes uns dos outros. Por exemplo, quando eu ajusto a
performance de um programa, cada lugar que eu poderia ajustar geralmente tem pou-
co efeito sobre os outros lugares que eu poderia ajustar. Eu nunca me encontro na si-
tuação de gastar muito tempo ajustando um local somente para descobrir que, por
causa desse ajuste, não é possível ajustar o próximo local. Em um sistema com con-
troles independentes, alguns deles estão destinados a ser mais importantes do que
outros.
Ward Cunningham fala de um livro que o elucidou sobre esqui avançado chama-
do The Athletic Skier1. Metade do livro trata sobre como ajustar suas botas, colocando-
as da maneira certa para que você possa sentir a montanha e manter o equilíbrio. E
então é dito no livro: “mas você só verá 20% de melhoramento quando você fizer
80% desses exercícios”. O livro segue explicando que há uma diferença enorme entre
manter o equilíbrio e perdê-lo. Se você está um pouco desequilibrado, é quase o mes-
mo que estar muito desequilibrado. E é uma série de pequenos fatores, como colocar
suas botas da maneira certa, que lhe permite estar equilibrado. Se qualquer um des-
ses fatores falhar, você cairá. Você verá pequenas melhorias ao longo do tempo, mas
1
Warren Witherell e Doug Evrad, The Athletic Skier, Johnson Books, 1993.
146 PROGRAMAÇÃO EXTREMA EXPLICADA
as últimas poucas modificações que você fizer melhorarão drasticamente o seu de-
sempenho no esqui.
Eu acho (e isso é apenas uma hipótese) que a XP funciona da mesma forma. As
práticas e os princípios trabalham em conjunto para criar uma sinergia maior do que
a soma das partes. Não é apenas o fato de você testar, mas sim o fato de você estar
testando um sistema simples, que ficou simples porque você teve um parceiro de
programação que o desafiou a refatorar e lembrou-lhe de escrever mais testes e elo-
giou-o quando você eliminou a complexidade e...
Isto cria um dilema. A XP é “tudo ou nada”? Precisamos seguir essas práticas ao
pé da letra ou então correremos o risco de não ver nenhuma melhoria? Nada disso.
Você pode obter ganhos significativos de partes da XP. Porém, acredito que há mui-
to mais a ser ganho quando você une todas as peças.
CAPÍTULO 24
O que Torna a XP Difícil
Q uando as pessoas me ouvem falar sobre XP, elas dizem: “Mas você faz pare-
cer tão simples”. Bem, é porque ela é simples. Não é necessário um doutora-
do em Ciência da Computação para contribuir para um projeto XP (de fato,
às vezes quem tem mais problemas são os doutores).
A XP é simples em seus detalhes, mas é difícil de executar.
Recapitulando. Quer dizer que a XP é simples, mas não é fácil? Exatamente. As
práticas que compõem a XP podem ser aprendidas por qualquer um que tenha con-
vencido alguém a pagá-lo para programar. Essa não é a parte difícil. A parte difícil é
reunir todas as peças e então mantê-las equilibradas. As peças tendem a apoiar umas
às outras, mas existem muitos problemas, preocupações, medos, eventos e erros que
podem levar ao desequilíbrio. A única razão pela qual você “sacrificaria” um técnico
experiente para torná-lo treinador é que o problema de manter o processo equilibra-
do é muito difícil.
Não quero assustá-lo. Não mais do que o necessário. A maior parte dos grupos de
desenvolvimento seria capaz de executar a XP (veja as exceções no próximo capítulo).
Aqui estão algumas das coisas que eu considero difíceis na XP, tanto quando eu a
estou aplicando em meu próprio código, como quando estou treinando times que a
estão adotando.
Não quero que você fique se preocupando desnecessariamente, mas quando a
transição para XP estiver difícil (e às vezes ela será, eu garanto), você precisa saber
que não está sozinho. Você está tendo dificuldades porque o que você está fazendo é
difícil.
É difícil fazer coisas simples. Parece loucura, mas às vezes é mais fácil fazer algo
mais complicado do que algo simples. Isso é verdade especialmente quando você ob-
148 PROGRAMAÇÃO EXTREMA EXPLICADA
*N. de T. A expressão checks and balances denota um sistema de limites imposto pela Constituição americana a todos
os poderes – Judiciário, Executivo e Legislativo. Esse sistema concede a cada poder o direito de modificar ou cancelar
os atos que se referem a sua jurisdição mas que foram estipulados por um outro poder.
O QUE TORNA A XP DIFÍCIL 149
O time tinha tentado evitar o último passo, então eles alteraram o processo para:
O problema era que a pessoa que aceitara a responsabilidade por uma tarefa não
era dono da estimativa. Eles voltavam no dia seguinte e diziam: “Por que isso vai de-
morar três dias? Eu nem sei o que está envolvido”. Você pode imaginar que essa não
é a condição mais produtiva para um programador. As pessoas estavam perdendo
um ou dois dias para a Síndrome da Primeira Terça em todas as iterações. Não é de
se admirar que eles não estivessem conseguindo atingir suas metas.
Eu conto essa história para ilustrar como pequenos problemas com o processo po-
dem ter grandes efeitos. Isso não quer dizer que você precise fazer tudo exatamente
como eu digo, do contrário você se arrependerá amargamente. Você ainda precisa
aceitar a responsabilidade pelo seu próprio processo. Mas o que torna a XP difícil é
exatamente isso – ao aceitar a responsabilidade pelo seu próprio processo de desen-
volvimento, você está aceitando a responsabilidade de estar ciente e de consertá-lo
quando houver um problema.
Dirigir projetos ajustando a direção um pouco de cada vez vai de encontro à me-
táfora do carro plenamente alinhado, prevalente em muitas empresas. Uma dificul-
dade final, e uma que pode facilmente afundar um projeto XP, é que redirecionar é
simplesmente inaceitável em muitas culturas de empresas. O aviso antecipado de
problemas é visto como um sinal de fraqueza ou reclamação. Você precisará de cora-
gem quando a sua companhia exigir que você aja de forma contrária ao processo que
você tenha escolhido para si.
CAPÍTULO 25
Quando Você não Deveria usar a XP
H
á certas práticas na XP que são boas, independentemente da sua opinião so-
bre o todo. Você deveria praticá-las. Ponto final. Os testes são um bom exem-
plo. O Jogo do Planejamento provavelmente funcione, mesmo se você gastar
mais tempo em estimativas e projeto antecipado. No entanto, como a regra 20-80 pro-
põe, é provável que exista uma grande diferença entre toda a XP e quase toda.
E, francamente, toda a XP não é para todos, e nem deveria ser para todos. Há mo-
mentos, lugares, pessoas e clientes que explodiriam um projeto XP como se ele fosse
um balão barato. É importante não utilizar a XP nestes projetos. Tão importante
quanto não utilizar a XP onde ela está destinada a fracassar, é utilizá-la onde ela po-
de proporcionar vantagens reais. É sobre isso que este livro fala – decidir quando
usar a XP e quando não usá-la.
Dito isso, eu não diria a vocês “Não use XP para construir software para mísseis”.
Eu nunca construí software para mísseis, então não sei como é isso. Por isso, não pos-
so lhe dizer que a XP funcionará. Mas eu também não posso lhe dizer que não irá
funcionar. Se você escrever um software para mísseis, você pode decidir se a XP tal-
vez funcione ou não.
No entanto, eu fracassei utilizando a XP vezes suficientes para conhecer alguns
dos casos em que ela certamente não funciona. Considere isto como uma lista de am-
bientes em que eu sei que a XP não dá certo.
A maior barreira para o sucesso de um projeto XP é a cultura. Não a cultura nacio-
nal, embora esta tenha algum impacto, mas a cultura empresarial. Qualquer negócio
que gerencie projetos tentando apontar o carro para a direção certa logo de cara terá
conflitos com um time que insiste em ir acertando a direção continuamente.
Uma variação de “apontar o carro” é a especificação gigante. Se um cliente ou um
gerente insiste em uma completa especificação, análise ou projeto antes de começar
152 PROGRAMAÇÃO EXTREMA EXPLICADA
C
omo você pode encaixar a XP nas práticas habituais de negócios? Uma forma
de contrato equivocada pode facilmente destruir um projeto, não importando
as ferramentas, a tecnologia e o talento.
Este capítulo examina alguns arranjos comerciais para o desenvolvimento de
software e a forma como você pode utilizá-los com a XP.
Preço Fixo
O pessoal tende a enfrentar maiores problemas ao desenvolver um contrato de pre-
ço fixo extremo. Como você pode fazer um contrato de preço fixo/data fixa/escopo
fixo se você joga o Jogo do Planejamento? Você acabará com um contrato de preço fi-
xo/data fixa/escopo razoavelmente variável.
Todos os projetos em que trabalhei que tinham preço e escopo fixos, terminaram
com ambas as partes dizendo: “Os requerimentos não estavam claros”. E o típico
projeto de preço e escopo fixos puxa as duas partes em direções exatamente opostas.
O fornecedor quer fazer o mínimo possível, e o cliente quer exigir o máximo possí-
vel. Mesmo com essa tensão, ambas as partes querem que o projeto seja bem-sucedi-
do, então eles abrem mão de seus objetivos primários, mas a tensão continua lá.
Com a XP, a relação se altera de uma forma sutil, mas importante. O escopo inicial
é uma suposição. “Por exemplo, por 5 milhões de marcos alemães, nós acreditamos
que possamos produzir estas histórias em 12 meses”. O cliente precisa decidir se es-
sas histórias realmente valem 5 milhões de marcos alemães. Se essas histórias iniciais
são as que o time acaba produzindo, ótimo. É mais provável que o cliente troque al-
gumas histórias por outras de maior valor. Ninguém reclama se recebe algo de maior
156 PROGRAMAÇÃO EXTREMA EXPLICADA
valor do que esperava. Todos reclamam se recebem aquilo que pediram, mas o
“aquilo” não é o que eles agora sabem que querem.
Ao invés de preço/data/escopo fixos, o time XP oferece algo que mais se parece
com uma assinatura. O time trabalhará à velocidade máxima para o cliente por um
determinado período de tempo. Eles rastrearão o aprendizado do cliente. No come-
ço da cada iteração, o cliente tem uma oportunidade formal de mudar a direção, de
introduzir novas histórias.
Outra diferença que a XP introduz é causada pelos ciclos de entrega curtos. Você
nunca faria um projeto XP por 18 ou até mesmo 12 meses sem entrar em produção.
Uma vez que o time se propnha a fazer o equivalente a 12 meses de histórias, eles vão
jogar o Jogo do Planejamento com o cliente para determinar o escopo da primeira
versão. Então um contrato de 12 meses pode colocar o sistema em produção após três
ou quatro meses, com as versões seguintes saindo a cada mês ou bimestre. Entregas
incrementais apóiam-se na oportunidade que o cliente tem de terminar o contrato se
o progresso for mais lento do que o estimado inicialmente, ou se as condições comer-
ciais acabaram tornando o projeto inútil e ainda dá ao cliente pontos naturais para
mudar a direção do projeto.
Terceirização (Outsourcing)
No desenvolvimento terceirizado, o cliente acaba com uma pilha de códigos que não
sabe como manter. Ele tem três escolhas:
• pode fazer uma grande bagunça ao tentar fazer a evolução do sistema sozi-
nho;
• pode contratar o fornecedor original para continuar evoluindo o sistema (mas
o fornecedor original pode cobrar uma fortuna);
• pode contratar outro fornecedor que não conhece bem o código.
Você até poderia fazer isto com XP, se você fizesse questão. O time poderia mu-
dar-se para o ambiente do cliente ou o cliente poderia mudar-se para o ambiente do
time. Eles jogariam o Jogo do Planejamento para decidir o que fazer. Quando o con-
trato estivesse terminado, o time poderia ir embora e deixar o cliente com o código.
De certa forma, isso poderia ser melhor do que um acordo típico de terceirização.
O cliente teria os testes funcionais e de unidade para garantir que qualquer modifi-
cação que ele fizesse não destruiria as funcionalidades existentes. O cliente teria al-
guém para espiar por sobre os ombros dos programadores, para que ele pudesse ter
idéia de como é o sistema por dentro. E o cliente poderia ainda direcionar o desen-
volvimento com o decorrer do projeto.
cremental. Mas há uma pequena alteração na terceirização que a XP pode fazer para
melhorar a situação. E se você substituísse gradualmente os membros do time por
pessoal técnico do cliente? Eu chamo isso de “utilização de pessoal da casa” ou “uti-
lização de pessoal interno” ou ainda “primeirização”*.
Ela tem muitas das vantagens da terceirização. Por exemplo, permite que o forne-
cedor dê ao cliente o benefício do conhecimento técnico detalhado. Ao gradualmen-
te repassar a responsabilidade pelo sistema, a primeirização não faz o cliente correr
o risco de herdar um programa que não é capaz de sustentar.
Vejamos um exemplo de um arranjo de primeirização provida por um fornecedor
de um time de 10 pessoas. O contrato é de 12 meses. O desenvolvimento inicial dura
três meses, seguido de uma entrega a cada mês durante nove meses. O cliente forne-
ce um técnico para o desenvolvimento inicial. Depois, a cada mês, o cliente traz uma
nova pessoa, e o fornecedor elimina uma também. Ao fim do contrato, metade do ti-
me é formada por empregados do cliente, aptos a dar suporte ao programa e conti-
nuar o desenvolvimento, mesmo que em um ritmo mais lento.
O desenvolvimento certamente não será tão rápido com todas essas trocas no ti-
me se comparado a um arranjo de terceirização em que o time do fornecedor perma-
nece estável. Mas a redução no risco pode valer a pena.
A XP dá suporte à primeirização por ter o time medindo constantemente sua ve-
locidade. Com a troca dos membros, o time como um todo está fadado a ir mais rá-
pido e mais devagar. Ao medir constantemente a produtividade alcançada, o time
pode ajustar quanto eles se comprometem a fazer nas iterações do Jogo do Planeja-
mento. Com a saída dos experts e sua substituição por pessoal menos experiente, o ti-
me pode reestimar as histórias remanescentes.
*N. de R. T. Optamos por traduzir insourcing por primeirização devido à clara intenção do autor de fazer oposição à
outsourcing (terceirização).
158 PROGRAMAÇÃO EXTREMA EXPLICADA
Término Antecipado
Uma das características da XP é que o cliente pode saber ao longo do projeto exata-
mente o que vai receber. E se eles descobrirem no meio do caminho que o projeto não
faz mais sentido? O cliente economizará dinheiro se puder terminá-lo mais cedo.
Considere acrescentar uma cláusula que permita ao cliente parar o projeto e pagar
apenas o valor proporcional ao período trabalhado, talvez com um pagamento adi-
cional para compensar o fornecedor por este ter de procurar um novo contrato sem
aviso prévio.
Frameworks
Como você poderia utilizar a XP para desenvolver um framework? Se uma das regras
é que você exclua qualquer funcionalidade que não esteja sendo usada atualmente,
você não acabaria excluindo todo o framework?
A XP não é muito boa em “reutilização adiantada”. Em um projeto XP, você nun-
ca passaria seis meses criando frameworks para então começar a usá-los. E também
não separaria o time do framework do time da aplicação. Com XP, fazemos aplicações.
Se, após alguns anos de refinamento constante, algumas das abstrações começam a
parecer úteis de uma forma geral, é tempo de pensar em como torná-las disponíveis
de maneira mais ampla.
Se o objetivo do projeto fosse desenvolver um framework para uso externo, você ain-
da poderia usar XP. No Jogo do Planejamento, os Negócios seriam jogados por um pro-
gramador que tivesse realmente construído o tipo de aplicação a que o framework pre-
tende dar suporte. As características do framework se transformariam em histórias.
A XP EM AÇÃO 159
Uma vez que o framework fosse implantado fora do time, você precisaria de uma
abordagem mais conservadora nas refatorações que alterassem interfaces visíveis.
Para amenizar a situação, você avisa ao cliente da iminente transformação de uma
característica, permitindo que você continue evoluindo a interface do framework ao
custo de manter duas interfaces vivas por algum tempo.
Software de Prateleira
Você também pode usar a XP para software de prateleira*. O papel dos Negócios no
Jogo do Planejamento é representado pelo departamento de marketing. São eles que
identificam que histórias o mercado deseja, o quanto de cada história é necessário e
em que ordem as histórias devem ser implementadas.
Contratar um usuário expert no software para ser parte dos Negócios também é
uma possibilidade. Por exemplo, companhias de jogos contratam jogadores experts
para testarem os seus softwares. Companhias que desenvolvem software para transa-
ções financeiras contratam corretores. Se você está desenvolvendo um programa pa-
ra composição tipográfica, seria loucura não ter um tipógrafo no time. E essa é exa-
tamente a pessoa que deve escolher se é a história A ou a história B que deve ser adia-
da para a próxima versão.
T
odas as metodologias baseiam-se no medo. Você tenta criar hábitos que impe-
çam que seus medos tornem-se realidade. Neste aspecto, a XP não é diferente
de nenhuma outra metodologia. A diferença está nos medos que estão embuti-
dos na XP. Já que a XP é o meu bebê, ela reflete os meus medos. Eu tenho medo de:
• codificar;
• mudar de idéia;
• seguir em frente sem saber absolutamente tudo sobre o futuro;
• contar com as outras pessoas;
• mudar a análise e o projeto de um sistema em andamento;
• escrever testes.
162 PROGRAMAÇÃO EXTREMA EXPLICADA
Eu precisei aprender a não ter medo dessas coisas. Isso não vem naturalmente, es-
pecialmente quando todos lhe dizem que essas são exatamente as coisas de que eu
deveria ter medo, as coisas que eu deveria a todo custo evitar.
Expectativa
Um jovem rapaz foi até um mestre espadachim. Sentado sob o sol em frente à caba-
na do mestre, teve sua primeira lição: “Aqui está sua espada de madeira para prati-
car. Eu posso acertá-lo a qualquer momento com a minha espada de madeira e você
precisa me bloquear”. Zap!
– Ai!
– Eu disse a qualquer momento. Zap!
– Ai!
O aprendiz ergueu sua espada e encarou o mestre ferozmente.
Durante os dias que se seguiram, o aprendiz reuniu uma adorável coleção de ma-
chucados. Ele tentava prestar atenção em tudo à sua volta. Mas toda vez que desvia-
va sua atenção, zap!
O aprendiz não podia comer em paz. Não podia dormir. Ele tornou-se paranóico,
espiando cuidadosamente em cada canto e escutando atentamente a cada ruído. Mas
a cada vez que seus olhos pendiam ou esquecia de escutar, Zap!
Logo ele chorou de frustração: “Eu não posso agüentar. Eu não tenho capacidade
para ser um espadachim. Eu vou para casa”. Neste momento, sem saber exatamente
porque, ele puxou sua espada e girou-a, bloqueando o ataque do mestre. O mestre
disse: “Agora você está pronto para aprender”.
Nós podemos ficar malucos com a expectativa. Mas, ao nos prepararmos para ab-
solutamente tudo o que possamos imaginar, nós nos tornamos vulneráveis às even-
tualidades que não podemos imaginar.
Existe outra forma. O time pode estar perfeitamente preparado para, a qualquer
momento, seguir em qualquer direção que os negócios ou o sistema exijam. Ao expli-
citamente desistir de preparar-se para as mudanças, paradoxalmente ele prepara-se
inteiramente para qualquer mudança. Ele nada espera. Ele não pode mais ser sur-
preendido.
Bibliografia Comentada
O
propósito desta seção é dar-lhe a oportunidade de se aprofundar nos aspec-
tos da XP que mais lhe interessaram.
Filosofia
Sue Bender, Plain and Simple. A Woman’s Journey to the Amish, HarperCollins, 1989;
ISBN 0062501860.
Mais não é melhor. Menos talvez não seja melhor, também.
Leonard Coren, Wabi-Sabi: For Artists, Designers, Poets, and Philosophers, Stone Bridge
Press, 1994; ISBN 1880656124.
A XP não busca nenhum tipo de perfeição transcendental em seus programas.
Wabi-sabi é uma celebração estética do rústico e funcional.
Richard Coyne, Designing Information Technology in the Postmodern Age: From Method
to Metaphor, MIT Press, 1995; ISBN 0262032287.
Discute as diferenças entre os pensamentos modernista e pós-modernista, um
tema presente na XP. Há ainda uma excelente discussão sobre a importância das
metáforas.
164 BIBLIOGRAFIA COMENTADA
Philip B. Crosby, Quality Is Free: The Art of Making Quality Certain, Mentor Books,
1992; ISBN 0451625854.
Desfaz o modelo compensatório das quatro variáveis – tempo, escopo, custo e
qualidade. Você não consegue terminar um software mais rápido se diminuir a
qualidade. Na verdade, você termina o software mais rápido se aumentar a qua-
lidade.
George Lakoff, Mark Johnson, Philosophy in the Flesh: The Embodied Mind and Its Chal-
lenge to Western Thought, Basic Books, 1998; ISBN 0465056733.
Mais uma boa discussão sobre metáforas e pensamento. Além disso, a descrição
de como as metáforas se misturam para formar novas metáforas é tal qual o que
está acontecendo com as idéias na engenharia de software. As metáforas antigas
emprestadas da engenharia civil, da matemática e de outras áreas estão lenta-
mente se tornando uma metáfora singular da engenharia de software.
Bill Mollison, Rena Mia Slay, Introduction to Permaculture, Ten Speed, 1997; ISBN
0908228082.
Alta intensidade, no mundo ocidental, geralmente está associada à exploração
e à exaustão. A permaculture é uma disciplina de cultivo que objetiva o uso sus-
tentável e de alta intensidade através dos efeitos sinérgicos de práticas simples.
A idéia mais interessante é a de que o maior crescimento se dá na interação en-
tre as áreas. A permaculture maximiza a interação com espirais de interplantação
e lagos com bordas bastante irregulares. A XP maximiza a interação através de
clientes presentes e programação em pares.
Atitude
Chistopher Alexander, Notes on the Synthesis of Form, Harvard University Press, 1970;
ISBN 0674627512.
Alexander começa encarando o projeto como decisões que resolvem restrições
conflitantes, levando a mais decisões para resolver as restrições remanescentes.
Chistopher Alexander, The Timeless Way of Building, Oxford University Press, 1979;
ISBN 0195024028.
A relação descrita entre projetistas/construtores e os usuários das construções
é muito parecida com a relação entre os programadores e o cliente.
Cynthia Heimel, Sex Tips for Girls, Simon & Schuster, 1983; ISBN 0671477250.
O entusiasmo genuíno é a melhor técnica. Com ele, todo o resto funciona. Sem
ele, esqueça.
Field Marshal Irwin Rommel, Attacks: Rommel, Athena, 1979; ISBN 0960273603.
Exemplos interessantes sobre como prosseguir sob circunstâncias aparentemen-
te sem saída.
BIBLIOGRAFIA COMENTADA 165
Frank Thomas, Ollie Johnston, Disney Animation: The Illusion of Life, Hyperion, 1995;
ISBN 0786860707.
Descreve como a estrutura dos times na Disney evoluiu com o passar dos anos
para lidar com negócios e tecnologia mutáveis. Há também várias boas dicas
para projetistas de interfaces e algumas imagens muito legais.
Processos Emergentes
Christopher Alexander, Sara Ishikawa, Murray Silverstein, A Pattern Language, Ox-
ford University Press, 1997; ISBN 0195019199.
Um exemplo de um sistema de regras que pretende produzir propriedades
emergentes. Podemos discutir se as regras obtêm sucesso ou não, mas as regras
em si são uma leitura interessante. Apresenta também uma discussão excelen-
te, se bem que um tanto curta, a respeito do projeto de ambientes de trabalho.
James Gleick, Chaos: Making a New Science, Penguin USA, 1988; ISBN 0140092501.
Uma introdução suave à teoria do caos.
Stuart Kauffman, At Home in the Universe: The Search for Laws of Self-Organization and
Complexity, Oxford University Press, 1996; ISBN 0195111303.
Uma introdução menos suave à teoria do caos.
Roger Lewin, Complexity: Life at the Edge of Chaos, Collier Books, 1994; ISBN
0020147953.
Ainda mais caos.
Margaret Wheatley, Leadership and the New Science, Beret-Koehler Pub, 1994; ISBN
1881052443.
Responde à questão: “E se nós utilizássemos a teoria dos sistemas auto-organi-
zados como uma metáfora para o gerenciamento?”.
Sistemas
Gerald Weinberg, Quality Software Management: Volume 1, Systems Thinking, Dorset
House, 1991; ISBN 0932633226.
Um sistema e uma notação para pensar sobre sistemas de ações interativas.
Warren Witherell, Doug Evrard, The Athletic Skier, Johnson Books, 1993; ISBN
1555661173.
Um sistema de regras inter-relacionadas para esquiar. A fonte da regra 20-80.
166 BIBLIOGRAFIA COMENTADA
Pessoas
Tom DeMarco, Timothy Lister, Peopleware, Dorset House, 1999; ISBN 0932633439.
Seguindo The Psychology of Computer Programming, este livro expandiu o diálo-
go prático sobre como são os programas escritos por pessoas, e em particular,
por grupos de pessoas. Este livro foi a fonte do princípio da “aceitação de res-
ponsabilidades”.
Carlo d’Este, Fatal Decision: Anzio and the Battle for Rome, Harper-Collins, 1991; ISBN
006092148X.
O que acontece quando o ego impede o pensamento claro.
Robert Kanigel, The One Best Way: Frederick Winslow Taylor and the Enigma of Efficiency,
Penguin, 1999; ISBN 0140260803.
Uma biografia de Taylor que coloca seu trabalho em um contexto que ajuda a
mostrar os limites de seu pensamento.
Geoffrey A. Moore, Crossing the Chasm: Marketing and Selling High-Tech Products to
Mainstream Customers, HarperBusiness, 1999; ISBN 0066620023.
Mudanças de paradigma sob a perspectiva dos negócios. Pessoas diferentes es-
tarão preparadas para adotar a XP em diferentes estágios da sua evolução. Al-
gumas das barreiras são previsíveis e há estratégias simples para abordá-las.
Frederick Winslow Taylor, The Principles of Scientific Management, 2nd ed. Institute of
Industrial Engineers, 1988 (1st ed. 1911); ISBN 0898061822.
Este é o livro que gerou o “taylorismo”. Especialização e rígida divisão-e-con-
quista serviram para produzir mais carros, mais barato. Minha experiência diz
que estes princípios não fazem sentido como estratégias para o desenvolvimen-
to de software: nem sentido comercial, nem sentido humano.
BIBLIOGRAFIA COMENTADA 167
Colin M. Turnbull, The Forest People: A Study of the Pygmies of the Congo, Simon &
Schuster, 1961; ISBN 0671640992.
Uma sociedade com abundância de recursos. Meu sonho é que seja possível cri-
ar esse sentimento no time.
————, The Mountain People, Simon & Schuster, 1972; ISBN 0671640984.
Uma sociedade com recursos escassos. Descreve apropriadamente diversos
projetos de que participei. Nunca mais quero viver dessa forma.
Mary Walton, W. Edwards Deming, The Deming Management Method, Perigee, 1988;
ISBN 0399550011.
Deming explicitamente identifica o medo como uma barreira para a perform-
ance. Todos estão focados em métodos de controle de qualidade estatísticos,
mas há muito a ser considerado sobre emoções humanas e seus efeitos.
Gerência de Projeto
Fred Brooks, The Mythical Man-Month, Addison-Wesley, 1995; ISBN 0201835959.
Histórias para fazê-lo pensar sobre as quatro variáveis. A edição comemorativa
tem também um diálogo interessante sobre o famoso artigo No Silver Bullet.
Tom DeMarco, Controlling Software Projects, Yourdon Press, 1982; ISBN 0131717111.
Exemplos excelentes de criação e uso de feedback para mensurar projetos de soft-
ware.
Ivar Jacobson, Grady Booch, James Rumbaugh, The Unified Software Development Pro-
cess, Addison Wesley Longman, 1999; ISBN 0201571692.
Filosoficamente, há muito com que eu concordo neste livro – iterações curtas,
ênfase na metáfora e uso de histórias para guiar o desenvolvimento.
Jennifer Stapleton, DSDM Dynamic Systems Development Method: The Method in Prac-
tice, Addison-Wesley, 1997; ISBN 0201178893.
DSDM é uma perspectiva na obtenção de controle sobre o desenvolvimento rá-
pido de aplicações sem abrir mão de seus benefícios.
Hirotaka Takeuchi, Ikujiro Nonaka, “The new product development game”, Harvard
Business Review [1986], 86116:137-146.
Uma abordagem orientada ao consenso para uma entrega evolutiva. Há idéias
interessantes aqui para dimensionar a XP para mais programadores.
Jane Wood, Denise Silver, Joint Application Development, 2nd ed, John Wiley and Sons,
1995; ISBN 0471042994.
Os facilitadores da JAD e os treinadores da XP compartilham um sistema de va-
lores comum – facilitar sem direcionar, dar poder àqueles que melhor sabem to-
mar a decisão e, por fim, sair de cena. A JAD é focada na criação de um docu-
mento de requisitos cujos desenvolvedores e clientes concordem que possa e
deva ser implementado.
BIBLIOGRAFIA COMENTADA 169
Programação
Kent Beck, Smalltalk Best Practices Patterns, Prentice-Hall, 1996; ISBN 013476904X.
A modéstia me impede.
Kent Beck, Erich Gamma, “Test Infected: Programmers Love Writing Tests”, in Java
Report, July 1998, volume 3, number 7, pp. 36-50.
A escrita de testes automatizados com JUnit, a versão Java do framework de tes-
tes xUnit.
Jon Bentley, Writting Efficient Programs, Prentice –Hall, 1982; ISBN 013970251-2.
Uma cura para a síndrome do “não vai ser rápido o bastante”.
Martin Fowler, Analysis Patterns, Addison Wesley Longman, 1996; ISBN 0201895420.
Um vocabulário comum para tomar decisões de análise. Mais difícil de absor-
ver do que os padrões de projeto, mas de muitas formas mais profundo, já que
padrões de análise estão ligados ao contexto de negócios.
Erich Gamma, Richard Helms, Ralph Johnson, John Vlissides, Design Patterns: Ele-
ments of Reusable Object-Oriented Software, Addison-Wesley, 1995; ISBN 0201633612.
Um vocabulário comum para tomar decisões de projeto.
Outros
Barry Boehm, Software Engineering Economics, Prentice-Hall, 1981; ISBN 0138221227.
A referência-padrão para idéias sobre quanto o software custa e por quê.
170 BIBLIOGRAFIA COMENTADA
Larry Gonick, Mark Wheelis, The Cartoon Guide to Genetics, HarperPerennial Library,
1991; ISBN 0062730991.
Uma demonstração do poder dos desenhos como meio de comunicação.
John Hull, Options, Futures, and Other Derivatives, Prentice-Hall, 1997; ISBN
0132643677.
A referência-padrão para mercado de opções.
Edward Tufte, The Visual Display of Quantitative Information, Graphics Press, 1992;
ISBN 096139210X.
Mais técnicas para se comunicar informação numérica através de figuras. Útil
para entender qual a melhor forma de apresentar gráficos de métricas, por
exemplo. Além do mais, a edição é muito bonita.
Glossário
Após alguns dos verbetes abaixo, foram inseridas explicações (entre parênteses e com destaque) pelo re-
visor técnico com a colaboração de Guilherme Lacerda, Diretor de Tecnologia da APOENA Software
Livre, Mestrando em Informática (UFRGS) e palestrante do eXtreme Programming Brasil 2002, um dos
pioneiros na prática da XP no Brasil e a quem agradecemos.
Carga de trabalho (load factor) A razão entre o tempo de programação ideal e o ca-
lendário. Tipicamente varia entre 2 e 4. (Na prática de XP, existe um ditado sobre a velo-
cidade: “Tão rápido quanto o mais lento”, ou seja, por mais rápido que um par trabalhe, ele
sempre terá que acompanhar o par mais lento. Por isso, são promovidos rodízios entre mem-
bros de cada par.)
Caso de teste (test case) Um conjunto automatizado de estímulos e respostas do sis-
tema. Cada caso de teste deve deixar o sistema no mesmo estado em que foi encon-
trado. Assim, cada teste pode executar independentemente dos outros.
Cliente Um papel no time para alguém que escolhe as histórias a que o sistema pre-
cisa satisfazer, quais histórias são necessárias primeiro e quais podem ser posterga-
das, e que define testes que verifiquem o funcionamento das histórias. (Em XP, exis-
te o conceito de time coeso. O cliente é o maior interessado no sucesso do projeto, pois está
investindo tempo e dinheiro.)
Cronograma de comprometimento (commitment schedule) Uma entrega e uma data.
O cronograma de comprometimento é refinado a uma iteração por vez e modifica-
do através da reestimativa e recuperação.
Entrega (release) Uma pilha de histórias que, juntas, tem relevância para o pessoal
dos Negócios. (Cada entrega – usa-se também o termo lançamento – disponibiliza 100%
do sistema funcional a cada iteração. Assim, o risco é reduzido pois, se o projeto terminar,
parte do sistema – a parte entregue – existe e funciona.)
172 GLOSSÁRIO
A B
Adaptação local, princípios de gerenciamento e, Bibliografia, 163-171
55, 79-80 seção sobre atitude, 164-165
Adotando XP, 125-127 seção sobre filosofia 163-164
Ajustando a XP, 127-130 seção sobre gerência de projeto, 167-169
desenvolvimento e, 129-130 seção sobre outros, 171
seção sobre pessoas, 166-168
gerenciamento e, 129-130
seção sobre processos emergentes, 164-166
planejamento e, 128-130
seção sobre programação, 169-170
projeto e, 128-129 seção sobre sistemas, 165-166
projetos problemáticos e, 130 Bônus por conclusão, 157-158
testes e, 127-129
Ajuste de desempenho, , 133-134
Ambiente de trabalho C
experimentando com, 87-88 Cartões de histórias, jogo do planejamento e , 95-
produtividade e, 85-86 96
quando usar a XP e, 153 Cartões de tarefa, 98-99
rearranjando, 86-87, 129-130 Chefe, 143-144
Classes, 114
Aprendendo
Classificar por risco, fase de comprometimento,
codificando e, 57-58
97
ensinando e, 52-53 Classificar por valor, fase de comprometimento,
Arquitetura 97
estratégia de projeto e, 117 Clientes, 139-141
fase de exploração e, 131-132 cliente presente e, 77-78
iterações e, 133-134 coragem e, 140-141
metáfora guia e, 67-69 definição, 172
176 ÍNDICE
T macaco, 122
paralelo,122
Tamanho do projeto, quando usar a XP e , 152-153
unidade, 122
Tarefas
Times
aceitar uma tarefa, 98-99
considerações técnicas e, 66-67
definição, 173
processo de mudança de time, 82-83
dividir uma tarefa/combinar tarefas, 98-99
velocidade dos, 175-176
escrever, 97-98
Treinador, 80-82, 141-143
estimar, 45-46, 98-99
como papel no gerenciamento, 80-81
implementar, 99-100
Tecnologia definição, 171
decisões de negócios e, 90-92 fornecendo comida e brinquedos, 81-82
fase de exploração e, 131-132 funções do, 81-82
Tempo habilidades do, 142-143
custo das mudanças e, 39-41 responsabilidade do, 141-142
decisões de desenvolvimento e, 90-91 Troca de pessoal, 21-23
efeito das limitações de, 34-35
feedback e, 46-48 V
idéia geral sobre, 33-34
variáveis de desenvolvimento de software e, 33 Valores, 45-49
Tempo de entrega, 90-91 colocando em prática, 48-49
Tempo e recursos materiais, contratos de, 157-158 comunicação, 45-46
Tempo ideal de programação, 173 coragem, 48-49
Terceirização. Veja Outsourcing estratégia de projeto e, 109
Término antecipado, 158-159 feedback, 46-48
Testador, 140-141 simplicidade, 45-47
Teste, casos de, 175-176 Variáveis, desenvolvimento de software, 33-37
Testes, 58-60 idéia geral sobre, 33-34
adotando XP e, 125 importância do escopo, 35-37
ajustando a XP e, 127-129 interações entre, 33-36
aumentando a confiança através de, 59-60 variável custo, 33-34
automatizando, 42 variável escopo, 33-34
ciclo de desenvolvimento e, 25-26 variável qualidade, 33-34
cliente e, 140-141 variável tempo, 33-34
codificação e, 57-58 visibilidade das, 33-34
comunicação e, 45-46 Velocidade, fase de comprometimento e definição
de integração e, 25-27 da, 97
falhas nos, 60 Viaje com pouca bagagem
feedback e, 46-47 estratégia de projeto e, 109-110
fundamentação para, 58-59, 74-76 princípios de gerenciamento e, 55, 79-80
práticas da XP e, 66, 68-69 projetando com figuras e, 116
velocidade dos, 59-60
vida do programa e, 59-60
Testes, estratégia, 119-122 X
fontes de testes e, 120-122 XP, exemplo, 131-136
isolando e automatizando, 119-120 fase de exploração, 131-133
minimizando testes, 119-120 fase de planejamento, 132-133
tipos de testes e, 122 iterações para a primeira versão, 132-134
Testes, tipo de manutenção, 134-135
automatizados, 172 morte do projeto, 135-136
estresse, 122 produção e, 133-134
funcionais, 173 XP, quando usar, 151-153
182 ÍNDICE