<?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>Keep Learning &#187; Extreme Programming</title>
	<atom:link href="http://www.makemesimple.com/blog/category/extreme-programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.makemesimple.com/blog</link>
	<description>Conhecimento nunca é o bastante</description>
	<lastBuildDate>Wed, 28 Apr 2010 21:28:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Testes devem revelar a intenção do código</title>
		<link>http://www.makemesimple.com/blog/2009/05/08/testes-devem-revelar-a-intencao-do-codigo/</link>
		<comments>http://www.makemesimple.com/blog/2009/05/08/testes-devem-revelar-a-intencao-do-codigo/#comments</comments>
		<pubDate>Fri, 08 May 2009 22:04:13 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Test-Driven Development]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=138</guid>
		<description><![CDATA[Essa frase não é novidade para ninguém &#8211; ou, pelo menos, não deveria ser. No entanto, é muito mais difícil fazer isso acontecer do que falar sobre o assunto. 
É muito bom que a mentalidade de testes esteja sendo cada vez mais difundida. Com isso, desenvolvem-se as abordagens às práticas de desenvolvimento orientado por testes [...]]]></description>
			<content:encoded><![CDATA[<p>Essa frase não é novidade para ninguém &#8211; ou, pelo menos, não deveria ser. No entanto, é muito mais difícil fazer isso acontecer do que falar sobre o assunto. </p>
<p>É muito bom que a mentalidade de testes esteja sendo cada vez mais difundida. Com isso, desenvolvem-se as abordagens às práticas de desenvolvimento orientado por testes como, por exemplo, os frameworks. Enquanto eles se tornam cada vez mais extensíveis, eficientes e com DSLs mais limpas e bonitas, muitas pessoas esquecem que, independentemente da ferramenta, da sintaxe e da abordagem técnica a ser utilizada, a intenção do código desenvolvido é que deve ficar explícita.</p>
<p><strong>Observação</strong>: ao longo desse texto, utilizarei a expressão &#8220;desenvolvimento orientado por testes&#8221;, mas você pode substituir por &#8220;desenvolvimento orientado por comportamento&#8221; ou qualquer abordagem similar.</p>
<h4>O que é a intenção do código?</h4>
<p>A intenção do código tem tudo a ver com algo que vem sendo muito discutido: o comportamento do software. Uma definição de comportamento é &#8220;<em>a resposta observável de um sistema a um estímulo</em>&#8220;. Logo, em última análise, podemos dizer que o que importa é verificar se a resposta observável de um componente de software é a esperada, dado um ou mais estímulos pré-definidos.</p>
<p>Em alguns casos isso significa apenas definir um estado, chamar algum método e verificar o resultado. Em outros, significa verificar também a propagação dos efeitos em outros objetos (caso onde os mocks são muito úteis). Isso vai depender do componente em desenvolvimento e da abordagem utilizada.</p>
<h4>Como?</h4>
<p>A pergunta é: como testes ajudam a revelar a intenção do código? </p>
<p>Se você escrever um monte de código confuso e, após isso, resolver escrever alguns testes para validar esse trabalho, esses testes não vão ajudar em nada. Mas, se utilizar testes para orientar seu processo de desenvolvimento, descobrirá o papel fundamental que eles terão para criar código claro, fácil de entender, utilizar e modificar. Ao especificar um cenário (o estado pré-definido onde ocorrerá o estímulo), fica muito mais simples projetar e verificar o comportamento necessário.</p>
<p>Geralmente, ao escrever testes antes da implementação, obtêm-se outros benefícios, tais como: uso de boa nomenclatura, simplicidade e facilidade no refactoring. Tudo isso deve-se ao fato de que, ao praticar o desenvolvimento orientado por testes, você efetivamente <strong>pensa</strong> mais sobre o que vai escrever, antes de o fazer.</p>
<h4>Exemplo</h4>
<p>Vou tentar exemplificar os passos de criação de um componente simples com e sem testes para orientar a implementação. Assim, ao final, teremos uma perspectiva melhor dos efeitos do processo.</p>
<p>Quero escrever uma aplicação para cadastrar minha coleção de filmes. Preciso de uma classe que representará o filme:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Movie
  attr_accessor <span style="color:#ff3333; font-weight:bold;">:title</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Isso é o suficiente para o exemplo.</p>
<p>Agora vamos iniciar o processo de implementação da classe responsável pelo gerenciamento da coleção. Primeiro, sem teste algum.</p>
<p>Sei que preciso de uma classe que possua uma lista de filmes e permita que eu posso adicionar, remover, procurar e listar todos os filmes. Vamos lá:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> MovieShelf
  attr_accessor <span style="color:#ff3333; font-weight:bold;">:movies</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize
    <span style="color:#0066ff; font-weight:bold;">@movies</span> = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> lookup<span style="color:#006600; font-weight:bold;">&#40;</span>movie<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@movies</span>.<span style="color:#9900CC;">detect</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>m<span style="color:#006600; font-weight:bold;">|</span> m == movie<span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> list
    <span style="color:#0066ff; font-weight:bold;">@movies</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>movie<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#CC0066; font-weight:bold;">puts</span> movie.<span style="color:#9900CC;">title</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Ok, muito simples. Em dois minutos está pronto. Um exemplo de uso (no irb):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&gt;&gt;</span> shelf = MovieShelf.<span style="color:#9900CC;">new</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#008000; font-style:italic;">#&lt;MovieShelf:0x36eb88 @movies=[]&gt;</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> m = Movie.<span style="color:#9900CC;">new</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#008000; font-style:italic;">#&lt;Movie:0x33b328&gt;</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> m.<span style="color:#9900CC;">title</span> = <span style="color:#996600;">&quot;Juno&quot;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Juno&quot;</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> m2 = Movie.<span style="color:#9900CC;">new</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#008000; font-style:italic;">#&lt;Movie:0x39968&gt;</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> m2.<span style="color:#9900CC;">title</span> = <span style="color:#996600;">&quot;Transformers&quot;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Transformers&quot;</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> shelf.<span style="color:#9900CC;">movies</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> m
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#008000; font-style:italic;">#&lt;Movie:0x33b328 @title=&quot;Juno&quot;&gt;]</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> shelf.<span style="color:#9900CC;">movies</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> m2
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#008000; font-style:italic;">#&lt;Movie:0x33b328 @title=&quot;Juno&quot;&gt;, #&lt;Movie:0x39968 @title=&quot;Transformers&quot;&gt;]</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> shelf.<span style="color:#9900CC;">list</span>
Juno
Transformers
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#008000; font-style:italic;">#&lt;Movie:0x33b328 @title=&quot;Juno&quot;&gt;, #&lt;Movie:0x39968 @title=&quot;Transformers&quot;&gt;]</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> shelf.<span style="color:#9900CC;">lookup</span> m2
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#008000; font-style:italic;">#&lt;Movie:0x39968 @title=&quot;Transformers&quot;&gt;</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> shelf.<span style="color:#9900CC;">movies</span>.<span style="color:#9900CC;">delete</span> m2
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#008000; font-style:italic;">#&lt;Movie:0x39968 @title=&quot;Transformers&quot;&gt;</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> shelf.<span style="color:#9900CC;">list</span>
Juno
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#008000; font-style:italic;">#&lt;Movie:0x33b328 @title=&quot;Juno&quot;&gt;]</span></pre></div></div>

<p>Tudo bem, funciona e parece estar de acordo com os requisitos. Mas o código não está muito consistente. A coleção de filmes, que na prática é um objeto da classe Array, está exposta e pode ser manipulada diretamente. Isso pode ser muito ruim caso algum método da classe MovieShelf faça ações adicionais ao operar sobre a coleção. A nomenclatura também não é muito clara, entre outros pequenos problemas. Também não gostei da forma como estou criando os objetos que representam os filmes.</p>
<p>Agora, vamos começar com uma pequena especificação do que é preciso. Com isso, vou ter mais tempo para pensar em bons nomes e numa forma de uso limpa e direta.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">context <span style="color:#996600;">&quot;a movie shelf&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  setup <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#0066ff; font-weight:bold;">@shelf</span> = MovieShelf.<span style="color:#9900CC;">new</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
  should <span style="color:#996600;">&quot;let the user store a movie&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    juno = Movie.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Juno&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    shelf.<span style="color:#9900CC;">store</span> juno
    assert shelf.<span style="color:#9900CC;">contains</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>juno<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Somente estabelecendo essa primeira expectativa quanto ao comportamento do componente, já temos idéia de um início de implementação:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Movie
  attr_accessor <span style="color:#ff3333; font-weight:bold;">:title</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>title<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">title</span> = title
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> MovieShelf
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize
    <span style="color:#0066ff; font-weight:bold;">@movies</span> = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> store<span style="color:#006600; font-weight:bold;">&#40;</span>movie<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@movies</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> movie
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> contains?<span style="color:#006600; font-weight:bold;">&#40;</span>movie<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@movies</span>.<span style="color:#9966CC; font-weight:bold;">include</span>? movie
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Continuando:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">context <span style="color:#996600;">&quot;a movie shelf&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  setup <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#0066ff; font-weight:bold;">@shelf</span> = MovieShelf.<span style="color:#9900CC;">new</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
  should <span style="color:#996600;">&quot;show how many movies are stored&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    juno = Movie.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Juno&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    transformers = Movie.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Transformers&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    shelf.<span style="color:#9900CC;">store</span> juno
    shelf.<span style="color:#9900CC;">store</span> transformers
    assert_equal <span style="color:#006666;">2</span>, shelf.<span style="color:#9900CC;">movies_count</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Implementando:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> MovieShelf
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize
    <span style="color:#0066ff; font-weight:bold;">@movies</span> = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> store<span style="color:#006600; font-weight:bold;">&#40;</span>movie<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@movies</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> movie
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> contains?<span style="color:#006600; font-weight:bold;">&#40;</span>movie<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@movies</span>.<span style="color:#9966CC; font-weight:bold;">include</span>? movie
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> movies_count
    <span style="color:#0066ff; font-weight:bold;">@movies</span>.<span style="color:#9900CC;">size</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>É claro que o exemplo é bem bobo, mas perceba como a interface fica melhor e também como vamos descobrindo novas funcionalidades ao longo do processo de especificação. Este é um dos principais benefícios do desenvolvimento orientado por testes: interfaces ricas através de código modular, flexível e de intenção clara.</p>
<p>Não vou continuar o exemplo com as demais funcionalidades para não alongar ainda mais o artigo. Acredito que consegui expor aqui a importância da intenção do código e como deixá-la clara e fácil de entender.</p>
<p>O que você pensa sobre isso? Deixe sua opinião, comentário, exemplo, crítica ou sugestão. <img src='http://www.makemesimple.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Leia também:</p>
<ul>
<li><a href="http://www.informit.com/articles/article.aspx?p=357688" target="_blank">Test Driven Development: Programming by Intention</a></li>
<li><a href="http://blog.aslakhellesoy.com/2006/12/11/the-bdd-cargo-cult" target="_blank">The BDD cargo culting</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/05/08/testes-devem-revelar-a-intencao-do-codigo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Agile não é para todos</title>
		<link>http://www.makemesimple.com/blog/2009/02/09/agile-nao-e-para-todos/</link>
		<comments>http://www.makemesimple.com/blog/2009/02/09/agile-nao-e-para-todos/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 02:11:11 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Opinião]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=145</guid>
		<description><![CDATA[Agile não é para todos. Waterfall também não. Nem RUP, nem qualquer método, técnica ou filosofia.
Assim como nem todos são bons jogadores de futebol ou bons em matemática, nem todos serão bons ou se adaptarão ao desenvolvimento ágil de software. 
Note o destaque em negrito na frase acima, pois estou aqui falando de práticas ágeis [...]]]></description>
			<content:encoded><![CDATA[<p>Agile não é para todos. Waterfall também não. Nem RUP, nem qualquer método, técnica ou filosofia.</p>
<p>Assim como nem todos são bons jogadores de futebol ou bons em matemática, nem todos serão bons ou se adaptarão ao desenvolvimento ágil <strong>de software</strong>. </p>
<p>Note o destaque em negrito na frase acima, pois estou aqui falando de práticas ágeis para o desenvolvimento de software, uma coisa que o Scrum <strong>não é</strong> (o Scrum é apenas um framework gerencial &#8220;ágil&#8221;, podendo ser aplicado à projetos de software ou de outros mercados). Extreme Programming já vai além, sendo, essa sim, uma metodologia de desenvolvimento ágil de software (que, por usa vez, usa muitos conceitos gerenciais do Scrum no que diz respeito à comunicação intra e extra-equipe).</p>
<p>Cada metodologia possui um conjunto de princípios básicos, algumas possuem práticas e, outras, formatos bem específicos de documentos a serem seguidos fielmente. Algumas possuem tudo isso junto.</p>
<p>De acordo com o perfil psicológico, social e profissional, é comum que pessoas envolvidas em desenvolvimento de software (gerentes, desenvolvedores, designers, testadores etc) possuam suas preferências quanto à metodologias e práticas. Alguns se dão muito bem apenas com waterfall, outros apenas com agile, uns poucos com ambas e muitas outras. E isso é extremamente normal. As metodologias ágeis são vistas como a salvação do mundo do desenvolvimento de software, principalmente num mercado dinâmico como a internet. Mas, não se engane, nem todos os profissionais conseguem trabalhar num ambiente realmente ágil. Eles são piores do que os que conseguem? Não. São apenas pessoas diferentes.</p>
<p>Ambientes &#8220;ágeis&#8221; exigem um conjunto de habilidades bem diferentes em relação a outros tipos de ambientes. Geralmente, exigem também muito sacrifício pessoal em detrimento do próprio ego, sendo essa uma das principais barreiras para que se consiga implementar uma cultura de desenvolvimento ágil de software.</p>
<p>Alguns profissionais (desenvolvedores e outros) não estão acostumados e não querem praticar coisas como feedback rápido, desenvolvimento orientado por testes, daily meetings e as outras práticas que as acompanham. Desenvolvimento ágil de software não é apenas escrever centenas de post-its e colá-los num quadro branco ou numa parede. É estar disposto a mudar muitos hábitos e fazer alguns sacrifícios, aceitar algumas &#8220;imposições&#8221; das metodologias, trabalhar em equipe e <strong>para a equipe</strong>.</p>
<p>Se a pessoa não se encaixa nesse tipo de mentalidade, tudo bem. Não significa nada em termos de qualidade profissional, mas uma empresa que deseja trabalhar com métodos ágeis definitivamente não é o lugar certo para ela, já que ambos os lados sairão perdendo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/02/09/agile-nao-e-para-todos/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Integração contínua</title>
		<link>http://www.makemesimple.com/blog/2007/10/24/integracao-continua/</link>
		<comments>http://www.makemesimple.com/blog/2007/10/24/integracao-continua/#comments</comments>
		<pubDate>Wed, 24 Oct 2007 23:24:14 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=36</guid>
		<description><![CDATA[Integração contínua é outra prática fundamental nas metodologias ágeis.
Em linhas gerais, integração contínua é a prática de constantemente enviar as alterações feitas no código fonte ao sistema de controle de versão para que os demais desenvolvedores sempre trabalhem com a versão mais atualizada do código. Recomenda-se também que esse processo inclua testes unitários, garantindo que [...]]]></description>
			<content:encoded><![CDATA[<p>Integração contínua é outra prática fundamental nas metodologias ágeis.</p>
<p>Em linhas gerais, integração contínua é a prática de constantemente enviar as alterações feitas no código fonte ao sistema de controle de versão para que os demais desenvolvedores sempre trabalhem com a versão mais atualizada do código. Recomenda-se também que esse processo inclua testes unitários, garantindo que todo código integrado ao servidor está correto e não &#8220;quebra&#8221; outra parte da aplicação.</p>
<p>Leia mais <a href="http://www.improveit.com.br/xp/praticas/integracao" target="_blank">aqui</a> e <a href="http://en.wikipedia.org/wiki/Continuous_integration">aqui</a>.</p>
<p>Recentemente foram escritos dois posts muito bons sobre o assunto. Você pode conferí-los no blog da <a href="http://blog.improveit.com.br/articles/2007/10/05/nosso-processo-de-integracao-continua" target="_blank">ImproveIT</a> e do <a href="http://www.urubatan.com.br/integracao-continua-sincrona-com-railsrake/" target="_blank">Urubatan</a>.</p>
<p>Nesses posts também é possível aprender sobre integração contínua <em>síncrona</em> e integração contínua <em>assíncrona</em>. Obrigado ao <a href="http://www.improveit.com.br/vinicius" target="_blank">Vinícius</a> e ao <a href="http://www.urubatan.com.br/" target="_blank">Urubatan</a> pelas ótimas referências.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2007/10/24/integracao-continua/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.594 seconds -->
