<?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>Zona J &#187; futurismo</title>
	<atom:link href="http://www.zonaj.org/category/futurismo/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zonaj.org</link>
	<description>Zona Java - Um blog português sobre java.</description>
	<lastBuildDate>Wed, 26 May 2010 17:23:38 +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>Como garantir Qualidade de Software?</title>
		<link>http://www.zonaj.org/2008/09/28/como-garantir-qualidade-de-software/</link>
		<comments>http://www.zonaj.org/2008/09/28/como-garantir-qualidade-de-software/#comments</comments>
		<pubDate>Sun, 28 Sep 2008 09:42:05 +0000</pubDate>
		<dc:creator>Ruben Badaró</dc:creator>
				<category><![CDATA[evento]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[futurismo]]></category>
		<category><![CDATA[geral]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[qa]]></category>
		<category><![CDATA[qualidade]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.zonaj.org/?p=145</guid>
		<description><![CDATA[Definir qualidade de software é difícil pois são muitos os factores que influenciam os resultados.
Mais do que ser uma lista extensiva de soluções, este post tem como objectivo identificar a maioria dos pontos &#8211; são, aliás, perfeitamente lógicos e conhecidos &#8211; que têm de ser testados e validados, e apontar a direcção e algumas ferramentas.
É [...]]]></description>
			<content:encoded><![CDATA[<p>Definir qualidade de software é difícil pois são muitos os factores que influenciam os resultados.<br />
Mais do que ser uma lista extensiva de soluções, este post tem como objectivo identificar a maioria dos pontos &#8211; são, aliás, perfeitamente lógicos e conhecidos &#8211; que têm de ser testados e validados, e apontar a direcção e algumas ferramentas.<br />
É uma visão na perspectiva de QA (<em>Quality Assurance</em>), mais especificamente de testes. Posso dividir estes factores em dois grupos:</p>
<ul>
<li><strong>Organizacionais ou processuais</strong></li>
<p>Englobam o tipo de gestão de projecto, metodologia de desenvolvimento da equipa, qualidade e processo de recolha de requisitos.</p>
<li><strong>Técnicos</strong></li>
<p>Os artefactos de código e semelhantes produzidos pelos developers e os processos levados a cabo por testers.
</ul>
<p>Este post foca-se primordialmente nos factores técnicos, que passo a enumerar.</p>
<h3>Correcção do código produzido</h3>
<p>É importantíssima a exigência que cada programador coloca em si próprio para escrever código de qualidade: primeiramente, código o mais correcto possível.<br />
No entanto, não basta tentar escrever código correcto, é também necessário pensar nas implicações de performance do que se escreve (por exemplo, fazer um select completo a uma tabela grande sem necessidade), de thread safety, de segurança (caso mais comum, SQL injection para o qual PreparedStatements são uma grande ajuda), de documentação (comentários relevantes) e de estética do próprio código (definir e seguir convenções).</p>
<p>Este ponto depende também da própria qualidade das pessoas na equipa e a diferença além de se pagar nota-se!</p>
<h3>Testes Unitários</h3>
<p>Escrever testes unitários é a forma mais directa que a equipa tem de garantir correcção do código.<br />
Em TDD (<em>Test Driven Development</em>) o teste unitário é a unidade básica e o código é desenvolvido para satisfazer cada teste. Esta aproximação é altamente eficaz mas exige disciplina e considero que é difícil de ser usada pela maioria das equipas, especialmente portuguesas.<br />
No entanto, mesmo em ambientes não TDD este tipo de testes são essenciais, não só para garantir que o código está correcto, como para verificar que não se quebra código anterior cada vez que se alteram ou adicionam funcionalidades.<br />
Quanto maior for a percentagem de caminhos possíveis de código coberta por testes unitários &#8211; o chamado <em>code coverage</em> &#8211; maior é a indicação de garantia de qualidade do código como um todo.</p>
<p>Ferramentas:<br />
<a href="http://www.junit.org/">JUnit</a>, <a href="http://testng.org">TestNG</a>, <a href="http://dbunit.sourceforge.net/">DbUnit</a>, <a href="http://jakarta.apache.org/cactus/">Cactus</a>, <a href="http://www.atlassian.com/software/clover/">Atlassian Clover</a> (<em>code coverage</em>)</p>
<h3><em>Code Reviews</em></h3>
<p>Ainda dentro dos mecanismos de controle que a própria equipa pode usar durante o desenvolvimente encontram-se os <em>code reviews</em>.<br />
Devíamos existir sempre <em>code reviews</em>, embora seja aceitável que não tenhamos 100% do código revisto, apenas uma boa percentagem. E esta boa percentagem é um equilíbrio entre o esforço que a equipa tem a rever e a melhoria de qualidade percebida.<br />
Ter este tipo de controle cria um tipo de <em>peer pressure</em> na equipa. Ninguém é dono do seu pedaço de código, todos sabem que os outros colegas vão validar o que escrevem por isso vão ter um cuidado extra no que produzem.<br />
Desta forma más práticas e erros são detectados cedo no processo e toda a equipa ganha pois todos os membros da equipa aprendem com as correcções que lhes são feitas, especialmente os membros menos experientes que têm neste processo um <em>mentoring</em> por parte de toda a equipa.</p>
<p>Ferramentas:<br />
<a href="http://www.atlassian.com/software/crucible/">Atlassian Crucible</a></p>
<h3>Análise Estática</h3>
<p>Ferramentas de análise estática permitem detectar no erros e standards no código de forma simples. Alguns erros detectados por estas ferramentas poucos ou nenhums programadores conseguem detectar e não são apanhados na grande maioria dos outros testes por isso são uma grande adição.</p>
<p>Ferramentas:<br />
<a href="http://findbugs.sourceforge.net/">FindBugs</a> (obrigatório!), <a href="http://checkstyle.sourceforge.net/">Checkstyle</a></p>
<h3>Sistema de builds / integração contínua</h3>
<p>Builds automatizados é obrigatório! Muitos são os projectos hoje em dia em que cada developer tem o seu próprio processo de build separado no seu IDE.<br />
Seguindo a regra de ouro de que quanto mais cedo se detecta um erro melhor, o processo de builds pode e deve ser escalonado num motor de integração contínua que permite rapidamente detectar quando um membro da equipa quebra o build.<br />
Igualmente importante é adicionar ao processo de build meios adicionais de controlo de qualidade na forma de plugins ou tasks extra &#8211; correr testes unitários, gerar relatórios de code coverage, correr ferramentas de análise estática de código, etc.</p>
<p>Ferramentas:<br />
<a href="http://ant.apache.org/">Ant</a>, <a href="http://maven.apache.org/">Maven</a>, <a href="http://ant.apache.org/ivy/">Ivy</a>, <a href="http://cruisecontrol.sourceforge.net/">Cuise Control</a>, <a href="https://hudson.dev.java.net/">Hudson</a>, <a href="http://www.jetbrains.com/teamcity/">TeamCity</a>, <a href="http://www.atlassian.com/software/bamboo/">Atlassian Bamboo</a></p>
<h3>Equipa de testes / QA</h3>
<p>Este ponto não é técnico mas considero-o importante. Em todos os projectos que trabalhei em Portugal apenas uma vez trabalhei uma equipa de QA (<em>Quality Assurance</em>) organizada. Na maioria dos projectos os testes de &#8220;qualidade&#8221; resumiam-se a fazer deploy da aplicação para outro ambiente e ter alguém &#8211; muitas vezes da parte do cliente &#8211; testar ad-hoc a aplicação. E quem fazia estes testes era muitas vezes o interessado em passar a aplicação a produção &#8211; muitas vezes o próprio project manager da equipa.<br />
É muito importante ter uma equipa, ou mesmo apenas uma pessoa, de QA que tem responsabilidades de testes em determinadas fazes. É ainda mais importante que esses membros não façam parte da equipa de desenvolvimento, pois estariam com &#8220;maus hábitos&#8221;, nem da gestão de projectos, pois vai querer é satisfazer o cliente, nem do cliente, que simplesmente não vai testar devidamente e depois a culpa é da equipa. Grande parte dos projectos têm baixa qualidade porque o desenvolvimento para clientes envolve os tais &#8220;compromissos&#8221; entre qualidade e tempo/dinheiro que os PMs tanto falam.</p>
<h3>Testes funcionais</h3>
<p>Quer se tenha um processo de desenvolvimento em cascata ou iterativo, depois de cada release deve-se passar à fase de QA em que os testes funcionais são executados.<br />
Estes testes devem ser feitos com base num plano de testes já elaborado ou nos próprios requisitos do projecto &#8211; sejam eles use cases, user stories ou outra coisa qualquer.<br />
Nestes testes o carácter específico de um membro QA entram em cena: o espírito inquisitivo e a capacidade de interpretarem os requisitos do ponto de vista do utilizador.</p>
<h3>Testes de carga</h3>
<p>Num modelo de desenvolvimento iterativo os testes de carga não precisam de ser feitos no fim de cada iteração mas apenas em releases major.<br />
Duas perspectivas devem ser testadas: performance e escalabilidade.<br />
Algumas ferramentas podem ser usadas para testas as duas perspectivas &#8211; por exemplo, a aplicação que testa o tempo de invocação de algo pode lançar x threads para testar como escala.<br />
Para testar devidamente escalabilidade, devem ser tida em conta a infraestrutura do projecto. Não é necessário replicar um ambiente de produção, é aliás impossível a maioria das vezes devido aos custos, mas se em produção temos uma base de dados numa máquina e um aplication server noutra, vamos deixá-los separados também para testes para ter em conta todas as variáveis.</p>
<p>Ferramentas:<br />
<a href="http://www.webload.org/">WebLoad</a>, <a href="http://jakarta.apache.org/jmeter/">JMeter</a>, <a href="http://grinder.sourceforge.net/">Grinder</a></p>
<h3>Testes de segurança</h3>
<p>Uma das áreas menos testadas no desenvolvimento de aplicações web é a segurança, normalmente até acontecer algo de mau. Mesmo a maioria dos testers não sabem fazer testes de segurança nem o que é uma ataque de <em>Cross-Site Scripting</em> (XSS). E mesmo a maioria dos developers não têm grandes cuidados com segurança além dos típicos ataques de <em>SQL Injection</em>.<br />
A falta de ferramentas é um dos grandes problemas nesta área.</p>
<p>Ferramentas:<br />
<a href="http://www.owasp.org/index.php/Category:OWASP_WebScarab_Project">WebScarab</a></p>
<h3>Testes de UI</h3>
<p>O teste mais básico de UI é ver se as coisas fazer <em>rendering</em> correcto nos diferentes browsers. Validar automaticamente o código gerado de acordo com standards é também importante.<br />
Para facilitar o trabalho, existem diversos projectos de automatização de testes de UI.</p>
<p>Ferramentas:<br />
<a href="http://selenium.openqa.org/">Selenium</a>, <a href="http://wtr.rubyforge.org/">Watir</a>, <a href="http://www.getwindmill.com/">Windmill</a> </p>
<p>Outros testes importantes são os de integração e de regressão mas não são áreas em que tenha muita experiência ou opinião formada por isso abstenho-me. </p>
<p>Todos estes pontos são bastante lógicos, penso eu. Tudo o que se possa fazer para aumentar a qualidade final do que se desenvolve é positivo e a qualidade deve estar na mente de todos e não ser uma moeda de troca, razão da mediocridade de grande parte das aplicações feitas para clientes que vi na minha vida profissional.<br />
Qualidade custa também dinheiro, sim, mas o retorno é grande, tenho a certeza.</p>
<p><strong>Update</strong>:<br />
A proposito de um comentário do <a href="http://www.mouseoverstudio.com/blog/">Diego Carrion</a>, fica uma referência para o <a href="http://jbehave.org/">JBehaviour2</a>, para testes funcionais numa aproximação BDD (<em>Behaviour-Driven Development</em>)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zonaj.org/2008/09/28/como-garantir-qualidade-de-software/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Properties na linguagem java</title>
		<link>http://www.zonaj.org/2008/04/17/properties-na-linguagem-java/</link>
		<comments>http://www.zonaj.org/2008/04/17/properties-na-linguagem-java/#comments</comments>
		<pubDate>Thu, 17 Apr 2008 06:07:10 +0000</pubDate>
		<dc:creator>Ruben Badaró</dc:creator>
				<category><![CDATA[futurismo]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.zonaj.org/2008/04/17/properties-na-linguagem-java/</guid>
		<description><![CDATA[Quando brinquei com C#, uma das coisas pelas quais fiquei apaixonado foi a implementação deles de properties. Enquanto em java temos a especificação dos JavaBeans e os nossos getters e setters de atributos são métodos que têm de corresponder a uma determinada nomenclatura, em C# essa definição é ao nível da sintaxe da linguagem. 
O [...]]]></description>
			<content:encoded><![CDATA[<p>Quando brinquei com C#, uma das coisas pelas quais fiquei apaixonado foi a implementação deles de properties. Enquanto em java temos a especificação dos JavaBeans e os nossos getters e setters de atributos são métodos que têm de corresponder a uma determinada nomenclatura, em C# essa definição é ao nível da sintaxe da linguagem. </p>
<p>O uso de getters e setters em java não deixam de me parecer como uma solução de recurso que passou a standard. Se se implementarem properties agora, teríamos sempre de manter o suporte para aquela horrível nomenclatura a que todos nos habituámos a não odiar. </p>
<p>Além disso é já hoje em dia uma questão cultural mudar uma prática tão enraízada. Penso mesmo que mais são os opositores à ideia &#8211; lembro-me de uns whiteboards no JavaPolis neste ano com propostas e votações sobre as futuras alterações à linguagem java e que deixo a imagem em baixo. Também há uma <a href="http://www.javapolis.com/confluence/display/JP07/Whiteboard+results+-+Language+change">descrição mais promenorizada na página do Javapolis</a>.</p>
<p><a href='http://www.zonaj.org/wp-content/uploads/2008/04/langchange-dscf3611.JPG' title='langchange-dscf3611.JPG'><img src='http://www.zonaj.org/wp-content/uploads/2008/04/langchange-dscf3611.JPG' alt='langchange-dscf3611.JPG'  width="400" height="267"/></a></p>
<p>Eu pessoalmente, gostava bastante de poder usar propriedades em Java.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zonaj.org/2008/04/17/properties-na-linguagem-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java: o futuro Cobol?</title>
		<link>http://www.zonaj.org/2007/10/12/java-o-futuro-cobol/</link>
		<comments>http://www.zonaj.org/2007/10/12/java-o-futuro-cobol/#comments</comments>
		<pubDate>Fri, 12 Oct 2007 00:17:24 +0000</pubDate>
		<dc:creator>Ruben Badaró</dc:creator>
				<category><![CDATA[futurismo]]></category>
		<category><![CDATA[geral]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.zonaj.org/?p=65</guid>
		<description><![CDATA[Antes de mais gostaria de pedir desculpa de falar sobre Cobol aqui, poderá trazer más memórias de alguns que em tempos passaram meses em caves escuras a programar na dita linguagem.
No início da minha carreira profissional &#8211; que não foi assim à tanto tempo, embora possa referir sempre que foi &#8220;no século passado&#8221; &#8211; uma [...]]]></description>
			<content:encoded><![CDATA[<p>Antes de mais gostaria de pedir desculpa de falar sobre Cobol aqui, poderá trazer más memórias de alguns que em tempos passaram meses em caves escuras a programar na dita linguagem.<br />
No início da minha carreira profissional &#8211; que não foi assim à tanto tempo, embora possa referir sempre que foi &#8220;no século passado&#8221; &#8211; uma das poucas certezas que tinha era que não queria ir programar Cobol para uma cave de um banco como um amigo meu tinha estado uns meses ali para os lados da Av. da República. Sabia que queria programar, mas como a maioria dos entusiastas por tecnologia, queria trabalhar com paradigmas recentes ou pelo menos actuais, como seja linguagens orientadas a objectos. Depois, entrei no mundo do Java.</p>
<p>Como tecnologia, o Java é o principal <em>player</em> a penetrar em áreas anteriormente ocupadas pelo cobol (nos bancos, seguradoras, etc.), aplicações java substituem sistemas <em>legacy</em> e implantam-se no negócio das empresas. Temos montes de pequenas aplicações, temos EAIs para integrar aquilo tudo, temos, na realidade, <a href="http://www.youtube.com/watch?v=SRLU1bJSLVg">java por todo o lado</a> e tão cedo não deixará de estar presente nestas instituições. É a linguagem mais usada e com programadores a nível mundial na actualidade e ainda vai demorar algum tempo a ser ultrapassada.</p>
<p>Dado isto, propõe-se como exercício ao leitor que imagine a linguagem e a vm java daqui a 5, 10 e 20 anos. Não falamos das mudanças da próxima versão 7 do java, falamos a longo prazo. Chegaremos a um ponto em que olharemos para trás e pensamos na linguagem java como actualmente pensamos em cobol, um sistema <em>legacy</em>?<br />
Põe-se a questão de qual será o caminho a seguir pelo java e, a meu ver, o sucesso apenas será atingido se analisarmos o termo java enquanto plataforma e não focando na linguagem. As linguagens de programação evoluem de acordo com paradigmas. Agora assistimos a um ressurgir da programação funcional em força com o <a href="http://www.ruby-lang.org/en/">ruby</a>, <a href="http://www.erlang.org/">erlang</a>, <a href="http://www.scala-lang.org/">scala</a> e outras (<a href="http://www.haskell.org">haskell</a>, <a href="http://www-swiss.ai.mit.edu/projects/scheme/">scheme</a>, <a href="http://caml.inria.fr/">ocaml</a>, &#8230;): paradigmas já antigos mas agora contextualizados para o poder computacional dos tempos modernos.<br />
Se os paradigmas evoluem com o tempo, tem toda a lógica olhar para a tecnologia java como uma plataforma que venha a suportar multiplas linguagens. A concepção do .net veio provar um pouco essa vantagem e nestes últimos 2 anos assistiu-se ao aparecimento de inúmeras linguagens para a Java VM como seja o <a href="http://jruby.codehaus.org/">jruby</a>, <a href="http://groovy.codehaus.org/">groovy</a>, <a href="http://www.jython.org/">jython</a>, <a href="http://www.scala-lang.org/">scala</a> etc. </p>
<p>No fundo, não acredito que cheguemos sequer daqui a 5 anos a usar a linguagens java de forma tão monolítica como actualmente. Teremos uma escolha maior de linguagens, a vm suportará linguagens dinâmicas de forma mais eficiente &#8211; esse trabalho está actualmente em curso &#8211; e nós, programadores, teremos de ser muito mais <em>language agnostic</em> do que muitas vezes somos. Se podemos desenvolver em várias linguagens para depois compilar para o mesmo <em>bytecode</em>, vamos usar a que melhor se adapta às nossas necessidades e também aos nossos gostos.</p>
<p>Enfim, confusões tecno-filosóficas de quem anda a brincar com <a href="http://www.lombardisoftware.com/">BPM</a> e não tem o direito de programar nada excepto nos tempos livres. Agradecem-se opiniões sobre o tema!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zonaj.org/2007/10/12/java-o-futuro-cobol/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
