<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.caelum.com.br &#187; Agile</title>
	<atom:link href="http://blog.caelum.com.br/tag/agile/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.caelum.com.br</link>
	<description>blog dos desenvolvedores da Caelum</description>
	<lastBuildDate>Thu, 09 Feb 2012 13:04:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Agile 2011, dívida técnica e o Hard Choices</title>
		<link>http://blog.caelum.com.br/agile-2011-divida-tecnica-e-o-hard-choices/</link>
		<comments>http://blog.caelum.com.br/agile-2011-divida-tecnica-e-o-hard-choices/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 15:03:36 +0000</pubDate>
		<dc:creator>Guilherme Silveira</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Inovação]]></category>
		<category><![CDATA[débito técnico]]></category>
		<category><![CDATA[dívida técnica]]></category>
		<category><![CDATA[pm-83]]></category>
		<category><![CDATA[pm-87]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=4571</guid>
		<description><![CDATA[O evento Agile 2011 aconteceu em Salt Lake City e contou com um misto tracks da indústria e da academia. Junto com o Maurício Aniche foi possível aprender um pouco mais da visão de cada lado, além de presenciar exemplos dessa rica experiência de prática e teoria. A Caelum apresentou o resultado de uma pesquisa <a href="http://blog.caelum.com.br/agile-2011-divida-tecnica-e-o-hard-choices/#more-4571'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/09/hard-choices-agile.png" width="240" />
		</p><p>O <a href="http://agile2011.agilealliance.org/">evento Agile 2011</a> aconteceu em Salt Lake City e contou com um misto <a href="http://program2011.agilealliance.org/">tracks da indústria e da academia</a>. Junto com o <a href="http://www.caelum.com.br/instrutores/mauricio-aniche/">Maurício Aniche</a> foi possível aprender um pouco mais da visão de cada lado, além de <a href="http://program2011.agilealliance.org/event/01fed7d376110912e4b6577ded880946">presenciar</a> <a href="http://program2011.agilealliance.org/event/ecc469bda49c3308e688e7c5cf5d147e">exemplos</a> dessa rica experiência de prática e teoria.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/09/hard-choices-agile.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/09/hard-choices-agile.png" alt="" title="hard-choices-agile" width="480" height="261" class="aligncenter size-full wp-image-4574" /></a></p>
<p>A Caelum <a href="http://program2011.agilealliance.org/event/9a086497e4cd2632ba5381f77a9c71c0">apresentou o resultado de uma pesquisa interna</a> com seus instrutores de como funciona o aprendizado, qual seu papel e como ele acontece dentro da empresa. </p>
<p><a href="http://program2011.agilealliance.org/event/b3b404bd9080a6487c0b856294578d04">Um workshop acadêmico muito interessante</a> discutia e apresentava de forma didática a questão das decisões técnicas adequadas: qual é a importância da qualidade do nosso código? O grupo de arquitetura da Carnegie Mellon criou um simples jogo de tabuleiro, o <a href="http://www.sei.cmu.edu/architecture/tools/hardchoices/">Hard Choices</a>. É uma forma fácil de você apresentar ao seu chefe o custo/benefício de utilizar gambiarras, evitar testes e o cowboy coding. </p>
<p>Três ou quatro jogadores começam na posição Start de um tabuleiro. A cada rodada, um jogador rola um único dado e pode anda o número de casas de acordo. Ao tirar um 5, por exemplo, ele pode andar cinco casas para frente, ou quatro casas para frente e uma para trás, ou cinco casas para trás: isto é, ele pode misturar passos para frente e para trás. Ao terminar sua rodada, o jogador que parar em uma casa com ferramenta, ganha uma carta (que vale 1 ponto).</p>
<p>Por outro lado, o primeiro jogador que chegar ao final ganha 7 pontos, o segundo 3 pontos e o terceiro 1 ponto. Como pode ser interessante acabar em primeiro, existem alguns atalhos (pontes). Ao passar pela ponte, o jogador corta caminho (para frente ou para trás) e recebe uma carta de ponte. Enquanto o jogador possui essa carta, ele anda somente o número resultante do dado menos o número de cartas de ponte que possui. Por exemplo, se ele possui uma carta de ponte e tira 3 no dado, ele anda somente 2 casas.</p>
<p>Quando um jogador terminar o tabuleiro, todos os outros só podem andar para frente (usando, ou não, pontes). Para remover o peso da decisão de cortar caminho, em qualquer rodada o jogador pode ficar parado, trocando sua movimentação por jogar uma carta de ponte fora, voltando então a andar mais rápido (uma analogia a gastar tempo para refatoração e melhoria do código).</p>
<p>O jogo é bem simples e cada jogador usa táticas diferentes para acumular o máximo de pontos. Ele reflete já na primeira rodada a grande dúvida de todo processo de desenvolvimento: <strong>corto o caminho e chego antes, trocando isso por andar mais devagar daqui pra frente?</strong> Isto é, como desenvolvedor, faço algo negativo e assumo o prejuízo até o momento que julgar adequado? E quando será esse momento?</p>
<p>Matematicamente, o jogo é um modelo simplificado do que enfrentamos no dia a dia: cortar caminho afeta somente o jogador, enquanto no mundo real afeta todos os desenvolvedores. Também é possível quantificar o prejuízo no jogo, mas na vida real é difícil saber o quanto vamos perder em cada ação. Ao mesmo tempo, assumir o caminho do perfeccionismo pode levar muito tempo e não maximizar o resultado: a entrega de uma funcionalidade.  Aqui sentimos o peso da dívida técnica. Em geralessa dívida consiste no tradeoff de entregar uma parte de uma implementação com menos qualidade do que a adequada, para depois melhorá-la. Os perigos estão, claro, quando não se paga a dívida e deixa a mesma acumular os juros, a ponto de se tornar muito caro qualquer mudança futura.</p>
<p>No <a href="http://qconsp.com">QConSP</a> três palestras abordaram a dívida técnica (ou débito, uma outra possível tradução) de projetos: &#8220;<a href="http://www.slideshare.net/dtsato/refatorao-em-larga-escala">Refatoração em larga escala</a>&#8220;, &#8220;<a href="http://www.slideshare.net/caelumdev/design-de-cdigo-qualidade-que-faz-a-diferena-qcon-2011">Design de código: a qualidade que faz a diferença</a>&#8221; e a &#8220;<a href="http://www.slideshare.net/alexandrefreire/dvida-tecnica-precisando-de-crdito-quo-fundo-entrar-e-como-evitar-que-o-cobrador-bata-na-sua-porta">Dívida técnica: precisando de crédito?</a>&#8221; (alguns autores traduzem como dívida técnica).</p>
<p>E você, qual tática você usaria no jogo? E no dia a dia como desenvolvedor? Quando abre mão da qualidade conscientemente e quando luta para recuperá-la?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/agile-2011-divida-tecnica-e-o-hard-choices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Há bom aprendizado em cursos online?</title>
		<link>http://blog.caelum.com.br/ha-bom-aprendizado-em-cursos-online/</link>
		<comments>http://blog.caelum.com.br/ha-bom-aprendizado-em-cursos-online/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 18:19:59 +0000</pubDate>
		<dc:creator>Guilherme Silveira</dc:creator>
				<category><![CDATA[Caelum]]></category>
		<category><![CDATA[Inovação]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[aula virtual]]></category>
		<category><![CDATA[caelum online]]></category>
		<category><![CDATA[cursos]]></category>
		<category><![CDATA[distancia]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[treinamento]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=4555</guid>
		<description><![CDATA[Ainda há uma certa desconfiança quando se fala em ensino a distância. O que poderia torná-lo uma alternativa viável ao presencial? Há 7 anos tenho o privilégio de trabalhar com a equipe da Caelum, buscando potencializar o aprendizado em uma sala de aula, trazendo a experiência do desenvolvimento. Questões de didática, colaboração com alunos, entre <a href="http://blog.caelum.com.br/ha-bom-aprendizado-em-cursos-online/#more-4555'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/09/alunos-e-instrutores.png" width="240" />
		</p><p>Ainda há uma certa desconfiança quando se fala em ensino a distância. O que poderia torná-lo uma alternativa viável ao presencial?</p>
<p>Há 7 anos tenho o privilégio de trabalhar com <a href="http://www.caelum.com.br/instrutores" title="equipe da caelum">a equipe da Caelum</a>, buscando potencializar o aprendizado em uma sala de aula, trazendo a experiência do desenvolvimento. Questões de didática, colaboração com alunos, entre alunos, muitos exercícios e avaliação do código produzido são alguns pontos que consideramos cruciais para um curso.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/09/alunos-e-instrutores.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/09/alunos-e-instrutores-300x125.png" alt="" title="alunos e instrutores" width="300" height="125" class="aligncenter size-medium wp-image-4568" /> </a></p>
<p>Nos últimos meses, criamos <a href="http://online.caelum.com.br">nossa própria plataforma online</a>, uma tentativa de levar para a internet tudo o que aprendemos nesses anos de ensino.<br />
Experimentamos com vários amigos, alunos, desenvolvedores e instrutores. Focamos o aprendizado não só nos videos, textos e exercícios, mas sim na colaboração de todos os participantes. É importante que o aluno não esteja sozinho durante seus exercícios, dúvidas e comentários; para isso, ele contará com a ajuda não só do instrutor, mas de todos os seus colegas, afinal aprendemos muito quando trabalhamos em equipe.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/09/feedback.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/09/feedback-300x112.png" alt="" title="feedback" width="300" height="112" class="alignright size-medium wp-image-4562" /></a></p>
<p>O contato social &#8211; fundamental no aprendizado &#8211; é feito a todo instante, como ao assistir uma explicação, ao ouvir uma segunda explicação caso não tenha entendido, ao repetir uma das anteriores, etc. Seus colegas de sala, assim como diversos instrutores da Caelum, podem ser alcançados para requisitar feedback sobre o código criado, assim como em uma sessão de pareamento ou revisão de código (code review). Tudo de maneira assíncrona, sem necessidade de estar online em determinados horários.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/09/lousa.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/09/lousa-300x270.png" alt="" title="lousa" width="150" height="135" class="alignleft size-medium wp-image-4563" /></a></p>
<p>Inicialmente, estamos oferecendo 3 novos cursos. Durante as próximas semanas, lançaremos os que já estão sendo produzidos, e vocês podem aguardar mais. Há <b>30% de desconto</b> durante essa fase beta, além de um trial para o início de cada curso. Aguardamos feedback, dicas, críticas, sugestões e ideias para os próximos cursos. Veja como o sistema funciona:</p>
<p><center><iframe src="http://player.vimeo.com/video/29268447?title=0&amp;byline=0&amp;portrait=0" width="400" height="225" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe></center></p>
<p>Com novas tecnologias e práticas surgindo a todo instante, <a href="http://online.caelum.com.br">espero encontrá-lo na nossa sala de aula</a>, para juntos aprendermos, discutirmos e criarmos software de qualidade no Brasil.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/ha-bom-aprendizado-em-cursos-online/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>TDD e sua influência no acoplamento e coesão</title>
		<link>http://blog.caelum.com.br/tdd-e-sua-influencia-no-acoplamento-e-coesao/</link>
		<comments>http://blog.caelum.com.br/tdd-e-sua-influencia-no-acoplamento-e-coesao/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 15:14:13 +0000</pubDate>
		<dc:creator>Guilherme Silveira</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Inovação]]></category>
		<category><![CDATA[acoplamento]]></category>
		<category><![CDATA[agilidade]]></category>
		<category><![CDATA[coesão]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[design evolutivo]]></category>
		<category><![CDATA[feedback]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[testes de unidade]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=4116</guid>
		<description><![CDATA[Escrever testes de unidade é uma prática cada vez mais adotada. Ela ajuda a verificar se tudo funciona como o esperado mesmo após mudanças, trazendo mais segurança para a equipe ao alterar o código. Mas os testes de unidade vão além, possibilitando a validação de um design. Um código fácil de testar tende a apresentar um bom design. <a href="http://blog.caelum.com.br/tdd-e-sua-influencia-no-acoplamento-e-coesao/#more-4116'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/02/tdd.jpg" width="240" />
		</p><p>Escrever testes de unidade é uma prática cada vez mais adotada. Ela  ajuda a verificar se tudo funciona como o esperado mesmo após mudanças, trazendo mais segurança para a equipe ao alterar o código. Mas os testes de unidade vão além, <strong>possibilitando a validação de um design</strong>.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/02/tdd.jpg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/02/tdd-300x186.jpg" alt="" title="tdd" width="300" height="186" class="aligncenter size-medium wp-image-4120" /></a></p>
<p>Um código fácil de testar tende a apresentar um bom design. <em><a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2007/09/the-deep-synerg.html">Existe uma grande sinergia entre testabilidade e um bom design</a></em>. Isso acontece pois, para que o programador consiga testar uma classe de maneira isolada e facilmente, essa classe deve lidar muito bem com suas dependências (buscando sempre um baixo acoplamento) e possuir pouca responsabilidade (ou seja, ser altamente coesa). Caso contrário, o programador gastará muito tempo tentando testá-la, um possível indicador de que a classe apresenta um design pobre.</p>
<p>Um design que apresenta classes com alto acoplamento são difíceis de testar, surgindo a necessidade de passar as dependências para nossos objetos e só então testá-los.</p>
<p>O primeiro resultado ao adicionar testes de unidade a um sistema é a mudança de padrões imperativos de execução onde instanciamos objetos e invocamos métodos para a injeção de dependências.</p>
<p>O exemplo a seguir mostra um processador sendo instanciado, o que torna difícil verificar se o comportamento do <code>ExecutorDeBatch </code> foi correto sem executar o código da classe <code>Processador</code>:</p>
<pre class="brush: java; title: ; notranslate">
public class ExecutorDeBatch {
  public void le(ListaDeItens itens) {
    Processador processador = new Processador();
    while(itens.temProximo()) {
       String item = sc.proximo();
       processador.interpreta(item);
    }
  }
}
</pre>
<p>O teste acima verifica o comportamento do <code>ExecutorDeBatch</code> junto com o <code>Processador</code>. Esse tipo de teste é considerado de integração, não passando muita informação sobre o acoplamento entre as classes, mas somente garantindo o comportamento em conjunto. </p>
<p>Para isolar a classe acima seria necessário a utilização de um <a href="http://blog.caelum.com.br/testes-unitarios-com-jmock-2/">mock</a> no lugar do <code>Processador</code>. Da maneira que o código está, seria bastante trabalhoso. No Java exigiria até manipulação de bytecode durante o classload para que fosse possível alterar a classe instanciada no momento do <code>new Processador()</code> por exemplo. Para isso, o programador deve deixar essas dependências bem explícitas, recebendo-as através do construtor, por exemplo. Teríamos então o seguinte código:</p>
<pre class="brush: java; title: ; notranslate">
public class ExecutorDeBatch {
  private Processador processador;
  public ExecutorDeBatch(Processador processador) {
    this.processador = processador;
  }

  public void le(ListaDeItens itens) {
    while(itens.temProximo()) {
       String item = sc.proximo();
       processador.interpreta(item);
    }
  }
}
</pre>
<p>Passar um mock para a classe acima e consequentemente testá-la de maneira isolada ficou é fácil. A adoção dos testes de unidade deixa explícito o excesso de  dependências (ou dependências implícitas escondidas). </p>
<p>Por fim, os testes precisam ser simples e curtos, limitando seu escopo; um teste muito grande ou complicado <a href="http://www.amazon.com/Growing-Object-Oriented-Software-Guided-Tests/dp/0321503627">pode indicar que o método em questão possui muita responsabilidade</a>.</p>
<p>Considere uma classe que é responsável por gerar uma nota fiscal a partir de uma fatura e disparar a mesma para o e-mail do cliente, assim como para um sistema SAP qualquer. Essa classe já possui as dependências bem explícitas:</p>
<pre class="brush: java; title: ; notranslate">
public class GeradorDeNotaFiscal {
       private final Sap sap;
       private final EnviadorDeEmails enviador;

       public GeradorDeNotaFiscal(Sap sap, EnviadorDeEmails enviador) {
               this.sap = sap;
               this.enviador = enviador;
       }

       private NotaFiscal geraNotaFiscalAPartirDa(Fatura fatura) {
           // codigo de geracao da nota fiscal
       }

       public void gera(Fatura fatura) {
               NotaFiscal nf = geraNotaFiscalAPartirDa(fatura);

               sap.armazena(nf);
               enviador.envia(nf);
       }
}
</pre>
<p>Passar mocks para essa classe é fácil, já que é possível injetar todas as dependências nela. O problema é que, para criar testes para ela, o programador se preocuparia em testar se a nota fiscal foi gerada, se ela é enviada ao SAP e se ela é enviada para o cliente:</p>
<pre class="brush: java; title: ; notranslate">
@Test public void deveGerarANf() { ... }
@Test public void deveArmazenarNfNoSap() { ... }
@Test public void deveEnviarNfParaOEmailDoCliente() { ... }
</pre>
<p>Perceba que essa classe tem responsabilidades demais: ela gera NF, envia para o SAP, envia para o cliente. Ao escrever esses testes, o programador perceberia que, em cada teste, ele estaria preocupado em testar uma responsabilidade da classe, sem se importar com a outra. No teste <code>deveArmazenarNfNoSap</code>, por exemplo, o programador seria obrigado a passar um stub da classe <code>Email</code>, mesmo não sendo o foco daquele teste. Isso torna a escrita do teste mais massante é um sinal de que a classe tem baixa coesão.</p>
<p>Portanto, se o seu design possue um alto acoplamento ou uma baixa coesão, será praticamente impossível escrever testes de unidade. Por esse mesmo motivo métodos estáticos, singletons, factories e estado global dificultam os testes de unidade.</p>
<p>Pensar e criar os testes antes do código também auxiliam no design. Usar <a href="http://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530">Test-Driven Development</a> força que a concentração do pensamento lógico foque nas responsabilidades de cada método, ao invés da exata implementação do mesmo.</p>
<p>Esse impacto no design é tão grande que muitos <a href="http://www.agiledata.org/essays/tdd.html">vão utilizar a sigla TDD para Test-Driven Design</a>. Com TDD o programador é forçado a pensar em decisões de design antes do código de implementação, criando um maior desacoplamento, <a href="http://athenea.ort.edu.uy/publicaciones/ingsoft/recursos/articulos/AimFire.pdf">deixando mais claro suas necessidades</a>.</p>
<p>O TDD, através dos testes de unidade e refatoração, possibilitam que o <a href="http://martinfowler.com/articles/designDead.html">design apareça de uma maneira mais evolutiva</a>, mas sem mágicas, sempre dependendo de conhecimento do desenvolvedor em relação a design e orientação a objetos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/tdd-e-sua-influencia-no-acoplamento-e-coesao/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Branches e integração contínua: o problema de feature branches</title>
		<link>http://blog.caelum.com.br/branches-e-integracao-continua-o-problema-de-feature-branches/</link>
		<comments>http://blog.caelum.com.br/branches-e-integracao-continua-o-problema-de-feature-branches/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 23:05:39 +0000</pubDate>
		<dc:creator>Guilherme Silveira</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Branch]]></category>
		<category><![CDATA[feature toggle]]></category>
		<category><![CDATA[integração contínua]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=3521</guid>
		<description><![CDATA[Integrar o código criado pelos desenvolvedores o mais frequentemente possível, com espaços de tempo mínimos, para que o feedback e consequências do código criado por um desenvolvedor entre em contato o mais rapidamente possível com os outros é o processo chamado de integração contínua. Mas em diversos momentos existe a tentação de criar branches, linhas <a href="http://blog.caelum.com.br/branches-e-integracao-continua-o-problema-de-feature-branches/#more-3521'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Integrar o código criado pelos desenvolvedores o mais frequentemente possível, com espaços de tempo mínimos, para que o feedback e consequências do código criado por um desenvolvedor entre em contato o mais rapidamente possível com os outros é o processo chamado de integração contínua.</p>
<p>Mas em diversos momentos existe a tentação de criar branches, linhas separadas de desenvolvimento, para cada funcionalidade: um feature branch, em cada um deles um conjunto de desenvolvedores trabalha de maneira isolada. <a href="http://martinfowler.com/bliki/FeatureBranch.html">O problema de desenvolver muito tempo sem integrar é que no momento que um feature branch terminar integrando-se ao mainline, os outros branches terão um processo de merge grande e custoso a ser feito</a>.</p>
<p>Variações do &#8220;feature branch&#8221; são branches por cliente, onde cada um possui um conjunto distinto de funções que está disponível. Gerenciar esse trabalho é difícil e propenso a erro como por exemplo quando bugs que são corrigidos em determinados branches não são passados para outros. Para mantermos os benefícios da integração contínua, tentamos minimizar o impacto dos feature branches e encontrar uma maneira de remover o efeito negativo dos mesmos, mantendo os benefícios.</p>
<p>Se o branch vive menos de um dia, por exemplo, a prática de feature branches não vira uma discussão: o merge e seu respectivo impacto é pequeno, não é necessário se preocupar com o impacto dessa decisão na integração contínua pois o tempo no qual a integração não é contínua é relativamente baixo.</p>
<p>Por outro lado, existem dois possíveis motivos para um branch viver mais de um dia. O primeiro deles é o de criar uma história muito grande, que para ser implementada é necessário muitas horas de trabalho. A solução aqui é simples: quebrar as histórias em pedaços menores permitirá que os desenvolvedores terminem mais cedo algo entregável que possivelmente resultará em feedback para os próximos trechos a serem criados.</p>
<p>O segundo motivo, mais complicado, é para manter um branch master (ou trunk) limpo que pode ser deployado para produção a qualquer instante. O motivo é justo e nobre uma vez que boas práticas como integração contínua andam de mãos dadas com entrega contínua e feedback frequente mas ao invés de criarmos um bloqueio para algo melhor (a integração contínua), é mais interessante ganhar o benefício de ambos.</p>
<p>Durante o tempo de compilação, build do artefato de deploy ou ainda execução podemos utilizar técnicas para não registrar componentes de funcionalidades ainda não prontos. O exemplo a seguir mostra como utilizar um container simples de injeção de dependências para controlar diversos ambientes com features distintas. Todos os métodos que retornam objetos do tipo Ambiente são utilizados por convenção:</p>
<pre class="brush: java; title: ; notranslate">
public class Ambientes {
  public Ambiente desenvolvimento() {
    return homologacao().com(OpenIdLogin.class);
  }

  public Ambiente homologacao() {
    return producao().com(ExcelExport.class);
  }

  public Ambiente producao() {
    return new Ambiente(new Container()).com(ClienteController.class).e(ProjetoController.class).e(LoginController.class);
  }
}
</pre>
<p>Da mesma maneira, em aplicações web, arquivos jsp templates de qualquer template engine podem ser customizados para mostrar determinadas partes de acordo com o ambiente atual:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;feature name=&quot;OpenId&quot;&gt;
  ... codigo html ...
&lt;/feature&gt;
</pre>
<p>E em qualquer ponto do sistema é possível verificar a disponibilidade de uma feature:</p>
<pre class="brush: java; title: ; notranslate">
public class LoginController {
  private final FeatureSet features;
  public LoginController(FeatureSet features) {
    this.features = features;
  }

  public Usuario login(Map parametros) {
    LoginFeature login = features.for(Login.class);
    return login.valida(...);
  }
}
</pre>
<p><a href="http://blog.jayfields.com/2010/10/experience-report-feature-toggle-over.html">Toggles limpos e bem elaborados como esses</a> permitem total customização do seu sistema sem ser um peso tão grande no desenvolvimento. Outras opções de implementações menos rebuscadas mas tão eficientes quanto envolvem a simples leitura de arquivos de propriedades. <a href="https://github.com/caelum/envie">Ferramentas como o envie</a> adicionam suporte a feature toggles em qualquer ponto de uma aplicação. O mesmo container acima funciona em Ruby da seguinte maneira:</p>
<pre class="brush: ruby; title: ; notranslate">
production = Envie.production.with(:oauth)
development = production.derive.with(:openid)

feature(:oauth) do
   # codigo que utiliza oauth
end

feature(:openid) do
  # codigo que utiliza openid
end
</pre>
<p>Utilizando tais ferramentas de toggle, que são baseadas na criação de enviroments, é possível automatizar o processo de oficialização de uma feature. Dada que a feature &#8220;openid&#8221; foi aceita, um script é capaz de adiciona-la no ambiente de produção, ou uma variação que removeria as definições de chamada ao métod feature, resultando em um código mais limpo a partir do próximo commit.</p>
<p>Feature branches e toggles são uma alternativa extremamente popular no desenvolvimento open source e muito bem feita em alguns projetos como o kernel do linux que pode ser construído utilizando inúmeras combinações. Testes de integração não são mais capazes de garantir o comportamento através de todas as possíveis combinações mas continuam adicionando valor.</p>
<p><a href="http://iansrobinson.com/">Durante o www 2010, Ian Robinson</a> descreveu como o Neo4j pode ser utilizado como alternativa para propragação da configuração de nós diferentes em clusters de máquinas de determinadas aplicações de larga escala na web. A abordagem de feature toggles como esses é interessante e positiva para projetos grandes que envolvem a constante necessidade de integrar funcionalidades ainda não aprovadas por completo e serve como segunda opção durante a utilização de feature branches. Também serve como solução simples para feature toggle por grupos de clientes.</p>
<p>A primeira regra no instante de criar um feature branch é: evite criá-lo. A segunda regra é, integre-o ao mainline o mais rápido possível.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/branches-e-integracao-continua-o-problema-de-feature-branches/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mudanças simples x Soluções simples</title>
		<link>http://blog.caelum.com.br/mudancas-simples-x-solucoes-simples/</link>
		<comments>http://blog.caelum.com.br/mudancas-simples-x-solucoes-simples/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 20:29:11 +0000</pubDate>
		<dc:creator>Mauricio Aniche</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[agilidade]]></category>
		<category><![CDATA[Qualidade]]></category>
		<category><![CDATA[refatoração]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=3445</guid>
		<description><![CDATA[O processo de entrega de uma funcionalidade nova envolve implementar ou corrigir algo que o nosso sistema atualmente não comporta. Dados os problemas que o programa resolve nesse instante, existem diversas maneiras distintas de resolvê-los, todas válidas, algumas mais limpas e mais simples do que outras. O gráfico a seguir mostra uma situação onde nosso <a href="http://blog.caelum.com.br/mudancas-simples-x-solucoes-simples/#more-3445'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/Diagramalindo-3.png" width="240" />
		</p><p>O processo de entrega de uma funcionalidade nova envolve implementar ou corrigir algo que o nosso sistema atualmente não comporta. Dados os problemas que o programa resolve nesse instante, existem diversas maneiras distintas de resolvê-los, todas válidas, algumas mais limpas e mais simples do que outras.</p>
<p>O gráfico a seguir mostra uma situação onde nosso programa não resolve o problema atual que desejamos atacar, onde:</p>
<p>a) <span style="color: #ff0000"><strong>vermelho</strong></span>: representa variações do sistema que não resolveriam meu problema;<br />
b) <span style="color: #ffcc00"><strong><span style="color: #95971f">amarelo</span></strong></span>: minha situação atual;<br />
c) <span style="color: #008000"><strong>verde</strong></span>: soluções possíveis.</p>
<div id="attachment_3453" class="wp-caption aligncenter" style="width: 310px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/1.png"><img class="size-medium wp-image-3453" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/1-300x251.png" alt="Soluções possiveis para um problema" width="300" height="251" /></a><p class="wp-caption-text">Soluções possiveis para um problema</p></div>
<p>Mas dentro das soluções possíveis, existem aquelas <strong>mudanças que são simples</strong> de serem executadas, por exemplo incluir um &#8220;if&#8221; ou simplesmente fazer um copy e paste de código, um pequeno passo, uma mudança simples, um <em>baby step</em>. <strong>Mudanças simples que resolvem o problema</strong>, representadas em verde escuro aqui:</p>
<div id="attachment_3454" class="wp-caption aligncenter" style="width: 289px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/2.png"><img class="size-full wp-image-3454" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/2.png" alt="Mudanças simples" width="279" height="235" /></a><p class="wp-caption-text">Mudanças simples</p></div>
<p>Por fim, existem as soluções mais simples para o problema. A solução mais simples pode ser extrair uma classe ou utilizar uma biblioteca que executa a lógica para nós, por exemplo. No diagrama a seguir as soluções mais simples são representadas em azul:</p>
<div id="attachment_3455" class="wp-caption aligncenter" style="width: 310px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/3.png"><img class="size-medium wp-image-3455" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/3-300x252.png" alt="Soluções simples" width="300" height="252" /></a><p class="wp-caption-text">Soluções simples</p></div>
<p>A execução desses passos, <em>baby steps</em>, traz o código para dentro das mudanças simples que resolvem o problema. Mas a sequência dos mesmos pode nos levar para diversos lugares diferentes: alguns mais próximos das soluções mais simples, <a href="http://www.aniche.com.br/2010/11/voce-quer-testar-metodos-privados-certeza/">outros cada vez mais distantes das mesmas, nos deixando com um débito técnico cada vez maior</a>.</p>
<p>Pior ainda, a adoção cega de <em>baby steps</em> ou de mudanças simples sem nenhuma prática para garantir a qualidade pode levar a uma situação onde seja impossível chegar em uma solução simples: seu sistema vira uma <a href="http://en.wikipedia.org/wiki/Big_ball_of_mud" target="_blank">grande bola de lama</a>.</p>
<p>Essa situação é o inferno de qualquer sistema: passos simples não são mais capazes de <a href="http://en.wikipedia.org/wiki/KISS_principle" target="_blank">manter as coisas simples</a>.</p>
<div id="attachment_3458" class="wp-caption aligncenter" style="width: 270px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/Diagramalindo.png"><img class="size-large wp-image-3458" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/Diagramalindo-389x1024.png" alt="Uso puro de baby steps" width="260" height="682" /></a><p class="wp-caption-text">Uso puro de baby steps não implica em melhoria de qualidade. Passos muito simples podem levar seu sistema a situações negativas.</p></div>
<p>Em algumas situações, o <em>baby step</em> pode implicar em uma das melhores soluções, mas para isso é necessário o domínio da tecnologia, do negócio, design e linguagem, algo que nem sempre é a realidade do desenvolvedor quando escreve uma funcionalidade:</p>
<div id="attachment_3463" class="wp-caption aligncenter" style="width: 522px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/Diagramalindo-3.png"><img class="size-full wp-image-3463" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/Diagramalindo-3.png" alt="Baby step e design" width="512" height="215" /></a><p class="wp-caption-text">Baby step de um desenvolvedor com domínio forte da tecnologia, linguagem, domínio de negócio e sistema.</p></div>
<p>Como é difícil executar um passo-a-passo muito suave e chegar em uma solução simples qualquer, adicionamos mais uma técnica ao processo: além de executar as tarefas em pedaços pequenos (mas não mínimos), refatoramos nosso código, para simplificá-lo.</p>
<p>Cada passo de simplificação através da refatoração coloca nosso código mais próximo do sistema ideal: o mais simples de todos que resolve nossos problemas.</p>
<div id="attachment_3462" class="wp-caption aligncenter" style="width: 522px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/Diagramalindo-2.png"><img class="size-large wp-image-3462" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/Diagramalindo-2-1024x853.png" alt="Refatorando" width="512" height="426" /></a><p class="wp-caption-text">A refatoração que a cada passo simplifica o código nos leva cada vez mais próximos a melhor solução para nossos problemas.</p></div>
<p><a href="http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672">Com a refatoração contínua</a>, cada passo que damos ao implementar uma nova feature nos mantém ainda próximos das soluções simples.</p>
<p>Mais importante do que fazer passos minúsculos (<em>baby steps</em>) é fazer passos que fazem sentido para levá-lo em direção a melhor solução (e não somente a mudança mais simples). Para isso não podemos nos esquecer de refatorar. E não só refatorações de baixo nível (como renomear variáveis, mover métodos, etc), mas sim refatorações de alto nível (como abstrair comportamentos).</p>
<p>Imagine o seguinte trecho de código, responsável por calcular o salário de um funcionário. Dependendo do cargo do funcionário, o algoritmo para o cálculo é diferente.</p>
<pre class="brush: java; title: ; notranslate">
public class CalculoDeSalario {

  public CalculoDeSalario(RegrasFiscais regrasFiscais, ...) {
    // ...
  }

  public double calcula(Funcionario f) {
    if(f.getCargo() == Cargo.VENDEDOR) {
      // calcula salario do vendedor usando regras fiscais, etc
    }

    if(f.getCargo() == Cargo.GERENTE) {
      // calcula salario do gerente usando regras fiscais, etc
    }
  }
}
</pre>
<p>Agora suponha que um novo cargo apareceu na empresa e precisamos calcular o salário das pessoas que farão o trabalho desse novo cargo. O código mais simples que faria isso acontecer, seria:</p>
<pre class="brush: java; title: ; notranslate">
public class CalculoDeSalario {

  public CalculoDeSalario(RegrasFiscais regrasFiscais, ...) {
    // ...
  }

  public double calcula(Funcionario f) {
    if(f.getCargo() == Cargo.VENDEDOR) {
      // calcula salario do vendedor usando regras fiscais, etc
    }

    if(f.getCargo() == Cargo.GERENTE) {
      // calcula salario do gerente usando regras fiscais, etc
    }

    if(f.getCargo() == Cargo.MARKETING) {
      // calcula salario do marketing usando regras fiscais, etc
    }
  }
}
</pre>
<p>Mas essa não é a melhor solução que resolveria o problema. A cada novo <em>if</em> inserido nesse código, mais longe estamos da melhor solução. O design fica cada vez mais rígido. E pior: refatorar esse trecho de código fica cada vez mais difícil: até mesmo o segundo if que foi adicionado ao código já havia o afastado da melhor solução!</p>
<p>Ao implementar uma nova funcionalidade, o programador <a href="http://www.agiledata.org/essays/tdd.html" target="_blank">deve observar o design atual da sua aplicação</a>. Se o design atual já provê uma maneira fácil de implementar a funcionalidade, então vá em frente. Caso contrário, o programador deve <strong>refatorar o design para permitir que você possa adicionar essa funcionalidade da maneira mais simples possível</strong>.</p>
<p>No exemplo acima, uma solução seria criar uma estratégia (do padrão de projeto Strategy) para calcular o salário de acordo com o cargo. Cada cargo seria responsável por devolver o seu algoritmo de cálculo. Por exemplo:</p>
<pre class="brush: java; title: ; notranslate">
public class CalculoDeSalario {

  public CalculoDeSalario(RegrasFiscais regrasFiscais, ...) {
    // ...
  }

  public double calcula(Funcionario f) {
    AlgoritmoDeCalculoDeSalario calculadora = f.getCargo().getAlgoritmoDeCalculo(regrasFiscais);
    return calculadora.calcula();
  }
}
</pre>
<p>Se essa é a melhor solução, é difícil dizer. Mas com certeza ela é uma solução melhor do que as anteriores. Mas, veja que após essa refatoração, implementar o cálculo de salário para o novo cargo é muito mais fácil. Agora posso voltar aos meus <em>baby steps</em>, já que a implementação corrente está em um lugar seguro.</p>
<p>Toda essa experiência se resume a uma frase que surgiu em uma conversa entre Guilherme Silveira e Maurício Aniche:</p>
<blockquote><p>A mudança mais simples para resolver um problema não é necessariamente a solução mais simples para resolvê-lo.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/mudancas-simples-x-solucoes-simples/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Prática: Evite influenciar estimativas: estime até mesmo as histórias mais simples</title>
		<link>http://blog.caelum.com.br/pratica-evite-influenciar-estimativas-estime-ate-mesmo-as-historias-mais-simples/</link>
		<comments>http://blog.caelum.com.br/pratica-evite-influenciar-estimativas-estime-ate-mesmo-as-historias-mais-simples/#comments</comments>
		<pubDate>Fri, 05 Nov 2010 12:33:38 +0000</pubDate>
		<dc:creator>Mauricio Aniche</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[agilidade]]></category>
		<category><![CDATA[desenvolvedor]]></category>
		<category><![CDATA[estimativa]]></category>
		<category><![CDATA[planning poker]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=3402</guid>
		<description><![CDATA[Sintoma: Durante a estimativa de estórias do backlog, ao aparecer uma estória razoavelmente clara ou simples, um desenvolvedor (geralmente mais experiente) toma a palavra antes de estimar: &#8220;Essa história tem 3 pontos. Pode ser? Todo mundo concorda, não é?&#8221; Problema: Ao fazer isso, o desenvolvedor acaba enviesando a estimativa dessa estória. Frases como essa durante <a href="http://blog.caelum.com.br/pratica-evite-influenciar-estimativas-estime-ate-mesmo-as-historias-mais-simples/#more-3402'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p><strong>Sintoma:</strong> <a href="http://www.amazon.com/Agile-Estimating-Planning-Mike-Cohn/dp/0131479415">Durante a estimativa de estórias do backlog</a>, ao aparecer uma estória razoavelmente clara ou simples, um<br />
desenvolvedor (geralmente mais experiente) toma a palavra antes de estimar: <em>&#8220;Essa história tem 3 pontos. Pode ser? Todo mundo concorda, não é?&#8221;</em></p>
<p><strong>Problema: </strong>Ao fazer isso, o desenvolvedor acaba enviesando a estimativa dessa estória. Frases como essa durante a estimativa inibem os outros desenvolvedores e fazem com que eles escondam a sua opinião (<em>pois, se o desenvolvedor experiente tem tanta certeza que a estória tem 3 pontos, ele deve estar certo, e eu devo estar errado; o <strong>problema</strong> que eu havia imaginado não deve existir&#8230;</em>).</p>
<p><strong>Solução: </strong><a href="http://www.planningpoker.com/references.html#ref2">A estimativa acontece em grupo</a> justamente para tentar diminuir o seu possível erro. Além disso, <a href="http://www.slideshare.net/jssunil/agile-software-estimation">estimar em grupo ajuda a levantar melhor os possíveis problemas que a equipe irá passar durante a implementação da estória</a>, afinal nesse momento temos uma equipe inteira pensando, e não só apenas uma pessoa.</p>
<p>Não só o desenvolvedor mas também o Product Owner (ou clientes dependendo de sua abordagem e metodologia) costuma utilizar palavras como &#8220;fácil&#8221; ou &#8220;simples&#8221; para descrever uma história. Qualquer tipo de adjetivo do gênero pode trazer um peso decisivo na hora de julgar a dificuldade da estória. <a href="http://www.caelum.com.br/curso/pm-83-agile-scrum/">Durante os treinamentos de Scrum e Lean</a>, no momento de explicar uma história, adjetivos surgem a todo instante por parte do PO.</p>
<p>Todos os participantes mostram suas estimativas juntos, justamente para que um desenvolvedor não influencie na opinião do outro, e as ideias possam surgir mais livremente e serem discutidas. Mesmo o desenvolvedor iniciante pode ver problemas ou soluções que um desenvolvedor mais experiente não enxergou. Mas, por saber que ele é iniciante, ele é mais facilmente influenciado pelos experientes!</p>
<p>Portanto, por mais simples e clara que a história possa parecer para você, faça o <em>planning poker</em> (ou qualquer <a href="http://www.amazon.com/Agile-Estimating-Planning-Mike-Cohn/dp/0131479415">outra técnica para estimar</a>) da maneira correta. Estime junto com o time. Deixe a estimativa <strong>emergir</strong> do time todo. Se o objetivo da estória estiver realmente claro, o time não vai levar muito tempo para chegar em um acordo sobre a estimativa.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/pratica-evite-influenciar-estimativas-estime-ate-mesmo-as-historias-mais-simples/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Prática: melhore a qualidade do código para evitar uma enchente de bugs</title>
		<link>http://blog.caelum.com.br/pratica-melhore-a-qualidade-do-codigo-para-evitar-uma-enchente-de-bugs/</link>
		<comments>http://blog.caelum.com.br/pratica-melhore-a-qualidade-do-codigo-para-evitar-uma-enchente-de-bugs/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 15:42:47 +0000</pubDate>
		<dc:creator>Guilherme Silveira</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[engenharia]]></category>
		<category><![CDATA[pm-87]]></category>
		<category><![CDATA[Qualidade]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=3273</guid>
		<description><![CDATA[Sintoma: o número de bugs novos que são abertos é maior do que o número de bugs fechados a cada iteração. O backlog é dominado por bugs e cada vez menos funções novas são adicionadas ao projeto. Ação: Por muito tempo acreditou-se que aumentando o número de desenvolvedores aumentaria a produtividade de uma equipe em <a href="http://blog.caelum.com.br/pratica-melhore-a-qualidade-do-codigo-para-evitar-uma-enchente-de-bugs/#more-3273'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/10/c.png" width="240" />
		</p><p><b>Sintoma</b>: o número de bugs novos que são abertos é maior do que o número de bugs fechados a cada iteração. O backlog é dominado por bugs e cada vez menos funções novas são adicionadas ao projeto.</p>
<p><b>Ação</b>: Por muito tempo acreditou-se que aumentando o número de desenvolvedores aumentaria a produtividade de uma equipe em um projeto, crença hoje combatida pelos métodos ágeis.</p>
<p>O primeiro fator para combater a sensação de fracasso na luta contra os bugs é criar uma medida que <b>incentive</b> a equipe a melhorar a qualidade do código.</p>
<p>Uma maneira fácil de criar essa métrica é medir o número de bugs novos abertos e de bugs fechados no último ciclo. A cada ciclo novo meça novamente esses valores. A medida pode ser tirada automaticamente através da criação de plugins para determinadas plataformas online ou de maneira bem simples durante o review de seu projeto &#8211; manualmente.</p>
<p>Para aqueles que usam o pivotal tracker, <a href="http://github.com/caelum/buggie">o projeto Buggie</a> integra com o processo de build e pode gerar os dados a cada novo build executado no servidor de integração, mantendo o gráfico sempre atualizado. A tabela a seguir mostra o gráfico de um projeto durante as seis meses, gerado com o Buggie:</p>
<div id="attachment_296" class="wp-caption alignnone" style="width: 390px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/10/aguardo.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/10/aguardo-300x235.png" alt="Aguardando algo acontecer para testar" title="aguardo" width="300" height="235" class="size-full wp-image-296" /></a><p class="wp-caption-text">Features sendo entregues e corrigidas continuamente até o momento da grande entrega de muitas novas funcionalidades: um grande impacto no número de bugs, mas em número absoluto é o mesmo que anteriormente.</p></div>
<p>Fica visualmente claro que os bugs vinham em um ritmo natural e corrigidos também da mesma maneira. Mas de repente uma avalanche de bugs aparece &#8211; e são corrigidos proporcionalmente. O feedback é instantâneo, e o time percebe que algo precisa mudar nessa parte do <a href="http://www.caelum.com.br/curso/pm-87-agile-praticas-ageis/">processo de desenvolvimento para melhorar a qualidade de seu código</a>.</p>
<p>Para melhorar a qualidade do código devemos adotar práticas como o pareamento, mais comunicação com o cliente e evitar adivinhar como as funcionalidades deveriam funcionar. A análise do gráfico de bugs junto com o histórico da equipe nos diz o que acontece e o que podemos fazer.</p>
<p><b>Desafio para o leitor</b></p>
<p>1. Cite motivos pelos quais o time acima possui um acúmulo de bugs próximo a iteração 18?</p>
<p>2. Quais motivos levam outro time a ter um gráfico diferente, como o a seguir?</p>
<div id="attachment_297" class="wp-caption alignnone" style="width: 390px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/10/continuo.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/10/continuo-300x230.png" alt="Fazendo a entrega contínua" title="continuo" width="300" height="230" class="size-full wp-image-297" /></a><p class="wp-caption-text">Executando a entrega contínua de um projeto, mesmo que sem o processo de deploy totalmente automatizado em um clique.</p></div>
<p>3. E o seu projeto controlado pelo Pivotal? <a href="http://github.com/caelum/buggie">Gere seu gráfico com o Buggie </a> e <a href="http://twitter.com/guilhermecaelum">envie via twitter</a> ou <a href="mailto:guilherme.silveira@caelum.com.br">email</a>. Se preferir basta compartilhar o acesso ao pivotal.</p>
<p>Veja também: <a href="http://agilenomundoreal.com.br/2010/03/15/pontos-de-bugs-contam-na-velocidade/">pontos de bug contam na velocidade de meu time?</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/pratica-melhore-a-qualidade-do-codigo-para-evitar-uma-enchente-de-bugs/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Noite ágil na Caelum</title>
		<link>http://blog.caelum.com.br/noite-agil-na-caelum/</link>
		<comments>http://blog.caelum.com.br/noite-agil-na-caelum/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 09:29:12 +0000</pubDate>
		<dc:creator>Guilherme Silveira</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[kanban]]></category>
		<category><![CDATA[lean]]></category>
		<category><![CDATA[qa]]></category>
		<category><![CDATA[Qualidade]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=2711</guid>
		<description><![CDATA[Nesse mês de Junho de 2010, foi realizada a primeira Noite Ágil, uma iniciativa do André Pantalião na lista happy hour ágil que foi rapidamente aceita, e tivemos a primeira experiência realizada na Caelum de São Paulo. A noite começou com o Adolfo Souza falando sobre os problemas resolvidos e em aberto em &#8220;O papel <a href="http://blog.caelum.com.br/noite-agil-na-caelum/#more-2711'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Nesse mês de Junho de 2010, foi realizada a primeira <a href="http://www.caelum.com.br/evento/agile/">Noite Ágil</a>, uma iniciativa do André Pantalião na lista <a href="http://groups.google.com/group/happy-hour-agil">happy hour ágil</a> que foi rapidamente aceita, e tivemos a primeira experiência realizada na Caelum de São Paulo.</p>
<p>A noite começou com o <a href="http://www.adolfosousa.com.br/" rel="nofollow">Adolfo Souza</a> falando sobre os problemas resolvidos e em aberto em &#8220;<em>O papel de QA em equipes ágeis</em>&#8221; na Locaweb, com vídeo online:</p>
<p><center><br />
<object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12707976&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=12707976&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object>
<p><a href="http://vimeo.com/12707976">O papel de QA em equipes ágeis</a> from <a href="http://vimeo.com/user1362352">Caelum</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p></center></p>
<p>Em seguida, tivemos o bate papo e explanação &#8220;<em>Kanban: Você não precisa de iterações</em>&#8221; do <a href="http://www.aspercom.com.br/" rel="nofollow">Rodrigo Yoshima</a>.</p>
<p><a href="http://vidageek.net/">Cecilia Fernandes</a> e <a href="http://agilenomundoreal.com.br">eu</a> comentamos sobre a aplicação de restrições de processos ágeis em tipos diferentes de equipes dentro da Caelum na apresentação &#8220;<em>Restrições são boas mas restrições são ruins</em>&#8220;:</p>
<p><center><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12704813&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=12704813&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object></center></p>
<p>Após o lanche, a última apresentação foi do <a href="http://ensinar.wordpress.com" rel="nofollow">André Pantalião</a> falando sobre &#8220;<em>Erros e acertos na implantação de agile</em>&#8220;.</p>
<p>Nas próximas edições, esperamos abrir mais espaço para as discussões, envolvendo outras abordagens que potencializam a discussão e participação do grupo. Vamos analisar e adaptar o próprio encontro para obter melhores resultados.</p>
<p>Para saber mais sobre os encontros, acompanhe o <a href="http://www.guj.com.br">GUJ</a>, <a href="http://blog.caelum.com.br">blog da Caelum</a> e o <a href="http://twitter.com/caelum/equipe">twitter dos desenvolvedores da Caelum</a>. Nos encontramos na próxima Noite Ágil!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/noite-agil-na-caelum/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

