<?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:slash="http://purl.org/rss/1.0/modules/slash/" 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>
	<lastBuildDate>Wed, 04 Nov 2009 13:19:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</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>Desenvolvedor, arquiteto, programador, engenheiro…</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/WnGzQ4MDbU8/</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>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/WnGzQ4MDbU8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/11/04/desenvolvedor-arquiteto-programador-engenheiro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/11/04/desenvolvedor-arquiteto-programador-engenheiro/</feedburner:origLink></item>
		<item>
		<title>Sobre investimentos, startups, limitações e tudo mais – em um parágrafo</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/h-z56vxMASY/</link>
		<comments>http://www.makemesimple.com/blog/2009/10/27/sobre-investimentos-startups-limitacoes-e-tudo-mais-em-um-paragrafo/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 17:05:27 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Empreendedorismo]]></category>
		<category><![CDATA[Opinião]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=327</guid>
		<description><![CDATA[&#8220;This is one of the reasons I encourage entrepreneurs to bootstrap instead of taking outside money. On day one, a bootstrapped company sets out to make money. They have no choice, really. On day one a funded company sets out to spend money. They hire, they buy, they invest, they spend. Making money isn’t important [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>&#8220;This is one of the reasons I encourage entrepreneurs to bootstrap instead of taking outside money. On day one, a bootstrapped company sets out to make money. They have no choice, really. On day one a funded company sets out to spend money. They hire, they buy, they invest, they spend. Making money isn’t important yet. <strong>They practice spending, not making</strong>.&#8221;</p></blockquote>
<p>&#8211; Jason Fried (37signals) em &#8220;<a href="http://37signals.com/svn/posts/1985-making-money-takes-practice-like-playing-the-piano-takes-practice">Making money takes practice like playing the piano takes practice</a>&#8221;</p>
<p>Escrevi dois posts para, no fim das contas, não conseguir expressar a mensagem. Minha falha foi tentar explicar demais o raciocínio ao invés de simplesmente expressar a conclusão (e ainda causei alguns acidentes no caminho). Pronto, através das palavras do Jason Fried, está aí tudo que eu quis dizer sobre o tema.</p>
<p>PS: Sim, os dois posts anteriores foram para o limbo. Como em todo processo criativo iterativo, as tentativas fracassadas podem ser descartadas. <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/h-z56vxMASY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/10/27/sobre-investimentos-startups-limitacoes-e-tudo-mais-em-um-paragrafo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/10/27/sobre-investimentos-startups-limitacoes-e-tudo-mais-em-um-paragrafo/</feedburner:origLink></item>
		<item>
		<title>O ActiveSupport mexeu no seu logger? Recupere a formatação original!</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/HpaIJ31Aw0M/</link>
		<comments>http://www.makemesimple.com/blog/2009/09/18/o-activesupport-mexeu-no-seu-logger-recupere-a-formatacao-original/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 18:11:44 +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=301</guid>
		<description><![CDATA[Recentemente estava escrevendo um script de manutenção utilizando o logger padrão do Ruby e tudo estava indo muito bem. A formatação padrão do logger oferece uma boa quantidade de informação, com timestamp, id do processo, nível da mensagem (erro, informação etc), como na imagem abaixo:
Pouco depois, resolvi utilizar o ActiveRecord (que carrega junto o ActiveSupport) [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente estava escrevendo um script de manutenção utilizando o logger padrão do Ruby e tudo estava indo muito bem. A formatação padrão do logger oferece uma boa quantidade de informação, com timestamp, id do processo, nível da mensagem (erro, informação etc), como na imagem abaixo:</p>
<div id="attachment_302" class="wp-caption aligncenter" style="width: 657px"><a href="http://www.makemesimple.com/blog/wp-content/uploads/2009/09/Picture-1.png"><img src="http://www.makemesimple.com/blog/wp-content/uploads/2009/09/Picture-1.png" alt="Formatação padrão do logger" title="default logger" width="485" height="56" class="size-full wp-image-302" /></a><p class="wp-caption-text">Formatação padrão do logger</p></div>
<p>Pouco depois, resolvi utilizar o ActiveRecord (que carrega junto o ActiveSupport) no script. Feito isso, o output do logger mudou para:</p>
<div id="attachment_303" class="wp-caption aligncenter" style="width: 405px"><a href="http://www.makemesimple.com/blog/wp-content/uploads/2009/09/Picture-2.png"><img src="http://www.makemesimple.com/blog/wp-content/uploads/2009/09/Picture-2.png" alt="Formatação com ActiveSupport" title="ActiveSupport logger output" width="315" height="41" class="size-full wp-image-303" /></a><p class="wp-caption-text">Formatação com ActiveSupport</p></div>
<p>Isso não é bom. Pesquisei um pouco e descobri que o ActiveSupport modifica a formatação padrão utilizando uma classe chamada SimpleFormatter ao invés da classe Formatter padrão do logger. </p>
<p>Desta forma, recuperar a formatação original é simples, basta modificar o formater utilizado pela sua instância do logger:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">log = <span style="color:#CC00FF; font-weight:bold;">Logger</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>STDOUT<span style="color:#006600; font-weight:bold;">&#41;</span>
log.<span style="color:#9900CC;">datetime_format</span> = <span style="color:#996600;">&quot;%d-%m-%Y %H:%M:%S&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Recuperando a formatação original</span>
log.<span style="color:#9900CC;">formatter</span> = <span style="color:#6666ff; font-weight:bold;">Logger::Formatter</span>.<span style="color:#9900CC;">new</span></pre></div></div>

<p>Também é possível alterar o formatter padrão na classe Logger. Dessa forma todas as instâncias utilizarão o formato padrão:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># Fazer isso após carregar o ActiveSupport para reverter a alteração do formatter</span>
<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC00FF; font-weight:bold;">Logger</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> formatter
    <span style="color:#0066ff; font-weight:bold;">@formatter</span> = Formatter.<span style="color:#9900CC;">new</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/HpaIJ31Aw0M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/09/18/o-activesupport-mexeu-no-seu-logger-recupere-a-formatacao-original/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/09/18/o-activesupport-mexeu-no-seu-logger-recupere-a-formatacao-original/</feedburner:origLink></item>
		<item>
		<title>Utilizando rack-debug para debugging com Passenger</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/aEJF7_OszUA/</link>
		<comments>http://www.makemesimple.com/blog/2009/09/10/utilizando-rack-debug-para-debugging-com-passenger/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 20:06:27 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=294</guid>
		<description><![CDATA[Desenvolver aplicações Rails utilizando o Phusion Passenger (principalmente no Mac OS X com o Passenger preference pane) é muito prático. Porém, uma coisa que logo senti falta foi a possibilidade de utilizar a gem ruby-debug quando precisava de breakpoints para debuggar o código.
Uma maneira de conseguir isso é através da gem/plugin rack-debug. Para utilizá-la, segui [...]]]></description>
			<content:encoded><![CDATA[<p>Desenvolver aplicações Rails utilizando o <a target="_blank" href="http://www.modrails.com/">Phusion Passenger</a> (principalmente no Mac OS X com o <a target="_blank" href="http://www.fngtps.com/passenger-preference-pane">Passenger preference pane</a>) é muito prático. Porém, uma coisa que logo senti falta foi a possibilidade de utilizar a gem <a target="_blank" href="http://rubyforge.org/projects/ruby-debug/">ruby-debug</a> quando precisava de breakpoints para <em>debuggar</em> o código.</p>
<p>Uma maneira de conseguir isso é através da gem/plugin <a target="_blank" href="http://github.com/ddollar/rack-debug/tree/master">rack-debug</a>. Para utilizá-la, segui os passos abaixo.</p>
<p>1. Instalação</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"> $ script<span style="color: #000000; font-weight: bold;">/</span>plugin <span style="color: #c20cb9; font-weight: bold;">install</span> git:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>ddollar<span style="color: #000000; font-weight: bold;">/</span>rack-debug.git
&nbsp;
 <span style="color: #666666; font-style: italic;"># config/environments/development.rb</span>
 config.middleware.use <span style="color: #ff0000;">&quot;Rack::Debug&quot;</span></pre></div></div>

<p>2. Chamar o debugger onde necessário:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">def</span> create
    <span style="color:#0066ff; font-weight:bold;">@status</span> = current_user.<span style="color:#9900CC;">statuses</span>.<span style="color:#9900CC;">create</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:status</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    debugger
    <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@status</span>.<span style="color:#9900CC;">valid</span>?
...</pre></div></div>

<p>3. Conectar-se ao debugger</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"> <span style="color: #666666; font-style: italic;"># No diretório da aplicação, chamar a task rake</span>
 $ rake debug
 Connected.</pre></div></div>

<p>4. Ao executar a linha onde o debugger foi chamado, a aplicação para e você tem acesso ao console do debugger</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"> <span style="color:#006600; font-weight:bold;">&#40;</span>rdb:<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#CC0066; font-weight:bold;">p</span> <span style="color:#0066ff; font-weight:bold;">@status</span>
 <span style="color:#008000; font-style:italic;">#&lt;Status id: 231, text: &quot;Testing rack-debug&quot;, user_id: 4, ...&gt;</span></pre></div></div>

<p>Pronto. Happy debugging! <img src='http://www.makemesimple.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Update</strong>: ao chamar a task rake, pode ocorrer um erro com a mensagem &#8220;Server is not running or Passenger has spooled down&#8221;. Neste caso, reinicie o Apache e tudo deve funcionar normalmente.</p>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/aEJF7_OszUA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/09/10/utilizando-rack-debug-para-debugging-com-passenger/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/09/10/utilizando-rack-debug-para-debugging-com-passenger/</feedburner:origLink></item>
		<item>
		<title>Seu chefe é incompetente? A ciência explica!</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/m2Ty61QBgms/</link>
		<comments>http://www.makemesimple.com/blog/2009/09/03/seu-chefe-e-incompetente-a-ciencia-explica/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 19:28:33 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Empreendedorismo]]></category>
		<category><![CDATA[Mercado]]></category>
		<category><![CDATA[Opinião]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=288</guid>
		<description><![CDATA[Pesquisas feitas na Universidade de Catania, na Itália, mostram que, quanto mais promoções, mais incompetente é o profissional. A pesquisa foi feita a partir do chamado Princípio de Peter, formulado pelo psicólogo canadense Laurence J. Peter, com a seguinte frase (original, em inglês): &#8220;Every new member in a hierarchical organization climbs the hierarchy until he/she [...]]]></description>
			<content:encoded><![CDATA[<p>Pesquisas feitas na <a target="_blank" href="http://arxiv.org/abs/0907.0455">Universidade de Catania</a>, na Itália, mostram que, quanto mais promoções, mais incompetente é o profissional. A pesquisa foi feita a partir do chamado Princípio de Peter, formulado pelo psicólogo canadense Laurence J. Peter, com a seguinte frase (original, em inglês): &#8220;Every new member in a hierarchical organization climbs the hierarchy until he/she reaches his/her level of maximum incompetence&#8221;.</p>
<p>A explicação é simples: no sistema de promoção por mérito, pessoas muito boas em dada especialidade são promovidas para outras áreas, para as quais podem ser menos aptas (claro, isso só ocorre quando a promoção leva o profissional a uma área em que suas habilidades atuais não são fundamentais). Dessa forma, cair nas garras do Princípio de Peter torna-se inevitável, levando a empresa a uma perda geral de eficiência ao longo do tempo.</p>
<p>A solução, segundo os cientistas, é reservar 50% das promoções para os piores profissionais da empresa &#8211; a chance de que eles &#8220;se encontrem&#8221; nos cargos aos quais são promovidos é muito maior.</p>
<p>Que desenvolvedor de software nunca topou com esse tipo de problema? Aquele cara, ótimo desenvolvedor, acaba sendo promovido à gerente (e aceita, seja pela grana, pelo status ou por falta de opção) e é simplesmente um zero à esquerda na função. É claro que isso acontece em qualquer área, mas é nesta em que eu tenho experiência.</p>
<p>Podemos tirar duas lições disso: </p>
<ul>
<li>Se, por ser um ótimo desenvolvedor, você for agraciado com uma promoção para outra área, pense duas vezes antes de aceitar &#8211; isso pode significar o fim da sua carreira como profissional competente. Se a empresa não lhe der opção (é bem comum que só se consiga um aumento aceitando uma promoção-bomba dessas), procure outro lugar &#8211; quando você realmente é competente, escolhas não faltam. </li>
<li>Se você se tornar um empreendedor, primeiro busque ajuda especializada caso não se sinta à vontade com as tarefas necessárias nesse seu &#8220;novo cargo&#8221;. Você pode ser um ótimo designer com uma ótima ideia, mas isso não quer dizer que será um bom empresário. Além disso, pense bem na política de promoção que vai utilizar se a empresa for bem sucedida. Um exemplo: pode ser muito mais satisfatório recompensar os bons funcionários com melhorias salariais do que promovê-los a cargos para os quais eles não possuem aptidão.</li>
</ul>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/m2Ty61QBgms" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/09/03/seu-chefe-e-incompetente-a-ciencia-explica/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/09/03/seu-chefe-e-incompetente-a-ciencia-explica/</feedburner:origLink></item>
		<item>
		<title>Cuidado com o DRY nos seus testes</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/TvZAIsrg3-U/</link>
		<comments>http://www.makemesimple.com/blog/2009/09/02/cuidado-com-o-dry-nos-seus-testes/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 17:31:21 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Test-Driven Development]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=283</guid>
		<description><![CDATA[Don&#8217;t Repeat Yourself é um dos princípios de desenvolvimento de software mais &#8220;badalados&#8221; nos últimos tempos. O problema é que, como tudo que se torna popular, isso acaba sendo abusado. Numa tentativa de criar código limpo é comum criar código difícil de entender. Isso afeta principalmente os testes.
Testes devem ser extremamente legíveis. Não deve existir [...]]]></description>
			<content:encoded><![CDATA[<p><a target="_blank" href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself">Don&#8217;t Repeat Yourself</a> é um dos princípios de desenvolvimento de software mais &#8220;badalados&#8221; nos últimos tempos. O problema é que, como tudo que se torna popular, isso acaba sendo abusado. Numa tentativa de criar código limpo é comum criar código difícil de entender. Isso afeta principalmente os testes.</p>
<p>Testes devem ser extremamente legíveis. Não deve existir sobrecarga cognitiva, isto é, não deve ser necessário entender o código do teste para então entender o comportamento que ele especifica &#8211; isso deve ficar claro rapidamente. Exemplos de sobrecarga são a necessidade de &#8220;ficar pulando&#8221; entre vários arquivos ou &#8220;descriptografando&#8221; lógica mágica para entender o código do teste.</p>
<p>É fácil, então, identificar dois tipos de recursos que podem causar problemas no entendimento dos testes &#8211; há uma tênue linha separando o bom e o mal uso deles: macros e &#8220;magia negra&#8221; em forma de código Ruby.</p>
<p>Macros devem ser utilizadas com muito cuidado. É interessante utilizar macros que encapsulam código simples para economizar tempo na criação dos testes, como essa macro para especificar ações autenticadas com o Authlogic:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> login_as<span style="color:#006600; font-weight:bold;">&#40;</span>user<span style="color:#006600; font-weight:bold;">&#41;</span>
  activate_authlogic   <span style="color:#008000; font-style:italic;">#this is from Authlogic::TestCase</span>
  UserSession.<span style="color:#9900CC;">create</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>:email <span style="color:#006600; font-weight:bold;">=&gt;</span> user.<span style="color:#9900CC;">email</span>, <span style="color:#ff3333; font-weight:bold;">:password</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> user.<span style="color:#9900CC;">password</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Macros com muito código ou que utilizam outras macros devem ser evitadas.</p>
<p>Um problema provavelmente mais grave é a utlização de algumas técnicas de &#8220;magia negra&#8221; no código. Aquela técnica super obscura e bacana envolvendo o Enumerable que você viu num blog esses dias não deve ser usada nos testes (nem na lógica de negócios, na minha opinião): foque sempre nos idiomas comuns da linguagem. Por simples falha da minha memória agora, segue um exemplo bobo, mas válido:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># truque menos conhecido</span>
<span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span>this is a test<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">*</span> <span style="color:#996600;">&quot;, &quot;</span>    <span style="color:#008000; font-style:italic;">#=&gt; &quot;this, is, a, test&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># idioma comum</span>
<span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span>this is a test<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;, &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>    <span style="color:#008000; font-style:italic;">#=&gt; &quot;this, is, a, test&quot;</span></pre></div></div>

<p>Os testes, quando usados corretamente, também são a porta de entrada de novos desenvolvedores ao código já existente na aplicação. Pode ser que sua equipe seja formada por Rubistas experientes que conheçam todos os truques envolvidos, mas a adaptação de um profissional com menos experiência na linguagem pode ser muito facilitada por testes com código simples e altamente legível, mesmo que isso &#8220;custe&#8221; alguma repetição ou uso de construções mais comuns.</p>
<p>A conclusão é: em todo seu código e principalmente nos testes, evite o uso de macros que escondem muito código ou lógica relevante ao comportamento especificado e também prefira idiomas comuns, mesmo que você saiba técnicas &#8220;ninja&#8221; da linguagem.</p>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/TvZAIsrg3-U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/09/02/cuidado-com-o-dry-nos-seus-testes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/09/02/cuidado-com-o-dry-nos-seus-testes/</feedburner:origLink></item>
		<item>
		<title>Você confia em métricas?</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/5f74IWTrt14/</link>
		<comments>http://www.makemesimple.com/blog/2009/08/31/voce-confia-em-metricas/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 17:29:23 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Opinião]]></category>
		<category><![CDATA[Test-Driven Development]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=154</guid>
		<description><![CDATA[Usar métricas no seu código é uma boa prática. Existem várias ferramentas que provém métricas muito interessantes e ferramentas, como o metric_fu, que integram várias delas.
No entanto, é preciso ter bastante cuidado. Métricas são como muletas: muito úteis quando você não consegue andar sem a ajuda delas mas, se você utilizá-las sem necessidade, vai enfraquecer [...]]]></description>
			<content:encoded><![CDATA[<p>Usar métricas no seu código é uma boa prática. Existem várias ferramentas que provém métricas muito interessantes e ferramentas, como o metric_fu, que integram várias delas.</p>
<p>No entanto, é preciso ter bastante cuidado. Métricas são como muletas: muito úteis quando você não consegue andar sem a ajuda delas mas, se você utilizá-las sem necessidade, vai enfraquecer suas pernas.</p>
<p>Um bom exemplo disso é uma métrica muito utilizada por quem escreve testes: a cobertura de código. É uma ferramenta muito útil quando é preciso &#8220;correr atrás&#8221; do prejuízo, isto é, adicionar testes a código sem cobertura. Nesse caso, é prática comum estabelecer uma porcentagem de cobertura a ser atingida dentro de um prazo limitado. Mas, se você pratica BDD/TDD consistentemente e não deixa código importante sem cobertura, é realmente necessário confirmar isso com um gráfico ou uma porcentagem? </p>
<p>O uso e confiança cega em métricas mesmo sem necessidade de um amparo como esse pode levar à má aplicação da técnica do desenvolvimento guiado por testes, já que ela passa a ser baseada em um número artificial &#8211; é muito fácil ter 100% de cobertura de código com uma suíte de testes ruim. Antes uma suite boa mas que, conscientemente, não passa por cada linha de código do que uma suite que execute cada linha, mas seja um lixo como especificação e ferramenta de refactoring.</p>
<p>Mais um exemplo de fragilidade fica claro no famoso e cantado aos quatro ventos <em>code to test ratio</em>: ao utilizar um framework de testes verboso, é fácil obter uma razão de linhas de teste por linhas de código muito maior do que utilizando um framework mais compacto ou macros. Me desculpe quem utiliza e divulga esse número como algum indicativo de qualidade, mas essa medida é simplesmente ridícula, além de totalmente ilusória.</p>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/5f74IWTrt14" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/08/31/voce-confia-em-metricas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/08/31/voce-confia-em-metricas/</feedburner:origLink></item>
		<item>
		<title>Testes envolvendo tempo: usando a gem time-warp</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/Wo8cnYYjqks/</link>
		<comments>http://www.makemesimple.com/blog/2009/08/28/testes-envolvendo-tempo-usando-a-gem-time-warp/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 16:46:23 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Test-Driven Development]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=269</guid>
		<description><![CDATA[É comum que precisemos &#8220;manipular o tempo&#8221; quando escrevendo testes para código cujo comportamento depende do momento no tempo.
Uma técnica comum é utilizar um mock ou stub na classe Time do Ruby para manipular o horário de acordo com o desejado. Isso vai contra um princípio importante do uso de fake objects em testes: &#8220;Não [...]]]></description>
			<content:encoded><![CDATA[<p>É comum que precisemos &#8220;manipular o tempo&#8221; quando escrevendo testes para código cujo comportamento depende do momento no tempo.</p>
<p>Uma técnica comum é utilizar um mock ou stub na classe Time do Ruby para manipular o horário de acordo com o desejado. Isso vai contra um princípio importante do uso de fake objects em testes: &#8220;<a target="_blank" href="http://www.infoq.com/news/2008/08/Mock-Roles-Pryce-and-Freeman">Não use fakes em objetos que não são seus</a>&#8220;. Na maioria do tempo isso pode não causar problemas, mas alterar o comportamento de uma classe usada internamente pela linguagem não soa bem e pode causar bugs difíceis de rastrear.</p>
<p>Aí entra a gem <a target="_blank" href="http://github.com/iridesco/time-warp/tree/master">time-warp</a>. Ela ainda trabalha sobre as classes do Ruby, mas provê uma camada específica para testes para todo código executado em um bloco definido pelo programador. Um exemplo de uso (da <a target="_blank" href="http://twtapp.info/">nossa aplicação feita para o Rails Rumble</a>):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">it <span style="color:#996600;">&quot;should only silence tweets with the desired word inside the configured time interval&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  pretend_now_is<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">Time</span>.<span style="color:#9900CC;">now</span>.<span style="color:#9900CC;">utc</span>.<span style="color:#9900CC;">beginning_of_day</span> <span style="color:#006600; font-weight:bold;">+</span> 1.<span style="color:#9900CC;">hour</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    tweet1.<span style="color:#9900CC;">sent_at</span> = 2.<span style="color:#9900CC;">minutes</span>.<span style="color:#9900CC;">ago</span>
    tweet2.<span style="color:#9900CC;">sent_at</span> = 32.<span style="color:#9900CC;">minutes</span>.<span style="color:#9900CC;">from_now</span>
    tweet3.<span style="color:#9900CC;">sent_at</span> = 1.<span style="color:#9900CC;">hour</span>.<span style="color:#9900CC;">from_now</span>
&nbsp;
    collection = <span style="color:#006600; font-weight:bold;">&#91;</span>tweet1, tweet2, tweet3<span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
    Silencer.<span style="color:#9900CC;">apply</span><span style="color:#006600; font-weight:bold;">&#40;</span>collection, <span style="color:#006600; font-weight:bold;">&#123;</span>:word <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;soccer&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:until</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> 30.<span style="color:#9900CC;">minutes</span>.<span style="color:#9900CC;">from_now</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  tweet1.<span style="color:#9900CC;">should</span> be_filtered
  tweet2.<span style="color:#9900CC;">should</span> be_filtered
  tweet3.<span style="color:#9900CC;">should_not</span> be_filtered
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>A gem adiciona o método &#8220;pretend_now_is&#8221;, que recebe um parâmetro com o horário desejado e um bloco. Dentro desse bloco, todo código executado é &#8220;transportado no tempo&#8221; para o horário definido. Além de tornar a manipulação das classes de tempo mais segura, o código fica muito mais elegante.</p>
<p>Veja mais detalhes no <a target="_blank" href="http://github.com/iridesco/time-warp/blob/884623fec90687c7f3c28b8e8074a39c96946cbb/README.md">README da gem</a>.</p>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/Wo8cnYYjqks" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/08/28/testes-envolvendo-tempo-usando-a-gem-time-warp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/08/28/testes-envolvendo-tempo-usando-a-gem-time-warp/</feedburner:origLink></item>
		<item>
		<title>Como aumentei minha produtividade eliminando distrações</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/sAwoPBrv27Q/</link>
		<comments>http://www.makemesimple.com/blog/2009/08/27/como-aumentei-minha-produtividade-eliminando-distracoes/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 16:23:20 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Opinião]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=261</guid>
		<description><![CDATA[(ou: Como deixei de me preocupar e deixei de assinar muitos feeds)
Não, ainda não sou uma pessoa super-mega-produtiva, mas aqui está como consegui aumentar minha produtividade usando alguns truques (e o incrível sistema operacional que é o Mac OS X em conjunto com ótimas aplicações):

Não verifique seu e-mail mais de quatro vezes ao dia: se [...]]]></description>
			<content:encoded><![CDATA[<p>(ou: Como deixei de me preocupar e deixei de assinar muitos feeds)</p>
<p>Não, ainda não sou uma pessoa super-mega-produtiva, mas aqui está como consegui aumentar minha produtividade usando alguns truques (e o incrível sistema operacional que é o Mac OS X em conjunto com ótimas aplicações):</p>
<ul>
<li>Não verifique seu e-mail mais de quatro vezes ao dia: se você está esperando algum e-mail importante, peça para quem for enviá-lo que te avise quando isso acontecer, usando, por exemplo, uma SMS;</li>
<li>Não verifique seu e-mail se você sabe que não estará apto a agir sobre alguma mensagem imediatamente: por exemplo, verificar seu e-mail de trabalho no final da tarde de Sexta &#8211; deixe para fazer isso na Segunda;</li>
<li>Livre-se dos feeds que você assina: você não vai realmente sentir falta deles sem ficar um tempo longe. Se, após alguns dias, você sentir muita falta de ler um deles, assine-o novamente, mas não verifique seus feeds mais do que uma vez ao dia. Essa é uma excelente técnica para descobrir o que é realmente importante dentre tudo que você consome;</li>
<li>Deixe que as pessoas sejam seu filtro: acredite em mim, se algo é realmente importante (ou banal, mas &#8220;quente&#8221;), vai chegar a você. Você não precisa ficar garimpando. O recurso de &#8220;shared items&#8221; do Google Reader é excelente nesse ponto &#8211; estou à caminho de usar apenas ele, me livrando de todos os feeds que assino (são por volta de oito hoje). Quando realmente precisar encontrar algo, o Google é seu amigo;</li>
<li>Desabilite notificações desnecessárias: como muitas do Growl ou os &#8220;contadores vermelhos&#8221; nos ícones de aplicações na Dock do OS X &#8211; mantenha apenas as que você realmente precisa (por exemplo, eu mantenho as notificações do <a target="_blank" href="http://propaneapp.com/">Propane</a>, já que é importante saber o que meus colegas de trabalho dizem no Campfire);</li>
<li>Não use um monitor muito grande: isso pode parecer estranho, mas <a target="_blank" href="http://lifehacker.com/367391/do-larger-monitors-make-you-more-productive">pesquisas</a> mostram que, após aproximadamente 26 polegadas, o tamanho do monitor diminui a produtividade. É óbvio: muitas coisas no seu campo visual vão lhe distrair. Use o Spaces e divida as telas de acordo com a tarefa (uma para programação, uma para navegação na internet etc);</li>
<li>Aumente o espaço livre na sua tela eliminando itens do seu Desktop: configura o Finder para não exibir discos rígidos (eu deixo apenas discos ópticos e dispositivos removíveis). Elimine da Dock as aplicações que você não usa muito frequentemente. Use o QuickSilver ou algo similar para acessar as aplicações e arquivos que você não usa frequentemente, apenas não deixe que eles se empilhem na Dock e no Desktop;</li>
<li>Elimine da Menu Bar os itens que você não precisa, como o ícone de status do Bluetooth, o indicador AM/PM se você usa o formato americano (é fácil saber isso olhando pela janela), o ícone do Time Machine etc;</li>
<li>Use o <a target="_blank" href="http://adium.im/">Adium</a> e configure-o para que fique oculto a menos que seja a aplicação ativa (veja aqui: <a target="_blank" href="http://yfrog.com/amactivep">ativo</a>, <a target="_blank" href="http://yfrog.com/ajinactive2p">inativo</a>, <a target="_blank" href="http://yfrog.com/e3picture2fuap">configurações 1</a>, <a target="_blank" href="http://yfrog.com/avpicture12xp">configurações 2</a>);</li>
<li>Use o <a target="_blank" href="http://fluidapp.com/">Fluid</a> para criar SSBs para as aplicações web que você precisa para trabalhar: o motivo para isso é evitar ter um browser repleto de abas abertas te distraindo enquanto você usa uma aplicação para trabalhar. Com as aplicações Fluid você pode focar apenas na tarefa à mão;</li>
<li>Use o <a target="_blank" href="http://www.gravityapps.com/tags/">Tags</a> para facilitar o processo de organização e busca de arquivos.</li>
</ul>
<p>É difícil tomar algumas dessas ações, como se livrar dos feeds que você assina &#8211; especialmente porque o número de feeds assinados geralmente é motivo de &#8220;disputazinhas&#8221; entre nerds/geeks. É estupidez pura, como competir para ver <a target="_blank" href="http://37signals.com/svn/posts/1006-sleep-deprivation-is-not-a-badge-of-honor">quem dorme menos e fica acordado programando por mais tempo</a>.</p>
<p>De qualquer modo, dê uma chance. Após algum tempo (eu recomendo tentar por, pelo menos, dez dias), você vai sentir falta das coisas que realmente precisa e pode tê-las novamente assim que quiser.</p>
<p><strong>Update</strong>: Como bem notado pelo <a target="_blank" href="http://www.arthurgeek.net/">ArthurGeek</a>, a imagem de configuração do Adium para que a lista de contatos se esconda automaticamente estava errada (a que eu chamei de &#8220;configuração 2&#8243;). Arrumei o link e deixo aqui também: <a target="_blank" href="http://yfrog.com/avpicture12xp">http://yfrog.com/avpicture12xp</a>.</p>
<p>&#8211;</p>
<p>Também <a target="_blank" href="http://lucashungaro.github.com/productivity/2009/08/27/how-i-increased-my-productivity.html">em inglês</a>.</p>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/sAwoPBrv27Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/08/27/como-aumentei-minha-produtividade-eliminando-distracoes/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/08/27/como-aumentei-minha-produtividade-eliminando-distracoes/</feedburner:origLink></item>
		<item>
		<title>Palestras e artigos altamente recomendados</title>
		<link>http://feedproxy.google.com/~r/LearningOnRails/~3/w8aClX9xGl4/</link>
		<comments>http://www.makemesimple.com/blog/2009/08/19/palestras-e-artigos-altamente-recomendados/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 16:51:14 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
				<category><![CDATA[Apresentações]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Desenvolvimento]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=234</guid>
		<description><![CDATA[Segue abaixo uma lista concisa de vídeos, artigos e slides que mantenho por perto como referência. Há material técnico e não-técnico e, é claro, não se trata de uma referência completa para desenvolvimento de software.
A intenção é ter algo que possa ser consumido em pouco tempo, resultando numa base sólida para o desenvolvedor profissional (ou [...]]]></description>
			<content:encoded><![CDATA[<p>Segue abaixo uma lista concisa de vídeos, artigos e slides que mantenho por perto como referência. Há material técnico e não-técnico e, é claro, não se trata de uma referência completa para desenvolvimento de software.</p>
<p>A intenção é ter algo que possa ser consumido em pouco tempo, resultando numa base sólida para o desenvolvedor profissional (ou seja, não há tópicos básicos para iniciantes) e, ao mesmo tempo, ser mantido como referência (o asterisco denota meus itens preferidos).</p>
<p>Vídeos de conferências:</p>
<ul>
<li><a href="http://blip.tv/file/2145004" target="_blank">Don&#8217;t Mock Yourself Out &#8211; David Chelimsky</a></li>
<li><a href="http://aac2009.confreaks.com/06-feb-2009-11-00-the-grand-unified-theory-jim-weirich.html" target="_blank">The Grand Unified Theory &#8211; Jim Weirich*</a></li>
<li><a href="http://rubyhoedown2008.confreaks.com/02-joe-obrien-and-jim-weirich-mock-dialogue.html" target="_blank">Mock Dialogue &#8211; Joe O&#8217;Brien and Jim Weirich </a></li>
<li><a href="http://goruco2009.confreaks.com/30-may-2009-15-40-solid-object-oriented-design-sandi-metz.html" target="_blank">SOLID Object-Oriented Design- Sandi Metz*</a></li>
<li><a href="http://rubyconf2008.confreaks.com/testing-heresies.html" target="_blank">Testing Heresies &#8211; Francis Hwang*</a></li>
<li><a href="http://rubyconf2007.confreaks.com/d1t1p1_what_makes_code_beautiful.html" target="_blank">What Makes Code Beautiful? &#8211; Marcel Molina Jr</a></li>
</ul>
<p>Artigos/Slides:</p>
<ul>
<li><a href="http://www.prescod.net/rest/mistakes/" target="_blank">Common REST mistakes</a></li>
<li><a href="http://www.defmacro.org/ramblings/fp.html" target="_blank">Functional Programming For The Rest of Us*</a> &#8211; finalmente alguém que explica programação funcional de forma simples, sem querer parecer um &#8220;sabe-tudo&#8221;</li>
<li><a href="http://tomayko.com/writings/rest-to-my-wife" target="_blank">How I Explained REST to My Wife*</a> &#8211; ótimo artigo, sempre uma referência ímpar</li>
<li><a href="http://www.fourhourworkweek.com/blog/2009/04/24/on-the-shortness-of-life-an-introduction-to-seneca/" target="_blank">On The Shortness of Life: An Introduction to Seneca</a></li>
<li><a href="http://www.dcmanges.com/blog/smart-model-dumb-controller" target="_blank">Smart Model, Dumb Controller</a> &#8211; focado em Rails, mas vale para qualquer MVC</li>
<li><a href="http://www.taylor.se/blog/2007/03/22/top-ten-things-ten-years-of-professional-software-development-has-taught-me/" target="_blank">Top ten things ten years of professional software development has taught me</a></li>
<li><a href="http://www.slideshare.net/rolfsky/web20-why-we-got-here-and-whats-next" target="_blank">Web2.0: Why we got here and what&#8217;s next</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/LearningOnRails/~4/w8aClX9xGl4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2009/08/19/palestras-e-artigos-altamente-recomendados/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.makemesimple.com/blog/2009/08/19/palestras-e-artigos-altamente-recomendados/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 3.449 seconds -->
