<?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>Borba on Software &#187; Programação</title>
	<atom:link href="http://borba.blog.br/category/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://borba.blog.br</link>
	<description>Desenvolvendo Software com Qualidade.</description>
	<lastBuildDate>Tue, 13 Jul 2010 18:20:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Por que você precisa (re)aprender linguagens funcionais?</title>
		<link>http://borba.blog.br/2010/07/por-que-voce-precisa-reaprender-linguagens-funcionais/</link>
		<comments>http://borba.blog.br/2010/07/por-que-voce-precisa-reaprender-linguagens-funcionais/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 18:20:52 +0000</pubDate>
		<dc:creator>Luiz Borba</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[apresentação]]></category>
		<category><![CDATA[funcional]]></category>

		<guid isPermaLink="false">http://borba.blog.br/?p=181</guid>
		<description><![CDATA[Continuo investindo neste tema. Essa apresentação fiz em maio aqui no CESAR.]]></description>
			<content:encoded><![CDATA[<p>Continuo investindo neste tema. Essa apresentação fiz em maio aqui no <a href="http://www.cesar.org.br" target="_blank">CESAR</a>.</p>
<object width="425" height="348"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=porquevoceprecisaapresenderlinguagensfuncionais-pptx-100713131537-phpapp01"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=porquevoceprecisaapresenderlinguagensfuncionais-pptx-100713131537-phpapp01"  type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="348"></embed></object>
]]></content:encoded>
			<wfw:commentRss>http://borba.blog.br/2010/07/por-que-voce-precisa-reaprender-linguagens-funcionais/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jogue fora sua IDE</title>
		<link>http://borba.blog.br/2010/05/jogue-fora-sua-ide/</link>
		<comments>http://borba.blog.br/2010/05/jogue-fora-sua-ide/#comments</comments>
		<pubDate>Thu, 13 May 2010 20:36:51 +0000</pubDate>
		<dc:creator>Luiz Borba</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[code assist]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[idea]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[scala]]></category>
		<category><![CDATA[turbo c]]></category>

		<guid isPermaLink="false">http://borba.blog.br/?p=167</guid>
		<description><![CDATA[Há algum tempo atrás, um amigo meu (Samuel) me disse que quando estava aprendendo algo novo (um framework ou uma nova linguagem) ele preferia usar o notepad ao invés de uma IDE. Naquele momento eu não dei muita importância, e ainda disse que era frescura, que usar uma IDE era bem melhor. Na hora eu [...]]]></description>
			<content:encoded><![CDATA[<p>Há algum tempo atrás, um amigo meu (Samuel) me disse que quando estava aprendendo algo novo (um framework ou uma nova linguagem) ele preferia usar o notepad ao invés de uma IDE. Naquele momento eu não dei muita importância, e ainda disse que era frescura, que usar uma IDE era bem melhor. Na hora eu não me dei conta, mas hoje vejo que eu já estava com IDE-dependência aguda.</p>
<p>Estou estudando <a title="Scala" href="http://www.scala-lang.org" target="_blank">Scala</a>, e a primeira coisa que procurei para começar o estudo foi uma IDE para começar a dar meus primeiros passos. O problema é que não existe ainda nenhuma IDE que seja boa o suficiente para Scala. Primeiro tentei o Eclipse, mas o plugin está incrivelmente instável, não deveria ser nem disponibilizado para download. O Netbeans não está muito a frente e o IDEA é o melhorzinho, porém com muitos bugs também. Resultado, fiquei com o IDEA e comecei a trabalhar. Por conta dos problemas e dificuldades em pouco tempo eu travei. Perdi a paciência por usar uma ferramenta com tantos problemas e parei os meus estudos práticos.</p>
<p>E agora? Vou ter que esperar meses (ou anos) para que alguém desenvolva uma IDE boa o suficiente? E quando não existia ferramentas com esse nível de recursos? Como a gente se virava?</p>
<p><a href="http://borba.blog.br/wordpress/wp-content/uploads/2010/05/tc201compilefp5.png"><img class="aligncenter size-full wp-image-166" title="Turbo C" src="http://borba.blog.br/wordpress/wp-content/uploads/2010/05/tc201compilefp5.png" alt="" width="650" height="434" /></a></p>
<p>Quando eu comecei a trabalhar, usava Turbo C 2.0. Alguém se lembra? Não  tinha <em>syntax highlight</em>, abria apenas um arquivo por vez e <em>code assist</em> nem pensar. Tinha <em>copy and paste</em> e lamba os beiços. E que saber? Era uma  ferramenta muito boa. Era boa e produtiva pela simples razão que <strong>EU  SABIA O QUE ESTAVA FAZENDO</strong>.</p>
<p>As ferramentas de hoje em dia são tão sofisticadas, tem tantos recursos e facilidades, que criaram uma geração de programadores que são absolutamente dependentes delas. Programadores que não são capazes de saber que método de uma determinada classe ele precisa chamar. Se não tiver um <em>code assist</em> eles simplesmente não sabem o que fazer (muitos não sabem nem com o uso do <em>code assist</em>).</p>
<p><a href="http://borba.blog.br/wordpress/wp-content/uploads/2010/05/codeassist.png"><img class="aligncenter size-full wp-image-168" title="code assist" src="http://borba.blog.br/wordpress/wp-content/uploads/2010/05/codeassist.png" alt="" width="334" height="209" /></a></p>
<p>Precisamos abandonar um pouco nossas IDEs. Precisamos (re)aprender as linguagens e frameworks sem o uso dessas facilidades. Só quando finalmente estivermos seguros sobre o nosso conhecimento é que estamos autorizados a usar as IDEs. <em>Bye bye</em> IDEA, seja bem vindo o Notepad. Agora finalmente vou <strong>APRENDER </strong>Scala. Depois de um momento de negação estou finalmente me curando da IDE-dependência. Samuel, você estava <strong>CERTO</strong>!</p>
]]></content:encoded>
			<wfw:commentRss>http://borba.blog.br/2010/05/jogue-fora-sua-ide/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Porque linguagens funcionais são importantes</title>
		<link>http://borba.blog.br/2010/04/porque-linguagens-funcionais-sao-importantes/</link>
		<comments>http://borba.blog.br/2010/04/porque-linguagens-funcionais-sao-importantes/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 19:43:34 +0000</pubDate>
		<dc:creator>Luiz Borba</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[funcional]]></category>

		<guid isPermaLink="false">http://borba.blog.br/?p=154</guid>
		<description><![CDATA[Dos 3 principais paradigmas de programação (funcional, imperativo e orientado a objetos),  o funcional é o mais antigo. A primeira linguagem de programação funcional foi criada em 1955 (IPL) e a mais popular LISP foi criada em 1958. Apesar de surgirem um pouco depois (Fortran e COBOL foram criadas respectivamentes em 1956 e 1959), as [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://borba.blog.br/wordpress/wp-content/uploads/2010/04/lambda.svg_.med_.png"><img class="alignleft size-full wp-image-161" title="lambda" src="http://borba.blog.br/wordpress/wp-content/uploads/2010/04/lambda.svg_.med_.png" alt="" width="204" height="299" /></a>Dos 3 principais paradigmas de programação (funcional, imperativo e orientado a objetos),  o funcional é o mais antigo. A primeira linguagem de programação funcional foi criada em 1955 (IPL) e a mais popular LISP foi criada em 1958. Apesar de surgirem um pouco depois (Fortran e COBOL foram criadas respectivamentes em 1956 e 1959), as linguagens imperativas tiveram maior popularidade. Mesmo sem ter alcançado o <em>mainstream</em>, o paradigma funcional continou recebendo investimentos ano após ano até meados dos anos 90, quando a turma das linguagens imperativas se fundiu definitivamente com o pessoal de orientação a objetos (C++ e principalmente Java são exemplos) enterrando as linguagens funcionais no lixo da história. Acabaram as esperanças desse paradigma se tornar parte do <em>mainstream</em>. Será?</p>
<p>O tempo passou e nos últimos anos alguns sinais começaram a aparecer. Erlang (linguagem funcional proprietária criada pela Ericsson) que foi banida e distribuida de forma open-source em 98, volta a ser utilizada pela Ericsson (e por muitos outros) em 2004. A Microsoft lança o F# (linguagem funcional para a plataforma .NET). O pessoal do Twitter reescreve seu back-end em Scala (linguagem funcional e OO para a plataforma Java). C# incorpora conceitos funcionais na sua linguagem para dar suporte ao  LINQ. A Google publica artigos mostrando como utiliza o paradigma funcional para armazenar e recuperar dados. Porque esse interesse no paradigma funcional foi renovado? Qual o pulo do gato?</p>
<p>Devido a proximidade de limites técnicos e preocupação com consumo de energia, o pessoal de hardware está focando no desenvolvimento de novos processadores em soluções de múltiplos cores. Em breve teremos processadores com centenas de cores. Para se beneficiar deste panorama, temos que escrever softwares que executem de forma paralela. A boa notícia é que é muito mais fácil escrever código concorrente em liguagens funcionais do que em linguagens imperativas.</p>
<p>Não existe um único paradigma que seja indicado para resolver todos os tipos de problemas. Precisamos aprender (ou reaprender) o paradigma funcional, que foi abandonado por muito tempo. Precisamos de linguagens que incluam de forma coerente vários paradigmas, para que a gente possa escolher a melhor forma de resolver um determinado problema. Por fim, precisamos aprender Scala, que me parece a mais promissora nas novas linguagens multi-paradigma.</p>
]]></content:encoded>
			<wfw:commentRss>http://borba.blog.br/2010/04/porque-linguagens-funcionais-sao-importantes/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>SQL ou NoSQL? Essa é a questão</title>
		<link>http://borba.blog.br/2010/01/sql-ou-nosql-essa-e-a-questao/</link>
		<comments>http://borba.blog.br/2010/01/sql-ou-nosql-essa-e-a-questao/#comments</comments>
		<pubDate>Sat, 30 Jan 2010 15:05:48 +0000</pubDate>
		<dc:creator>Luiz Borba</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://borba.blog.br/?p=135</guid>
		<description><![CDATA[Banco de dados relacionais fazem parte da nossa vida há muito tempo. SQL e abstrações (HQL por exemplo) fazem parte da rotina de qualquer desenvolvedor de sistemas de informação. Agora, será que o domínio dessa tecnologia vai continuar prevalecendo na era da Internet? Gigantes da Internet como Google, Amazon, Facebook, entre outros, descobriram há um [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://borba.blog.br/wordpress/wp-content/uploads/2010/01/nosql-logo.gif"><img class="alignnone size-full wp-image-136" title="nosql-logo" src="http://borba.blog.br/wordpress/wp-content/uploads/2010/01/nosql-logo.gif" alt="" width="200" height="51" /></a></p>
<p>Banco de dados relacionais fazem parte da nossa vida há muito tempo. SQL e abstrações (HQL por exemplo) fazem parte da rotina de qualquer desenvolvedor de sistemas de informação. Agora, será que o domínio dessa tecnologia vai continuar prevalecendo na era da Internet?</p>
<p>Gigantes da Internet como Google, Amazon, Facebook, entre outros, descobriram há um bom tempo que os bancos de dados relacionais não atendem suas necessidades, especialmente as relacionadas com escalabilidade. Essas empresas investiram em outro tipo de tecnologia para armazenamento e recuperação de dados. Hoje essas soluções são conhecida coletivamente como <a href="http://nosql-database.org/" target="_blank">NoSQL</a>.</p>
<p>Agora vem a grande questão, para onde eu vou: SQL ou NoSQL?</p>
<p>Cada opção tem sua aplicabilidade, não seja dogmático (muitos nas duas comunidades são) e aproveite o que cada tecnologia tem de melhor. A única coisa que quero alertar é que a opção por NoSQL é uma realidade viável. Claro que as soluções NoSQL ainda tem que comer muita farinha para chegar a maturidade, mas podemos enxergar nisso uma oportunidade de pioneirismo. Como desenvolvedores de software temos que estar preparados, então arregace as mangas e vá ESTUDAR!</p>
]]></content:encoded>
			<wfw:commentRss>http://borba.blog.br/2010/01/sql-ou-nosql-essa-e-a-questao/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Um Software de Qualidade</title>
		<link>http://borba.blog.br/2009/07/um-software-de-qualidade/</link>
		<comments>http://borba.blog.br/2009/07/um-software-de-qualidade/#comments</comments>
		<pubDate>Sun, 19 Jul 2009 19:31:00 +0000</pubDate>
		<dc:creator>Luiz Borba</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[qualidade]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://borba.blog.br/?p=111</guid>
		<description><![CDATA[Eu vou falar um pouco mais sobre o WordPress porque acho que é um bom exemplo de um software de qualidade. Vou começar pela instalação. Para instalar o WordPress, só é necessário verificar o "Famous 5-Minute Install". Pronto. Funciona de verdade. Na verdade não é você que instala o WordPress, ele se instala sozinho, você [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-112" title="wordpress logo" src="http://borba.blog.br/wordpress/wp-content/uploads/2009/07/blue-m.png" alt="wordpress logo" width="100" height="100" />Eu vou falar um pouco mais sobre o <a href="http://www.wordpress.org" target="_blank">WordPress</a> porque acho que é um bom exemplo de um software de qualidade.</p>
<p>Vou começar pela instalação. Para instalar o WordPress, só é necessário verificar o "<a href="http://codex.wordpress.org/Installing_WordPress#Famous_5-Minute_Install" target="_blank">Famous 5-Minute Install</a>". Pronto. Funciona de verdade. Na verdade não é você que instala o WordPress, ele se instala sozinho, você apenas manda ele se instalar. Não dá pra engolir softwares que só para instalar é preciso ler um livro cheio de procedimentos e depois acaba dando tudo errado e você ainda tem que ficar pesquisando na internet para ver ser descobre o que aconteceu.</p>
<p>Um dos procedimentos que ele faz na instalação é criar a estrutura do banco de dados. Hoje em dia não é difícil encontrar um framework que facilite isso (vide <a href="http://www.hibernate.org" target="_blank">Hibernate</a>), por então não fazemos isso sempre?</p>
<p>Outro exemplo que vi de como o WordPress é robusto foi quando eu resolvi mudar a configuração dos permalinks. Após alterar a configuração veja o que apareceu na tela:</p>
<p><img class="alignnone size-full wp-image-114" title="wp_permalink" src="http://borba.blog.br/wordpress/wp-content/uploads/2009/07/wp_permalink.png" alt="wp_permalink" width="668" height="367" /></p>
<p>Devido a minha escolha o wordpress precisava criar um arquivo .htaccess para atender minha necessidade, como ele sozinho descobriu que não tinha permissão de escrita no diretório, mostrou na tela as instruções detalhadas do procedimento que eu precisava fazer na mão para que os permalinks pudessem funcionar. Quantas vezes você já se deparou com algum erro desconhecido e teve que fuçar logs para descobrir qual o problema?</p>
<p>É verdade, Software Robusto demanda mais esforço mas devemos abrir mão da preguiça. Não podemos é abrir mão da qualidade dos softwares que escrevemos. Software frágeis acabam por consumir a falsa economia no desenvolvimento porque geram um imenso custo de suporte e manutenção. Siga o exemplo do Worpress.</p>
]]></content:encoded>
			<wfw:commentRss>http://borba.blog.br/2009/07/um-software-de-qualidade/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O que não ajuda, atrapalha&#8230;</title>
		<link>http://borba.blog.br/2009/06/o-que-nao-ajuda-atrapalha/</link>
		<comments>http://borba.blog.br/2009/06/o-que-nao-ajuda-atrapalha/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 11:42:00 +0000</pubDate>
		<dc:creator>Luiz Borba</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[nhibernate]]></category>

		<guid isPermaLink="false">http://metralhadoralord2.wordpress.com/2009/06/20/o-que-nao-ajuda-atrapalha/</guid>
		<description><![CDATA[Trabalhei esses últimos dias fazendo uma otimização de uma rotina escrita em C# e que usava NHibernate. Uma das mudanças que fiz foi fazer um bulk delete de uma certa entidade. Quis o destino que eu encontrasse um método delete com uma assinatura que recebia uma query. Perfeito! Fiz a minha parte: sessao.Delete&#40;&#34;FROM Ocorrencia WHERE [...]]]></description>
			<content:encoded><![CDATA[<p>Trabalhei esses últimos dias fazendo uma otimização de uma rotina escrita em C# e que usava NHibernate. Uma das mudanças que fiz foi fazer um <span style="font-style:italic;">bulk delete</span> de uma certa entidade. Quis o destino que eu encontrasse um método delete com uma assinatura que recebia uma query. Perfeito!</p>
<p>Fiz a minha parte:</p>
<p><code class="codecolorer csharp default"><span class="csharp">sessao<span style="color: #008000;">.</span><span style="color: #0000FF;">Delete</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;FROM Ocorrencia WHERE ...&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></span></code></p>
<p>Não é que o maldito NHibernate ao invés de simplesmente criar a query de remoção, executa uma query de consulta, monta todos as entidades (no caso, Ocorrencia) e depois dá delete de um por um?</p>
<p>Por que diabos alguém em seu juízo perfeito escreveria um método tão estúpido quanto esse? Se eu já quero apagar esses objetos porque carrega-los na memória, consumindo o meu já escasso tempo de processamento?</p>
<p>Fica a lição: NÃO PROGRAME POR COINCIDÊNCIA. Não é apenas porque um método tem a assinatura perfeita que ele vai ser a solução do seu problema. LEIA A DOCUMENTAÇÃO. Certifique-se que está fazendo a coisa certa, ou caso contrário você vai se dar muito mal.</p>
]]></content:encoded>
			<wfw:commentRss>http://borba.blog.br/2009/06/o-que-nao-ajuda-atrapalha/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Aprenda direito!</title>
		<link>http://borba.blog.br/2008/11/aprenda-direito/</link>
		<comments>http://borba.blog.br/2008/11/aprenda-direito/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 01:11:00 +0000</pubDate>
		<dc:creator>Luiz Borba</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[aprendizado]]></category>
		<category><![CDATA[wicket]]></category>

		<guid isPermaLink="false">http://metralhadoralord2.wordpress.com/2008/11/18/aprenda-direito/</guid>
		<description><![CDATA[Cuidado quando precisar aprender uma tecnologia nova. É muito tentador ver um tutorial e achar que já sabe usar a coisa. Já cansei de ver o pessoal cair do cavalo por conta disso (eu mesmo caí várias vezes). Estudar apenas o tutorial não lhe dá a base necessária para entender como aquele treco funciona e [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://borba.blog.br/wordpress/wp-content/uploads/2008/11/people_studying.jpg" alt="people studying" title="people studying" width="320" height="314" class="alignleft size-full wp-image-78" />Cuidado quando precisar aprender uma tecnologia nova. É muito tentador ver um tutorial e achar que já sabe usar a coisa. Já cansei de ver o pessoal cair do cavalo por conta disso (eu mesmo caí várias vezes). Estudar apenas o tutorial não lhe dá a base necessária para entender como aquele treco funciona e muitas vezes você vai fazer besteira por não compreender o que acontece por debaixo dos panos.</p>
<p>Aqui o caso em questão é o <a href="http://wicket.apache.org/">wicket</a>. Um de nossos clientes resolveu adotar esse framework em sua arquitetura. Eles mesmo escreveram parte da aplicação utilizando o wicket e nós continuamos o desenvolvimento. A base que eles desenvolveram não era suficiente para atender todas as necessidades do projeto (nunca é), então tivemos que nos aprofundar na solução. Muitos envolvidos cairam na armadilha. Aprendem um pouco e começam a chutar e adivinhar como o negócio funciona através de tentativa e erro. NÃO FAÇA ISSO!</p>
<p>Agora eu mesmo estou aprendendo a trabalhar com wicket. Peguei um livro (<a href="http://www.manning.com/dashorst/">Wicket in Action</a>) e estou estudando TUDO. Em geral esse tipo de livro começa com um overview, passando para uma explicação sobre a arquitetura, depois vem o tutorial e depois vem seções que mostram de forma mais detalhadas suas funcionalidades. Normalmente durante o tutorial você já é capaz de implementar coisas mais simples, mas não pare por aí. ESTUDE O LIVRO TODO! Monte uma base SÓLIDA de conhecimentos. Depois de ter essa base, tudo fica mais fácil.</p>
]]></content:encoded>
			<wfw:commentRss>http://borba.blog.br/2008/11/aprenda-direito/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aprenda C</title>
		<link>http://borba.blog.br/2008/09/aprenda-c/</link>
		<comments>http://borba.blog.br/2008/09/aprenda-c/#comments</comments>
		<pubDate>Sat, 27 Sep 2008 16:24:00 +0000</pubDate>
		<dc:creator>Luiz Borba</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[assembly]]></category>
		<category><![CDATA[basic]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[computador]]></category>
		<category><![CDATA[tk85]]></category>
		<category><![CDATA[z80]]></category>

		<guid isPermaLink="false">http://metralhadoralord2.wordpress.com/2008/09/27/aprenda-c/</guid>
		<description><![CDATA[Meu primeiro computador foi um TK85. Nele eu aprendi o BASIC e comecei a programar. Logo eu percebi que o BASIC não era suficiente para fazer tudo o que queria e comecei a estudar Assembly Z80. Nessa época não tinha internet, a gente aprendia muitas coisas nos livros e revistas, mas na maioria do tempo [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-51 aligncenter" title="tk85" src="http://borba.blog.br/wordpress/wp-content/uploads/2008/09/tk85.jpg" alt="tk85" width="368" height="231" /><br />
Meu primeiro computador foi um <a href="http://www.mci.org.br/micro/microdigital/tk85.html">TK85</a>. Nele eu aprendi o <a href="http://en.wikipedia.org/wiki/BASIC_programming_language">BASIC</a> e comecei a programar. Logo eu percebi que o BASIC não era suficiente para fazer tudo o que queria e comecei a estudar <a href="http://en.wikipedia.org/wiki/Assembly_language">Assembly</a> <a href="http://en.wikipedia.org/wiki/Zilog_Z80">Z80</a>. Nessa época não tinha internet, a gente aprendia muitas coisas nos livros e revistas, mas na maioria do tempo era por tentativa e erro. Todas essas dificuldades e limitações ajudaram a formar uma geração que conhece muito bem como um computador funciona e sabe muito bem como programar. Hoje em dia, o cara que quer começar na área já começa aprendendo uma linguagem como <a href="http://java.sun.com/">Java</a>, <a href="http://www.php.net/">PHP</a>, <a href="http://msdn.microsoft.com/en-us/vcsharp/aa336809.aspx">C#</a>, <a href="http://www.ruby-lang.org/">Ruby</a>, ou sei lá o que e se tornam engenheiros medíocres... Falta uma base sólida! A maioria dos engenheiros hoje em dia não têem a mínima idéia de como as linguagens e os computadores funcionam. Se você está começando, aprenda <a href="http://en.wikipedia.org/wiki/C_%28programming_language%29">C</a> (não precisa ser assembly). Aprendendo e usando C, você vai construir a base de conhecimentos necessária para ser tornar um bom engenheiro. Depois de ter essa base, você vai aprender qualquer linguagem com muita facilidade, se tornando um excelente programador.</p>
]]></content:encoded>
			<wfw:commentRss>http://borba.blog.br/2008/09/aprenda-c/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>DbUnit x Hibernate</title>
		<link>http://borba.blog.br/2008/09/dbunit-x-hibernate/</link>
		<comments>http://borba.blog.br/2008/09/dbunit-x-hibernate/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 14:41:00 +0000</pubDate>
		<dc:creator>Luiz Borba</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[dbunit]]></category>
		<category><![CDATA[ejb]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[princípio dry]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[yaml]]></category>

		<guid isPermaLink="false">http://metralhadoralord2.wordpress.com/2008/09/11/dbunit-x-hibernate/</guid>
		<description><![CDATA[Aqui na empresa, temos clientes que apenas mandam executar um projeto segundo a arquitetura definida por eles. Algumas vezes é frustante trabalhar neste tipo de projeto, afinal, nem sempre conseguimos seguir nossas convicções e utilizar plenamente nossos conhecimentos e experiência na definição da melhor solução para o problema. Em um desses projetos, fui convocado para [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-49" style="margin-left: 10px;" title="testing" src="http://borba.blog.br/wordpress/wp-content/uploads/2008/09/testing1.jpg" alt="testing" width="256" height="176" />Aqui na empresa, temos clientes que apenas mandam executar um projeto segundo a arquitetura definida por eles. Algumas vezes é frustante trabalhar neste tipo de projeto, afinal, nem sempre conseguimos seguir nossas convicções e utilizar plenamente nossos conhecimentos e experiência na definição da melhor solução para o problema. Em um desses projetos, fui convocado para auxiliar a equipe que estava consumindo muito tempo na implementação dos testes.</p>
<p><strong>O Cenário:</strong></p>
<p>O sistema utiliza <a href="http://java.sun.com/products/ejb">EJB</a> 2 e <a href="http://www.hibernate.org/">Hibernate</a> 2. O cliente exige implementação de testes dos métodos da <a href="http://c2.com/cgi/wiki?FacadePattern">fachada</a> utilizando <a href="http://www.junit.org/">JUnit</a> e <a href="http://dbunit.sourceforge.net/">DbUnit</a>.</p>
<p><strong>Problemas:</strong></p>
<p>A montagem dos cenários é complexa. O DbUnit entende apenas o modelo relacional, isto significa que o engenheiro tem que fazer um "desmapeamento hibernate" na cabeça dele para montar as tabelas e colunas com os valores necessários. Veja um exemplo:</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">'1.0'</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">'UTF-8'</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dataset<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;employee</span> <span style="color: #000066;">start_date</span>=<span style="color: #ff0000;">&quot;2001-01-01&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">first_name</span>=<span style="color: #ff0000;">&quot;Drew&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">ssn</span>=<span style="color: #ff0000;">&quot;333-29-9999&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">last_name</span>=<span style="color: #ff0000;">&quot;Smith&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;employee</span> <span style="color: #000066;">start_date</span>=<span style="color: #ff0000;">&quot;2002-04-04&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">first_name</span>=<span style="color: #ff0000;">&quot;Nick&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">ssn</span>=<span style="color: #ff0000;">&quot;222-90-1111&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">last_name</span>=<span style="color: #ff0000;">&quot;Marquiss&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;employee</span> <span style="color: #000066;">start_date</span>=<span style="color: #ff0000;">&quot;2003-06-03&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">first_name</span>=<span style="color: #ff0000;">&quot;Jose&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">ssn</span>=<span style="color: #ff0000;">&quot;111-67-2222&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">last_name</span>=<span style="color: #ff0000;">&quot;Whitson&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dataset<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
<p>Claro que esse é um modelo relacional simples, agora imagine modelos de classes complexos, com heranças, relacionamentos, etc. Neste caso, dá bastante trabalho.</p>
<p>Além da dificuldade em produzir a massa de dados, existe um problema muito grave. Dentro das classes de teste é necessário fazer validações contra os valores do arquivo xml (por exemplo em métodos de consulta). Neste caso podemos fazer as validações com valores hard coded, como neste exemplo:</p>
<p><code class="codecolorer java default"><span class="java">assertEquals<span style="color: #009900;">&#40;</span>employee.<span style="color: #006633;">getFirstName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #0000ff;">&quot;Jose&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></span></code></p>
<p>Que é uma péssima idéia, pois viola o <a href="http://c2.com/cgi/wiki?DontRepeatYourself">princípio DRY</a> (Don't Repeat Yourself). Outra saída é obter os valores do xml através da API do DbUnit, que vai dar uma trabalheira danada, ainda mais se você quiser montar o objeto para fazer comparações deste tipo:</p>
<p><code class="codecolorer java default"><span class="java">assertEquals<span style="color: #009900;">&#40;</span>employeeActual, employeeExpected<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></span></code></p>
<p>Já imaginou? Vai ter que construir outro hibernate só para pegar cada valor das tabelas e colunas do arquivo XML e remontar os objetos novamente.</p>
<p><strong>Como Resolver?</strong></p>
<p>O grande problema dessa abordagem é o fato do DbUnit entender apenas de tabelas e colunas. E se existisse um HibernateUnit? No hipotético HibernateUnit eu poderia especificar meus dados na forma de objetos. Além disso, poderia utilizar um formato mais legível e que pudesse ser transformado diretamente para objetos dentro do seu código. Esse formato pode ser o <a href="http://www.yaml.org/">YAML</a>. Veja como ficaria:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">departaments:<br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#006600; font-weight:bold;">&amp;</span>engineering<br />
&nbsp; &nbsp; &nbsp; id &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: <span style="color:#006666;">1</span><br />
&nbsp; &nbsp; &nbsp; name &nbsp; &nbsp; &nbsp; &nbsp;: Engineering<br />
&nbsp; &nbsp; &nbsp; employees:<br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">-</span> id &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: <span style="color:#006666;">1</span><br />
&nbsp; &nbsp; &nbsp; startDate &nbsp; : <span style="color:#006666;">2001</span><span style="color:#006600; font-weight:bold;">-</span>01<span style="color:#006600; font-weight:bold;">-</span>01<br />
&nbsp; &nbsp; &nbsp; firstName &nbsp; : Drew<br />
&nbsp; &nbsp; &nbsp; lastName &nbsp; &nbsp;: Smith<br />
&nbsp; &nbsp; &nbsp; ssn &nbsp; &nbsp; &nbsp; &nbsp; : <span style="color:#006666;">333</span><span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">29</span><span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">9999</span><br />
&nbsp; &nbsp; &nbsp; departament : <span style="color:#006600; font-weight:bold;">*</span>engineering<br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">-</span> id &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: <span style="color:#006666;">2</span><br />
&nbsp; &nbsp; &nbsp; startDate &nbsp; : <span style="color:#006666;">2002</span><span style="color:#006600; font-weight:bold;">-</span>04<span style="color:#006600; font-weight:bold;">-</span>04<br />
&nbsp; &nbsp; &nbsp; firstName &nbsp; : Nick<br />
&nbsp; &nbsp; &nbsp; lastName &nbsp; &nbsp;: Marquiss<br />
&nbsp; &nbsp; &nbsp; ssn &nbsp; &nbsp; &nbsp; &nbsp; : <span style="color:#006666;">222</span><span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">90</span><span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1111</span><br />
&nbsp; &nbsp; &nbsp; departament : <span style="color:#006600; font-weight:bold;">*</span>engineering<br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">-</span> id &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: <span style="color:#006666;">3</span><br />
&nbsp; &nbsp; &nbsp; startDate &nbsp; : <span style="color:#006666;">2003</span><span style="color:#006600; font-weight:bold;">-</span>06<span style="color:#006600; font-weight:bold;">-</span>03<br />
&nbsp; &nbsp; &nbsp; firstName &nbsp; : Jose<br />
&nbsp; &nbsp; &nbsp; lastName &nbsp; &nbsp;: Whitson<br />
&nbsp; &nbsp; &nbsp; ssn &nbsp; &nbsp; &nbsp; &nbsp; : <span style="color:#006666;">111</span><span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">67</span><span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">2222</span><br />
&nbsp; &nbsp; &nbsp; departament : <span style="color:#006600; font-weight:bold;">*</span>engineering</div></div>
<p>Inclui um relacionamento para employee só para ficar um pouco mais rico. A vantagem dessa abordagem é que além de ficar mais legível, existem frameworks que serializam e deserializam esse formato para objetos. Com esse recurso, seria possível obter os objetos diretamente do arquivo e em seguida fazer comparações com objetos obtidos no banco. Legal, hein?</p>
<p>Acho que uma solução deste tipo poderia trazer muitos benefícios para o nosso problema. Estou fazendo uma pesquisa e se não existir nada semelhante, devo implementar essa solução como um projeto open source.</p>
<p>Pena que nosso cliente EXIGE que usemos o DbUnit.</p>
]]></content:encoded>
			<wfw:commentRss>http://borba.blog.br/2008/09/dbunit-x-hibernate/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
