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

<channel>
	<title>Guilherme Chapiewski &#187; Engenharia de software</title>
	<atom:link href="http://gc.blog.br/category/engenharia-de-software/feed/" rel="self" type="application/rss+xml" />
	<link>http://gc.blog.br</link>
	<description>Blog sobre desenvolvimento de software e tecnologia</description>
	<lastBuildDate>Wed, 18 May 2011 12:00:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Programador &#8220;Religioso&#8221; x &#8220;Filósofo&#8221;</title>
		<link>http://gc.blog.br/2010/03/01/programador-religioso-x-filosofo/</link>
		<comments>http://gc.blog.br/2010/03/01/programador-religioso-x-filosofo/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 04:44:55 +0000</pubDate>
		<dc:creator>Guilherme Chapiewski</dc:creator>
				<category><![CDATA[Comunidade]]></category>
		<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Mercado]]></category>
		<category><![CDATA[Anselmo Alves]]></category>
		<category><![CDATA[Filosofia]]></category>
		<category><![CDATA[Flame Wars]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Religião]]></category>
		<category><![CDATA[Tecnologia]]></category>

		<guid isPermaLink="false">http://gc.blog.br/?p=1501</guid>
		<description><![CDATA[Há algum tempo atrás enquanto usava o GTalk encontrei uma mensagem sensacional que o Anselmo Alves havia colocado no seu status:
&#8220;Philosophy is questions that may never be answered. Religion is answers that may never be questioned.&#8221;
(&#8220;Filosofia são questões que podem nunca ser respondidas. Religião são respostas que nunca podem ser questionadas.&#8221;)
Quando li essa frase imediatamente [...]]]></description>
			<content:encoded><![CDATA[<p>Há algum tempo atrás enquanto usava o <a href="http://www.google.com/talk/" onclick="urchinTracker('/outgoing/www.google.com/talk/?referer=');">GTalk</a> encontrei uma mensagem sensacional que o <a href="http://www.anselmoalves.com" onclick="urchinTracker('/outgoing/www.anselmoalves.com?referer=');">Anselmo Alves</a> havia colocado no seu status:</p>
<blockquote><p>&#8220;Philosophy is questions that may never be answered. Religion is answers that may never be questioned.&#8221;</p>
<p>(<em>&#8220;Filosofia são questões que podem nunca ser respondidas. Religião são respostas que nunca podem ser questionadas.&#8221;</em>)</p></blockquote>
<p>Quando li essa frase imediatamente lembrei do que acontece no dia-a-dia do nosso mercado; do ambiente de trabalho a conferências e listas de discussão. Sem querer entrar em detalhes profundos ou em opiniões/<a href="http://gc.blog.br/2007/06/05/flame-wars/">flames</a> sobre assuntos não-técnicos, vejo que existem dois tipos de programadores: os <strong>Religiosos</strong> e os <strong>Filósofos</strong>.</p>
<p>A palavra <a href="http://pt.wikipedia.org/wiki/Religi%C3%A3o" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Religi_C3_A3o?referer=');">&#8220;religião&#8221;</a> vem do latim &#8220;religio&#8221;, que significa &#8220;prestar culto a uma divindade&#8221;. Os programadores <strong>Religiosos</strong> fazem exatamente isso: aproveitam todas as oportunidades que podem para louvarem a sua linguagem ou framework favoritos. Os <strong>Religiosos</strong> dificilmente aceitam &#8220;religiões&#8221; diferentes da sua e os mais extremistas acreditam que a sua linguagem ou framework resolve todos os problemas do universo e são a chave da salvação da humanidade. Eles aceitam tudo cegamente e nunca reconhecem ou questionam os defeitos desses projetos que apoiam (e em alguns casos mais extremos até transformam esses problemas em <a href="http://en.wikipedia.org/wiki/Feature_%28software_design%29" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Feature_28software_design_29?referer=');">&#8220;features&#8221;</a>). Quando aparece um problema pela frente não precisa nem pensar: ele usará a sua ferramenta favorita para resolvê-lo, não importa o que seja (um padrão também conhecido como <a href="http://en.wikipedia.org/wiki/One_Ring" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/One_Ring?referer=');">&#8220;One Ring to rule them all&#8221;</a>).</p>
<p><a href="http://pt.wikipedia.org/wiki/Filosofia" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Filosofia?referer=');">&#8220;Filosofia&#8221;</a> vem do grego &#8220;philos&#8221; (que ama) + &#8220;sophia&#8221; (sabedoria), ou seja, &#8220;que ama a sabedoria&#8221;. Filosofia é a investigação crítica e racional de questões, ou seja, um programador <strong>Filósofo</strong> não está procurando defender uma linguagem ou framework mas sim em investigar várias delas, analisar como elas funcionam e refletir sobre como elas podem ajudá-lo a resolver problemas. Os <strong>Filósofos</strong> são curiosos; eles sempre querem compreender e questionar o funcionamento e utilidade das ferramentas que usam. Quando precisam resolver um problema eles analisam de forma racional todas as opções que conhecem e se nenhuma delas for boa o suficiente eles pesquisam e procuram uma opção mais eficiente. </p>
<p>Um programador precisa resolver problemas complexos com qualidade e precisa ser cada vez mais produtivo/veloz para atingir um objetivo (desenvolver um produto, terminar um projeto da sua empresa e por ai vai). A melhor ferramenta não é a sua preferida ou aquela que você escolheu para seguir e amar, e sim aquela que te faz ser mais rápido, mais produtivo, com mais qualidade e que te dá mais conforto para trabalhar. A melhor ferramenta é a que melhor atende os requisitos da sua profissão e do seu projeto, não o seu <a href="http://pt.wikipedia.org/wiki/Ego" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Ego?referer=');">ego</a> (ou sua religião).</p>
<p><strong>Seja menos &#8220;religioso&#8221; e mais &#8220;filósofo&#8221;!</strong> Com a mente aberta e sem encarar ferramentas como &#8220;a verdade definitiva&#8221; (ou descartando-as sem ao menos testar e conhecer como funcionam) você terá muito mais chances de ser bem-sucedido.</p>
]]></content:encoded>
			<wfw:commentRss>http://gc.blog.br/2010/03/01/programador-religioso-x-filosofo/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Colaboração e Open Source dentro da empresa</title>
		<link>http://gc.blog.br/2009/09/24/colaboracao-e-open-source-dentro-da-empresa/</link>
		<comments>http://gc.blog.br/2009/09/24/colaboracao-e-open-source-dentro-da-empresa/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 19:15:20 +0000</pubDate>
		<dc:creator>Guilherme Chapiewski</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[CVS]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[Gitorious]]></category>
		<category><![CDATA[Globo.com]]></category>
		<category><![CDATA[Google Code]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Savannah]]></category>
		<category><![CDATA[SCM]]></category>
		<category><![CDATA[SourceForge]]></category>
		<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://gc.blog.br/?p=1254</guid>
		<description><![CDATA[O Github sem sombra de dúvidas mudou a forma como funciona a colaboração em projetos Open Souce. Já existiam alguns websites de colaboração nesse sentido (e até bem conhecidos) como o SourceForge, Google Code, Savannah e vários outros. Todos eles tem várias qualidades mas o Github na minha opinião foi o que conseguiu ser o [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://github.com" onclick="urchinTracker('/outgoing/github.com?referer=');">Github</a> sem sombra de dúvidas mudou a forma como funciona a colaboração em projetos <a href="http://en.wikipedia.org/wiki/Open_source" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Open_source?referer=');">Open Souce</a>. Já existiam alguns websites de colaboração nesse sentido (e até bem conhecidos) como o <a href="http://sourceforge.net" onclick="urchinTracker('/outgoing/sourceforge.net?referer=');">SourceForge</a>, <a href="http://code.google.com" onclick="urchinTracker('/outgoing/code.google.com?referer=');">Google Code</a>, <a href="http://savannah.gnu.org" onclick="urchinTracker('/outgoing/savannah.gnu.org?referer=');">Savannah</a> e <a href="http://en.wikipedia.org/wiki/Forge_(software)" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Forge_software?referer=');">vários outros</a>. Todos eles tem várias qualidades mas o <a href="http://github.com" onclick="urchinTracker('/outgoing/github.com?referer=');">Github</a> na minha opinião foi o que conseguiu ser o mais bem sucedido: eles uniram uma interface bem agradável a uma rede social de programadores e o sistema de controle de versão <a href="http://git-scm.com" onclick="urchinTracker('/outgoing/git-scm.com?referer=');">Git</a>.</p>
<p>Colaborar com outros projetos é bem fácil no <a href="http://github.com" onclick="urchinTracker('/outgoing/github.com?referer=');">Github</a>, basta <a href="http://help.github.com/forking/" onclick="urchinTracker('/outgoing/help.github.com/forking/?referer=');">fazer um fork</a> do projeto que eu pretendo colaborar, fazer minhas modificações e depois um &#8220;<a href="http://github.com/guides/pull-requests" onclick="urchinTracker('/outgoing/github.com/guides/pull-requests?referer=');">pull request</a>&#8221; para o dono do projeto avaliar e integrar (ou não) o meu código ao dele. Antes do <a href="http://github.com" onclick="urchinTracker('/outgoing/github.com?referer=');">Github</a> não funcionava muito diferente disso mas o que ele fez de bom foi facilitar esse fluxo e criar uma rede social bem interessante em torno desse mundo.</p>
<p>Isso é bem diferente de como as empresas normalmente funcionam. No caso da <a href="http://globo.com" onclick="urchinTracker('/outgoing/globo.com?referer=');">Globo.com</a>, por exemplo, todos os repositórios sempre estiveram amontoados nos servidores <a href="http://www.nongnu.org/cvs/" onclick="urchinTracker('/outgoing/www.nongnu.org/cvs/?referer=');">CVS</a> e <a href="http://subversion.tigris.org" onclick="urchinTracker('/outgoing/subversion.tigris.org?referer=');">Subversion</a> e consequentemente &#8220;escondidos&#8221; (pouco visíveis) de possíveis colaboradores. Alguns até tinham permissão de commit restrita para um pequeno grupo e o processo de colaboração era ainda mais difícil. Não dá nem para abrir um branch seu, você tem que fazer as modificações localmente e mandar um patch por e-mail, e o merge geralmente não é muito fácil de fazer quando você tem um grande fluxos de merge para lá e para cá. Imagina então quando você trabalha na versão &#8220;v1&#8243; do código e enquanto você produz a &#8220;v2&#8243; um outro desenvolvedor pede merge antes de você? Era preciso esperar o merge terminar para dar checkout da versão nova e ficar mais uma vez fazendo o inferno do merge.</p>
<p>No início desse ano resolvemos experimentar usar o <a href="http://gitorious.org" onclick="urchinTracker('/outgoing/gitorious.org?referer=');">Gitorious</a>, que é uma ferramenta similar ao <a href="http://github.com" onclick="urchinTracker('/outgoing/github.com?referer=');">Github</a> porém Open Source e que você pode instalar num servidor da sua empresa. Isso tinha 2 objetivos: (1) criar uma cultura de &#8220;enterprise&#8221; Open Source e (2) facilitar a colaboração em projetos em que vários times trabalham e commitam ao mesmo tempo.</p>
<p>No início foi um inferno e houve uma rejeição muito grande de muita gente. O modelo de trabalho com o <a href="http://git-scm.com" onclick="urchinTracker('/outgoing/git-scm.com?referer=');">Git</a> é bem diferente do que com <a href="http://www.nongnu.org/cvs/" onclick="urchinTracker('/outgoing/www.nongnu.org/cvs/?referer=');">CVS</a> e Subversion. Você tem branches (e clones &#8211; que é um conceito um pouco diferente) que podem ser locais ou remotos, commits locais que não vão direto para o servidor e pulls/pushes. As pessoas tendem a fazer relações do tipo &#8220;o push é o que manda as coisas para o servidor, então ele equivale ao commit&#8221;. Mas então o que é o commit do Git? Enfim, não dá pra trabalhar pensando assim, é preciso dar um reset e entender a arquitetura desses sistemas de controle de versão distribuídos para entender que faz sentido sim ter um commit e só depois do push que o código está no repositório (no remoto, porque no local já estava). <img src='http://gc.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Também foi difícil aprender a trabalhar com merges. No modelo antigo você evita fazer merges o máximo possível porque o trabalho para fazer isso é enorme. Geralmente você só faz quando acabou de fazer tudo para ter trabalho uma vez só. Ainda bem que existem ferramentas para ajudar (como as ferramentas das próprias IDEs) senão seria complicado. Se você trabalha da mesma forma com o <a href="http://git-scm.com" onclick="urchinTracker('/outgoing/git-scm.com?referer=');">Git</a> geralmente vai se dar mal, porque não existem (não existiam mas estão começando a melhorar) as mesmas ferramentas de merge visual do <a href="http://www.nongnu.org/cvs/" onclick="urchinTracker('/outgoing/www.nongnu.org/cvs/?referer=');">CVS</a> ou Subversion, e era um <strong>parto</strong> para fazer a coisa toda funcionar após fazer um merge de uma semana de fork. Com o <a href="http://git-scm.com" onclick="urchinTracker('/outgoing/git-scm.com?referer=');">Git</a> funciona ao contrário: como o merge é automático (na maioria dos casos ele consegue se virar) então a estratégia é fazer merge <strong>toda hora</strong>, várias vezes por dia, o máximo que der.</p>
<p>Depois de alguns meses de &#8220;fricção&#8221; hoje já dá para ver um monte de frutos começando a aparecer. Por exemplo, no último sprint do meu time nós precisavamos usar um cliente <a href="http://python.org" onclick="urchinTracker('/outgoing/python.org?referer=');">Python</a> para acessar a engine de busca da <a href="http://globo.com" onclick="urchinTracker('/outgoing/globo.com?referer=');">Globo.com</a>. Como esse cliente era novo tinha uma série de problemas pequenos que precisavam ser resolvidos, mas o time que é responsável pelo projeto estava com vários compromissos e demoraria 2 semanas para trabalhar nisso. Então o <a href="http://blogs.manicprogrammer.com/heynemann/" onclick="urchinTracker('/outgoing/blogs.manicprogrammer.com/heynemann/?referer=');">Bernardo</a> e o <a href="http://www.andrewsmedina.com" onclick="urchinTracker('/outgoing/www.andrewsmedina.com?referer=');">Andrews</a> decidiram fazer um clone no <a href="http://gitorious.org" onclick="urchinTracker('/outgoing/gitorious.org?referer=');">Gitorious</a> para contribuir com o projeto do time de busca, e eles não só resolveram os problemas como devolveram o código <a href="http://pt.wikipedia.org/wiki/Refatora%C3%A7%C3%A3o" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Refatora_C3_A7_C3_A3o?referer=');">refatorado</a> e com a <a href="http://en.wikipedia.org/wiki/Code_coverage" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Code_coverage?referer=');">cobertura de testes</a> bem melhor. O outro time rapidamente integrou o novo código ao projeto e gostou tanto do trabalho deles que eles viraram commiters e agora podem fazer as modificações que forem necessárias em colaboração com o time de busca. <strong>Exatamente</strong> como funciona no mundo Open Source.</p>
<p>Além desse exemplo, no projeto que estou trabalhando (que é um framework para sites de publicação de conteúdo) temos vários times trabalhando no mesmo código ao mesmo tempo. Nesse momento tem cerca de 10 clones do projeto no nosso <a href="http://gitorious.org" onclick="urchinTracker('/outgoing/gitorious.org?referer=');">Gitorious</a> e talvez cerca de 10 times trabalhando usando o mesmo código para fazer seus &#8220;add-ons&#8221;. O <a href="http://git-scm.com" onclick="urchinTracker('/outgoing/git-scm.com?referer=');">Git</a> facilita o trabalho dos times para atualizarem constantemente sua base de código com o que entra de novo no branch master do <em>mainline</em> (o repositório principal do projeto) e o <a href="http://gitorious.org" onclick="urchinTracker('/outgoing/gitorious.org?referer=');">Gitorious</a> torna isso tudo mais visível para todos.</p>
<p>Enfim, as vantages que nós passamos a ter com o <a href="http://git-scm.com" onclick="urchinTracker('/outgoing/git-scm.com?referer=');">Git</a> e <a href="http://gitorious.org" onclick="urchinTracker('/outgoing/gitorious.org?referer=');">Gitorious</a> são várias:</p>
<ul>
<li>Todo mundo pode ver facilmente os projetos que existem e quando novos projetos são criados;</li>
<li>Todo mundo pode ver o que todo mundo está fazendo e em que estão trabalhando;</li>
<li>Todo mundo pode facilmente criar e gerenciar seus projetos (sem precisar do <a href="http://en.wikipedia.org/wiki/System_administrator" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/System_administrator?referer=');">Sys Admin</a>);</li>
<li>É bem facil de navegar nos projetos, ver e pegar código dos outros;</li>
<li>Todo mundo pode criar seus clones de repositórios para trabalhar em cima do seu código e do código dos outros;</li>
<li>Todo mundo pode colaborar de volta sem precisar de um processo complicado para isso;</li>
<li>É mais fácil de fazer merges constantes e gerenciar múltiplas colaboracoes simultâneas;</li>
<li>Fora as outras features interessantes que o Git tem e os sistemas de SCM antigos não como o <a href="http://www.kernel.org/pub/software/scm/git/docs/git-stash.html" onclick="urchinTracker('/outgoing/www.kernel.org/pub/software/scm/git/docs/git-stash.html?referer=');">stash</a>, <a href="http://www.kernel.org/pub/software/scm/git-core/docs/git-clone.html" onclick="urchinTracker('/outgoing/www.kernel.org/pub/software/scm/git-core/docs/git-clone.html?referer=');">clones</a>, <a href="http://www.kernel.org/pub/software/scm/git/docs/git-merge.html" onclick="urchinTracker('/outgoing/www.kernel.org/pub/software/scm/git/docs/git-merge.html?referer=');">merge</a> automático e por aí vai.</li>
</ul>
<p>Só para dizer um ponto negativo, a documentação de usuários do <a href="http://git-scm.com" onclick="urchinTracker('/outgoing/git-scm.com?referer=');">Git</a> não é das melhores (mas tem melhorado bastante) e alguns comandos não são tão intuitivos (como deletar um branch remoto), mas nada que você não descubra e que não se acostume com o tempo.</p>
<p>Aconselho fortemente a todo mundo que puder que faça isso. Instale o <a href="http://gitorious.org" onclick="urchinTracker('/outgoing/gitorious.org?referer=');">Gitorious</a> e fomente a colaboração entre os desenvolvedores da sua empresa! Se você estiver com muita grana também pode dar uma olhada no <a href="http://fi.github.com" onclick="urchinTracker('/outgoing/fi.github.com?referer=');">Github Firewall Install</a>, que deve ser bem legal mas também é <strong>bem</strong> caro.</p>
]]></content:encoded>
			<wfw:commentRss>http://gc.blog.br/2009/09/24/colaboracao-e-open-source-dentro-da-empresa/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>&#8220;50 in 50&#8243;, por Richard P. Gabriel e Guy L. Steele</title>
		<link>http://gc.blog.br/2009/08/27/50-in-50-por-richard-p-gabriel-e-guy-l-steele/</link>
		<comments>http://gc.blog.br/2009/08/27/50-in-50-por-richard-p-gabriel-e-guy-l-steele/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 14:22:25 +0000</pubDate>
		<dc:creator>Guilherme Chapiewski</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[50 in 50]]></category>
		<category><![CDATA[Eternal Flame]]></category>
		<category><![CDATA[Guy L. Steele]]></category>
		<category><![CDATA[JAOO]]></category>
		<category><![CDATA[Lisp]]></category>
		<category><![CDATA[Palestra]]></category>
		<category><![CDATA[QCon]]></category>
		<category><![CDATA[Richard P. Gabriel]]></category>

		<guid isPermaLink="false">http://gc.blog.br/?p=1202</guid>
		<description><![CDATA[Quem gosta de apresentações épicas vai gostar desse vídeo. Assisti essa apresentação ao vivo na QCon 2007 e foi incrível, certamente uma das mais interessantes que eu já vi! Ontem comentei isso com o Henrique que acabou achando esse video que eu sempre procurei loucamente!
Apresentada por Richard P. Gabriel e Guy L. Steele, a palestra [...]]]></description>
			<content:encoded><![CDATA[<p>Quem gosta de apresentações épicas vai gostar desse vídeo. Assisti essa apresentação ao vivo na <a href="http://gc.blog.br/2007/11/02/qcon-2007-ai-vou-eu/">QCon 2007</a> e foi <strong>incrível</strong>, certamente uma das mais interessantes que eu já vi! Ontem comentei isso com o <a href="http://henriquebastos.net/" onclick="urchinTracker('/outgoing/henriquebastos.net/?referer=');">Henrique</a> que acabou achando esse video que eu sempre procurei loucamente!</p>
<p>Apresentada por <a href="http://en.wikipedia.org/wiki/Richard_P._Gabriel" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Richard_P._Gabriel?referer=');">Richard P. Gabriel</a> e <a href="http://en.wikipedia.org/wiki/Guy_L._Steele,_Jr." onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Guy_L._Steele_Jr.?referer=');">Guy L. Steele</a>, a palestra <strong>50 in 50</strong> fala de 50 tópicos sobre linguagens de programação e 50 anos de história de computação em 50 minutos. Tem pérolas musicais como a sensacional <a href="http://www.songworm.com/lyrics/songworm-parody/EternalFlame.html" onclick="urchinTracker('/outgoing/www.songworm.com/lyrics/songworm-parody/EternalFlame.html?referer=');"><em>&#8220;Eternal Flame&#8221;</em></a> (também conhecida como <em>&#8220;God had a deadline, so he wrote it all in Lisp&#8221;</em>), <a href="http://www.youtube.com/watch?v=-e8oBF4IrgU" onclick="urchinTracker('/outgoing/www.youtube.com/watch?v=-e8oBF4IrgU&amp;referer=');">representações teatrais</a> de um programa escrito usando <a href="http://shakespearelang.sourceforge.net" onclick="urchinTracker('/outgoing/shakespearelang.sourceforge.net?referer=');">Shakespeare Programming Language</a> e muito mais! <strong>É imperdível!</strong></p>
<p><embed src="http://blip.tv/play/6VbaqWSJtgc" type="application/x-shockwave-flash" width="450" height="358" allowscriptaccess="always" allowfullscreen="true"></embed> </p>
<p>Para ver com qualidade melhor, <a href="http://jaoo.blip.tv/file/1472720/" onclick="urchinTracker('/outgoing/jaoo.blip.tv/file/1472720/?referer=');">acesse o video no Blip.tv da JAOO</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://gc.blog.br/2009/08/27/50-in-50-por-richard-p-gabriel-e-guy-l-steele/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Rails Conf] Conselhos do Uncle Bob</title>
		<link>http://gc.blog.br/2009/05/08/rails-conf-conselhos-do-uncle-bob/</link>
		<comments>http://gc.blog.br/2009/05/08/rails-conf-conselhos-do-uncle-bob/#comments</comments>
		<pubDate>Fri, 08 May 2009 18:01:35 +0000</pubDate>
		<dc:creator>Guilherme Chapiewski</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Fabio Akita]]></category>
		<category><![CDATA[Rails Conf]]></category>
		<category><![CDATA[Uncle Bob]]></category>

		<guid isPermaLink="false">http://gc.blog.br/?p=991</guid>
		<description><![CDATA[Excelente!  

Uncle Bob Martin na RailsConf 2009 from Fabio Akita on Vimeo.
]]></description>
			<content:encoded><![CDATA[<p>Excelente! <img src='http://gc.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><object width="450" height="259"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4523516&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=4523516&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="450" height="259"></embed></object>
<p><a href="http://vimeo.com/4523516" onclick="urchinTracker('/outgoing/vimeo.com/4523516?referer=');">Uncle Bob Martin na RailsConf 2009</a> from <a href="http://vimeo.com/akitaonrails" onclick="urchinTracker('/outgoing/vimeo.com/akitaonrails?referer=');">Fabio Akita</a> on <a href="http://vimeo.com" onclick="urchinTracker('/outgoing/vimeo.com?referer=');">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://gc.blog.br/2009/05/08/rails-conf-conselhos-do-uncle-bob/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Arquitetura &#8220;pull&#8221; ou &#8220;push&#8221;: qual escala mais?</title>
		<link>http://gc.blog.br/2009/02/25/arquitetura-pull-ou-push-qual-escala-mais/</link>
		<comments>http://gc.blog.br/2009/02/25/arquitetura-pull-ou-push-qual-escala-mais/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 05:38:22 +0000</pubDate>
		<dc:creator>Guilherme Chapiewski</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Webservices]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Firehose]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[Pingback]]></category>
		<category><![CDATA[Postfix]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[XMPP]]></category>

		<guid isPermaLink="false">http://gc.blog.br/?p=802</guid>
		<description><![CDATA[Apesar do que possa parecer, esse post não é sobre git.  
Conversando com o Peleteiro esses dias ele me deu uma idéia interessante. Ia ser o máximo se houvesse um post automático no meu Twitter toda vez que eu ganhasse um achievement no Xbox! Os achievements são como se fossem medalhas: na medida que [...]]]></description>
			<content:encoded><![CDATA[<p>Apesar do que possa parecer, esse post não é sobre <a href="http://twitpic.com/15232" onclick="urchinTracker('/outgoing/twitpic.com/15232?referer=');">git</a>. <img src='http://gc.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Conversando com o <a href="http://peleteiro.net" onclick="urchinTracker('/outgoing/peleteiro.net?referer=');">Peleteiro</a> esses dias ele me deu uma idéia interessante. Ia ser o máximo se houvesse um post automático no <a href="http://twitter.com/gchapiewski" onclick="urchinTracker('/outgoing/twitter.com/gchapiewski?referer=');">meu Twitter</a> toda vez que eu ganhasse um <a href="http://en.wikipedia.org/wiki/Xbox_Live" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Xbox_Live?referer=');">achievement no Xbox</a>! Os achievements são como se fossem medalhas: na medida que você vai jogando os jogos e passando de fase ou conquistando coisas, você vai ganhando mais pontos e mais medalhas. Resumindo, é totalmente inútil mas bem legal.</p>
<p>Como nos últimos tempos andei fazendo uma porção de robôs de Twitter para fazer uma porção de coisas, na mesma hora pensei em fazer mais um deles, que ficaria dando requests na API do Xbox Live até que aparecesse um novo achievement e então ele faria o post.</p>
<p>Na mesma hora me bateu a mesma sensação de ineficiência que tive quando fiz os outros robôs. Pra fazer essas coisas eu tenho que ficar fazendo <a href="http://en.wikipedia.org/wiki/Polling_(computer_science)" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Polling_computer_science?referer=');">polling</a> no serviço de &#8220;n&#8221; em &#8220;n&#8221; minutos para saber das atualizações&#8230; Apesar de ser eficiente nao é lá muito eficaz.</p>
<p>Vou fazer uma brincadeira para mostrar o tamanho do problema. Somando só os robôs que fiz para a Globo.com, eu faço diariamente cerca de 72.000 requests para o Twitter (cerca de 25 robôs x 2 requests por minuto x 60 minutos x 24 horas). Ok, nem todo mundo faz robôs de Twitter, eu sei, mas vamos supor que uma pessoa em cada 100.000 faz robôs que nem eu. Isso significaria que só eu e mais uma pessoa fazemos isso no Brasil inteiro (o que não deve ser verdade, mas vamos continuar assim fazendo a conta por baixo). Então considerando que a <a href="http://pt.wikipedia.org/wiki/Popula%C3%A7%C3%A3o_mundial" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Popula_C3_A7_C3_A3o_mundial?referer=');">população mundial é de quase 7 bilhões de pessoas</a>, temos cerca de 70.000 pessoas fazendo o mesmo em todo o mundo. Sendo assim, pela minha conta de padaria o Twitter recebe algo em torno de <strong>5,04 bilhões de requisições por dia</strong>, 210 milhões de requisições por hora, quase 60.000 requisições por segundo (só de robôs)!!!</p>
<p>Ok, o número deve ser bem diferente disso. O fato é que <strong>com certeza é muito alto</strong>.</p>
<p>Eu faço polling no Twitter para buscar por usuários que falaram uma determinada palavra (usando o <a href="http://search.twitter.com/search.atom?q=gchapiewski" onclick="urchinTracker('/outgoing/search.twitter.com/search.atom?q=gchapiewski&amp;referer=');">RSS</a> da <a href="http://search.twitter.com/search?q=gchapiewski" onclick="urchinTracker('/outgoing/search.twitter.com/search?q=gchapiewski&amp;referer=');">busca do Twitter</a>) e então adicioná-los. Funciona assim: quando uma pessoa escreve alguma coisa que eu estou procurando, eu adiciono ela como amigo(a). Apesar dessa quantidade imensa de buscas e requests, um robô adiciona apenas na faixa de 25 usuários por dia. Se houvesse alguma forma de saber que algum usuário escreveu alguma palavra que eu busco, nesse meu cenário só seria necessário fazer algo em torno de 625 requests por dia (menos de 1% da quantidade que eu faço).</p>
<p>O que eu estou propondo aqui não é nada novo. Além dos mecanismos tradicionais de polling (fazer &#8220;pull&#8221; de arquivos de tempos em tempos), estes tipos de serviços deveriam disponibilizar um mecanismo para o servidor avisar o cliente que alguma informação que ele deseja está disponível (&#8221;push&#8221;).</p>
<p>Depois da apresentação <a href="http://www.slideshare.net/kellan/beyond-rest" onclick="urchinTracker('/outgoing/www.slideshare.net/kellan/beyond-rest?referer=');"><em>&#8220;Beyond REST? Building data services with XMPP&#8221;</em></a> que rolou na <a href="http://radar.oreilly.com/2008/07/oscon-day-1-beyond-rest-buildi.html" onclick="urchinTracker('/outgoing/radar.oreilly.com/2008/07/oscon-day-1-beyond-rest-buildi.html?referer=');">OSCON 2008</a>, o <a href="http://en.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol?referer=');">XMPP</a> entrou na moda como uma possível solução para esse problema. Nessa arquitetura, os clientes se &#8220;inscrevem&#8221; em um serviço de mensagens instantâneas e mantém uma conexão aberta com o servidor para que, quando determinada informação estiver disponível, ela seja enviada ao cliente ao invés dele ter que ficar fazendo &#8220;polling&#8221;. Isso reduz consideravelmente a carga de requests recebida pela aplicação, mas é mais difícil de escalar para uma quantidade muito grande de usuários.</p>
<p>Uma solução que surgiu na nossa conversa foi um &#8220;<a href="http://en.wikipedia.org/wiki/Pingback" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Pingback?referer=');">pingback</a> ao contrário&#8221;. Seria algo como o <a href="http://github.com/guides/post-receive-hooks" onclick="urchinTracker('/outgoing/github.com/guides/post-receive-hooks?referer=');">webhook do Github</a>. Quando o usuário fizer um GET em um recurso, ele poderia mandar um header com uma URL, e quando houvesse alguma atualização do recurso o servidor poderia fazer um GET para esta URL com o objetivo de informar ao cliente que há informações novas disponíveis. Essa solução escala mais do que a primeira, mas tem um lado negativo: não funciona se o cliente não tiver um IP real disponível. No meu caso, por exemplo, que tenho robôs rodando no meu desktop da Globo.com (que não tem IP real), não seria possível usar esse tipo de serviço.</p>
<p>Também dá pra fazer algumas soluções mais criativas usando coisas que a princípio parecem esquisitas mas podem fazer sentido. Por exemplo, um servidor de e-mail como o Postfix poderia fazer esse trabalho com o pé nas costas. Quando o cliente acessasse um recurso, ele poderia informar em um header um e-mail para ser notificado quando houvesse atualização. É uma solução bem fácil de escalar e de fácil implementação &#8211; tanto pelo lado do cliente quanto do servidor &#8211; apesar de não ser muito comum.</p>
<p><a href="http://metajack.im/2008/10/23/twitter-says-they-have-data-but-they-just-have-a-big-mouth/" onclick="urchinTracker('/outgoing/metajack.im/2008/10/23/twitter-says-they-have-data-but-they-just-have-a-big-mouth/?referer=');">Pelo que eu andei lendo o pessoal do Twitter já pensou nesse problema e para resolvê-lo criaram o Firehose</a>, que é uma solução baseada em XMPP. Como eu falei, o problema não termina por aí &#8211; <a href="http://www.dehora.net/journal/2008/10/25/scaling-xmpp-and-pubsub/" onclick="urchinTracker('/outgoing/www.dehora.net/journal/2008/10/25/scaling-xmpp-and-pubsub/?referer=');">eles terão vários problemas novos para escalar XMPP para uma grande quantidade de usuários</a>.</p>
<p>Enfim, esse problema é bem interessante&#8230; Na próxima oportunidade que tiver vou tentar fazer uma prova de conceito de todas essas opções para ver no que dá.</p>
<p><a href="http://www.google.com.br/search?q=rails+não+escala" onclick="urchinTracker('/outgoing/www.google.com.br/search?q=rails+n_o+escala&amp;referer=');">E para aqueles que ainda não entenderam</a>, talvez fique um pouco mais claro agora: escalabilidade é muito mais uma questão de arquitetura de software e infra-estrutura do que de linguagens e frameworks.</p>
]]></content:encoded>
			<wfw:commentRss>http://gc.blog.br/2009/02/25/arquitetura-pull-ou-push-qual-escala-mais/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Java é ruim?</title>
		<link>http://gc.blog.br/2008/10/19/java-e-ruim/</link>
		<comments>http://gc.blog.br/2008/10/19/java-e-ruim/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 02:21:35 +0000</pubDate>
		<dc:creator>Guilherme Chapiewski</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Applets]]></category>
		<category><![CDATA[Assembly]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Fortran]]></category>
		<category><![CDATA[Globo.com]]></category>
		<category><![CDATA[IAX]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[MS SQL Server]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Piet]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[Shell script]]></category>
		<category><![CDATA[SIP]]></category>
		<category><![CDATA[VoIP]]></category>

		<guid isPermaLink="false">http://gc.blog.br/?p=510</guid>
		<description><![CDATA[Em tempos de Ruby on Rails parece que está na moda falar mal de Java. Na Rails Summit então meus ouvidos chegaram a doer de tanto ouvir falar que Java é ruim, Java é burocrático, bla bla bla e que Ruby on Rails é fantástico, produtivo e sexy. Calma, essa não é mais uma daquelas [...]]]></description>
			<content:encoded><![CDATA[<p>Em tempos de <a href="http://pt.wikipedia.org/wiki/Ruby_on_Rails" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Ruby_on_Rails?referer=');">Ruby on Rails</a> parece que <a href="http://desciclo.pedia.ws/wiki/Java" onclick="urchinTracker('/outgoing/desciclo.pedia.ws/wiki/Java?referer=');">está na moda falar mal de Java</a>. Na <a href="http://gc.blog.br/2008/10/14/rails-summit-latin-america-ai-vou-eu/">Rails Summit</a> então meus ouvidos chegaram a doer de tanto ouvir falar que Java é ruim, Java é burocrático, bla bla bla e que Ruby on Rails é fantástico, produtivo e <a href="http://www.google.com.br/search?q=ruby+on+rails+sexy" onclick="urchinTracker('/outgoing/www.google.com.br/search?q=ruby+on+rails+sexy&amp;referer=');">sexy</a>. Calma, essa não é mais uma daquelas <a href="http://www.google.com.br/search?q=Java+versus+Ruby+on+Rails" onclick="urchinTracker('/outgoing/www.google.com.br/search?q=Java+versus+Ruby+on+Rails&amp;referer=');">comparações ridículas de Java versus Ruby on Rails</a>.</p>
<p>Mas ainda ficou a pergunta que não quer calar: Java é ruim mesmo? A resposta, como sempre, é que depende do caso&#8230;</p>
<p>Em um projeto de desenvolvimento de software, mesmo antes de começar o desenvolvimento você já tem algumas restrições para escolher tecnologias. A finalidade do software por si só pode já restrigir muito a tecnologia que terá que ser usada.</p>
<p>Por exemplo, se você estiver fazendo um website, provavelmente você não escapará de fazer uma interface em <a href="http://pt.wikipedia.org/wiki/HTML" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/HTML?referer=');">HTML</a>, <a href="http://pt.wikipedia.org/wiki/Adobe_Flash" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Adobe_Flash?referer=');">Flash</a> ou qualquer outra coisa específica para desenvolver uma camada de apresentação web. Provavelmente você não vai querer usar <a href="http://pt.wikipedia.org/wiki/Assembly" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Assembly?referer=');">Assembly</a> para fazer a parte server-side, já que não seria muito produtivo (apesar de não ser impossível). Eventualmente esse site pode ser um portal como a <a href="http://globo.com" onclick="urchinTracker('/outgoing/globo.com?referer=');">Globo.com</a> que têm milhões de acessos por dia e você terá que escolher uma plataforma/linguagem/arquitetura que priorizem performance e favoreçam escalabilidade. Ou então pode ser um site com pouquíssimos acessos e você nem precisará se preocupar com isso&#8230;</p>
<p>Ou então você pode precisar fazer um pequeno script para fazer backup automatizado de um banco de dados <a href="http://www.mysql.com/" onclick="urchinTracker('/outgoing/www.mysql.com/?referer=');">MySQL</a>. Seria totalmente incoerente usar <a href="http://www.borland.com/br/products/delphi/index.html" onclick="urchinTracker('/outgoing/www.borland.com/br/products/delphi/index.html?referer=');">Delphi</a>, <a href="http://www.fortran.com/" onclick="urchinTracker('/outgoing/www.fortran.com/?referer=');">Fortran</a> ou <a href="http://en.wikipedia.org/wiki/Piet" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Piet?referer=');">Piet</a>. Provavelmente você vai querer usar algo como <a href="http://pt.wikipedia.org/wiki/Shell_script" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Shell_script?referer=');">Shell script</a> e resolver o problema em meia dúzia de linhas. Alguns bancos como o <a href="http://www.microsoft.com/sqlserver/2008/en/us/default.aspx" onclick="urchinTracker('/outgoing/www.microsoft.com/sqlserver/2008/en/us/default.aspx?referer=');">SQL Server</a> têm mecanismos de agendamento de backup automático que são super fáceis de configurar e usar, portanto nesse caso usar Shell script seria trabalho desnecessário.</p>
<p>Meu ponto aqui é que não dá para dizer que Java (ou qualquer outra coisa) é ruim por sí só. Java pode ser ruim ou bom dentro de um contexto. Por exemplo, em 2005 eu trabalhei num projeto de Call Center à distância via Internet onde precisei desenvolver um <a href="http://www.voip-info.org/wiki-VOIP+Phones#SoftPhones" onclick="urchinTracker('/outgoing/www.voip-info.org/wiki-VOIP+Phones_SoftPhones?referer=');">softphone</a> e a melhor opção foi usar <a href="http://java.sun.com/applets/" onclick="urchinTracker('/outgoing/java.sun.com/applets/?referer=');">Java Applets</a>. Além de existirem <a href="http://www.hem.za.org/jiaxclient/" onclick="urchinTracker('/outgoing/www.hem.za.org/jiaxclient/?referer=');">bibliotecas Java para trabalhar com IAX</a> (que é um protocolo como o <a href="http://pt.wikipedia.org/wiki/SIP" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/SIP?referer=');">SIP</a>, só que proprietário do <a href="http://www.asterisk.org/" onclick="urchinTracker('/outgoing/www.asterisk.org/?referer=');">Asterisk</a>), o usuário não precisava instalar nenhum programa para falar com o Call Center, bastava acessar o site. Eu odeio Applets com todas as minhas forças, mas foi ótimo para esse projeto (eu diria até que foi relativamente fácil). Seria correto então dizer que Ruby on Rails é ruim só porque seria impossível de fazer esse projeto com tanta facilidade? <strong>É óbvio que não!!!</strong></p>
<p><strong>Jamais existirá uma única linguagem ou plataforma para resolver todos os problemas.</strong> O desenvolvedor de software precisa conhecer vários tipos de ferramenta e saber escolher a melhor delas para resolver cada problema. Que fique claro que eu não sou defensor de Java, Ruby ou de qualquer outra coisa. O caso é que é incoerente dizer que X ou Y é bom ou ruim por sí só; é preciso analisar as opções dentro de um contexto.</p>
]]></content:encoded>
			<wfw:commentRss>http://gc.blog.br/2008/10/19/java-e-ruim/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>Simplicidade</title>
		<link>http://gc.blog.br/2008/08/30/simplicidade/</link>
		<comments>http://gc.blog.br/2008/08/30/simplicidade/#comments</comments>
		<pubDate>Sat, 30 Aug 2008 14:36:33 +0000</pubDate>
		<dc:creator>Guilherme Chapiewski</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[37 Signals]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Boas práticas]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Garr Reynolds]]></category>
		<category><![CDATA[Getting Real]]></category>
		<category><![CDATA[Presentation Zen]]></category>
		<category><![CDATA[Simplicidade]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://gc.blog.br/?p=430</guid>
		<description><![CDATA[Há mais ou menos um mês terminei de ler o livro Presentation Zen do Garr Reynolds. O livro é muito legal e tem excelentes dicas sobre como fazer apresentações baseadas nos princípios Zen. O Garr trabalhou durante muito tempo na Apple fazendo design de apresentações e é fato que a Apple arrebenta nesse quesito. Depois [...]]]></description>
			<content:encoded><![CDATA[<p>Há mais ou menos um mês terminei de ler o livro <a href="http://www.amazon.com/Presentation-Zen-Simple-Design-Delivery/dp/0321525655" onclick="urchinTracker('/outgoing/www.amazon.com/Presentation-Zen-Simple-Design-Delivery/dp/0321525655?referer=');"><em>Presentation Zen</em></a> do <a href="http://www.presentationzen.com/" onclick="urchinTracker('/outgoing/www.presentationzen.com/?referer=');">Garr Reynolds</a>. O livro é muito legal e tem excelentes dicas sobre como fazer apresentações baseadas nos princípios <a href="http://pt.wikipedia.org/wiki/Zen" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Zen?referer=');">Zen</a>. O Garr trabalhou durante muito tempo na <a href="http://www.apple.com/" onclick="urchinTracker('/outgoing/www.apple.com/?referer=');">Apple</a> fazendo design de apresentações e é fato que <a href="http://presentationzen.blogs.com/presentationzen/2005/11/the_zen_estheti.html" onclick="urchinTracker('/outgoing/presentationzen.blogs.com/presentationzen/2005/11/the_zen_estheti.html?referer=');">a Apple arrebenta nesse quesito</a>. Depois de assistir <a href="http://gc.blog.br/2008/06/10/apple-wwdc-2008-direto-dos-bastidores/">apresentações que foram verdadeiros shows na Apple WWDC</a> decidí ler o livro e tentar aprender alguma coisa sobre o que eles fazem.</p>
<p>Quando eu estava lendo o livro, um trecho de um capítulo que fala sobre os <strong>princípios de design</strong> acendeu uma lâmpada na minha cabeça e me fez atentar para uma coisa que acontece diariamente no desenvolvimento de software:</p>
<blockquote><p><em>&#8220;Design can make things easier for the viewer or the user. Design is not decoration. If anything, design is more about subtraction than addition. Visually, we do not want to include too much, nor do we want to exclude too much. <strong>Generally, people err on the side of including too much visual information, which often results in clutter and confusion.</strong>&#8220;</em></p></blockquote>
<p>É verdade. Existe uma tendência grande das pessoas acharem que mais funcionalidades e complexidade é sempre melhor. As pessoas pensam exatamente como descreve o livro <a href="http://gettingreal.37signals.com/ch02_Build_Less.php" onclick="urchinTracker('/outgoing/gettingreal.37signals.com/ch02_Build_Less.php?referer=');"><em>Getting Real</em></a> da <a href="http://www.37signals.com/" onclick="urchinTracker('/outgoing/www.37signals.com/?referer=');">37 Signals</a>:</p>
<blockquote><p><em>&#8220;Conventional wisdom says that to beat your competitors you need to one-up them. If they have four features, you need five (or 15, or 25). If they&#8217;re spending x, you need to spend xx. If they have 20, you need 30.</p>
<p><strong>This sort of one-upping Cold War mentality is a dead-end.</strong> It&#8217;s an expensive, defensive, and paranoid way of building products. <strong>Defensive, paranoid companies can&#8217;t think ahead, they can only think behind. They don&#8217;t lead, they follow.</strong>&#8220;</em></p></blockquote>
<p>Transportando para o mundo do desenvolvimento de software, eu vejo que muitos desenvolvedores adoram entulhar seus códigos com todos os <a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Design_pattern_computer_science?referer=');">design patterns</a> que já ouviram falar, adoram usar <a href="http://java.sun.com/products/ejb/" onclick="urchinTracker('/outgoing/java.sun.com/products/ejb/?referer=');">EJBs</a> em qualquer coisa, adoram inventar seus frameworks malucos&#8230; Enfim, adoram fazer tudo que é complexo e trabalhoso. Assim como no design, entulhar o código com essas coisas só fazem ele ficar muito mais difícil de ser mantido e entendido!</p>
<p>Talvez um dos motivos disso acontecer seja que nem sempre o desenvolvedor tem senso de urgência e visão do negócio. Nem sempre ele entende que não dá para perder 3 dias fazendo um menu <a href="http://pt.wikipedia.org/wiki/JavaScript" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/JavaScript?referer=');">JavaScript</a> que abre e fecha, ou passar 80% do tempo tentando encaixar design patterns no código, ou criar uma arquitetura com 36 camadas para diminuir o acoplamento. Essas coisas podem ser extremamente prejudiciais para o projeto, porque o cliente está esperando triplicar o faturamento e o número de visitantes do seu site e essas coisas não vão ajudar em absolutamente nada. A oportunidade de usar design patterns, criar camadas no software ou qualquer outra coisa surgirá naturalmente no decorrer do projeto. Se isso não acontecer, então simplesmente não os use.</p>
<p>Uma dica para descobrir se você ou alguém está fazendo uma coisa útil ou não é tentar responder a seguinte pergunta: &#8220;Qual problema será resolvido com isso?&#8221;. Ultimamente tenho feito essa pergunta para todo mundo e percebí que muito mais da metade das coisas não são justificáveis. É incrível como as pessoas criam coisas sem nenhum motivo, que só deixam o software mais complexo sem necessidade, tanto internamente (código) quanto externamente (interface).</p>
<p>Por isso eu gosto e recomendo trabalhar sempre com uma das regras básicas do <a href="http://www.extremeprogramming.org/" onclick="urchinTracker('/outgoing/www.extremeprogramming.org/?referer=');">XP</a>. Independente de usar <a href="http://www.extremeprogramming.org/" onclick="urchinTracker('/outgoing/www.extremeprogramming.org/?referer=');">XP</a> ou não, a <a href="http://www.extremeprogramming.org/rules/simple.html" onclick="urchinTracker('/outgoing/www.extremeprogramming.org/rules/simple.html?referer=');">simplicidade</a> é uma ótima regra:</p>
<blockquote><p><em>&#8220;A simple design always takes less time to finish than a complex one. So always do the simplest thing that could possibly work. If you find something that is complex replace it with something simple. It&#8217;s always faster and cheaper to replace complex code now, before you waste a lot more time on it. Keep things as simple as possible as long as possible by never adding functionality before it is scheduled. Beware though, keeping a design simple is hard work.&#8221;</em></p></blockquote>
<p>Se você é desenvolvedor e adora complicar tudo, <strong>pare de brincar de <a href="http://pt.wikipedia.org/wiki/Professor_Pardal" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Professor_Pardal?referer=');">professor pardal</a> e pense simples</strong>, ou é isso que vai acontecer com a sua empresa:</p>
<p><a href="http://stuffthathappens.com/blog/2008/03/05/simplicity/" onclick="urchinTracker('/outgoing/stuffthathappens.com/blog/2008/03/05/simplicity/?referer=');"><img src="http://gc.blog.br/wp-content/uploads/2008/08/simplicity.png" alt="" title="Simplicity" width="400" height="772" class="aligncenter size-full wp-image-432" align="center" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://gc.blog.br/2008/08/30/simplicidade/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Cuidando para que o software não apodreça</title>
		<link>http://gc.blog.br/2008/07/20/cuidando-para-que-o-software-nao-apodreca/</link>
		<comments>http://gc.blog.br/2008/07/20/cuidando-para-que-o-software-nao-apodreca/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 02:06:10 +0000</pubDate>
		<dc:creator>Guilherme Chapiewski</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Débito Técnico]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Desenvolvimento Ágil]]></category>

		<guid isPermaLink="false">http://gc.blog.br/2008/07/20/cuidando-para-que-o-software-nao-apodreca/</guid>
		<description><![CDATA[Infeliz o sujeito que teve a idéia de comparar desenvolvimento de software a construção de prédios. Até hoje, em pleno século 21, algumas pessoas ainda acreditam que para fazer software você deve fazer exatamente como na construção civil: você deve ter &#8220;engenheiros&#8221; que fazem um grande projeto especificando exatamente como tudo vai ser, depois os [...]]]></description>
			<content:encoded><![CDATA[<p>Infeliz o sujeito que teve a idéia de comparar desenvolvimento de software a construção de prédios. Até hoje, em pleno século 21, algumas pessoas ainda acreditam que para fazer software você deve fazer exatamente como na construção civil: você deve ter &#8220;engenheiros&#8221; que fazem um grande projeto especificando exatamente como tudo vai ser, depois os pedreiros constroem e no final está tudo pronto e funcionando conforme a especificação.</p>
<p><strong><a href="http://jamesshore.com/Blog/That-Damned-Construction-Analogy.html" onclick="urchinTracker('/outgoing/jamesshore.com/Blog/That-Damned-Construction-Analogy.html?referer=');">Desenvolvimento de software</a> <a href="http://wordaligned.org/articles/why-software-development-isnt-like-construction" onclick="urchinTracker('/outgoing/wordaligned.org/articles/why-software-development-isnt-like-construction?referer=');">não tem</a> <a href="http://www.kuro5hin.org/story/2003/3/13/211831/159" onclick="urchinTracker('/outgoing/www.kuro5hin.org/story/2003/3/13/211831/159?referer=');">absolutamente</a> <a href="http://www.poppendieck.com/construction.htm" onclick="urchinTracker('/outgoing/www.poppendieck.com/construction.htm?referer=');">nada a ver</a> <a href="http://www.agilemanagement.net/Articles/Weblog/ConstructionAnalogyAgain.html" onclick="urchinTracker('/outgoing/www.agilemanagement.net/Articles/Weblog/ConstructionAnalogyAgain.html?referer=');">com construção</a>!</strong></p>
<p>No livro <em><a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/ref=pd_bbs_sr_1?ie=UTF8&#038;s=books&#038;qid=1207921851&#038;sr=8-1" onclick="urchinTracker('/outgoing/www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/ref=pd_bbs_sr_1?ie=UTF8_038_s=books_038_qid=1207921851_038_sr=8-1&amp;referer=');">The Pragmatic Programmer</a></em>, <a href="http://pragdave.pragprog.com/" onclick="urchinTracker('/outgoing/pragdave.pragprog.com/?referer=');">Dave Thomas</a> e <a href="http://blog.toolshed.com/" onclick="urchinTracker('/outgoing/blog.toolshed.com/?referer=');">Andy Hunt</a> fazem uma analogia muito mais apropriada: <strong>fazer software não é como constriur prédios mas sim como jardinagem</strong>. É muito mais &#8220;orgânico&#8221; do que &#8220;concreto&#8221;. Inicialmente você planeja muitas coisas para o seu jardim de acordo com as condições atuais de terra, clima, etc. Você precisa plantar as sementes, regar todo dia e cuidar para que as pragas não acabem com tudo. Você pode com o passar do tempo mover suas plantas de lugar para tirar vantagem de fatores como exposição ao sol, sombra ou até mesmo para fazer a rotatividade da terra. Você poda suas plantas constantemente e move alguns tipos de flores de um lugar para o outro para que o jardim fique melhor esteticamente. Se alguma planta cresce demais, pode ser que o espaço que você planejou para ela tenha ficado pequeno, e então é necessário movê-la de lugar. Enfim, não é uma coisa que você planeja, mas sim uma coisa que você tem uma idéia inicial e trabalha ao longo do tempo para fazer o melhor possível dentro daquela idéia.</p>
<p>Assim como o jardim, se o software não receber todos os cuidados necessários ele apodrece. Quando um software apodrece, é impossível implementar qualquer funcionalidade num tempo aceitável, é impossível colocar em produção sem que alguém tenha que ficar de babá, enfim, tudo passa a ser imprevisível. Nos piores casos passa a ser até impossível &#8220;tocar&#8221; no software, e esses monstros viram aqueles softwares que &#8220;se o servidor desligar ele não liga nunca mais&#8221;. E o pior é que isso acontece toda hora. Quantas vezes você já não pegou um projeto tão ruim, mas tão ruim que seria mais fácil fazer do zero do que consertá-lo? Isso é um sinal claro de software podre.</p>
<p>Para evitar que isso aconteça, o que se deve fazer é reavaliar a situação do software a cada história/funcionalidade implementada. Um bom desenvolvedor sempre avaliará se não é hora de mover algumas coisas de lugar, generalizar algumas funcionalidades, reescrever algumas porções de código e etc. &#8211; assim como faria um bom jardineiro. Isso deveria ser uma lei, não uma opção.</p>
<p>Os times ágeis trabalham com um conceito que é a &#8220;definição de pronto&#8221; (<a href="http://chrissterling.gettingagile.com/2007/10/05/building-a-definition-of-done/" onclick="urchinTracker('/outgoing/chrissterling.gettingagile.com/2007/10/05/building-a-definition-of-done/?referer=');"><em>DOD &#8211; definition of done</em></a>). A definição de pronto diz quando é que uma funcionalidade pode ser considerada pronta ou finalizada. Na minha opinião, para se considerar uma funcionalidade &#8220;pronta&#8221; é necessário no mínimo:</p>
<ul>
<li>Desenvolver a funcionalidade</li>
<li>Testar unitariamente (melhor ainda se for fazendo <a href="http://www.improveit.com.br/xp/praticas/tdd" onclick="urchinTracker('/outgoing/www.improveit.com.br/xp/praticas/tdd?referer=');">TDD</a>)</li>
<li>Testar a integração com outros componentes (quando for o caso)</li>
<li>Verificar se o build do projeto funciona sem erros e fazer o deploy em uma ambiente de produção simulado</li>
<li>Testar segundo os critérios de aceitação estabelecidos pelo cliente</li>
<li>Depois dos testes desenvolvidos e a nova funcionalidade passando em todos eles, avaliar a necessidade de fazer refactoring no novo código</li>
<li>Com a entrada da nova funcionalidade, avaliar a necessidade de fazer refactoring em algum módulo do sistema</li>
<li>Atualizar a documentação (quando necessário)</li>
</ul>
<p>Pode parecer um exagero ou muito trabalho, mas não é. A questão é que você não pode deixar para fazer nenhum desses itens depois de 2 meses de desenvolvimento, você precisa fazer isso desde o primeiro dia! Quando você deixa para depois, você acaba acumulando o famoso <a href="http://www.martinfowler.com/bliki/TechnicalDebt.html" onclick="urchinTracker('/outgoing/www.martinfowler.com/bliki/TechnicalDebt.html?referer=');">débito técnico</a>, e depois poderá ter que pagá-lo com juros, que poderão ser muito altos. O melhor é fazer aos poucos, a cada passo dado, porque desta forma o trabalho sempre será muito menor e não irá onerar o projeto. Mais uma vez fazendo analogias, é como câncer: você pode se previnir e tentar evitar que ele aconteça, ou você pode esperar ficar doente para depois ter que fazer uma arriscada cirurgia invasiva (e mesmo assim pode não dar certo, e aí perde-se o paciente).</p>
]]></content:encoded>
			<wfw:commentRss>http://gc.blog.br/2008/07/20/cuidando-para-que-o-software-nao-apodreca/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>Programadores de Schrödinger</title>
		<link>http://gc.blog.br/2008/04/29/programadores-de-schrodinger/</link>
		<comments>http://gc.blog.br/2008/04/29/programadores-de-schrodinger/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 00:47:38 +0000</pubDate>
		<dc:creator>Guilherme Chapiewski</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Testes]]></category>
		<category><![CDATA[Desenvolvimento Ágil]]></category>
		<category><![CDATA[Donald Knuth]]></category>

		<guid isPermaLink="false">http://gc.blog.br/2008/04/29/programadores-de-schrodinger/</guid>
		<description><![CDATA[Donald Knuth deu uma entrevista para o InformIt esses dias que deu o que falar!
Como o Paulo Silveira comentou no GUJ, Knuth tem algumas opiniões controversas e polêmicas sobre testes unitários, eXtreme Programming, Open Source e programação concorrente. O Phillip Calçado também comentou o assunto, referindo-se a opinião do Keith Braithwaite, que tem ótimos pontos.
Sobre [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.informit.com/articles/article.aspx?p=1193856" onclick="urchinTracker('/outgoing/www.informit.com/articles/article.aspx?p=1193856&amp;referer=');">Donald Knuth deu uma entrevista para o InformIt esses dias</a> que deu o que falar!</p>
<p>Como o <a href="http://www.guj.com.br/posts/list/89174.java" onclick="urchinTracker('/outgoing/www.guj.com.br/posts/list/89174.java?referer=');">Paulo Silveira comentou no GUJ</a>, <a href="http://www-cs-staff.stanford.edu/~uno/" onclick="urchinTracker('/outgoing/www-cs-staff.stanford.edu/_uno/?referer=');">Knuth</a> tem algumas opiniões controversas e polêmicas sobre testes unitários, eXtreme Programming, Open Source e programação concorrente. O <a href="http://fragmental.tw/2008/04/27/2dollars56cents/" onclick="urchinTracker('/outgoing/fragmental.tw/2008/04/27/2dollars56cents/?referer=');">Phillip Calçado também comentou o assunto</a>, referindo-se a <a href="http://peripateticaxiom.blogspot.com/2008/04/why-you-arent-donald-knuth.html" onclick="urchinTracker('/outgoing/peripateticaxiom.blogspot.com/2008/04/why-you-arent-donald-knuth.html?referer=');">opinião do Keith Braithwaite</a>, que tem ótimos pontos.</p>
<p>Sobre <a href="http://pt.wikipedia.org/wiki/Teste_unit%C3%A1rio" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Teste_unit_C3_A1rio?referer=');">testes unitários</a> em particular, <a href="http://www-cs-staff.stanford.edu/~uno/" onclick="urchinTracker('/outgoing/www-cs-staff.stanford.edu/_uno/?referer=');">Knuth</a> fala o seguinte:</p>
<blockquote><p><em>[...] the idea of immediate compilation and &#8220;unit tests&#8221; appeals to me only rarely, when I’m feeling my way in a totally unknown environment and need feedback about what works and what doesn’t. Otherwise, lots of time is wasted on activities that I simply never need to perform or even think about. Nothing needs to be &#8220;mocked up.&#8221;</em></p></blockquote>
<p>Basicamente ele parece não acreditar em testes unitários.</p>
<p>O problema é que hoje em dia, além da complexidade da programação em sí, é necessário lidar com a complexidade do domínio do software, com o fato de que as empresas devem responder rapidamente às mudanças (e o software deve acompanhar), o fato de que não existem &#8220;desenvolvedores solo&#8221; mas sim equipes de desenvolvimento e por aí vai. Por isso é essencial que os softwares sejam bem testados e que esses testes sejam executados constantemente para garantir o bom funcionamento do sistema ao longo dos incrementos que serão feitos durante seu ciclo de vida. Mesmo com todas essas precauções, como bem disse o <a href="http://fragmental.com.br/" onclick="urchinTracker('/outgoing/fragmental.com.br/?referer=');">Phillip</a>, se nos dias de hoje alguém ou alguma empresa pagasse $2.56 por cada bug encontrado nos seus programas (<a href="http://en.wikipedia.org/wiki/Knuth_reward_check" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Knuth_reward_check?referer=');">como faz o Knuth</a>), provavelmente já estaria falida. Já imaginou então se não houvessem os testes como que seria?</p>
<p>Convenhamos, o caso do <a href="http://www-cs-staff.stanford.edu/~uno/" onclick="urchinTracker('/outgoing/www-cs-staff.stanford.edu/_uno/?referer=');">Knuth</a> é um caso a parte. Ele está na ativa desde os anos 60 quando nossos pais ainda eram adolescentes, e possivelmente por isso tem práticas e opiniões que não necessariamente se aplicam às situações de hoje. É claro que ele merece todo o respeito por tudo que ele fez e faz pela computação, mas não acho que a opinião dele sobre práticas ágeis em especial possa ser levada em consideração ao pé da letra. E o que mais me preocupa nisso tudo é que, por ele ser um ícone da computação, as pessoas tomem tudo que ele falou como verdade absoluta e comecem a achar que testes unitários não servem para nada, quando na verdade eles <a href="http://blog.fragmental.com.br/2007/10/31/programadores-profissionais-escrevem-testes-ponto-final/" onclick="urchinTracker('/outgoing/blog.fragmental.com.br/2007/10/31/programadores-profissionais-escrevem-testes-ponto-final/?referer=');">são essenciais para qualquer programador profissional</a>!</p>
<p>Para mim, os programadores que não testam poderiam ser chamados de <strong>Programadores de Schrödinger</strong>.</p>
<p>Falo isso por causa da teoria do <a href="http://pt.wikipedia.org/wiki/Gato_de_Schr%C3%B6dinger" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Gato_de_Schr_C3_B6dinger?referer=');">Gato de Shrödinger</a>. Resumindo a história, o físico <a href="http://pt.wikipedia.org/wiki/Erwin_Schr%C3%B6dinger" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Erwin_Schr_C3_B6dinger?referer=');">Erwin Schrödinger</a> uma vez sugeriu que se puséssemos um gato numa caixa fechada, onde a vida do gato dependesse do estado de uma partícula sub-atômica, haveria uma superposição de estados que faria com que, do ponto de vista da mecânica quântica, o gato estivesse vivo e morto ao mesmo tempo até que a caixa fosse aberta. Seria impossível determinar o seu estado até abrir a caixa! Na minha imaginação eu fico pensando no momento que a caixa é aberta e aparece um gato vivo (ou morto) o que aconteceu com o outro gato&#8230; Provavelmente ele está em algum outro universo paralelo onde todas as coisas são ao contrário (e as pessoas acham guarda-chuvas ao invés de perdê-los). Enfim, não se sabe de forma alguma o que pode acontecer.</p>
<p>Finalizando toda essa viagem, os <strong>Programadores de Schrödinger</strong> simplesmente não sabem o que vai acontecer quando o seu sistema entrar em produção. Pode ser que nenhum bug apareça e que eles fiquem ricos e comprem milhares de jatos particulares. Ou não.</p>
<p>Na dúvida, eu escrevo testes. <img src='http://gc.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://gc.blog.br/2008/04/29/programadores-de-schrodinger/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Test infection: por onde começar?</title>
		<link>http://gc.blog.br/2008/03/30/test-infection-por-onde-comecar/</link>
		<comments>http://gc.blog.br/2008/03/30/test-infection-por-onde-comecar/#comments</comments>
		<pubDate>Sun, 30 Mar 2008 10:07:59 +0000</pubDate>
		<dc:creator>Guilherme Chapiewski</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Testes]]></category>
		<category><![CDATA[CruiseControl]]></category>
		<category><![CDATA[Dependency Injection]]></category>
		<category><![CDATA[JMock]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://gc.blog.br/2008/03/30/test-infection-por-onde-comecar/</guid>
		<description><![CDATA[Fala GC!
Cara, o que voce faria se entrasse em um projeto para implementar umas melhorias, mas esse projeto não tivesse nenhum tipo de teste, o código não fosse testável e você soubesse que daqui a 3 meses ia sair do projeto? Você perderia tempo fazendo refactoring, implementando testes, configurando CruiseControl e tal, ou ia simplesmente [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Fala GC!</p>
<p>Cara, o que voce faria se entrasse em um projeto para implementar umas melhorias, mas esse projeto não tivesse nenhum tipo de teste, o código não fosse testável e você soubesse que daqui a 3 meses ia sair do projeto? Você perderia tempo fazendo refactoring, implementando testes, configurando CruiseControl e tal, ou ia simplesmente ligar o foda-se???</p></blockquote>
<p>Isso acontece pelo menos 32409 vezes todos os dias em algum lugar do planeta.</p>
<p>Os desenvolvedores acostumados a programar com testes têm uma dificuldade enorme de trabalhar em aplicações que não tem testes. A primeira coisa que os desenvolvedores mais experientes fazem quando pegam uma aplicação nova é olhar a base de testes. Por alí já é possível descobrir uma série de comportamentos e detalhes da implementação do sistema, bem como as intenções de quem o programou. Mas o que você faz quando cai de pára-quedas num projeto que não tem um mísero teste sequer? Você não pode deixar esse problema para outra pessoa? É você o infeliz que tem que resolver o problema e fazer a faxina?</p>
<p>Minha resposta para essa pergunta é bem simples: <strong>SIM</strong>, você é o infeliz que tem que resolver o problema.</p>
<p>&lt;história&gt;<br />
Uma vez eu trabalhava numa empresa e meu chefe me pediu para fazer um protótipo de um sistema que integrava um website com um PABX para fazer determinadas tarefas. Como era um protótipo e eu só tinha duas semanas, eu fiz ZERO testes (e a aplicação funcionava por milagre divino). Só que para o meu azar, esse protótipo era para fazer uma demonstração para um cliente, que adorou a idéia e comprou na mesma hora! Como meu chefe achava que já estava parcialmente pronto e funcionando, meu prazo para terminar era de mais quatro semanas. Duas semanas depois eu estava desesperado por não conseguir avançar na aplicação e não conseguir fazer o negócio funcionar. Aconteciam bugs estranhos, daqueles que te fazem pensar que você está na profissão errada. Todos os dias eu me arrependia profundamente de ter deixado os testes para trás. Meu chefe ficou desesperado e colocou mais um desenvolvedor para me ajudar. No primeiro dia ele me perguntou: &#8220;GC, onde estão os testes para eu dar uma olhada?&#8221;. Er.. bom&#8230; não tinham testes&#8230; E eu fiquei totalmente desmoralizado, fui humilhado, massacrado e apanhei quase até a morte.<br />
&lt;/história&gt;</p>
<p>Hoje em dia não abro mão dos testes. Se você entregar uma aplicação que não funciona, a culpa é sua! Então, faça tudo que é possível para garantir que tudo esteja funcionando.</p>
<p>Finalmente, respondendo o e-mail do meu amigo acima (que não posso dizer o nome porque não tenho permissão), eis algumas dicas para você não ficar em maus lençóis:</p>
<p><strong>Dica número 1:</strong> faça sempre o melhor que puder! Mesmo que você ache que vai ficar 2 semanas ou 3 meses em um projeto, seu gerente pode mudar de idéia e você pode acabar ficando bem mais tempo do que isso. Então, tire essa idéia da cabeça já e comece a se preocupar com os testes. E mesmo que você com certeza absoluta só fique 3 meses, como que você vai sair de cabeça erguida e com a certeza de que o que você fez está funcionando se você não tem os testes para comprovar?</p>
<p><strong>Dica número 2:</strong> <a href="http://en.wikipedia.org/wiki/Fixing_Broken_Windows" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Fixing_Broken_Windows?referer=');">conserte as janelas quebradas</a>. Se alguém chega na sua casa e metade das janelas estão quebradas, então não tem muito problema se quebrar mais uma. Porém, se todas as janelas estiverem impecáveis, quebrar uma janela é péssimo! Siga este mesmo princípio para o seu código, não tenha janelas quebradas. Se você tiver 90% de cobertura de testes, todos eles forem impecáveis e nenhum falhar no <a href="http://cruisecontrol.sourceforge.net/" onclick="urchinTracker('/outgoing/cruisecontrol.sourceforge.net/?referer=');">CruiseControl</a>, o próximo desenvolvedor que chegar se sentirá na obrigação de manter tudo funcionando da mesma forma, porque esta é a cultura do projeto. Já se todos os testes estiverem quebrados ou não houverem testes, não faz a menor diferença.</p>
<p><strong>Dica número 3:</strong> não abraçe o mundo com as pernas! Não precisa refatorar a aplicação inteira de uma vez, até porque você corre um grande risco de tudo parar de funcionar e você ser demitido, além de que não vai conseguir implementar as features. Neste caso, minha estratégia seria refatorar o código na medida que precisasse implementar as features. Faria o ciclo normal de <a href="http://gc.blog.br/2007/05/09/test-driven-development-in-a-nutshell/">TDD</a>: implementaria os testes fazendo refactor na implementação para torná-la testável, implementaria a feature, garantiria seu funcionamento e depois um novo refactor para deixar tudo bonito.</p>
<p><strong>Dica número 4:</strong> <em>get them <a href="http://junit.sourceforge.net/doc/testinfected/testing.htm" onclick="urchinTracker('/outgoing/junit.sourceforge.net/doc/testinfected/testing.htm?referer=');">Test Infected</a>!</em> Faça um workshop com os outros desenvolvedores do time e mostre para eles a importância de escrever testes. Ensine-os a usar o <a href="http://cruisecontrol.sourceforge.net/" onclick="urchinTracker('/outgoing/cruisecontrol.sourceforge.net/?referer=');">CruiseControl</a>, <a href="http://www.junit.org/" onclick="urchinTracker('/outgoing/www.junit.org/?referer=');">JUnit</a>, <a href="http://www.jmock.org/" onclick="urchinTracker('/outgoing/www.jmock.org/?referer=');">JMock</a>, <a href="http://martinfowler.com/articles/injection.html" onclick="urchinTracker('/outgoing/martinfowler.com/articles/injection.html?referer=');">injeção de dependência</a> e tudo mais que for necessário para que os testes aconteçam. Mesmo que você &#8220;perca&#8221; dois ou três dias de trabalho, com certeza ganhará muito mais desse dia em diante.</p>
<p>&lt;piada&gt;<br />
<strong>Dica número 5:</strong> só por via das dúvidas, para ajudar nos momentos de fraqueza, coloque alguém para te vigiar em tempo integral. <a href="http://gc.blog.br/2007/09/13/dijkstra-is-watching/">O &#8220;Dijkstra is watching&#8221; é ótimo para isso</a>, tenha ele sempre por perto.<br />
&lt;/piada&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://gc.blog.br/2008/03/30/test-infection-por-onde-comecar/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Um exemplo prático de Fluent Interface</title>
		<link>http://gc.blog.br/2008/03/03/um-exemplo-pratico-de-fluent-interface/</link>
		<comments>http://gc.blog.br/2008/03/03/um-exemplo-pratico-de-fluent-interface/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 19:27:35 +0000</pubDate>
		<dc:creator>Guilherme Chapiewski</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[Fluent Interface]]></category>
		<category><![CDATA[Fluent Mail API]]></category>
		<category><![CDATA[Globo.com]]></category>
		<category><![CDATA[JavaMail]]></category>

		<guid isPermaLink="false">http://gc.blog.br/2008/03/03/um-exemplo-pratico-de-fluent-interface/</guid>
		<description><![CDATA[Há alguns meses escreví um post sobre Fluent Interfaces, mostrando um trabalho que fizemos aqui na empresa para tornar nossa API interna mais fácil de se utilizar. Depois disso, algumas pessoas me pediram códigos e exemplos de uso da WebMediaAPI, mas o código é da empresa e não posso compartilhá-lo.
Fiquei então com a idéia de [...]]]></description>
			<content:encoded><![CDATA[<p>Há alguns meses escreví um <a href="http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/">post sobre Fluent Interfaces</a>, mostrando um trabalho que fizemos aqui na empresa para tornar nossa API interna mais fácil de se utilizar. Depois disso, algumas pessoas me pediram códigos e exemplos de uso da WebMediaAPI, mas o código é da empresa e não posso compartilhá-lo.</p>
<p>Fiquei então com a idéia de criar uma demonstração de uso de <a href="http://martinfowler.com/bliki/FluentInterface.html" onclick="urchinTracker('/outgoing/martinfowler.com/bliki/FluentInterface.html?referer=');">Fluent Interfaces</a> na cabeça, mas eu queria usar um domínio fácil para que as pessoas pudessem entender melhor. A WebMediaAPI pode ser até legal, mas o fato é que ninguém conhece o modelo de mídias da <a href="http://globo.com" onclick="urchinTracker('/outgoing/globo.com?referer=');">Globo.com</a> e fica difícil de explicar ou discutir o que está sendo feito.</p>
<p>Há duas semanas, conversando com o <a href="http://blog.eof.com.br/" onclick="urchinTracker('/outgoing/blog.eof.com.br/?referer=');">Evandro</a> sobre uma apresentação que faremos mês que vem no evento de tecnologia da <a href="http://globo.com" onclick="urchinTracker('/outgoing/globo.com?referer=');">Globo.com</a>, ele deu uma idéia super simples e bem legal. Todas as pessoas já trabalharam com <strong>e-mail</strong>, seja enviando mensagens para outras pessoas ou então escrevendo código para enviar e-mails em diversas linguagens. Esse é um domínio extramanete fácil para todo mundo, e também, é pequeno o suficiente para ser implementado rapidamente em um dia.</p>
<p>Então, nasceu a <a href="http://code.google.com/p/fluentmailapi/" onclick="urchinTracker('/outgoing/code.google.com/p/fluentmailapi/?referer=');">Fluent Mail API</a>. A <a href="http://code.google.com/p/fluentmailapi/" onclick="urchinTracker('/outgoing/code.google.com/p/fluentmailapi/?referer=');">Fluent Mail API</a> é uma API simples que utiliza a <a href="http://java.sun.com/products/javamail/" onclick="urchinTracker('/outgoing/java.sun.com/products/javamail/?referer=');">JavaMail API</a> da <a href="http://www.sun.com" onclick="urchinTracker('/outgoing/www.sun.com?referer=');">Sun</a> para enviar e-mails. Meu objetivo não é criar mais uma ferramenta para envio de e-mails, é apenas demonstrar o uso de <a href="http://martinfowler.com/bliki/FluentInterface.html" onclick="urchinTracker('/outgoing/martinfowler.com/bliki/FluentInterface.html?referer=');">Fluent Interfaces</a> como <a href="http://en.wikipedia.org/wiki/Wrapper" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Wrapper?referer=');">wrapper</a> de um framework maior, simplificando seu uso. A idéia é fazer com que enviar um e-mail seja tão fácil quanto isso:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">new</span> EmailMessage<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;demo@guilhermechapiewski.com&quot;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">to</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;destination@address.com&quot;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">withSubject</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Fluent Mail API&quot;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">withBody</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Demo message&quot;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Você pode ver os códigos-fonte e uma descrição mais detalhada no <a href="http://code.google.com/p/fluentmailapi/" onclick="urchinTracker('/outgoing/code.google.com/p/fluentmailapi/?referer=');">site do &#8220;projeto&#8221;</a>. Se alguém quiser discutir, opinar, tirar dúvidas ou qualquer outra coisa, é só comentar.</p>
]]></content:encoded>
			<wfw:commentRss>http://gc.blog.br/2008/03/03/um-exemplo-pratico-de-fluent-interface/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>[JBoss World 2008] Max Ross: Hibernate Shards</title>
		<link>http://gc.blog.br/2008/02/15/jboss-world-2008-max-ross-hibernate-shards/</link>
		<comments>http://gc.blog.br/2008/02/15/jboss-world-2008-max-ross-hibernate-shards/#comments</comments>
		<pubDate>Fri, 15 Feb 2008 19:53:23 +0000</pubDate>
		<dc:creator>Guilherme Chapiewski</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Hibernate Shards]]></category>
		<category><![CDATA[JBoss World]]></category>
		<category><![CDATA[Max Ross]]></category>

		<guid isPermaLink="false">http://gc.blog.br/2008/02/15/jboss-world-2008-max-ross-hibernate-shards/</guid>
		<description><![CDATA[Max Ross, do Google, fez uma apresentação sobre o Hibernate Shards.
Desenvolvido em 6 meses como um &#8220;pet project&#8221; (projeto pessoal) usando 20% do tempo de 3 engenheiros, o Hibernate Shards foi lançado internamente no Google em dezembro de 2006 e depois doado para a JBoss em maio de 2007.
&#8220;Shard&#8221; é um termo que o pessoal [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/guilhermechapiewski/2265819389/" onclick="urchinTracker('/outgoing/flickr.com/photos/guilhermechapiewski/2265819389/?referer=');"><img src='http://gc.blog.br/wp-content/jbw2008_hibernateshards.jpg' alt='JBoss World 2008 - Max Ross - Hibernate Shards' align='right' /></a><a href="http://google-code-updates.blogspot.com/2007/03/ode-to-hibernate.html" onclick="urchinTracker('/outgoing/google-code-updates.blogspot.com/2007/03/ode-to-hibernate.html?referer=');">Max Ross</a>, do <a href="http://google.com" onclick="urchinTracker('/outgoing/google.com?referer=');">Google</a>, fez uma apresentação sobre o <a href="http://shards.hibernate.org" onclick="urchinTracker('/outgoing/shards.hibernate.org?referer=');">Hibernate Shards</a>.</p>
<p>Desenvolvido em 6 meses como um &#8220;pet project&#8221; (<a href="http://googleblog.blogspot.com/2006/05/googles-20-percent-time-in-action.html" onclick="urchinTracker('/outgoing/googleblog.blogspot.com/2006/05/googles-20-percent-time-in-action.html?referer=');">projeto pessoal</a>) usando 20% do tempo de 3 engenheiros, o <a href="http://shards.hibernate.org" onclick="urchinTracker('/outgoing/shards.hibernate.org?referer=');">Hibernate Shards</a> foi lançado internamente no Google em dezembro de 2006 e depois doado para a JBoss em maio de 2007.</p>
<p>&#8220;Shard&#8221; é um termo que o pessoal do Google usa para falar de divisão/particionamento. O Hibernate Shards é um framework de persistência baseado no Hibernate, usado para dividir os dados entre vários bancos de dados diferentes, criando um <a href="http://en.wikipedia.org/wiki/Partition_(database)" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Partition_database?referer=');">particionamento horizontal</a> das informações.</p>
<p>Resumidamente, o <a href="http://en.wikipedia.org/wiki/Partition_(database)" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Partition_database?referer=');">particionamento horizontal</a> é usado quando você têm aplicações com bancos de dados monstruosamente grandes e você precisa distribuí-los em vários bancos de dados. Então, você tem várias instâncias de banco de dados diferentes, todas com o mesmo schema, e com os dados divididos entre elas. Quem gerencia onde está cada banco de dados e em qual &#8220;shard&#8221; (partição/bucket/o que você quiser) estão os dados é o Hibernate Shards, de forma transparente para a aplicação. O Shards pode usar qualquer banco de dados suportado pelo Hibernate (ele tira vantagem dos <a href="http://www.hibernate.org/hib_docs/v3/api/org/hibernate/dialect/package-summary.html" onclick="urchinTracker('/outgoing/www.hibernate.org/hib_docs/v3/api/org/hibernate/dialect/package-summary.html?referer=');">dialects</a>).</p>
<p>Os criadores do projeto queriam que fosse fácil e natural para os usuários de Hibernate usá-lo, por isso ele usa vários conceitos familiares como, por exemplo, a <strong>ShardedSessionFactory</strong>, que implementa a interface <strong>SessionFactory</strong>. Eles tem uma <strong>ShardedSession</strong>, e por aí vai.</p>
<p>Apesar do Shards ser totalmente compatível com Hibernate do ponto de vista da aplicação (porque usa as mesmas interfaces), ele não suporta <a href="http://java.sun.com/developer/technicalArticles/J2EE/jpa/" onclick="urchinTracker('/outgoing/java.sun.com/developer/technicalArticles/J2EE/jpa/?referer=');">JPA</a>, a implementação de <a href="http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Query.html" onclick="urchinTracker('/outgoing/www.hibernate.org/hib_docs/v3/api/org/hibernate/Query.html?referer=');">Query</a> ainda não funciona 100% e vários outros probleminhas e &#8220;gaps&#8221; em relação ao Hibernate&#8230;</p>
<p>Confesso que fiquei um pouco decepcionado, porque pelo que eu tinha conversado com o pessoal por aí, parecia que ele seria uma forma de ter um <strong>schema distribuído</strong> em vários bancos de dados diferentes, e isso ia resolver um problema gigante que tenho. Mas descobrí que isso que eu preciso é <a href="http://en.wikipedia.org/wiki/Partition_(database)" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Partition_database?referer=');">particionamento vertical</a>. Perguntei para o Max se daria para fazer alguma adaptação e ele falou que até seria possível escrever um <em>ShardStrategy</em> que quebrasse um galho, mas eu teria muitos problemas maiores pra resolver.</p>
<p>Ao menos serviu para conhecer esses conceitos de banco de dados, que de certa forma eu conhecia mas não da maneira formal.</p>
]]></content:encoded>
			<wfw:commentRss>http://gc.blog.br/2008/02/15/jboss-world-2008-max-ross-hibernate-shards/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[JBoss World 2008] Mladen Turk: JBoss Web Server</title>
		<link>http://gc.blog.br/2008/02/15/jboss-world-2008-mladen-turk-jboss-web-server/</link>
		<comments>http://gc.blog.br/2008/02/15/jboss-world-2008-mladen-turk-jboss-web-server/#comments</comments>
		<pubDate>Fri, 15 Feb 2008 18:22:38 +0000</pubDate>
		<dc:creator>Guilherme Chapiewski</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Globo.com]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[JBoss Web]]></category>
		<category><![CDATA[JBoss World]]></category>
		<category><![CDATA[Mladen Turk]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://gc.blog.br/2008/02/15/jboss-world-2008-mladen-turk-jboss-web-server/</guid>
		<description><![CDATA[Mladen Turk acabou de fazer sua apresentação sobre o JBoss Web Server, que é um web server/container baseado no Tomcat, projetado para aplicações de médio e grande porte. Ele suporta Java (JSPs, Servlets, etc), PHP, e CGI. Basicamente ele concorre com o Tomcat, com a vantagem de que é excelente para prover conteúdo estático, lidar [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.jboss.com/blog/mturk/" onclick="urchinTracker('/outgoing/blogs.jboss.com/blog/mturk/?referer=');">Mladen Turk</a> acabou de fazer sua apresentação sobre o <a href="http://labs.jboss.com/jbossweb/" onclick="urchinTracker('/outgoing/labs.jboss.com/jbossweb/?referer=');">JBoss Web Server</a>, que é um web server/container baseado no <a href="http://tomcat.apache.org/" onclick="urchinTracker('/outgoing/tomcat.apache.org/?referer=');">Tomcat</a>, projetado para aplicações de médio e grande porte. Ele suporta Java (JSPs, Servlets, etc), PHP, e CGI. Basicamente ele concorre com o <a href="http://tomcat.apache.org/" onclick="urchinTracker('/outgoing/tomcat.apache.org/?referer=');">Tomcat</a>, com a vantagem de que é excelente para prover conteúdo estático, lidar com milhares de requisições simultâneas e tem um container web bem razoável, suficiente para a maioria das aplicações.</p>
<p>É óbvio que o criador dele só poderia falar que ele é ótimo, então a opinião dele é suspeita. Mas o fato é que na <a href="http://www.globo.com" onclick="urchinTracker('/outgoing/www.globo.com?referer=');">Globo.com</a> temos usado JBoss Web em várias aplicações e de fato ele é muito bom. Ele realmente aguenta o tranco de milhares de acessos e definitivamente é muito mais estável que o Tomcat, e muito mais leve que o JBoss. IMHO, ele é o mais completo da atualidade e é a minha primeira escolha para os tipos de projetos que tenho trabalhado (web applications que não usam EJBs, JMS e as parafernalhas mais complexas do Java EE).</p>
<p>As principais vantagens do JBoss Web sobre o Tomcat são:</p>
<ul>
<li>Ótimo para conteúdo estático. Como ele usa a mesma engine do Apache, benchmarks mostram que ele consegue praticamente os mesmos resultados de performance.</li>
<li>Melhor integração com o sistema operacional, usando JBoss Native.</li>
<li>Networking é melhor devido a extensões na JRE.</li>
<li>Usa features modernas de sistema operacional para <a href="http://en.wikipedia.org/wiki/Zero-copy" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Zero-copy?referer=');">zero-copy</a>.</li>
<li>Melhor solução de clustering.</li>
<li>Usa menos CPU e memória.</li>
<li>Tem uma implementação de <a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html" onclick="urchinTracker('/outgoing/httpd.apache.org/docs/2.0/mod/mod_rewrite.html?referer=');">mod_rewrite</a> em Java.</li>
</ul>
<p>O objetivo do JBoss Web não é substituir o Apache, nem o Tomcat, nem o JBoss. Se você tiver aplicações tradicionais onde um Apache é suficiente (conteúdo estático + PHP, por exemplo), use-o. Se você for usar JSP/Servlets para um site pequeno-médio, talvez a melhor opção seja mesmo o Tomcat. Se você precisar processar EJBs, certamente vai precisar de um full JEE application server. Além disso, o JBoss Web não têm a variedade de módulos que o Apache tem, e também não tem um foco grande em segurança. Mesmo assim, é mais uma excelente carta na manga.</p>
]]></content:encoded>
			<wfw:commentRss>http://gc.blog.br/2008/02/15/jboss-world-2008-mladen-turk-jboss-web-server/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>[JBoss World 2008] Isaac Christoffersen e Dan Santillo: Virtualization technologies</title>
		<link>http://gc.blog.br/2008/02/14/jboss-world-2008-virtualization-technologies-isaac-christoffersen-and-dan-santillo/</link>
		<comments>http://gc.blog.br/2008/02/14/jboss-world-2008-virtualization-technologies-isaac-christoffersen-and-dan-santillo/#comments</comments>
		<pubDate>Thu, 14 Feb 2008 20:36:14 +0000</pubDate>
		<dc:creator>Guilherme Chapiewski</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Booz Allen Hamilton]]></category>
		<category><![CDATA[Dan Santillo]]></category>
		<category><![CDATA[Isaac Christoffersen]]></category>
		<category><![CDATA[JBoss World]]></category>
		<category><![CDATA[Virtualização]]></category>
		<category><![CDATA[VMWare]]></category>
		<category><![CDATA[Xen]]></category>

		<guid isPermaLink="false">http://gc.blog.br/2008/02/14/jboss-world-2008-virtualization-technologies-isaac-christoffersen-and-dan-santillo/</guid>
		<description><![CDATA[Há algum tempo eu queria escrever sobre virtualização. Essa palestra do Isaac Christoffersen e do Dan Santillo, da Booz Allen Hamilton, foi o impulso que faltava.
Como esse é um assunto que muita gente não conhece, vou colar aqui a definição da wikipedia sobre virtualização:
&#8220;[Virtualization is] a technique for hiding the physical characteristics of computing resources [...]]]></description>
			<content:encoded><![CDATA[<p>Há algum tempo eu queria escrever sobre virtualização. Essa palestra do <a href="http://www.linkedin.com/pub/5/581/956" onclick="urchinTracker('/outgoing/www.linkedin.com/pub/5/581/956?referer=');">Isaac Christoffersen</a> e do Dan Santillo, da <a href="http://www.boozallen.com/" onclick="urchinTracker('/outgoing/www.boozallen.com/?referer=');">Booz Allen Hamilton</a>, foi o impulso que faltava.</p>
<p>Como esse é um assunto que muita gente não conhece, vou colar aqui a <a href="http://en.wikipedia.org/wiki/Virtualization" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Virtualization?referer=');">definição da wikipedia sobre virtualização</a>:</p>
<blockquote><p>&#8220;[Virtualization is] a technique for hiding the physical characteristics of computing resources from the way in which other systems, applications, or end users interact with those resources. This includes making a single physical resource (such as a server, an operating system, an application, or storage device) appear to function as multiple logical resources; or it can include making multiple physical resources (such as storage devices or servers) appear as a single logical resource.&#8221;</p></blockquote>
<p>Agora, falando em português curto e grosso e transportando para o nosso contexto (aplicações web): virtualização seria basicamente fazer com que as aplicações que rodam em clusters de várias máquinas passem a rodar em clusters de menos máquinas, onde em cada uma delas teria várias instâncias de sistemas operacionais. Ou seja, rodar vários sistemas operacionais em uma mesma máquina em paralelo. Com isso você mantêm o número de instâncias da aplicação, porém usando menos máquinas. Para isso pode-se usar <a href="http://pt.wikipedia.org/wiki/VMware" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/VMware?referer=');">VMWare</a> ou <a href="http://pt.wikipedia.org/wiki/Xen" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Xen?referer=');">Xen</a>, por exemplo.</p>
<p>Muitas empresas hoje gastam milhões de dólares com hardware, como uma solução de contorno para software de qualidade ruim. E quando se gasta milhões comprando, naturalmente se gasta vários outros milhões mantendo essa infraestrutura, e não dá para crescer. Muitas vezes o hardware é super-dimensionado, e fica &#8220;90% idle&#8221; na maior parte do tempo.</p>
<p>As aplicações <a href="http://pt.wikipedia.org/wiki/Cliente-servidor" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Cliente-servidor?referer=');">cliente-servidor</a> de antigamente muitas vezes precisavam apenas de 1 servidor de banco de dados para funcionar (só para centralizar os dados, na verdade). Nos dias de hoje, com <a href="http://pt.wikipedia.org/wiki/N_camadas" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/N_camadas?referer=');">N-camadas</a> e arquiteturas baseadas em <a href="http://en.wikipedia.org/wiki/Service-oriented_architecture" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Service-oriented_architecture?referer=');">SOA</a>, as aplicações podem ser resultado da composição de dezenas de serviços, e cada um desses serviços pode estar instalado em dezenas de máquinas. Resumindo: hoje em dia temos aplicações que rodam em centenas, talvez milhares de máquinas.</p>
<p>E onde que a virtualização se encaixa nisso tudo? Vamos lá, vamos imaginar um cenário. Imagine uma aplicação que roda em um cluster de 20 máquinas, e que nos horários de pico a utilização de CPU chega a no máximo 5% ou 10%. Ou seja, você tem 90% de máquina sobrando o tempo inteiro! Com virtualização, uma estratégia poderia ser fazer com que esse mesmo cluster funcionasse em 5 máquinas, e cada máquina teria 4 instâncias de sistema operacional. Ou seja, cada sistema operacional ficaria com 25% da máquina original, que como vimos, é mais do que o dobro e o suficiente para ela funcionar. Resumindo: mesmo resultado e 1/4 dos recursos necessários.</p>
<p>Temos várias vantagens com essa abordagem:</p>
<ul>
<li>Corte de custos.</li>
<li>Maior aproveitamento dos recursos existentes.</li>
<li>Liberação de recursos para outras aplicações que podem estar precisando mais.</li>
<li>Melhorar os planos de recuperação de desastre e backup, mantendo instâncias de aplicação prontas para funcionar em qualquer lugar.</li>
<li>Maior maleabilidade de recursos: se houver um pico em uma ou outra aplicação, os recursos podem ser gerenciados (até via script) para atender a demanda momentânea.</li>
<li>Redução do espaço físico necessário para os datacenters, bem como redução de consumo de energia e redução de custos para resfriamento.</li>
<li>Etc.</li>
</ul>
<p>Sou apenas um curioso e não um especialista nesse assunto, mas com certeza essa é uma área que vai crescer muito nos próximos anos.</p>
<p>No nosso laboratório na <a href="http://globo.com" onclick="urchinTracker('/outgoing/globo.com?referer=');">Globo.com</a>, já fazemos experiências com virtualização há algum tempo e temos inclusive deploys virtualizados de algumas aplicações para teste. Agora precisamos colocar para funcionar!</p>
]]></content:encoded>
			<wfw:commentRss>http://gc.blog.br/2008/02/14/jboss-world-2008-virtualization-technologies-isaac-christoffersen-and-dan-santillo/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>[JBoss World 2008] James Ward: Porting from web 1.0 to RIA</title>
		<link>http://gc.blog.br/2008/02/14/jboss-world-2008-james-ward-porting-from-web-10-to-ria/</link>
		<comments>http://gc.blog.br/2008/02/14/jboss-world-2008-james-ward-porting-from-web-10-to-ria/#comments</comments>
		<pubDate>Thu, 14 Feb 2008 17:46:37 +0000</pubDate>
		<dc:creator>Guilherme Chapiewski</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Globo Vídeos]]></category>
		<category><![CDATA[InfoQ]]></category>
		<category><![CDATA[James Ward]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JBoss World]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Laszlo]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Shashank Tiwari]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Web2.0]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://gc.blog.br/2008/02/14/jboss-world-2008-james-ward-porting-from-web-10-to-ria/</guid>
		<description><![CDATA[James Ward, evangelista da Adobe, fez uma apresentação muito legal sobre como criar Rich Internet Applitacions com Flex, usando back-ends robustos em Java com JBoss.
Essa apresentação teve muito a ver com o artigo que ele publicou no InfoQ sobre como portar aplicações HTML tradicionais para Flex, escrito em conjunto com Shashank Tiwari (mais detalhes no [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.jamesward.org" onclick="urchinTracker('/outgoing/www.jamesward.org?referer=');">James Ward</a>, evangelista da <a href="http://www.adobe.com" onclick="urchinTracker('/outgoing/www.adobe.com?referer=');">Adobe</a>, fez uma apresentação muito legal sobre como criar <a href="http://en.wikipedia.org/wiki/Rich_Internet_application" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Rich_Internet_application?referer=');">Rich Internet Applitacions</a> com <a href="http://www.adobe.com/products/flex/" onclick="urchinTracker('/outgoing/www.adobe.com/products/flex/?referer=');">Flex</a>, usando back-ends robustos em Java com JBoss.</p>
<p>Essa apresentação teve muito a ver com o <a href="http://www.infoq.com/articles/web-flex-port" onclick="urchinTracker('/outgoing/www.infoq.com/articles/web-flex-port?referer=');">artigo que ele publicou no InfoQ sobre como portar aplicações HTML tradicionais para Flex</a>, escrito em conjunto com <a href="http://www.shanky.org/" onclick="urchinTracker('/outgoing/www.shanky.org/?referer=');">Shashank Tiwari</a> (mais detalhes no <a href="http://www.jamesward.org/wordpress/2008/02/11/from-tags-to-riches-going-from-web-10-to-flex/" onclick="urchinTracker('/outgoing/www.jamesward.org/wordpress/2008/02/11/from-tags-to-riches-going-from-web-10-to-flex/?referer=');">blog do James</a>).</p>
<p>No início ele mostrou um demo sensacional de uma aplicação de seguros que eles migraram de &#8220;web 1.0&#8243; para <a href="http://www.adobe.com/products/flex/" onclick="urchinTracker('/outgoing/www.adobe.com/products/flex/?referer=');">Flex</a>. Realmente o poder das interfaces ricas é impressionante. Outro demo interessante foi do <a href="http://desktop.ebay.com/" onclick="urchinTracker('/outgoing/desktop.ebay.com/?referer=');">eBay Desktop</a>, que tem uma boa combinação de HTML e <a href="http://www.adobe.com/products/flashplayer/" onclick="urchinTracker('/outgoing/www.adobe.com/products/flashplayer/?referer=');">Flash</a> (usando o <a href="http://labs.adobe.com/technologies/air/" onclick="urchinTracker('/outgoing/labs.adobe.com/technologies/air/?referer=');">Adobe AIR</a>), resultando em uma interface muito bonita e funcional.</p>
<p>Ultimamente na <a href="http://globo.com" onclick="urchinTracker('/outgoing/globo.com?referer=');">Globo.com</a> temos trabalhado muito com Flash, por causa do <a href="http://gc.blog.br/2007/12/19/globo-videos-em-flash/">player do Globo Vídeos</a>. Antes disso eu nunca tinha trabalhado com Flash e talvez por isso nunca tenha tido a oportunidade de sentir tão de perto seu potencial. <a href="http://www.adobe.com/products/flashplayer/" onclick="urchinTracker('/outgoing/www.adobe.com/products/flashplayer/?referer=');">Flash</a>/<a href="http://www.adobe.com/products/flex/" onclick="urchinTracker('/outgoing/www.adobe.com/products/flex/?referer=');">Flex</a>/<a href="http://labs.adobe.com/wiki/index.php/ActionScript_3" onclick="urchinTracker('/outgoing/labs.adobe.com/wiki/index.php/ActionScript_3?referer=');">AS3</a>/<a href="http://labs.adobe.com/technologies/air/" onclick="urchinTracker('/outgoing/labs.adobe.com/technologies/air/?referer=');">AIR</a>/etc abrem um novo mundo de possibilidades, dando o poder de criar interfaces com usabilidade e interatividade excelentes, e ainda com um forte apelo visual.</p>
<p>Ele apresentou o conceito de &#8220;SOARIA&#8221; (aliás, quando ele falou isso eu comecei a rir sozinho, parecia que ele estava falando &#8220;sorria&#8221;). O que ele chama de SOARIA significa <a href="http://en.wikipedia.org/wiki/Service_Oriented_Architecture" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Service_Oriented_Architecture?referer=');">SOA</a> + <a href="http://en.wikipedia.org/wiki/Rich_Internet_application" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Rich_Internet_application?referer=');">RIA</a>, ou seja, aplicações ricas (RIA) que interagem com o back-end através de serviços (SOA). IMHO, acho essa abordagem muito legal, porque evita aquela dependência cíclica que sempre acaba se formando entre o Flash e a aplicação.</p>
<p>No final, vimos um <a href="http://www.jamesward.org/census/" onclick="urchinTracker('/outgoing/www.jamesward.org/census/?referer=');">benchmark interessante</a>, comparando vários modelos de carregamento de dados em aplicações RIA usando Flex, Laszlo e Javascript/Ajax, integradas com serviços SOAP, pure-XML, HTML e JSON. O benchmark analisa como cada um desses modelos impacta em performance, consumo de banda e consumo de memória na máquina cliente. Fiquei surpreso com os resultados&#8230; Por exemplo, a aplicação mostra que o <a href="http://dojotoolkit.org/" onclick="urchinTracker('/outgoing/dojotoolkit.org/?referer=');">Dojo</a> tem uma performance surpreendentemente ruim quando comparado a aplicações Flex, que têm uma performance normalmente superior a todas as outras (atenção, se você for rodar os testes não se esqueça de desabilitar o Firebug antes!).</p>
<p>A Adobe realmente acertou com o Action Script 3, Flex, AIR e todos esses novos produtos que têm sido lançados. Tenho que tirar o chapéu.</p>
]]></content:encoded>
			<wfw:commentRss>http://gc.blog.br/2008/02/14/jboss-world-2008-james-ward-porting-from-web-10-to-ria/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

