Barrigas abertas
Publicado por Vinicius Manhães Teles há mais de 5 anos.
O Marcelo Baltar fez alguns comentários, nesse artigo, sobre a utilização do CruiseControl no processo de integração contínua e eu gostaria de levantar algumas considerações. Preferi fazer isso através de um novo artigo. O Marcelo cita o seguinte:
"Parabéns, mais um excelente post. Mas devo dizer que eu também tenho uma preferência pelos testes assíncronos (CruiseControl-like ;) ). Além das questões técnicas, já bem exploradas no seu post e em alguns comentários, esse tipo de abordagem aproxima-se mais dos conceitos pregados pelas metodologias 'ágeis'.
No meu entender é mais proveitoso o desenvolvedor 'commitar' seu trabalho o quanto antes (lógico, com os devidos testes implementados) e já avançar para as próximas tarefas ao invés de ser obrigado a passar por todo esse processo de integração 'pré-commit'. Afinal de contas, quão realmente grave/problemático seria o commit de código que quebra o que está no repositório? Pela minha experiência, isso acontece pouquíssimo, e quando acontece, graças a granularidade dos commits, pode ser facilmente corrigido."
Marcelo, muito obrigado pelo comentário. Compreendo sua percepção de que o uso do CruiseControl possa estar mais associado a metodologias ágeis, porém não compartilho essa mesma visão. Acredito que isso tem a ver com a interpretação do que seja uma "metodologia ágil". Não sei se você chegou a ler o artigo sobre agilidade x Agilidade. O termo "ágil" não está associado apenas ao conceito de velocidade, mas sim ao Manifesto Ágil e seus princípios.
Um dos valores fundamentais no mundo ágil é feedback. Receber feedback cedo e agir sobre ele rapidamente. A forma de receber feedback e atuar sobre ele é diferente dependendo se você utiliza um modelo de integração síncrona ou assíncrona. No assíncrono, o feedback tende a ser mais demorado e pode passar despercebido. Por exemplo, se ele vier por email, pode ser que o desenvolvedor não esteja consultando os emails com freqüência. Isso é comum de acontecer em XP, por exemplo, devido à programação em par e outros fatores.
Desenvolvimento ágil também está relacionado a entregar software funcionando. Então, cada novo código introduzido no projeto tem que estar funcionando para gerar valor de verdade. Por essa razão, o código que vem do repositório tem que estar em ordem permanentemente. O uso de uma ferramenta como o CruiseControl, pelas razões descritas acima, permite a existência de código quebrado no repositório. Ele não leva a isso, mas permite.
Nos projetos que eu conheci, que utilizavam CruiseControl, era comum o repositório estar quebrado. A razão era sempre alguma coisa "boba" que ia ficando lá porque ninguém queria parar para consertar. Nós aqui chamamos isso de "barriga aberta". Pense em um cirurgião. Quando ele vai operar uma pessoa, ele abre a barriga, faz o que precisa ser feito e fecha, antes de partir para outra cirurgia. Ele não abre a barriga de um, começa a operar e, em seguida, abre a barriga de outro antes de terminar a primeira cirurgia (como ilustrado abaixo). Ele sabe que isso seria perigoso e improdutivo. Nós não. Nós somos de computação, então a gente adora fazer aquilo que parece rápido, mas costuma gerar dores de cabeça mais adiante. :-)
Ilustração de Leandro Mello.
Na minha opinião, fazer um commit e partir para outra atividade, antes de receber feedback sobre o que foi colocado no repositório é o mesmo que "deixar uma barriga aberta". Para nós, desenvolvedores, que estamos sempre ansiosos para passar para a próxima atividade, é tentador demais seguir com o próximo cartão, mesmo enquanto ainda há pendências no atual. E o modelo de integração assíncrona permite isso. Já a integração síncrona, não. Ela obriga o desenvolvedor a parar momentaneamente, ter certeza de que tudo correu bem e só então prosseguir para a próxima atividade. Isso está alinhado a um princípio do XP chamado passos de bebê. Acredito que o importante não seja a velocidade com que partimos para a próxima atividade, mas sim quão rápido conseguimos entregar código que temos certeza de estar funcionando.
Outra questão, também ligada ao feedback é o próprio tempo de execução dos testes. A integração síncrona, para funcionar, exige testes que executem rapidamente. Mais de cinco minutos para integrar já é um problema. Kent Beck costuma dizer: se essa atividade é difícil, execute-a freqüentemente. Fazer builds que executem rapidamente é desafiador. É algo que exige atenção permanente. A integração síncrona nos obriga a ter essa atenção e nos leva a melhorar os testes quando o tempo cresce. Na assíncrona, é fácil demais deixar os testes demorarem cada vez mais e não fazer nada a respeito.
No meu entender, essa é uma questão sistêmica, ou seja, no curto prazo, trabalhar com o CruiseControl pode parecer uma boa idéia, pela aparente velocidade que ele traz ao processo de integração. No médio e longo prazo, entretanto, o comportamento da equipe, influenciado pelas facilidades oferecidas pelo CruiseControl, atrapalham o projeto. Digo isso com base no que pude observar em projetos que usavam o CruiseControl. Entretanto, cada projeto é uma realidade. Se no seu caso o CruiseControl funciona e não causa os problemas sistêmicos que mencionei, use-o. No meu caso, ainda prefiro a integração síncrona.



O que você achou? Coloque seus comentários e sugestões abaixo!
Acompanhe o RSS dessa página.
Comentários (5 até o momento)
AkitaOnRails disse aproximadamente 10 horas depois:
Marcelo Baltar disse 2 dias depois:
Marcelo Baltar disse 3 dias depois:
Celestino Gomes disse 6 dias depois:
Marcelo Baltar disse 6 dias depois: