<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Keep Learning</title>
	
	<link>http://www.makemesimple.com/blog</link>
	<description>Conhecimento nunca é o bastante</description>
	<pubDate>Mon, 29 Jun 2009 19:30:10 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/LearningOnRails" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Waterfall é xadrez. Agile é futebol.</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/Fi9iNZW3PCY/</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). Outro 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>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/Fi9iNZW3PCY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/06/29/waterfall-e-xadrez-agile-e-futebol/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/06/29/waterfall-e-xadrez-agile-e-futebol/</feedburner:origLink></item>
		<item>
		<title>Slides e notas da minha sessão no FISL10</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/teOWYdVDSWY/</link>
		<comments>http://www.makemesimple.com/blog/2009/06/25/slides-e-notas-da-minha-sessao-no-fisl10/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 16:52:25 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Apresentações]]></category>

		<category><![CDATA[Eventos]]></category>

		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Test-Driven Development]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=228</guid>
		<description><![CDATA[Pessoal, abaixo está o link para download, em formato PDF, dos slides com notas que eu utilizei na minha sessão ontem no FISL10, entitulada &#8220;TDD e Rails: Mais rápido, mais forte e melhor&#8221;.
Download.
Obrigado a todos que apareceram por lá! Qualquer feedback é muito bem-vindo.  
]]></description>
			<content:encoded><![CDATA[<p>Pessoal, abaixo está o link para download, em formato PDF, dos slides com notas que eu utilizei na minha sessão ontem no FISL10, entitulada &#8220;TDD e Rails: Mais rápido, mais forte e melhor&#8221;.</p>
<p><a href="http://makemesimple.com/files/fisl10.pdf" target="_blank">Download</a>.</p>
<p>Obrigado a todos que apareceram por lá! Qualquer feedback é muito bem-vindo. <img src='http://www.makemesimple.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/teOWYdVDSWY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/06/25/slides-e-notas-da-minha-sessao-no-fisl10/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/06/25/slides-e-notas-da-minha-sessao-no-fisl10/</feedburner:origLink></item>
		<item>
		<title>Sobre mudanças</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/O752yZNQj1Y/</link>
		<comments>http://www.makemesimple.com/blog/2009/06/23/sobre-mudancas/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 06:06:26 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Busk]]></category>

		<category><![CDATA[Pessoal]]></category>

		<category><![CDATA[Spix]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=225</guid>
		<description><![CDATA[Há um mês algumas coisas mudaram e, hoje, resolvi escrever sobre isso aqui.
Por conta de mudanças estratégicas que não cabe a mim revelar, a WebCO mudou alguns de seus rumos e, com isso, deixou de ser um lugar em que eu gostaria de trabalhar. Nada grave, apenas coisas do mundo dos negócios. Decidi, então, deixar [...]]]></description>
			<content:encoded><![CDATA[<p>Há um mês algumas coisas mudaram e, hoje, resolvi escrever sobre isso aqui.</p>
<p>Por conta de mudanças estratégicas que não cabe a mim revelar, a WebCO mudou alguns de seus rumos e, com isso, deixou de ser um lugar em que eu gostaria de trabalhar. Nada grave, apenas coisas do mundo dos negócios. Decidi, então, deixar a empresa. Muito aprendizado, novas amizades, um ano muito divertido e, sem dúvida, inesquecível. Agradeço, mesmo, a todos pela oportunidade única que tive.</p>
<p>Dado isso, busquei por um projeto forte e com potencial em que eu pudesse ajudar e, também, crescer. Recebi proposta de alguns e, após um processo de bastante ponderação (sempre é difícil), decidi me juntar ao pessoal da Spix, que hoje tem como projeto principal o <a href="http://busk.com" target="_blank">Busk</a> (pronuncia-se &#8220;busqui&#8221;). </p>
<p>O projeto e a visão são excelentes e o futuro é promissor. Equipe pequena (somos apenas dois desenvolvedores, eu e o <a href="http://www.arthurgeek.net/" target="_blank">ArthurGeek</a>), pouquíssima interferência de processos e muito espaço pra experimentar e descobrir os melhores caminhos para o projeto.</p>
<p>Fique de olho no <a href="http://busk.com" target="_blank">Busk</a>. Muita coisa nova vem por aí!</p>
<p>PS: Agora também sou mais um no crescente time do home-office. Vejo vocês na Starbucks mais próxima! <img src='http://www.makemesimple.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/O752yZNQj1Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/06/23/sobre-mudancas/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/06/23/sobre-mudancas/</feedburner:origLink></item>
		<item>
		<title>Testes devem revelar a intenção do código</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/HAK6qEW75Co/</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 - 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 - 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>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/HAK6qEW75Co" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/05/08/testes-devem-revelar-a-intencao-do-codigo/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/05/08/testes-devem-revelar-a-intencao-do-codigo/</feedburner:origLink></item>
		<item>
		<title>Obtendo informações de uma instalação do Ruby</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/hoOIbpt9_7I/</link>
		<comments>http://www.makemesimple.com/blog/2009/05/03/obtendo-informacoes-de-uma-instalacao-do-ruby/#comments</comments>
		<pubDate>Sun, 03 May 2009 04:09:16 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Dicas]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=196</guid>
		<description><![CDATA[Existem algumas maneiras de obter informações sobre uma instalação do Ruby, mas uma que conheci hoje é através do próprio irb, utilizando uma biblioteca chamada rbconfig, presente na instalação padrão do Ruby.
Para iniciar o irb já com essa lib carregada, basta executar o comando: irb -r rbconfig (a flag -r diz ao irb para carregar [...]]]></description>
			<content:encoded><![CDATA[<p>Existem algumas maneiras de obter informações sobre uma instalação do Ruby, mas uma que conheci hoje é através do próprio <code>irb</code>, utilizando uma biblioteca chamada <code>rbconfig</code>, presente na instalação padrão do Ruby.</p>
<p>Para iniciar o irb já com essa lib carregada, basta executar o comando: <code>irb -r rbconfig</code> (a flag -r diz ao irb para carregar uma lib ao iniciar). Para obter algumas configurações da instalação Ruby, acesse o hash <code>Config::CONFIG</code>. Veja alguns exemplos (clique para ver a imagem maior):</p>
<p><a href="http://www.makemesimple.com/blog/wp-content/uploads/2009/05/ishot-1.jpg" target="_blank"><img src="http://www.makemesimple.com/blog/wp-content/uploads/2009/05/ishot-1.jpg" alt="irb with rbconfig" title="irb with rbconfig" width="478" height="248" class="aligncenter size-medium" /></a></p>
<p><strong>Nota</strong>: em algumas instalações, essa biblioteca já é carregada com o <code>irb</code> por padrão.</p>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/hoOIbpt9_7I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/05/03/obtendo-informacoes-de-uma-instalacao-do-ruby/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/05/03/obtendo-informacoes-de-uma-instalacao-do-ruby/</feedburner:origLink></item>
		<item>
		<title>Evitando over-stubbing com Mocha</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/oOG9BxTV1_A/</link>
		<comments>http://www.makemesimple.com/blog/2009/03/18/evitando-over-stubbing-com-mocha/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 16:45:29 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Anúncios]]></category>

		<category><![CDATA[Desenvolvimento]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Test-Driven Development]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=191</guid>
		<description><![CDATA[Não é segredo que não sou &#8220;fã&#8221; da maneira como a comunidade de desenvolvedores utiliza mocks e stubs. A meu ver, trata-se de mal uso de uma ferramenta muito útil.
Com esse tipo de uso surgem alguns problemas, tais como over-mocking e over-stubbing, ou seja, o uso abusivo de mocks e stubs. O abuso de mocks [...]]]></description>
			<content:encoded><![CDATA[<p>Não é segredo que não sou &#8220;fã&#8221; da maneira como a comunidade de desenvolvedores utiliza mocks e stubs. A meu ver, trata-se de mal uso de uma ferramenta muito útil.</p>
<p>Com esse tipo de uso surgem alguns problemas, tais como over-mocking e over-stubbing, ou seja, o uso abusivo de mocks e stubs. O abuso de mocks torna seus testes quebradiços, isto é, testes que falham sem que haja alteração de comportamento do componente sob verificação. O abuso de stubs torna seus testes fracos, isto é, testes que saem de sincronia com o código, verificando comportamento que já não é real, mas continuam passando.</p>
<p>Um exemplo de abuso de mocks:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">it <span style="color:#996600;">&quot;should be successful&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  Account.<span style="color:#9900CC;">expects</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:new</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">with</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:current_user</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@user</span>, <span style="color:#ff3333; font-weight:bold;">:first_name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Test&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:last_name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Test&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">returns</span><span style="color:#006600; font-weight:bold;">&#40;</span>@account<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#0066ff; font-weight:bold;">@account</span>.<span style="color:#9900CC;">expects</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:login_method</span>=<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">with</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#6666ff; font-weight:bold;">CONFIG::LOGIN::OpenID</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#0066ff; font-weight:bold;">@account</span>.<span style="color:#9900CC;">expects</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:has_email_and_password</span>=<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">at_least_once</span>
  <span style="color:#0066ff; font-weight:bold;">@account</span>.<span style="color:#9900CC;">expects</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:has_openid</span>=<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">twice</span>
  do_edit
  response.<span style="color:#9900CC;">should</span> be_success
  response.<span style="color:#9900CC;">should</span> render_template<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;edit&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Note que até métodos de atribuição são colocados sob expectativas. Se a implementação sofrer uma alteração simples, fazendo, por exemplo, com que algum desses métodos não seja mais chamado, mesmo que não haja qualquer modificação no comportamento, o teste falhará.</p>
<p>Um exemplo do abuso de stubs:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">it <span style="color:#996600;">&quot;has been modified a lot of times&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  Dependency.<span style="color:#9900CC;">stubs</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:a_method</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  NoLongerADependency.<span style="color:#9900CC;">stubs</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:something</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">returns</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">false</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  AnotherDependency.<span style="color:#9900CC;">stubs</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:nonexistent_method</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">returns</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">10</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  MyClass.<span style="color:#9900CC;">new</span>.<span style="color:#9900CC;">do_something</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Com esse tipo de abordagem, você pode acabar com problemas como fazer stubs de métodos que não existem mais ou até mesmo de objetos que já não são mais uma dependência.</p>
<p>Uma forma de evitar isso com o Mocha (além, é claro, de estudar o uso correto das ferramentas) é utilizar algumas configurações providas pelo framework através de sua classe Configuration:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">Mocha::Configuration</span>.<span style="color:#9900CC;">prevent</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:stubbing_non_existent_method</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;">#impede stubbing de métodos inexistentes</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">Mocha::Configuration</span>.<span style="color:#9900CC;">prevent</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:stubbing_method_unnecessarily</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;">#impede stubbing de métodos não utilizados</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">Mocha::Configuration</span>.<span style="color:#9900CC;">prevent</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:stubbing_non_public_method</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;">#impede stubbing de métodos não-públicos</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">Mocha::Configuration</span>.<span style="color:#9900CC;">prevent</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:stubbing_method_on_non_mock_object</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;">#impede stubbing em objetos &quot;reais&quot;</span></pre></div></div>

<p>Nos exemplos acima, caso encontre um dos usos &#8220;indevidos&#8221;, o Mocha lançará uma exceção do tipo Mocha::StubbingError. Isso ocorre por termos utilizado o método prevent. Há outras configurações possíveis, sendo providos três nívels de configuração:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># padrão - permite a condição</span>
<span style="color:#6666ff; font-weight:bold;">Mocha::Configuration</span>.<span style="color:#9900CC;">allow</span><span style="color:#006600; font-weight:bold;">&#40;</span>condition<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># apenas emite um aviso quando ocorre a condição</span>
<span style="color:#6666ff; font-weight:bold;">Mocha::Configuration</span>.<span style="color:#9900CC;">warn_when</span><span style="color:#006600; font-weight:bold;">&#40;</span>condition<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># lança um erro quando ocorre a condição</span>
<span style="color:#6666ff; font-weight:bold;">Mocha::Configuration</span>.<span style="color:#9900CC;">prevent</span><span style="color:#006600; font-weight:bold;">&#40;</span>condition<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Essas configurações podem ser um auxílio para o aprendizado do uso correto e equilibrado da ferramenta.</p>
<p>Leia mais:<br />
<a href="http://mocha.rubyforge.org/classes/Mocha/Configuration.html" target="_blank">Mocha::Configuration RDoc</a><br />
<a href="http://blog.floehopper.org/articles/2009/02/09/mocha-configuration" target="_blank">Mocha Configuration - James Mead</a></p>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/oOG9BxTV1_A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/03/18/evitando-over-stubbing-com-mocha/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/03/18/evitando-over-stubbing-com-mocha/</feedburner:origLink></item>
		<item>
		<title>Treinando seu Mac Fu! Dicas para Mac OS X</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/K7UnZdQdJ4U/</link>
		<comments>http://www.makemesimple.com/blog/2009/03/13/treinando-seu-mac-fu-dicas-para-mac-os-x/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 14:26:48 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Dicas]]></category>

		<category><![CDATA[MacOS]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=184</guid>
		<description><![CDATA[Post rápido, com algumas dicas para melhorar a já muito boa experiência de uso no Mac OS X:

Forçando o esvaziamento da lixeira: às vezes o Mac OS se recusa a limpar algum arquivo da lixeira, pois este, teoricamente, está em uso. Uma maneira de forçar o esvaziamento da lixeira é abrir uma sessão no Terminal [...]]]></description>
			<content:encoded><![CDATA[<p>Post rápido, com algumas dicas para melhorar a já muito boa experiência de uso no Mac OS X:</p>
<ul>
<li><strong>Forçando o esvaziamento da lixeira</strong>: às vezes o Mac OS se recusa a limpar algum arquivo da lixeira, pois este, teoricamente, está em uso. Uma maneira de forçar o esvaziamento da lixeira é abrir uma sessão no Terminal e executar o comando:
<pre>rm -rf ~/.Trash/</pre>
</li>
<li><strong>Invocando o Quicksilver via terminal</strong>: um modo muito útil do Quicksilver é o &#8220;Command Window with Selection&#8221;, onde a janela do programa se abre com um arquivo selecionado, possibilitando a execução rápida de arquivos sobre o mesmo. Além de configurar um atalho para isso nas preferências, é possível também instalar o plugin &#8220;Command Line Tool&#8221; e, na linha de comando, invocar o Quicksilver com um arquivo selecionado através do comando:
<pre>qs nome_do_arquivo</pre>
<p> Para mais informações, execute:
<pre>qs --help</pre>
</li>
<li><strong>Melhorando o alternador de janelas (Cmd+Tab)</strong>: instale o <a href="http://www.manytricks.com/witch/" target="_blank">Witch</a>, configure um atalho e você terá um alternador de janelas mais prático e informativo do que o padrão do Finder. Vale a pena dar uma olhada nas outras aplicações da Many Tricks.</li>
<li><strong>Mudando o mapeamento das teclas modificadoras</strong>: entre os usuários do emacs é comum mapear a tecla Caps Lock como a tecla Control, pois facilita a digitação. Para fazer isso, entre outras coisas, basta acessar System Preferences, Keyboard &#038; Mouse, acessar a aba Keyboard e clicar no botão &#8220;Modifier Keys&#8230;&#8221;. No pop-up que se abre é possível modificar a ação executada por cada tecla modificadora.</li>
</ul>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/K7UnZdQdJ4U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/03/13/treinando-seu-mac-fu-dicas-para-mac-os-x/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/03/13/treinando-seu-mac-fu-dicas-para-mac-os-x/</feedburner:origLink></item>
		<item>
		<title>Agile não é para todos</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/ctQeTIv5nR0/</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>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/ctQeTIv5nR0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/02/09/agile-nao-e-para-todos/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/02/09/agile-nao-e-para-todos/</feedburner:origLink></item>
		<item>
		<title>Ruby Quick Tip: Aprendendo através de testes</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/HeSkwGM-XxE/</link>
		<comments>http://www.makemesimple.com/blog/2009/02/08/ruby-quick-tip-aprendendo-atraves-de-testes/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 21:07:09 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=156</guid>
		<description><![CDATA[Se você não conhece (completamente ou pacialmente) alguma biblioteca, uma boa forma de fazer isso é através de um caso de testes. 
Um benefício resultante dessa prática é poder executar os testes contra várias versões do Ruby e, assim, verificar alterações em sua estrutura.
Se você usa o TextMate, é muito fácil criar um caso de [...]]]></description>
			<content:encoded><![CDATA[<p>Se você não conhece (completamente ou pacialmente) alguma biblioteca, uma boa forma de fazer isso é através de um caso de testes. </p>
<p>Um benefício resultante dessa prática é poder executar os testes contra várias versões do Ruby e, assim, verificar alterações em sua estrutura.</p>
<p>Se você usa o TextMate, é muito fácil criar um caso de testes. Basta abrir uma janela do editor, ativar o bundle do Ruby, digitar <em>tc</em> e pressionar a tecla <em>tab</em>:</p>
<p><img src="http://www.makemesimple.com/blog/wp-content/uploads/2009/02/ishot-1.jpg" alt="TextMate" title="TextMate" width="475" height="449" class="aligncenter size-full wp-image-161" /></p>
<p><img src="http://www.makemesimple.com/blog/wp-content/uploads/2009/02/ishot-2.jpg" alt="test case scaffold" title="test case scaffold" width="475" height="449" class="aligncenter size-full wp-image-162" /></p>
<p>Com isso temos um &#8220;esqueleto&#8221; de um caso de testes pronto. Pressionando tab, o foco do cursor passa por pontos importantes, como o require da biblioteca a ser testada, o nome do caso de testes etc. Agora, basta modificar de acordo com o que queremos testar e, através do atalho command+R, executar os testes e verificar o resultado:</p>
<p><img src="http://www.makemesimple.com/blog/wp-content/uploads/2009/02/ishot-3.jpg" alt="test" title="test" width="475" height="449" class="aligncenter size-full wp-image-163" /></p>
<p><img src="http://www.makemesimple.com/blog/wp-content/uploads/2009/02/ishot-41.jpg" alt="ishot-41" title="ishot-41" width="500" height="331" class="aligncenter size-full wp-image-174" /></p>
<p><strong>Veja também</strong>:</p>
<p><a href="http://www.makemesimple.com/blog/2007/08/27/aprendizado-orientado-por-testes/">Aprendizado orientado por testes</a></p>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/HeSkwGM-XxE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/02/08/ruby-quick-tip-aprendendo-atraves-de-testes/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/02/08/ruby-quick-tip-aprendendo-atraves-de-testes/</feedburner:origLink></item>
		<item>
		<title>Seu framework não faz BDD</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/NxFZbAODJs4/</link>
		<comments>http://www.makemesimple.com/blog/2009/01/08/seu-framework-nao-faz-bdd/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 03:49:51 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Opinião]]></category>

		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Test-Driven Development]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=142</guid>
		<description><![CDATA[Eu sinto uma &#8220;pontada&#8221; no cérebro quando ouço ou leio coisas como &#8220;o RSpec (ou Shoulda, test/spec etc) é um framework BDD&#8221;.
Não existe algo como um &#8220;framework BDD&#8221;. Tenha em mente que quem pratica ou não o BDD é o desenvolvedor. O que existe são frameworks ou bibliotecas que adicionam uma boa dose de açúcar [...]]]></description>
			<content:encoded><![CDATA[<p>Eu sinto uma &#8220;pontada&#8221; no cérebro quando ouço ou leio coisas como &#8220;o RSpec (ou Shoulda, test/spec etc) é um framework BDD&#8221;.</p>
<p>Não existe algo como um &#8220;framework BDD&#8221;. Tenha em mente que quem pratica ou não o BDD é o desenvolvedor. O que existe são frameworks ou bibliotecas que adicionam uma boa dose de açúcar sintático para facilitar o estilo de escrita para quem deseja praticar essa técnica de testes.</p>
<p>Os <a href="http://dannorth.net/introducing-bdd" target="_blank">maiores</a> <a href="http://blog.daveastels.com/files/BDD_Intro.pdf" target="_blank">proponentes</a> do BDD enfatizam que a maior mudança em relação às técnicas tradicionais é mesmo a sintaxe. Porém, isso não quer dizer que basta utilizar uma sintaxe &#8220;mais legível&#8221; (o que é discutível também) para pular no vagão do BDD. A sintaxe bonitinha é um auxílio, uma ferramenta com o objetivo de diminuir as dificuldades na transição de um <strong>modo de pensar</strong>, que é onde a verdadeira diferença reside. Muitas dessas dificuldades são, inclusive, ditas de origem &#8220;psicológica&#8221;, como a abolição da palavra &#8220;test&#8221; nos nomes dos métodos para forçar o pensamento no sentido de uma verificação de comportamento ao invés de um teste de estado (medida defendida através da <a href="http://pt.wikipedia.org/wiki/Hip%C3%B3tese_de_Sapir-Whorf" target="_blank">hipótese de Sapir-Whorf</a>).</p>
<p>De fato, posso afirmar que a maior parte das suítes de testes escritas em RSpec, Shoulda ou test/spec que já tive a oportunidade de examinar (seja trabalhando, seja &#8220;navegando&#8221; por projetos open source - uma grande fonte de aprendizado), falha miseravelmente na tentativa de adotar o BDD, tropeçando feio em erros como verificar estado ao invés de comportamento, testar funcionalidades da linguagem ou framework e, principalmente, overmocking - chegando ao ponto em que um teste não verifica mais nada, apenas mocks e stubs - o que nos leva a testes quebradiços ou testes que não falham mesmo que você apague o código que eles deveriam verificar.</p>
<p>Esse último item leva a um outro ponto importante (e, aqui, uma visão muito pessoal - acredito ser compartilhada por poucos): acredita-se que o uso de mocks configura o uso do BDD, pois estabelecer expectativas em relação à interfaces e, consequentemente, isolar horizontalmente os componentes testados, passa a ser, &#8220;automaticamente&#8221;, verificação de comportamento. O uso de mocks não estabelece nada além de uma expectativa de interação - uma interface. </p>
<p>Como um <a href="http://martinfowler.com/articles/mocksArentStubs.html#ClassicalAndMockistTesting" target="_blank">classicista</a> evito o uso de mocks (e dublês em geral), reservando-os para onde realmente é difícil ou pouco prático o uso de um objeto real ou, como deveria ser seu principal uso, uma ferramenta de design de código através da qual modelamos interfaces ainda não existentes à medida em que praticamos o TDD (ou seja, escrevemos testes antes da implementação do código real) - e os substituo assim que a classe real é implementada, quando aplicável.</p>
<p>Então, não acredite que por utilizar alguma ferramenta facilitadora, você, instantâneamente, estará praticando BDD. Estude a técnica e a filosofia envolvida e você poderá utilizá-la com qualquer ferramenta para testes.</p>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/NxFZbAODJs4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/01/08/seu-framework-nao-faz-bdd/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/01/08/seu-framework-nao-faz-bdd/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 1.146 seconds -->
