<?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; Agile</title>
	<atom:link href="http://www.makemesimple.com/blog/category/agile/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>Desenvolvedor, arquiteto, programador, engenheiro&#8230;</title>
		<link>http://www.makemesimple.com/blog/2009/11/04/desenvolvedor-arquiteto-programador-engenheiro/</link>
		<comments>http://www.makemesimple.com/blog/2009/11/04/desenvolvedor-arquiteto-programador-engenheiro/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 13:16:53 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Opinião]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=336</guid>
		<description><![CDATA[É realmente necessário ter equipes de arquitetura separadas de equipes de desenvolvimento? Essa pergunta é muito antiga e cada um tem uma resposta. Pra mim, não. Mas vamos pensar mais sobre isso.
Em primeiro lugar, o que é um arquiteto de software? É um desenvolvedor com muito conhecimento e experiência (minha resposta)? É um profissional diferente, [...]]]></description>
			<content:encoded><![CDATA[<p>É realmente necessário ter equipes de arquitetura separadas de equipes de desenvolvimento? Essa pergunta é muito antiga e cada um tem uma resposta. Pra mim, não. Mas vamos pensar mais sobre isso.</p>
<p>Em primeiro lugar, o que é um arquiteto de software? É um desenvolvedor com muito conhecimento e experiência (minha resposta)? É um profissional diferente, especificamente treinado para a arquitetura de sistemas? É alguém que possui algum &#8220;dom&#8221; especial?</p>
<p>O cargo de &#8220;Arquiteto de Software&#8221; como empregado hoje na indústria do software é mais uma <a href="http://blog.fragmental.com.br/2007/07/24/contratando-agilistas-retardatarios/" target="_blank">herança ruim da comparação entre desenvolvimento de software e construção civil</a>. Nesta última, o arquiteto faz o projeto mas, em geral, não suja as mãos no cimento. O ponto é: arquitetar um sistema de software é ou não é fundamentalmente diferente de construir software, isto é, programá-lo, testá-lo e mantê-lo? Não. Existem algumas diferenças e algumas preocupações diferentes mas é impossível dissociar as atividades no nível em que é feito em outras áreas.</p>
<p>Um fato interessante é que apenas empresas grandes, com orçamentos folgados (que, em geral, desperdiçam tempo e dinheiro com futilidades e becos sem saída) costumam oferecer o cargo de arquiteto de software. Eles geralmente ficam em equipes de arquitetura, longe das equipes que &#8220;sujam&#8221; as mãos no código no dia-a-dia. Ora, isso, por si só, <a href="http://blog.fragmental.com.br/2008/12/09/nao-vai-subir-ninguem/" target="_blank">cria as Torres de Marfim e uma certa animosidade latente</a> entre as diferentes equipes &#8211; que deveriam trabalhar em conjunto todos os dias.</p>
<p>Não faz sentido (e não é eficiente) ter equipes de arquitetura separadas, sem contato direto e constante com as equipes de desenvolvimento. Também não faz sentido empregar arquitetos de software que só planejam e não participam da execução diariamente.</p>
<p>Usando a já batida metáfora do desenvolvimento de software como jardinagem é fácil perceber que estamos longe do processo utilizado, por exemplo, na construção civil ou na indústria automobilística. Não é possível projetar todo o software com antecedência, como um prédio ou um carro, comprar a matéria-prima, contratar os operários e implementá-lo praticamente sem desvios. <strong>O projeto é o software e o software é o projeto</strong>.</p>
<p>Podemos, sim, ter um plano geral, um conjunto de guias e processos a serem seguidos, interfaces definidas, padrões e tudo mais, mas é preciso adaptação rápida à mudança. Na <strong>criação</strong> (e não construção, isso é importante) de um jardim, uma planta pode não se desenvolver por um entre vários fatores. Na <strong>criação</strong> de software, uma especificação da equipe de arquitetura pode não se encaixar nas necessidades do projeto.</p>
<p>Se houver uma &#8220;equipe de arquitetura&#8221; como uma entidade especial, separada, perde-se muito tempo para reagir às mudanças. Se os arquitetos são do tipo que se acha bom demais pra se sujar na programação as conseqüências são ainda piores &#8211; em primeiro lugar porque eles não tem noção da realidade do projeto enquanto fazem os planos e, em segundo, porque tendem a resistir à mudanças no que consideram um plano perfeito.</p>
<p>Se insistíssemos em utilizar a metáfora da construção civil, podemos comparar <strong>todo</strong> o ciclo de desenvolvimento de software com o ciclo de arquitetura e projeto de um edifício, excluindo sua construção. O desenvolvimento de software é uma atividade criativa, não &#8220;mecânica&#8221;.</p>
<p>Um desenvolvedor de software que não se atenta à arquitetura, que não tenta melhorar nos fundamentos básicos necessários ao entendimento do software como um todo, não passa de um programador &#8211; um mero codificador, facilmente substituível.</p>
<p>Um arquiteto de software que não programa, não se envolve com o dia-a-dia da produção de software e não se interessa pelos outros aspectos da disciplina, não passa de um &#8220;<a href="http://blog.fragmental.com.br/2008/08/09/analista-pedreiro/">masturbador mental de software</a>&#8220;. Daí para o que os americanos chamam de &#8220;Death by PowerPoint&#8221; leva um piscar de olhos.</p>
<p>Sim, é necessário que tenhamos a figura do &#8220;líder técnico&#8221;, aquele desenvolvedor com bastante experiência e jogo de cintura, que já viu e já fez de tudo na área. Ele, inclusive, pode ter o cargo formal de arquiteto de software. O que não pode acontecer é que ele seja um profissional isolado em uma esfera de cristal, um &#8220;deus&#8221; criando o que ele pensa ser adequado, dando ordens e ignorando eventuais questionamentos de sua intocável arquitetura. Isso é tudo o que um time de verdade não precisa.</p>
<p>Em resumo, um bom desenvolvedor é também um bom arquiteto. E um bom programador. E um bom qualquer coisa que seja necessária para criar software consistentemente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/11/04/desenvolvedor-arquiteto-programador-engenheiro/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Como falhar com métodos ágeis</title>
		<link>http://www.makemesimple.com/blog/2009/07/20/como-falhar-com-metodos-ageis/</link>
		<comments>http://www.makemesimple.com/blog/2009/07/20/como-falhar-com-metodos-ageis/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 18:44:25 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Opinião]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=240</guid>
		<description><![CDATA[É comum vermos guias de como fazer algo da maneira correta. A meu ver, muitas vezes, um guia de como fazer tudo errado acaba sendo mais últil, pois mostra o outro lado da moeda e acaba servindo melhor de indicador de sucesso (ou falta de).
Dada alguma experiência que possuo com métodos ágeis, aqui vai um [...]]]></description>
			<content:encoded><![CDATA[<p>É comum vermos guias de como fazer algo da maneira correta. A meu ver, muitas vezes, um guia de como fazer tudo errado acaba sendo mais últil, pois mostra o outro lado da moeda e acaba servindo melhor de indicador de sucesso (ou falta de).</p>
<p>Dada alguma experiência que possuo com métodos ágeis, aqui vai um guia 100% garantido de como falhar utilizando-os. Todas as recomendações foram vistas em prática e são ótimas receitas para o fracasso, ainda mais quando utilizadas em conjunto:</p>
<ul>
<li><strong>Não utilize equipes multi-funcionais</strong><br />
Separe os membros em equipes de Criação, Desenvolvimento, Infra-estrutura e várias outras, assim como setores em grandes empresas. Mantenha-os distantes, de preferência em salas separadas, dificultando a comunicação (o pilar central dos métodos ágeis) ao máximo &#8211; sabemos que basta ficar em mesas separadas para que as pessoas se comuniquem apenas via e-mail, quando muito. Crie processos para que as equipes façam requisições umas às outras, faça com que isso seja demorado: com isso você desestimula qualquer resquício de colaboração.
</li>
<li><strong>Espere até o final da iteração para avaliar as histórias</strong><br />
Crie um processo de QA intrincado e lento. Faça com que a avaliação das histórias fique para o último dia da iteração &#8211; desta forma, se uma história não for aprovada, não haverá tempo para correção, garantindo assim mais um passo rumo ao fracasso.
</li>
<li><strong>Não abrace a mudança</strong><br />
Crie processos burocráticos com várias etapas, dificulte a resposta rápida e limite os profissionais o mais que puder. Deixe o caos reinar sob a desculpa de que não fará micro-gerenciamento quando, na verdade, não há gerenciamento nenhum. Não escute o que a equipe tem a dizer, esse bando de programadores, designers e administradores de sistemas não tem experiência com gerenciamento de verdade e não sabe o que está dizendo.</li>
<li><strong>Centralize o controle e as (in)decisões</strong><br />
Crie comitês para qualquer problema, dos mais simples aos mais complexos. Responsabilize uma pessoa pelo controle de cada comitê, que deve fazer inúmeras reuniões, coletar muita informação e repassar ao responsável. Esse tem a tarefa de levar toda a informação ao &#8220;chefe&#8221; que, por sua vez, não decidirá nada e criará mais comitês. Dessa forma você garante que nenhuma decisão será tomada e todos os problemas se arrastarão até que se combinem no caos completo.
</li>
<li><strong>Utilize &#8220;Agile by the book&#8221;</strong><br />
Leia vários livros sobre Extreme Programming, Scrum, Lean e o que mais estiver na moda. Adote todos os processos do jeito que são descritos &#8211; o que, num primeiro momento, é bom, já que não há experiência. No entanto, recuse-se a modificar qualquer detalhe, mesmo que as coisas não estejam funcionando e que a experiência adquirida pela equipe aponte em uma direção diferente. Sempre refute qualquer argumentação com uma citação ao estilo &#8220;Ken Schwaber diz que&#8230;&#8221; (vale qualquer nome &#8220;de peso&#8221;), afinal Ken Schwaber está trabalhando junto à equipe todos os dias e conhece suas necessidades, correto?
</li>
</ul>
<p>Este é um trabalho em progresso. Quais práticas você adicionaria ao guia?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/07/20/como-falhar-com-metodos-ageis/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Waterfall é xadrez. Agile é futebol.</title>
		<link>http://www.makemesimple.com/blog/2009/06/29/waterfall-e-xadrez-agile-e-futebol/</link>
		<comments>http://www.makemesimple.com/blog/2009/06/29/waterfall-e-xadrez-agile-e-futebol/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 17:55:55 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Opinião]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=149</guid>
		<description><![CDATA[Essa é uma boa analogia quando necessário comparar esses dois tipos de filosofia/metodologia (é apenas uma analogia, não uma comparação perfeita, mas ajuda bastante).
Waterfall é xadrez: você usa muito tempo para pensar e planejar, fazendo o máximo de esforço para tentar prever cada possível movimento durante o jogo. Dada essa natureza de muito planejamento antes [...]]]></description>
			<content:encoded><![CDATA[<p>Essa é uma boa analogia quando necessário comparar esses dois tipos de filosofia/metodologia (é apenas uma analogia, não uma comparação perfeita, mas ajuda bastante).</p>
<p>Waterfall é xadrez: você usa muito tempo para pensar e planejar, fazendo o máximo de esforço para tentar prever cada possível movimento durante o jogo. Dada essa natureza de muito planejamento antes da execução, faz sentido apenas em domínios muito estáveis e conhecidos, sem mudanças na demanda (geralmente em software de alto risco, como para voos espaciais).</p>
<p>Agile é futebol (ou qualquer esporte coletivo): as decisões durante o jogo devem ser tomadas muito rapidamente, sem tempo para análise de todas as possíveis consequências. Por isso, é &#8220;ideal&#8221; para domínios altamente dinâmicos e instáveis, com constantes alterações na demanda (como software para a web). Outra semelhança muito importante a ser notada é: mesmo que você tenha os melhores jogadores, se a equipe não jogar bem junta, o time não vence.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/06/29/waterfall-e-xadrez-agile-e-futebol/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<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>
	</channel>
</rss>

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