<?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>Fabrício Lemos</title>
	<atom:link href="http://www.fabriciolemos.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.fabriciolemos.org/blog</link>
	<description>Blog sobre desenvolvimento de software</description>
	<lastBuildDate>Tue, 10 Nov 2009 18:54:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Retrospectiva Ceará On Rails 2009</title>
		<link>http://www.fabriciolemos.org/blog/2009/retrospectiva-ceara-on-rails-2009/</link>
		<comments>http://www.fabriciolemos.org/blog/2009/retrospectiva-ceara-on-rails-2009/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 18:53:13 +0000</pubDate>
		<dc:creator>Fabrício Lemos</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Ceará on Rails]]></category>

		<guid isPermaLink="false">http://www.fabriciolemos.org/blog/?p=98</guid>
		<description><![CDATA[
Sábado passado ocorreu aqui em Fortaleza o Ceará on Rails 2009,  segunda edição do evento desta comunidade aqui do Ceará. Eu, que ainda estou iniciando no mundo Rails, achei o evento bem positivo. É sempre muito bom ver a comunidade de desenvolvimento de software reunida e motivada em volta de alguma tecnologia, ainda mais quando [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		A:link { so-language: zxx } --></p>
<p style="margin-bottom: 0cm;">Sábado passado ocorreu aqui em Fortaleza o <a href="http://www.cearaonrails.com.br/" target="_blank">Ceará on Rails 2009</a>,  segunda edição do evento desta comunidade aqui do Ceará. Eu, que ainda estou iniciando no mundo Rails, achei o evento bem positivo. É sempre muito bom ver a comunidade de desenvolvimento de software reunida e motivada em volta de alguma tecnologia, ainda mais quando esta tecnologia é o <a href="http://rubyonrails.org/" target="_blank">Ruby on Rails</a>, que promove uma série de boas práticas e já nasceu com uma forte embasamento em <a href="http://en.wikipedia.org/wiki/Agile_software_development" target="_blank">metodologias ágeis</a>.</p>
<p>O evento teve somente dois pontos negativos, mas que acabaram comprometendo o aproveitamento: a <a href="http://www.cearaonrails.com.br/programacao" target="_blank">programação</a> muito extensa e o atraso. Achei meio exagerado começar 14:00h e terminar somente 20:10h. Seria melhor se fosse divido pela manhã e tarde ou, melhor ainda, se fosse um evento menor, mais focado, talvez retirando-se a palestra de MAC (que não cabia muito ali) e alguma outra. E os atrasos fizeram com que as palestras fossem encurtadas, prejudicando a qualidade.</p>
<p>Como eu sabia que não iria conseguir passar seis horas direto no evento e estava cheio de coisas pra resolver no sábado (prefiro eventos durante a semana, em horário comercial mesmo) cheguei bem atrasado e peguei somente as três ultimas palestras.</p>
<p>A palestra do Anderson Leite, <strong>Pensando ao contrário. Por que você deveria considerar Rails no seu próximo projeto?,</strong> foi a mais interessante. Ele falou porque é bom procurarmos errar, roubar e precipitar. Devemos errar como forma de quebrar paradigmas e ir contra muitas coisas que estão por aí definidas como “certas”. Devemos roubar soluções como forma de nos apoiarmos em boas idéias e assim progredir de forma mais rápido. Ele citou como exemplo o <a href="http://vraptor.caelum.com.br/" target="_blank">Vraptor</a> , que roubou várias idéias do Rails. E por fim devemos nos precipitar como forma de estar sempre buscando o novo. Na palestra ele também mostrou código com exemplos de <a href="http://en.wikipedia.org/wiki/Ruby_%28programming_language%29#Metaprogramming" target="_blank">metaprogramação</a> do Ruby e como o Rails se aproveitou de tais recursos. Foi uma excelente palestra e com um bom equilíbrio entre conteúdo conceitual e prático.</p>
<p>Na palestra <a href="http://simplesideias.com.br/ceara-on-rails-2009-testando-rails-apps-com-rspec/"><strong>Testando Rails apps com Rspec</strong></a>, acho que o palestrante, Nando Vieira, foi prejudicado pelo tempo que foi reduzido (o evento estava bem atrasado). Ele mostrou bastante código com Rspec, mas não deu para absorver muito porque ele teve que passar os slides bem rápido e não dava nem para terminar de ler o código. De positivo ficaram as dicas de sempre utilizar <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a>.</p>
<p>A palestra do <a href="http://www.akitaonrails.com/" target="_blank">Akita</a> era uma das que eu estava mais motivado para assistir. Vi a palestra dele no Ceará on Rails do ano passado e gostei muito. O tema foi <strong>Filosofia RubyOnRails</strong>. Mesmo com todo o atraso ele ainda colocou um vídeo de uns 10 minutos de propaganda da Apple (feita pela<a href="http://37signals.com/" target="_blank"> 37 Signals</a>) que poderia muito bem ter sido cortado. O começo propriamente dito foi bem legal, ele explicou um pouco da origem do Ruby e porque metaprogramação não era pra ser encarada como uma coisa tão exótica. Porém logo depois o assunto ficou mais para Filosofia Ágil do que Filosofia RubyOnRails. Falar de metodologias ágeis é bastante pertinente em qualquer encontro de desenvolvimento de software, principalmente de Rails, mas pra quem já tinha um certo background no “mundo ágil” foi algo como chover no molhado. Esperava ouvir mais de Rails. De qualquer maneira foi legal ele reforçar, de forma tão enfática, várias idéias e boas práticas. O ponto alto foi quando ele falou que se você não faz <a href="http://en.wikipedia.org/wiki/Extreme_programming" target="_blank">Extreme Programming</a> você não faz Rails. Infelizmente já estava bem tarde e não pude ficar até o fim da palestra.</p>
<p>A palestra do Cauê, sobre CouchDB, era outra que eu esperava muito assistir, mas foi cancelada. Outra coisa chata foi a falta de energia, que demorou a voltar. Mas compensou pelos sorteios em que eu ganhei uma senha de acesso ao <a href="http://peepcode.com/" target="_blank">PeepCode</a> <img src='http://www.fabriciolemos.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>No mais, o pessoal do Ceará On Rails está de parabéns. A comunidade é relativamente nova e já está conseguindo fazer eventos, gratuitos, com palestrantes de renome nacional e atraindo um público bem considerável. Espero que o evento se repita todo ano.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fabriciolemos.org/blog/2009/retrospectiva-ceara-on-rails-2009/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Terceiro Encontro do Grupo XPCE</title>
		<link>http://www.fabriciolemos.org/blog/2009/terceiro-encontro-do-grupo-xpce/</link>
		<comments>http://www.fabriciolemos.org/blog/2009/terceiro-encontro-do-grupo-xpce/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 23:49:48 +0000</pubDate>
		<dc:creator>Fabrício Lemos</dc:creator>
				<category><![CDATA[Testes automatizados]]></category>
		<category><![CDATA[Testes funcionais]]></category>
		<category><![CDATA[automação de testes]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[xp]]></category>
		<category><![CDATA[xpce]]></category>

		<guid isPermaLink="false">http://www.fabriciolemos.org/blog/?p=88</guid>
		<description><![CDATA[No ultimo dia 24 palestrei no terceiro encontro do grupo XPCE sobre automação de testes funcionais com Selenium. Estes foram os slides da palestra:
Em breve colocarei o projeto usado como exemplo.
]]></description>
			<content:encoded><![CDATA[<p>No ultimo dia 24 palestrei no terceiro encontro do grupo <a href="http://www.xpce.org/" target="_blank">XPCE</a> sobre automação de testes funcionais com Selenium. Estes foram os slides da palestra:</p>
<object width="425" height="348"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=xpcetestesfuncionais-091030190409-phpapp02"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=xpcetestesfuncionais-091030190409-phpapp02"  type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="348"></embed></object><!-- ysttest:Array
(
    [id] => 2387582&amp;doc=xpcetestesfuncionais-091030190409-phpapp02
)
-->
<p>Em breve colocarei o projeto usado como exemplo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fabriciolemos.org/blog/2009/terceiro-encontro-do-grupo-xpce/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>OpenUP como Porta de Entrada para o Mundo Ágil.</title>
		<link>http://www.fabriciolemos.org/blog/2009/openup-como-porta-de-entrada-para-o-mundo-agil/</link>
		<comments>http://www.fabriciolemos.org/blog/2009/openup-como-porta-de-entrada-para-o-mundo-agil/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 22:07:36 +0000</pubDate>
		<dc:creator>Fabrício Lemos</dc:creator>
				<category><![CDATA[Desenvolvimento Ágil]]></category>
		<category><![CDATA[OpenUP]]></category>
		<category><![CDATA[Processos de software]]></category>
		<category><![CDATA[Unified Process]]></category>

		<guid isPermaLink="false">http://www.fabriciolemos.org/blog/?p=7</guid>
		<description><![CDATA[Quando você começa a adoção de práticas ágeis de desenvolvimento de forma pública, novos desafios surgem. Para conseguir o patrocínio de todas as partes envolvidas e afetadas deve-se procurar a adoção de uma metodologia ao mesmo tempo eficiente e que não encontre muita resistência. O OpenUP surge então como uma boa escolha para um primeiro passo ao "Mundo Àgil".]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p class="western" style="margin-bottom: 0cm;">No <a href="http://www.fabriciolemos.org/blog/2008/padroes-para-adocao-de-agilidade/" target="_blank">post anterior</a> escrevi sobre alguns padrões para adoção de agilidade em um ambiente de desenvolvimento de software. Falei também que desta vez estamos utilizando uma abordagem utilizando os padrões <em>Public Display of Agility</em> e <em>Iterative First</em>, além do <em>Start Small</em>.</p>
<p class="western" style="margin-bottom: 0cm;">A utilização dos dois primeiros padrões impôs desafios diferentes dos encontrados na utilização dos padrões <em>Stealth Mode</em> e <em>Technical Practices First</em> (minha experiência anterior).</p>
<p class="western" style="margin-bottom: 0cm;">Uma das principais diferenças é que, por o  <em>Stealth Mode</em> não chamar muita atenção, você tem mais liberdade para aplicar as práticas da maneira que achar melhor. Não precisa responder a muitas perguntas e nem assume de ante mão compromissos externos. Ou seja, pode trabalhar de forma bastante eficiente e não encontra muitas resistências.</p>
<p class="western" style="margin-bottom: 0cm;">Indo para o <em>Public Display of Agility</em>, entretanto, você estará chamando bastante atenção (como o próprio nome do padrão sugere) e, por metodologias ágeis ainda estarem longe de ser unanimidade, um certo jogo político tem que ser levado adiante. Um lado positivo é que você acaba ganhando o patrocínio das várias partes envolvidas, mas esse patrocínio as vezes vem com um preço um pouco alto. Por exemplo, algumas práticas ainda são encaradas como “muito radicais”.</p>
<p class="western" style="margin-bottom: 0cm;">Com <em>Technical Practices First</em>, a pesar de certas práticas “técnicas” serem bem difíceis de se dominar e possuírem certas dependências entre si, não é tão difícil sair da inercia. Por exemplo, se o time decide começar a fazer testes de unidade ou adotar integração contínua, existem disponíveis uma grande quantidade de material bem ao estilo “receita de bolo” e ferramentas bem simples de se trabalhar. Claro que leva-se algum tempo para se começar a trabalhar corretamente e entender o espírito da coisa, mas a sensação de estar perdido não é tão grande.</p>
<p class="western" style="margin-bottom: 0cm;">Porém, se o time decide ir pelo <em>Iterative First</em>, a adoção deve ser levada com mais cuidado e deve-se ter uma grande sensibilidade de como as práticas se encaixarão e principalmente mudarão a cultura da empresa. As primeiras práticas que serão abordadas são as gerenciais; e de gerência de projeto todo mundo entende um pouco, ou acha que entende Ou seja, é bem mais fácil encontrar resistências: infelizmente ainda há muita gente que acha que desenvolvimento de software deve ser feito de forma prescritiva e que devemos adotar as mesmas práticas gerenciais de outras engenharias. Também existem pessoas bem abertas a mudanças e enxergam as vantagens na aplicação de práticas ágeis, mas, por não terem um background sólido, não conseguem digerir os reais valores do <a href="http://agilemanifesto.org/" target="_blank">Manifesto Ágil</a>.</p>
<p class="western" style="margin-bottom: 0cm;">Ficamos então com o desafio de adotarmos como base uma metodologia de desenvolvimento ao mesmo tempo eficiente e que levasse em consideração todo esse cenário. Foi aí que o <a href="http://epf.eclipse.org/wikis/openup/index.htm" target="_blank">OpenUP</a> se encaixou como uma luva às nossas necessidades:</p>
<ul>
<li>É um processo bastante enxuto e se encaixa bem em um contexto ágil (a gestão do projeto é quase que uma cópia do <a href="http://en.wikipedia.org/wiki/Scrum_(development)" target="_blank">SCRUM</a>). Práticas de outras metodologias também podem ser facilmente encaixadas no processo</li>
</ul>
<ul>
<li>Por ser um <a href="http://en.wikipedia.org/wiki/Unified_Process" target="_blank">Unified Process</a>, traz possui conceitos que muitos já estão acostumados, diminuindo a resistência inicial:</li>
</ul>
<blockquote>
<ul>
<li> É iterativo e incremental</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>É Baseado na utilização de casos de uso</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li> Desenvolvimento centrado na arquitetura do projeto.</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>Possui foco em gestão de risco</li>
</ul>
</blockquote>
<ul>
<li>Mesmo sendo bem enxuto, engloba (quase) todas as disciplinas de software: Arquitetura, Gestão de Projeto, Gestão de Configuração, Desenvolvimento, Gestão de Requisitos e Testes</li>
</ul>
<ul>
<li>Mesmo tendo que ser adaptado para a nossa realidade, é um processo que já está pronto para ser utilizado, contém um bom conjunto de práticas e artefatos, já com templates e &#8220;boas práticas&#8221; documentados</li>
</ul>
<ul>
<li>Está todo documentado no <a href="http://en.wikipedia.org/wiki/Eclipse_Process_Framework" target="_blank">EPF</a></li>
</ul>
<ul>
<li>
<p class="western" style="margin-bottom: 0cm;">É disponibilizado 	através da Eclipse Public License: pode ser utilizado sem 	restrições.</p>
</li>
</ul>
<p class="western" style="margin-bottom: 0cm;">OpenUP contém todas as melhores soluções para desenvolvimento de software? Acredito que não. Mas com essas características foi a solução salomônica para este momento inicial. Ainda estamos no começo (<em>Start Small</em>) e é difícil já fazermos algum jugamento da escolha, mas acredito que estamos no caminho certo, principalmente porque acabamos ganhando o apoio de muita gente boa.</p>
<p class="western" style="margin-bottom: 0cm;">É importante também ficar claro que a mudança de cultura de um ambiente não se trata somente de um mudança no processo ou metodologia de desenvolvimento e é um fator que também deve ser levado em conta, tendo desafios ainda maiores.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fabriciolemos.org/blog/2009/openup-como-porta-de-entrada-para-o-mundo-agil/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Padrões para Adoção de Agilidade</title>
		<link>http://www.fabriciolemos.org/blog/2008/padroes-para-adocao-de-agilidade/</link>
		<comments>http://www.fabriciolemos.org/blog/2008/padroes-para-adocao-de-agilidade/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 21:24:56 +0000</pubDate>
		<dc:creator>Fabrício Lemos</dc:creator>
				<category><![CDATA[Desenvolvimento Ágil]]></category>
		<category><![CDATA[Processos de software]]></category>

		<guid isPermaLink="false">http://www.fabriciolemos.org/blog/?p=71</guid>
		<description><![CDATA[Mesmo com sua adoção crescendo ano a ano e comprovadamente trazendo ganhos de produtividade para projetos de desenvolvimento, metodologias ágeis ainda encontram bastante resistência e ainda tem uma adoção relativamente pequena aqui no Brasil. Existiria então uma forma mais indicada de transição para uma abordagem ágil de acordo com as características de cada ambiente?]]></description>
			<content:encoded><![CDATA[<p class="western" style="margin-bottom: 0cm; text-align: justify;">Mesmo com sua adoção crescendo ano a ano e <a href="http://www.versionone.com/pdf/3rdAnnualStateOfAgile_FullDataReport.pdf" target="_blank">comprovadamente</a> trazendo ganhos de produtividade para projetos de desenvolvimento, metodologias ágeis ainda encontram bastante <a href="http://blog.improveit.com.br/articles/2008/03/28/o-mercado-est%C3%A1-mudando" target="_blank">resistência </a>e ainda tem uma adoção relativamente pequena aqui no Brasil. Existiria então uma forma mais indicada de transição para uma abordagem ágil de acordo com as características de cada ambiente?</p>
<p class="western" style="margin-bottom: 0cm; text-align: justify;">O Mike Cohn documentou  alguns <a href="http://www.agilejournal.com/content/view/734/76/" target="_blank">padrões interessantes</a> para adoção de agilidade e os dividiu em três pares antagônicos que são:</p>
<ul style="text-align: justify;">
<li><strong>Start Small</strong> ou <strong>Go All In</strong>?</li>
</ul>
<p style="padding-left: 30px; text-align: justify;">Começar a adoção 		com um projeto piloto ou já começar com a grande maioria dos 		projetos da empresa?</p>
<p class="western" style="margin-bottom: 0cm; text-align: justify;">
<ul style="text-align: justify;">
<li><strong>Technical Practices First</strong> ou <strong>Iterative First</strong>?</li>
</ul>
<p style="padding-left: 30px; text-align: justify;">Focar primeiramente nas práticas de engenharia ou nas práticas de gestão?</p>
<p class="western" style="margin-bottom: 0cm; text-align: justify;">
<ul style="text-align: justify;">
<li><strong>Stealth Mode</strong> ou <strong>Public Display of Agility</strong>?</li>
</ul>
<p style="margin-bottom: 0cm; padding-left: 30px; text-align: justify;">Serão esperados os primeiros resultados para que a adoção seja tornada pública ou ela será divulgada de ante mão?</p>
<p class="western" style="margin-bottom: 0cm; text-align: justify;">
<p class="western" style="margin-bottom: 0cm; text-align: justify;">Dentre estes padrões, o caminho mais seguro e menos traumático é a combinação de <em>Start Small</em>, <em>Technical Practices First</em> e <em>Stealth Mode</em>. Foi essa combinação que funcionou <strong>muito</strong> bem em meu <a href="http://www.serpro.gov.br/" target="_blank">emprego anterior</a> e, encontrando as mesmas condições, tentaria adotá-la em qualquer outro ambiente.</p>
<p class="western" style="margin-bottom: 0cm; text-align: justify;">
<p class="western" style="margin-bottom: 0cm; text-align: justify;">Adotando <em>Start Small</em> e <em>Technical Practices First</em> não se precisa de tanto apoio das hierarquias superiores e conseqüentemente pode-se atuar sob <em>Stealth Mode</em>. Como, até meio que paradoxalmente, as hierarquias superiores são as que menos conhecem e mais resistem às abordagens ágeis, o time pode evoluir sem encontrar muitas resistências nos estágios iniciais e, principalmente, sem ser talhado pela equipe de “qualidade”. Claro que vai chegar um momento em que o apoio será necessário, porém os resultados já alcançados servirão de prova de que desenvolvimento ágil não é coisa de adolescente frustrado ou programador revoltado.</p>
<p class="western" style="margin-bottom: 0cm; text-align: justify;">
<p class="western" style="margin-bottom: 0cm; text-align: justify;">Essa combinação, no entanto, possui um lado negativo considerável: é a mais lenta. Adotando-a, demoramos em torno de três anos para que começássemos a ter um impacto organizacional mais abrangente (demora também ocasionada pelo tamanho da empresa), mesmo resultados positivos tendo estado presentes desde os primeiros meses. E a razão da sua vantagem  é também o motivo da sua desvantagem. Sem o apoio corporativo, o time pioneiro sente dificuldades de levar a adoção adiante e depende muito de esforços homéricos dos envolvidos para que as dificuldades naturais da adoção não comprometam o andamento do(s) projeto(s), gerando ruídos e quebrando o <em>Stealth Mode</em>.</p>
<p class="western" style="margin-bottom: 0cm; text-align: justify;">
<p class="western" style="margin-bottom: 0cm; text-align: justify;">Seria então está combinação a mais indicada para todos os ambientes? Acredito que não. Algumas forças devem estar presentes para que esta combinação seja a mais indicada:</p>
<p class="western" style="margin-bottom: 0cm; text-align: justify;">
<ul style="text-align: justify;">
<li>
<p class="western" style="margin-bottom: 0cm;">Já existe na 	empresa um processo de desenvolvimento “tradicional” bem 	estabelecido e controlado. Geralmente em empresas que tem ou buscam 	o selo CMMI e que acabam considerando abordagens ágeis uma 	ameaça para o processo de avaliação e controle de “qualidade”.</p>
</li>
<li>
<p class="western" style="margin-bottom: 0cm;">O time tem um 	perfil técnico muito bom, os membros são proativos e comprometidos 	na busca de melhores formas de desenvolver software.</p>
</li>
<li>
<p class="western" style="margin-bottom: 0cm;">Os integrantes do 	time devem, em grande parte, se manter constantes.</p>
</li>
</ul>
<p class="western" style="margin-bottom: 0cm; text-align: justify;">
<p class="western" style="margin-bottom: 0cm; text-align: justify;">Aqui na <a href="http://www.sefaz.ce.gov.br/" target="_blank">SEFAZ</a>, por termos outro cenário (com vantagens e desvantagens) estamos adotando outra estratégia, mais próxima da combinação <em>Start Small</em>, <em>Iterative First</em> e <em>Public Display of Agility</em>. O padrão <em>Go All In</em> traria resultados ainda mais rápidos, mas acho demasiadamente arriscado. O ponta pé inicial ainda não foi dado, mas estou animado com o comprometimento que estamos obtendo em todos os níveis e espero que em breve eu tenha boas notícias para dar.</p>
<p class="western" style="margin-bottom: 0cm; text-align: justify;">
<p class="western" style="margin-bottom: 0cm; text-align: justify;">
<p class="western" style="margin-bottom: 0cm; text-align: justify;">
<p class="western" style="margin-bottom: 0cm; text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://www.fabriciolemos.org/blog/2008/padroes-para-adocao-de-agilidade/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Template Method e Exceções</title>
		<link>http://www.fabriciolemos.org/blog/2008/template-method-e-excecoes/</link>
		<comments>http://www.fabriciolemos.org/blog/2008/template-method-e-excecoes/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 21:13:32 +0000</pubDate>
		<dc:creator>Fabrício Lemos</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Tratamento de Erros]]></category>

		<guid isPermaLink="false">http://www.fabriciolemos.org/blog/?p=65</guid>
		<description><![CDATA[Template Method sempre foi um dos meus padrões favoritos, porém quando aplicado de forma exagerada acho que ele trouxe mais prejuízos do que benefícios.]]></description>
			<content:encoded><![CDATA[<p class="western" style="margin-bottom: 0cm;"><a href="http://en.wikipedia.org/wiki/Template_method_pattern" target="_blank">Template Method</a> sempre foi um dos meus padrões favoritos, porém quando aplicado de forma exagerada acho que ele trouxe mais prejuízos do que benefícios.</p>
<p class="western" style="margin-bottom: 0cm;">A principal razão é que ele acaba dificultando o tratamento de erros da aplicação: ao padronizar o comportamento de alguma operação para uma hierarquia de classes, ele acaba também padronizando as exceções lançadas pelo método, e é aí que está o problema.</p>
<p class="western" style="margin-bottom: 0cm;">Um dos principais problemas que vejo em aplicações legadas é o tratamento de erros feito de forma inapropriada. Já vi algumas pessoas criticando, mas considero um excelente recurso da linguagem Java a existência de <a href="http://en.wikipedia.org/wiki/Exception_handling#Checked_exceptions" target="_blank">Checked Exceptions</a>, utilizadas para erros que podem precisar de um tratamento particular.</p>
<p class="western" style="margin-bottom: 0cm;">Na implementação de uma biblioteca ou de um framework, checked exceptions talvez não sejam tão interessantes. Mas, na implementação de aplicações, considero um recurso bem valioso principalmente para aquelas divididas em <a href="http://en.wikipedia.org/wiki/Layer_(object-oriented_design)" target="_blank">camadas</a>.</p>
<p class="western" style="margin-bottom: 0cm;">Template methods não casam bem com checked exceptions pelo seguinte motivo:</p>
<pre class="java">abstract protected void validar(Entidade entidade);

abstract protected void logarOperacao(Object algumaCoisa);

public void salvar (Entidade entidade) {
    this.validar(entidade);
    this.dao.persistir(entidade);
    this.logarOperacao(algumaCoisa);
}</pre>
<p class="western" style="margin-bottom: 0cm;">Um código como esse é comum em frameworks caseiros ou arquiteturas de referência. Geralmente fica em uma classe chamada MeuManagerGenerico, ou algo do tipo, e as diversas classes de negócio, específicas de cada entidade, devem implementar o método de validação e o método de log. O único problema com está abordagem é que você não está &#8220;amarrando&#8221; somente a assinatura e o algorítimo para salvar uma entidade, está também dizendo que nenhuma operação &#8220;salvar&#8221; do sistema lança uma checked exception.</p>
<p class="western" style="margin-bottom: 0cm;">A não ser que sua aplicação seja 100% <a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" target="_blank">CRUD</a>, sem nenhuma restrição de unicidade em nenhum atributo, acho que essa é uma restrição muito forte e que não se aplica.</p>
<p class="western" style="margin-bottom: 0cm;">Dessa forma, se alguma regra de validação ou regra de negócio específica não for atendida, como você comunica para a camada superior (provavelmente a camada de visão) sobre o problema ocorrido? A única maneira é lançar unchecked exceptions.</p>
<p class="western" style="margin-bottom: 0cm;">Usando unchecked exception, como as camadas superiores saberão quais exceções lançadas pelas camadas inferiores? A única saída seria a camada inferior antecipar o tratamento dado ao erro, de maneira que a camada superior não precise trata-lo. Já vi muito essa abordagem com a exception tendo como atributo a chave da mensagem que será exibida ao usuário. Dessa forma a camada superior iria somente exibir a mensagem, não importando qual seja a exceção. Isso é um exemplo claro de quebra da divisão de responsabilidade entre as camadas. Se as camadas inferiores tem que antecipar de alguma forma a maneira como as camadas superiores fazem o tratamento de erro, porque você divide sua aplicação em camadas em primeiro lugar?</p>
<p class="western" style="margin-bottom: 0cm;">Esse um bom exemplo de que &#8220;amarração de código&#8221; e antecipação de necessidades podem trazer prejuízos não antecipados. Imagino que desenvolvedores que fazem template methods para operações com algoritmos simples como &#8220;salvar&#8221;, &#8220;atualizar&#8221;, &#8220;deletar&#8221;, etc só podem ter duas coisas em mente:</p>
<p class="western" style="margin-bottom: 0cm;"><strong>1. </strong> Economizar código.</p>
<p class="western" style="margin-bottom: 0cm;">Esse pensamento vem do falso sentimento de que uma aplicação enxuta é uma aplicação com pouco código. Temos que tomar cuidado pra não exagerar nas simplificações e não enxergar abstrações onde elas não existem ou são prejudiciais.</p>
<p class="western" style="margin-bottom: 0cm;"><strong>2.</strong> O desenvolvedor pode esquecer de fazer a validação ou gravar o log ou qualquer coisa do tipo, então &#8220;amarra-se&#8221; esse algoritmo em um template method.</p>
<p class="western" style="margin-bottom: 0cm;">Se seu desenvolvedor não sabe como fazer uma validação correta ou alguma dessas operações, ele não deveria colocar as mãos no código sem que estivesse fazendo <a href="http://www.improveit.com.br/xp/praticas/programacao_par" target="_blank">programação em par</a> com outro mais experiente.</p>
<p class="western" style="margin-bottom: 0cm;">Mesmo com essa armadilha, ainda acho válida a utilização do template method, mas somente nos raros casos onde se pode antecipar os erros de toda a hierarquia de classes e quando a complexidade do algoritmo justifique essa abordagem.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fabriciolemos.org/blog/2008/template-method-e-excecoes/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Glassfish ou Jboss + JON</title>
		<link>http://www.fabriciolemos.org/blog/2008/glassfish-ou-jboss-jon/</link>
		<comments>http://www.fabriciolemos.org/blog/2008/glassfish-ou-jboss-jon/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 09:48:27 +0000</pubDate>
		<dc:creator>Fabrício Lemos</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Servidores de aplicação]]></category>
		<category><![CDATA[Glassfish]]></category>
		<category><![CDATA[Jboss]]></category>
		<category><![CDATA[JON]]></category>

		<guid isPermaLink="false">http://www.fabriciolemos.org/blog/?p=26</guid>
		<description><![CDATA[Iniciamos um processo de decisão sobre qual servidor de aplicação passaremos a utilizar em nosso ambiente. A motivação é que o velho Jboss de guerra não está mais dando conta do recado. Não que o Jboss não seja um ótimo servidor, muito pelo contrário. A questão é que o seu ponto mais criticado, a administração, [...]]]></description>
			<content:encoded><![CDATA[<p>Iniciamos um processo de decisão sobre qual servidor de aplicação passaremos a utilizar em nosso ambiente. A motivação é que o velho Jboss de guerra não está mais dando conta do recado. Não que o Jboss não seja um ótimo servidor, muito pelo contrário. A questão é que o seu ponto mais criticado, a administração, começou a cobrar seu preço. Iremos aumentar consideravelmente o número de servidores em produção (assunto outro post) e uma interface de administração central, mais produtiva e confiável, passou a ser uma necessidade.</p>
<p>Depois de uma análise prévia, vimos que duas soluções poderiam atender nossas necessidades: Glassfish ou Jboss + <a href="http://www.jboss.com/products/jbosson" target="_blank">JON</a>.</p>
<p>O Glassfish é uma promessa que virou realidade, mas confesso que ainda não me convenci, culpa mais pela pouca experiência que tenho com esse servidor do que por sua qualidade, que ele é a melhor solução para o nosso caso. De qualquer maneira, nesses estudos prévios e na <a href="http://www.cejug.org/pages/viewpage.action?pageId=30900360" target="_blank">apresentação do Kohsuke</a>, acabou subindo muito no meu conceito.</p>
<p>O Jboss já é um velho conhecido e ainda está no páreo, levando em consideração a utilização do JON. O JBoss Operations Network me pareceu ser uma ferramenta realmente fantástica que permite a administração e monitoramento de muitos e muitos e muitos pontos, desde o sistema operacional, passando pelo servidor de aplicação e chegando nas aplicações. Seu lado negativo é que é uma ferramenta paga.</p>
<p>Tomcat está fora da jogada. A maioria das nossas aplicações utilizam Spring, mas algumas mais novas já estão em EJB e futuramente iremos para o <a href="http://www.jboss.com/products/seam" target="_blank">Jboss Seam</a> ou <a href="http://jcp.org/en/jsr/detail?id=299" target="_blank">Web Beans</a>, como preferirem (também assunto para outro post). Ainda existem algumas outras alternativas, mas a princípio os principais candidatos são esses dois mesmo.</p>
<p>Bem, a análise ainda está em andamento e os principais pontos ques estamos analisando são:</p>
<p>- <strong>Administração</strong>: facilidade de administrar e monitorar remotamente múltiplas instâncias de servidores.</p>
<p>- <strong>Performance</strong>: para essa avaliação buscaremos análises de instituições independentes.</p>
<p><strong>- Ambiente de desenvolvimento</strong>: facilidades de utilização do servidor de aplicação no ambiente de desenvolvimento:  integração com o Eclipse, tempo de start up e deploy, facilidade de debug, hot deploy, etc.</p>
<p><strong>- Documentação técnica</strong>: disponibilidade e qualidade da documentação técnica disponível: manuais, tutoriais, wiki e fóruns</p>
<p><strong>- Suporte técnico:</strong> disponibilidade de suporte 24&#215;7. Considerando custo, meio (apenas via web e e-mail ou por telefone também), idioma (em português ou inglês) e tempo de resposta.</p>
<p><strong>- Aderência à especificação:</strong> aderência à especificação Java EE 5, incluindo a velocidade em que são lançadas novas versões da ferramenta quando saem novas versões da especificação.</p>
<p><strong>- Custo da migração:</strong> custo associado à migração do ambiente atual para o servidor de aplicação escolhido. Atualmente temos aplicações em produção tanto no Jboss quanto no Glassfish</p>
<p><strong>- Custo do software:</strong> custo de aquisição de ferramentas necessárias para administração ou desenvolvimento no servidor de aplicação.</p>
<p><strong>- Cases de sucesso:</strong> existência de casos de sucesso de sistemas em produção usando o servidor de aplicação.</p>
<p>Estes dois servidores possuem um grande comunidade de usuários, então, caros colegas e recém chegados leitores, sintam-se a vontade e estimulados a deixar algum comentário caso tenham alguma opinião ou experiência relativos a qualquer um desses pontos do Glassfish ou Jboss + JON.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fabriciolemos.org/blog/2008/glassfish-ou-jboss-jon/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Automatização de testes funcionais</title>
		<link>http://www.fabriciolemos.org/blog/2008/automatizacao-de-testes-funcionais/</link>
		<comments>http://www.fabriciolemos.org/blog/2008/automatizacao-de-testes-funcionais/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 09:44:46 +0000</pubDate>
		<dc:creator>Fabrício Lemos</dc:creator>
				<category><![CDATA[Testes automatizados]]></category>
		<category><![CDATA[Testes funcionais]]></category>
		<category><![CDATA[Refatoração]]></category>
		<category><![CDATA[Testes de Unidade]]></category>

		<guid isPermaLink="false">http://www.fabriciolemos.org/blog/?p=3</guid>
		<description><![CDATA[Oi pessoal, nesse primeiro post vou falar de testes automatizados. Quem me conhece sabe que esse é um assunto que me interessa muito, mas desta vez o assunto não é teste de unidade, e sim testes funcionais, muitas vezes chamados de teste de aceitação.
A realização de testes funcionais é uma prática bem mais difundida do [...]]]></description>
			<content:encoded><![CDATA[<p>Oi pessoal, nesse primeiro post vou falar de testes automatizados. Quem me conhece sabe que esse é um assunto que me interessa muito, mas desta vez o assunto não é <a href="http://en.wikipedia.org/wiki/Unit_Test" target="_blank">teste de unidade</a>, e sim testes funcionais, muitas vezes chamados de <a href="http://en.wikipedia.org/wiki/Acceptance_test" target="_blank">teste de aceitação</a>.</p>
<p>A realização de testes funcionais é uma prática bem mais difundida do que testes de unidade. É uma disciplina presente em qualquer metodologia de desenvolvimento, até mesmo porque o cliente em algum momento do ciclo de vida do projeto vai querer verificar se o que foi desenvolvido satisfaz suas espectativas.</p>
<p>O que não é uma prática difundida é a <strong>automatização</strong> dos testes funcionais e sua utilização desde as fases iniciais do desenvolvimento. Enquanto testes de unidade vem ganhando atenção, principalmente com a popularização de metodologias ágeis como <a href="http://en.wikipedia.org/wiki/Extreme_Programming" target="_blank">XP</a>, a automatização de testes funcionais, também defendida por esta metodologia, não tem ganho a mesma atenção.</p>
<p>Em vários projetos já vi diversos motivos para o não investimento na automatização. O mais comum, infelizmente, é nem sentir sua falta. Se se trabalha com um <a href="http://en.wikipedia.org/wiki/Waterfall_model" target="_blank">processo cascata</a>, a fase de teste só é realizada uma vez (no final do projeto) e não existe muito overhead para ser eliminado. Nesses projetos a equipe geralmente tem tantos pepinos que qualidade de software chega a ser um luxo.</p>
<p>Em outros, a preocupação com qualidade do software parte de quem realmente bota a mão na massa: os desenvolvedores. Estes, por estarem muito envolvidos com aspectos de baixo nível, se preocupam em testar o código e delegam, de certa forma, o teste a nível de usuário para a &#8220;equipe de teste&#8221; ou para o cliente mesmo. Pelo menos era assim que eu agia.</p>
<p>Mesmo sem a preocupação com a automatização de testes funcionais, estava tudo funcionando perfeitamente. O investimento em testes de unidade estava dando um ótimo retorno e, aliado a <a href="http://martinfowler.com/articles/continuousIntegration.html" target="_blank">algumas</a> <a href="http://www.improveit.com.br/xp/praticas/codigo_coletivo" target="_blank">outras</a> <a href="http://www.improveit.com.br/xp/praticas/design_incremental" target="_blank">práticas</a>,  fazia com que as iterações terminassem em sua maioria sem nenhum bug e com o cliente bastante satisfeito. Porém, os sistemas em que trabalhei com essa abordagem tinham algo em comum: os testes de unidade eram feitos a partir do dia zero.</p>
<p>A frustração veio quando, ao entrar em um projeto em andamento e com alto índice de instabilidade, testes de unidade não mostraram ser uma boa ferramenta para começar a resolver o problema. Neste projeto as entregas não eram confiáveis. O sistema tinha muitos bugs e, a medida que eles eram corrigidos, outros apareciam ou retornavam. Intuitivamente, para identificar os bugs e evitar que eles voltem, pensamos em adotar testes de unidade. Porém não obtivemos a resposta esperada.</p>
<p>A causa era simples: Uma grande vantagem dos testes de unidade é a exposição de locais em que o design do código poderia ser melhorado. Dessa forma, ao implementar os testes de forma tardia, você vai achar diversos pontos em que o sistema precisa de uma refatoração. Mas como realizar as refatorações necessárias se a cobertura dos testes ainda está bem pequena e não te dá garantia que não vai quebrar o sistema?</p>
<p>É aí que entra a automatização dos testes funcionais. Por ser um teste completamente <a href="http://en.wikipedia.org/wiki/Black_box_testing" target="_blank">caixa preta</a>, você pode de maneira bem mais rápida alcançar uma boa cobertura dos testes. Daí em diante você vai se sentir mais seguro para fazer as refatorações necessárias, de preferência já encaixando os testes de unidade também. Além, claro, do ganho óbvio na identificação de erros no sistema.</p>
<p>Pretendo em outros posts falar mais da automatização de testes funcionais. Nesse primeiro momento queria somente destacar sua importância, principalmente para <a href="http://en.wikipedia.org/wiki/Legacy_system" target="_blank">sistemas legados</a>. Posteriormente espero escrever sobre quais ferramentas e práticas estamos utilizando, além da dificuldade e benefícios encontrados.</p>
<blockquote><p>Functional tests are the first type of tests any application should have. If you had to choose between writing unit tests or functional tests, you should choose the latter.</p>
<p><a href="http://www.amazon.com/JUnit-Action-Vincent-Massol/dp/1930110995/ref=sr_1_2?ie=UTF8&amp;s=books&amp;qid=1222809813&amp;sr=8-2" target="_blank">Junit in Action</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.fabriciolemos.org/blog/2008/automatizacao-de-testes-funcionais/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
