<?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>Blog do PacMan &#187; Java</title>
	<atom:link href="http://pacman.blog.br/blog/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://pacman.blog.br/blog</link>
	<description>Varias Coisas, por Tiago Peczenyj</description>
	<lastBuildDate>Thu, 26 Jan 2012 13:51:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Cuidado com os imports automaticos do Eclipse</title>
		<link>http://pacman.blog.br/blog/java/cuidado-com-os-imports-automaticos-do-eclipse/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cuidado-com-os-imports-automaticos-do-eclipse</link>
		<comments>http://pacman.blog.br/blog/java/cuidado-com-os-imports-automaticos-do-eclipse/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 01:24:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/?p=27</guid>
		<description><![CDATA[Hoje em dia as IDEs para desenvolvimento, sobretudo para Java, fornecem dicas para solucionar todo o tipo de problemas como: classpath, package errado, algum throws faltando, etc. O Eclipse fornece essas dicas quando vc clica no aviso vermelho do lado esquerdo da &#8230; <a href="http://pacman.blog.br/blog/java/cuidado-com-os-imports-automaticos-do-eclipse/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hoje em dia as IDEs para desenvolvimento, sobretudo para Java, fornecem dicas para solucionar todo o tipo de problemas como: classpath, package errado, algum throws faltando, etc. O Eclipse fornece essas dicas quando vc clica no aviso vermelho do lado esquerdo da linha com problema.</p>
<p>Geralmente a primeira dica é a correta, entretanto devemos perder um tempinho analisando as outras. Um bom exemplo aconteceu comigo trabalhando com JDBC: Em determinado momento eu estava trabalhando com PreparedStatement e a dica do Eclipse, para os imports, era <span style="color: #ccffff;"><em><span style="color: #0000ff;">com.mysql.jdbc.PreparedStatement</span></em> </span>porém, naquele momento, me interessava o <span style="color: #0000ff;"><em>java.sql.PreparedStatement</em>.</span> Não prestei a atenção e o eclipse me pedia, estranhamente, um cast numa determinada linha aonde não precisava.</p>
<p>Detalhe que este import errôneo não iria prejudicar a minha classe naquele momento: ela funcionaria sem maiores problemas. O problema era uma dependência adicional com o driver mysql: eu teria problemas se quisesse migrar de banco. Um problema bem simples, bastaria corrigir a classe, mas que me faria perder algum tempo no futuro.</p>
<p>Sem falar que, pela lei de Murphy, esse problema poderia surgir quando ele fosse o mais <strong>devastador</strong> possivel.</p>
]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/java/cuidado-com-os-imports-automaticos-do-eclipse/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Closures em Java &#8211; Parte 2</title>
		<link>http://pacman.blog.br/blog/java/closures-em-java-parte-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=closures-em-java-parte-2</link>
		<comments>http://pacman.blog.br/blog/java/closures-em-java-parte-2/#comments</comments>
		<pubDate>Mon, 11 Aug 2008 13:48:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/dicas/closures-em-java-parte-2/</guid>
		<description><![CDATA[Ainda sobre a Closures do java 7, agora será possivel fazer isso: public class A { public static void main(String args[]) { @Shared int acumulador = 0; {int => int } xxx = { int i => acumulador += i; &#8230; <a href="http://pacman.blog.br/blog/java/closures-em-java-parte-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ainda sobre a Closures do java 7, agora será possivel fazer isso:</p>
<pre><code>public class A {        public static void main(String args[]) {            @Shared int acumulador = 0;

            {int => int } xxx  = { int i =>  acumulador += i; i};

            System.out.println(xxx.invoke(1));            System.out.println(xxx.invoke(2));            System.out.println(xxx.invoke(3));            System.out.println("o valor do acumulador eh " + acumulador );

        }}</code></pre>
<p>Só eu estou achando divertido?</p>
<p><a href="http://gafter.blogspot.com/2008/08/java-closures-prototype-feature.html">http://gafter.blogspot.com/2008/08/java-closures-prototype-feature.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/java/closures-em-java-parte-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Closures em Java</title>
		<link>http://pacman.blog.br/blog/java/closures-em-java/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=closures-em-java</link>
		<comments>http://pacman.blog.br/blog/java/closures-em-java/#comments</comments>
		<pubDate>Fri, 08 Aug 2008 22:23:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/dicas/closures-em-java/</guid>
		<description><![CDATA[Olha o que vai ter no java 1.7 public class A { public static void main(String args[]) { exec( { int a, int b => a + b }); exec( { int a, int b => a * b }); &#8230; <a href="http://pacman.blog.br/blog/java/closures-em-java/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Olha o que vai ter no java 1.7</p>
<pre><code>public class A {        public static void main(String args[]) {                exec( { int a, int b => a + b });                exec( { int a, int b => a * b });                exec( { int a, int b =>                         System.out.println("closure " + a + ":" + b);                         (a * a) + (b * b)                 });        }        public static void exec({ int, int => int } closure){                System.out.println(closure.invoke(3,2));        }}</code></pre>
<pre>$ java -Xbootclasspath/p:./closures-2008-08-04/lib/closures.jar   A56closure 3:213</pre>
<p>Divertido <img src='http://pacman.blog.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Fonte:<br /><a href="http://guj.com.br/posts/list/99477.java">http://guj.com.br/posts/list/99477.java</a></p>
]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/java/closures-em-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Voltas às Aulas e o Java &#8211; parte 2</title>
		<link>http://pacman.blog.br/blog/java/voltas-as-aulas-e-o-java-parte-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=voltas-as-aulas-e-o-java-parte-2</link>
		<comments>http://pacman.blog.br/blog/java/voltas-as-aulas-e-o-java-parte-2/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 20:43:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/dicas/voltas-as-aulas-e-o-java-parte-2/</guid>
		<description><![CDATA[Existe o clássico problema de determinar se um aluno passou ou não de ano quando são informados as notas e o número de faltas. Vejamos: 1) O número de faltas é acima do permitido?. Aqui entra um if dos bons &#8230; <a href="http://pacman.blog.br/blog/java/voltas-as-aulas-e-o-java-parte-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Existe o clássico problema de determinar se um aluno passou ou não de ano quando são informados as notas e o número de faltas.</p>
<p>Vejamos: <br />1) O número de faltas é acima do permitido?. Aqui entra um <span style="font-weight:bold;">if</span> dos bons com uma comparação numérica, quando um número é maior ou igual a outro.<br />2) A média é basicamente somar as X notas e dividir por X (se for média aritmética). Somar e dividir são operações matemáticas básicas.</p>
<p>Uma forma de fazer é:<br /><code> if( numero_de_faltas &gt; maximo_de_faltas_toleradas) {<br />   // reprovado por faltas<br />} else if ( media_do_aluno &lt; media_para_passar ){<br />  // reprovado por nota<br />} <br />// se nem um nem outro, esta aprovado<br /></code></p>
<p>O ruim dessa abordagem é que o aluno estar aprovado é uma condição &#8220;que sobra&#8221;. Se passarmos a focar a aprovação do mesmo ficaria assim:</p>
<p><code> if( media_do_aluno &gt;= media_para_passar &#038;&#038; numero_de_faltas &lt;= maximo_de_faltas_toleradas) {<br />   // aprovado!<br />} else {<br />  // reprovado!<br />}</code></p>
<p>É claro que eu posso que eu posso querer saber o motivo pelo qual o aluno foi reprovado:</p>
<p><code> if( media_do_aluno &gt;= media_para_passar &#038;&#038; numero_de_faltas &lt;= maximo_de_faltas_toleradas) {<br />   // aprovado!<br />} else if(numero_de_faltas &gt; maximo_de_faltas_toleradas){<br />   // reprovado pelo número de faltas: ignoro a média.<br />} else {<br />  // aqui só sobra a reprovação por nota, <br />  // basta fazer a tabela-verdade dessas expressões<br />}</code></p>
<p>Se o foco do professor for o algoritmo, isso é o que deveria ser analisado. Quem implementa corretamente um método que recebe X notas e um número de faltas e consegue responder a essas perguntas consegue descrever facilmente os casos de teste para verificar se a implementação corresponde ao que se espera.</p>
<p>Um programa que tenha algum tipo de interação (seja Swing ou console) ajuda a fazer um macarrão de código, mesclando o algoritmo com o controle de estado dos &#8220;menuzinhos&#8221;. No fim vemos laços de repetição aonde não são necessários, calculo de média errado, etc.</p>
<p>Ok, não acho que um marinheiro de primeira viagem devesse começar por JUnit, mas uma com boa noção dos fundamentos da linguagem e evitando a interação desnecessária com o usuario (poderia ser usado até os parâmetros do main), acredito num melhor desempenho. O risco é o aluno acreditar que java  é dificil ou que tudo se resume a getters/setters e gigantescos try/catch&#8217;s onde as exceptions são varridas pra debaixo do tapete. </p>
<p>Eu colocaria TDD num segundo momento, mas ai sem perdão, ensinando o caboclo a fazer do jeito certo o quanto antes. O que é dificil se eles conseguem passar sem saber fazer aritmética básica.</p>
]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/java/voltas-as-aulas-e-o-java-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Test Driven Development &#8211; parte 1.</title>
		<link>http://pacman.blog.br/blog/java/test-driven-development-parte-1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=test-driven-development-parte-1</link>
		<comments>http://pacman.blog.br/blog/java/test-driven-development-parte-1/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 17:31:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/dicas/test-driven-development-parte-1/</guid>
		<description><![CDATA[Veja este código: public void testEhPar() throws Exception{ assertTrue("2 deve ser par",algoritmo.ehPar(2)); assertTrue("4 deve ser par",algoritmo.ehPar(4)); assertTrue("6 deve ser par",algoritmo.ehPar(6)); assertTrue("1 NAO deve ser par",!algoritmo.ehPar(1)); assertTrue("3 NAO deve ser par",!algoritmo.ehPar(3)); assertTrue("5 NAO deve ser par",!algoritmo.ehPar(5)); } Dentro de uma classe &#8230; <a href="http://pacman.blog.br/blog/java/test-driven-development-parte-1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Veja este código:</p>
<pre><code> public void testEhPar() throws Exception{  assertTrue("2 deve ser par",algoritmo.ehPar(2));  assertTrue("4 deve ser par",algoritmo.ehPar(4));  assertTrue("6 deve ser par",algoritmo.ehPar(6));

  assertTrue("1 NAO deve ser par",!algoritmo.ehPar(1));  assertTrue("3 NAO deve ser par",!algoritmo.ehPar(3));  assertTrue("5 NAO deve ser par",!algoritmo.ehPar(5));   }</code></pre>
<p>Dentro de uma classe de teste, usando o framework <a href="http://junit.sourceforge.net/#Getting">JUnit</a>, a leitura dessas linhas é a seguinte:</p>
<p>Eu tenho um objeto chamado <span style="font-style:italic;">algortimo</span>.<br />A chamada algoritmo.ehPar(2) deve retornar <span style="font-weight:bold;">true</span>, pois 2 é par, e este método informa se o parâmetro informado é, ou não, par.<br />O método <span style="font-weight:bold;">assertTrue</span> recebe dois parâmetros: uma mensagem informando o significado deste teste, e o resultado do mesmo.</p>
<p>Se o método estivesse com algum problema e retornasse false, isso:</p>
<p>assertTrue(&#8220;2 deve ser par&#8221;,algoritmo.ehPar(2));</p>
<p>seria o mesmo que</p>
<p>assertTrue(&#8220;2 deve ser par&#8221;,false);</p>
<p>Logo, o teste falha, pois <span style="font-weight:bold;">2 deve ser par</span>.</p>
<p>Esta é uma forma <span style="font-style:italic;">programática</span> de garantir o comportamento do código que eu desenvolvo: testando. Se o meu método só depende dos parâmetros informados, é muito simples verificar o seu funcionamento.</p>
<p>Desenvolvendo os testes antes de implementar o código, tendo apenas as assinaturas dos métodos (por isso recorri a uma interface <a href="http://pacman.blog.br/2008/08/voltas-s-aulas-e-o-java.html">aqui</a>, lembra?), eu posso pensar nos comportamentos esperados e, então, vou desenvolvendo até que todos os testes estejam passando.</p>
<p>Não é nada fácil, funciona melhor quando o projeto que estás desenvolvendo está começando, porém os resultados são excelentes: veja o quanto de tempo estás economizando! Se tu pretendes determinar se um código teu está funcionando por programas que perguntam os valores, escrever </p>
<pre>$ ant clean test</pre>
<p>é muito mais rápido! </p>
<p>O problema surge quando queremos fazer algo complexo, pois a dificuldade de testar mostra problemas na arquitetura adotada, por exemplo. Quanto temos objetos que tem objetos, herança, polimorfismo, tecnicas mais avançadas podem ser usadas como usar Mocks de objetos (e prover os mecanismos para injetar estes Mocks).</p>
<p>No caso desse exemplo, esta é uma solução:
<pre><code>public boolean ehPar(int numero){      return numero % 2 == 0;}</code></pre>
<p>Muitos alunos desconhecem as operações de divisão e módulo entre inteiros. O 1, inteiro, dividido por 2, inteiro, não é 0.5, (em java), e sim 0, pois este é o resultado da divisão inteira. O resto da divisão, simbolizado por %, retorna 1. Dessa forma, o resto da divisão de um numero par por 2 é 0, caso contrario é um número inteiro. São operações básicas que precisam ser dominadas. Repare que eu fiz um código que funcione, não tentei nada mais maquiavélico que dê 0.0001 milissegundos mais rápido. <a href="http://gc.blog.br/2008/01/08/a-falacia-da-otimizacao-prematura/">Evite a otimização precoce</a>.</p>
<p>Programar profissionalmente é uma tarefa de <span style="font-weight:bold;">muita</span> responsabilidade. Desenvolver testes para garantir a qualidade provê excelentes resultados a longo prazo.</p>
</p>]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/java/test-driven-development-parte-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Voltas às Aulas e o Java</title>
		<link>http://pacman.blog.br/blog/java/voltas-as-aulas-e-o-java/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=voltas-as-aulas-e-o-java</link>
		<comments>http://pacman.blog.br/blog/java/voltas-as-aulas-e-o-java/#comments</comments>
		<pubDate>Mon, 04 Aug 2008 15:20:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/dicas/voltas-as-aulas-e-o-java/</guid>
		<description><![CDATA[Na época de volta às aulas nas faculdades percebe-se uma grande invasão de alunos desesperados em foruns de informática para resolverem os seus execícios. É facil reconhecer um aluno em pânico com o seu primeiro while ou algum exercício sobre &#8230; <a href="http://pacman.blog.br/blog/java/voltas-as-aulas-e-o-java/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Na época de volta às aulas nas faculdades percebe-se uma grande invasão de alunos desesperados em foruns de informática para resolverem os seus execícios. É facil reconhecer um aluno em pânico com o seu primeiro <span style="font-style:italic;">while</span> ou algum exercício sobre Fibonacci: eles não tentam, simplesmente colam o enunciado do problema esperando a resposta pronta.</p>
<p>Entretanto tão bizarro quanto são os exercícios propostos: um programa que leia pergunte 2 numeros e retorne a soma, ou um programa para calcular alguma coisa que pergunte ao usuário&#8230; perai, pergunte? Um programa perguntando? Como?</p>
<p>Este é o típico programa &#8216;interativo&#8217; com o usuário. Quando não usa a entrada padrão (algo completamente misterioso para boa parte dos alunos), usam algum recurso SWING. Mas sera que ninguem pensa o quão PREJUDICIAL são estes exercícios?</p>
<p>Normalmente o aluno se preocupa com a apresentação do mesmo, fazendo frescuras de menuzinhos, asteriscos pra lá e pra cá&#8230; e o algoritmo que é bom nada. Sinceramente: dane-se os menuzinhos. Sabem quantos programas com menuzinhos e que vão perguntar alguma coisa pro usuario vcs vão fazer na vida profissional de vcs? 0! Zero! Nenhum!</p>
<p>Existem muitas formas de interação com o usuario, hoje em dia vc pode ter interfaces web, por exemplo. Eu acho que, num primeiro momento, a única interação com o usuario deveria ser escrever na tela. Nada mais que isso se o camarada não sabe o que significa um NullPointerException.</p>
<p>Exemplo pratico:</p>
<p>- Prepare um diretório para trabalhar (suponho que vc vai usar linux, senão deve ser facil portar este exemplo para outros sistemas operacionais).<br />- Crie um diretorio lib e copie o junit-4.4.jar pra lá (use o google pra baixar esse arquivo, se vc não conseguir saia do curso de informática).<br />- Crie a estrutura abaixo, ainda no diretório de trabalho:<br />src/java<br />src/test<br />- Instale o aplicativo ant (de novo o google te ajuda, alias vc tem algum JDK instalado, certo??).<br />- Crie um arquivo chamado build.xml no diretorio de trabalho.<br />- Baixe o arquivo ant-junit.jar daqui [ http://www.java2s.com/Code/Jar/ANT/Downloadantjunitjar.htm ] e copie o .JAR para ~/.ant/lib (se não existe, crie).</p>
<p>Agora vem a proposta: baseado nessa interface:</p>
<pre><code>public interface Algoritmo{/* dado um numero, retorna true se for par */        boolean ehPar(int numero);/* calcula o valor absoluto ou modulo de um numero, ex: -1 vira 1, 1 vira 1 */int calculaModulo(int numero);/* calcula algum termo da série de fibonacci: se 0, mostra o primeiro, se 1 mostra o segundo...*/int calculaFibonacci(int elemento);/* calcula o fatorial do numero indicado */long calculaFatorial(int numero);}</code></pre>
<p>Vais criar uma classe chamada, digamos, SuaClasse que implementa esta interface (percebeu que tudo deve ficar em src/java não é?). Não pense na implementação dessa classe ainda.</p>
<p>No diretorio src/test vc vai salvar esta classe:</p>
<pre><code>import junit.framework.TestCase;

public class AlgoritmoTeste extends TestCase{ Algoritmo algoritmo; public void setUp(){  algoritmo = new SuaClasse(); }

 public void tearDown(){  algoritmo = null;   }

 public void testEhPar() throws Exception{  assertTrue("2 deve ser par",algoritmo.ehPar(2));  assertTrue("4 deve ser par",algoritmo.ehPar(4));  assertTrue("6 deve ser par",algoritmo.ehPar(6));

  assertTrue("1 NAO deve ser par",!algoritmo.ehPar(1));  assertTrue("3 NAO deve ser par",!algoritmo.ehPar(3));  assertTrue("5 NAO deve ser par",!algoritmo.ehPar(5));   }

 public void testCalculaModulo() throws Exception{  assertTrue("modulo de  3 deve ser 3",algoritmo.calculaModulo(3) == 3);  assertTrue("modulo de -3 deve ser 3",algoritmo.calculaModulo(-3) == 3);  assertTrue("modulo de  5 deve ser 5",algoritmo.calculaModulo(5) == 5);  assertTrue("modulo de -5 deve ser 5",algoritmo.calculaModulo(-5) == 5);   }

 public void testCalculaFibonacci() throws Exception{  assertTrue("elemento  0 da serie fibonacci deve ser   0",algoritmo.calculaFibonacci(0) == 0);  assertTrue("elemento  1 da serie fibonacci deve ser   1",algoritmo.calculaFibonacci(1) == 1);  assertTrue("elemento  2 da serie fibonacci deve ser   1",algoritmo.calculaFibonacci(2) == 1);  assertTrue("elemento  3 da serie fibonacci deve ser   2",algoritmo.calculaFibonacci(3) == 2);    assertTrue("elemento  4 da serie fibonacci deve ser   3",algoritmo.calculaFibonacci(4) == 3);  assertTrue("elemento  5 da serie fibonacci deve ser   5",algoritmo.calculaFibonacci(5) == 5);  assertTrue("elemento  6 da serie fibonacci deve ser   8",algoritmo.calculaFibonacci(6) == 8);  assertTrue("elemento  7 da serie fibonacci deve ser  13",algoritmo.calculaFibonacci(7) == 13);    assertTrue("elemento 11 da serie fibonacci deve ser  89",algoritmo.calculaFibonacci(11) == 89);  assertTrue("elemento 13 da serie fibonacci deve ser 223",algoritmo.calculaFibonacci(13) == 233);   }

 public void testCalculaFatorial() throws Exception{  assertTrue("Fatorial de  1 deve ser        1",algoritmo.calculaFatorial(1) == 1);  assertTrue("Fatorial de  2 deve ser        2",algoritmo.calculaFatorial(2) == 2);  assertTrue("Fatorial de  3 deve ser        6",algoritmo.calculaFatorial(3) == 6);  assertTrue("Fatorial de  4 deve ser       24",algoritmo.calculaFatorial(4) == 24);  assertTrue("Fatorial de  5 deve ser      120",algoritmo.calculaFatorial(5) == 120);  assertTrue("Fatorial de  6 deve ser      720",algoritmo.calculaFatorial(6) == 720);  assertTrue("Fatorial de 10 deve ser 3628800L",algoritmo.calculaFatorial(10) == 3628800L);   }}</code></pre>
<p>Uma ideia sobre o JUnit pode ser encontrada aqui: [ http://guj.com.br/java.tutorial.artigo.40.1.guj ], alias o guj, na sessão de tutoriais, explica varias coisas, é ótimo material de referência!</p>
<p>Ok, vc tem a interface que vc deve respeitar e um arquivo de teste. Vamos falar do arquivo de build do ant.</p>
<pre><code>&lt;project name="Meu Projeto" basedir="." default="dist"&gt;        &lt;description&gt;                Aprendendo a fazer um build.xml para o ant        &lt;/description&gt;

        &lt;property name="lib"   location="lib"/&gt;        &lt;property name="src"   location="src/java"/&gt;        &lt;property name="test"  location="src/test"/&gt;

        &lt;property name="build" location="build"/&gt;        &lt;property name="dist"  location="dist"/&gt;

        &lt;path id="classpath.test"&gt;                 &lt;pathelement location="${test}" /&gt;                &lt;pathelement location="${build}" /&gt;                &lt;pathelement location="${lib}/junit-4.4.jar" /&gt;        &lt;/path&gt;

        &lt;target name="init"&gt;                &lt;!-- Create the time stamp --&gt;                &lt;tstamp/&gt;                &lt;!-- Create the build directory structure used by compile --&gt;                &lt;mkdir dir="${build}"/&gt;        &lt;/target&gt;

        &lt;target name="compile" depends="init" description="compile the source " &gt;                &lt;!-- Compile the java code from ${src} into ${build} --&gt;                &lt;javac srcdir="${src}" destdir="${build}"/&gt;        &lt;/target&gt;

        &lt;target name="dist" depends="compile" description="generate the distribution" &gt;                &lt;!-- Create the distribution directory --&gt;                &lt;mkdir dir="${dist}/lib"/&gt;

                &lt;!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --&gt;                &lt;jar jarfile="${dist}/lib/Algortimo-${DSTAMP}.jar" basedir="${build}"/&gt;        &lt;/target&gt;

        &lt;target name="clean" description="clean up" &gt;                &lt;!-- Delete the ${build} and ${dist} directory trees --&gt;                &lt;delete dir="${build}"/&gt;                &lt;delete dir="${dist}"/&gt;        &lt;/target&gt;

        &lt;target name="test" depends="compile"&gt;                &lt;javac srcdir="${test}"&gt;                        &lt;classpath refid="classpath.test"/&gt;                &lt;/javac&gt;                &lt;junit&gt;                        &lt;classpath refid="classpath.test" /&gt;                        &lt;formatter type="brief" usefile="false" /&gt;                        &lt;test name="AlgoritmoTeste"/&gt;                &lt;/junit&gt;        &lt;/target&gt;&lt;/project&gt;</code></pre>
<p>A utilização desse arquivo é muito simples, não se amedronte pelo tamanho do arquivo, o formato xml do ant é bizarro e verboso, sou muito mais um Makefile, porém uma vez com ele feito basta ir adicionando coisas &#8220;com cuidado&#8221;. Sem falar que tudo tem documentação oficial cheia de exemplos, só não aprende quem <span style="font-weight:bold;">não</span> quer.</p>
<p>$ ant <br />isso deve compilar a sua classe e gerar um jar (pode ser util no futuro).</p>
<p>$ ant clean<br />limpa os diretorios que vc acabou de criar com as suas paradas compiladas.</p>
<p>$ ant test<br />compila e executa os testes unítarios.</p>
<p>É claro que vc vai dizer, e agora??? Bom, veja isso:</p>
<pre><code>public class SuaClasse implements Algoritmo{        public boolean ehPar(int numero){return false;}        public int calculaModulo(int numero){ return -1;}        public int calculaFibonacci(int elemento){return -1;}        public long calculaFatorial(int numero){return -1;}}</code></pre>
<p>Olha que legal! Uma classe que tem o minimo pra compilar! Agora vamos testar&#8230;</p>
<pre>$ ant testBuildfile: build.xml

init:    [mkdir] Created dir: /home/GLOBO.COM/peczenyj/test/junit/build

compile:    [javac] Compiling 2 source files to /home/GLOBO.COM/peczenyj/test/junit/build

test:    [javac] Compiling 1 source file    [junit] Testsuite: AlgoritmoTeste    [junit] Tests run: 4, Failures: 4, Errors: 0, Time elapsed: 0.005 sec    [junit]     [junit] Testcase: testEhPar(AlgoritmoTeste):        FAILED    [junit] 2 deve ser par    [junit] junit.framework.AssertionFailedError: 2 deve ser par    [junit]     at AlgoritmoTeste.testEhPar(Unknown Source)    [junit]     [junit]     [junit] Testcase: testCalculaModulo(AlgoritmoTeste):        FAILED    [junit] modulo de  3 deve ser 3    [junit] junit.framework.AssertionFailedError: modulo de  3 deve ser 3    [junit]     at AlgoritmoTeste.testCalculaModulo(Unknown Source)    [junit]     [junit]     [junit] Testcase: testCalculaFibonacci(AlgoritmoTeste):     FAILED    [junit] elemento  0 da serie fibonacci deve ser   0    [junit] junit.framework.AssertionFailedError: elemento  0 da serie fibonacci deve ser   0    [junit]     at AlgoritmoTeste.testCalculaFibonacci(Unknown Source)    [junit]     [junit]     [junit] Testcase: testCalculaFatorial(AlgoritmoTeste):      FAILED    [junit] Fatorial de  1 deve ser        1    [junit] junit.framework.AssertionFailedError: Fatorial de  1 deve ser        1    [junit]     at AlgoritmoTeste.testCalculaFatorial(Unknown Source)    [junit]     [junit]     [junit] Test AlgoritmoTeste FAILED

BUILD SUCCESSFULTotal time: 1 second</pre>
<p>Agora basta escrever codigo de verdade na SuaClasse e testar, estara pronto quando TUDO estiver passando. São 4 métodos básicos, sabendo lidar com variaveis locais, if e for, vc consegue muita coisa.</p>
<p>Se eu fosse professor eu daria exercícios assim: o projeto deveria compilar e todos os testes deveriam passar senão o aluno leva 0. A nota viria de acordo com o que eu espero, posso usar um EMMA e ver a cobertura de código, posso avaliar a presença de um Javadoc que preste, etc.</p>
<p>Enfim, eu seria um professor muito malvado }-)</p>
<p>Não perca a parte 2 <a href="http://pacman.blog.br/2008/08/voltas-s-aulas-e-o-java-parte-2.html">aqui</a>, e uma introdução ao TDD <a href="http://pacman.blog.br/2008/08/test-driven-development-parte-1.html">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/java/voltas-as-aulas-e-o-java/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Sobre o &quot;ensino&quot; de Java hoje em dia.</title>
		<link>http://pacman.blog.br/blog/java/sobre-o-ensino-de-java-hoje-em-dia/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sobre-o-ensino-de-java-hoje-em-dia</link>
		<comments>http://pacman.blog.br/blog/java/sobre-o-ensino-de-java-hoje-em-dia/#comments</comments>
		<pubDate>Thu, 06 Mar 2008 11:22:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/dicas/sobre-o-ensino-de-java-hoje-em-dia/</guid>
		<description><![CDATA[Java é uma linguagem orientada a objetos que contem tipos primitivos e wrappers para estes tipos, é executada sobre uma maquina virtual, com suporte a herança simples mas possui interfaces, com mecanismos de sobreescrita e sobrecarga de métodos, com um &#8230; <a href="http://pacman.blog.br/blog/java/sobre-o-ensino-de-java-hoje-em-dia/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Java é uma linguagem orientada a objetos que contem tipos primitivos e wrappers para estes tipos, é executada sobre uma maquina virtual, com suporte a herança simples mas possui <span style="font-style:italic;">interfaces</span>, com mecanismos de sobreescrita e sobrecarga de métodos, com um sistema de tratamento de exceções que te <span style="font-weight:bold;">obriga</span> a tratar determinadas situações e por ai vai.</p>
<p>Ao meu ver o estudo da linguagem deveria focar o domínio do mecanismo de herança e a construção de classes, domínio dos métodos, tipos de retorno, escopos de variavel, conversão de tipos, domínio das estruturas condicionais, de loops e de tratamento de erros, domínio das operações matemáticas e lógicas e,principalmente, domínio da classe String (ok, <span style="font-style:italic;">domínio</span> pode ser uma palavra forte, talvez uma boa noção fosse suficiente em algumas situações).</p>
<p>Com disso tudo, o aluno deveria primeiro trabalhar com argumentos de linha de comando (o que vc acha que o <span style="font-weight:bold;">main</span> recebe?), depois passar a estudar a leitura e escrita em arquivo texto e, por fim, leitura pela entrada padrão.</p>
<p>Pois leitura pela entrada padrão é o que vc menos vai fazer em Java. Ninguem faz programa com menuzinho em Java pra console no mercado. Temos coisas mais complexas pela frente e sem conhecer tudo aquilo que eu listei antes só é possivel fazer gambiarras (como as famosas <span style="font-style:italic;">class functions</span>, gigantescos métodos que fazem centenas de coisas com nomes adequados do tipo <span style="font-weight:bold;">createTree3</span>).</p>
<p>Ensina-se Java ao contrário: primeiro o camarada programa como se fosse C, perdendo tempo em fazer menus e estruturas de controle pois o usuario pode ter dado um enter, tab, &#8220;ç&#8221; ou ter digitado algo inválido quando deveria aprender os fundamentos da linguagem. Cria-se vícios que pode ser custoso para remover (como encher o código de getters/setters sem necessidade). A prova disso é que invariavelmente temos comparação de Strings usando o operador == quando deveria ser utilizado os métodos adequados para isso (imagina o susto quando a galera descobre o <a href="http://java.sun.com/j2se/1.3/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String)">equalsIgnoreCase</a>).</p>
<p>Eu vejo muitos estudantes incapazes de compilar e executar uma classe (o famoso <a href="http://guj.com.br/java.tutorial.artigo.16.1.guj">hello world</a>) pois os mesmos nunca fizeram uso da linha de comando muito menos foram apresentados ao conceito de <a href="http://guj.com.br/java.tutorial.artigo.108.1.guj">classpath</a>. Vejo barbaridades típicas de quem não conhece (ou não sabe ler) o javadoc das classes básicas. Fico me perguntando quando esses jovens serão capazes de ler um &#8220;Effective Java&#8221;, por exemplo.</p>
<p><a href="http://blog.caelum.com.br/2006/10/14/como-nao-aprender-orientacao-a-objetos-heranca/">Aqui</a> tem um excelente começo.</p>
<p>Espero que os professores acordem para essa realidade e que os alunos percebam que estão sendo prejudicados e passem a estudar por sua conta os tópicos necessários para sair arrasando pro ai.</p>
]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/java/sobre-o-ensino-de-java-hoje-em-dia/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Analise Orientada a Objetos com Java &#8211; Parte 1</title>
		<link>http://pacman.blog.br/blog/java/analise-orientada-a-objetos-com-java-parte-1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=analise-orientada-a-objetos-com-java-parte-1</link>
		<comments>http://pacman.blog.br/blog/java/analise-orientada-a-objetos-com-java-parte-1/#comments</comments>
		<pubDate>Sat, 17 Nov 2007 18:02:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/dicas/analise-orientada-a-objetos-com-java-parte-1/</guid>
		<description><![CDATA[Estes dias eu me deparei com um problema bem interessante: uma forma de atribuir professores a disciplinas por meio de um sistema feito em Java. Já aviso, estou tentando aprender e achei este exemplo interessante. Este post é uma tentativa &#8230; <a href="http://pacman.blog.br/blog/java/analise-orientada-a-objetos-com-java-parte-1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Estes dias eu me deparei com um problema bem interessante: uma forma de atribuir professores a disciplinas por meio de um sistema feito em Java. </p>
<p>Já aviso, estou tentando aprender e achei este exemplo interessante. Este post é uma tentativa de análise orientada à objetos feita de forma progressiva, comentários são bem vindos.</p>
<p>A primeira proposta foram 2 matrizes bidimensionais, uma com os professores disponíveis naquele dia e outra com as turmas, distribuidas ao longo de uma semana. Eu logo percebi que isso podia ser um problema de modelagem, pois se vc vai utilizar matrizes, paineis, interface textual ou seja lá o que for, isto é apenas uma camada &#8211; <span style="font-weight:bold;">a visão</span>. Um modelo muito mais rico pode ser criado, vejamos este exemplo em Java:</p>
<pre><code>class Professor{}class Disciplina{}class Turma{ Disciplina disciplina; Professor  professor;}public class Main{ public static void main(String[] args) {  Professor  oseias     = new Professor();  Disciplina matematica = new Disciplina();  Turma matA = new Turma();

  matA.disciplina = matematica;  matA.professor  = oseias; }}</code></pre>
<p>A minha classe <span style="font-weight:bold;">Main </span>mostra como seriam as operações sobre estas 3 classes. Basicamente eu tenho uma classe <span style="font-weight:bold;">Professor</span>, uma classe <span style="font-weight:bold;">Disciplina </span>e uma classe <span style="font-weight:bold;">Turma</span>. Se vc observarem qualquer instituição de ensino vão perceber que uma turma tem-um professor e tem-uma disciplina associados (<span style="font-style:italic;">composição</span>).</p>
<p>Percebam também que eu não fui até uma escola ou universidade e fiquei horas levantando requisitos, criado diagramas uml ou documentos no word &#8211; apenas criei uma casca inicial de código (cheio de problemas por sinal). Também não me importo, ainda, com nenhum aspecto <span style="font-style:italic;">temporal</span>. Sem falar que esta escola todos os professores podem dar qualquer disciplina &#8211; agora vamos implementar direito.</p>
<p>Vejamos&#8230; uma turma não troca de disciplina facilmente, mas de professor sim. Faz sentido, então, ter um setter de professor e um construtor que receba uma disciplina. Outra coisa, eu não defini nada nas outras classes, então está na hora de definir 2 atributos : id (numérico) e nome (String). Vou diferenciar os objetos pelo código, isto é, o seu id, e o nome será utilizado como descrição. Vou sobreescrever os métodos equals e toString.</p>
<p>Como o nome desses objetos é importante, vou coloca-los no construtor também (assim como o id).</p>
<pre><code>class Professor{ long id; private String nome; public Professor(long id,String nome){  this.id = id;  this.nome = nome; } public long getId(){ return id; } public String toString(){ return this.nome ; } public boolean equals(Object o){  boolean test = false;

  if (!(o instanceof Professor))   test = super.equals(o);  else    test = ((Professor) o).getId() == this.id;   return test; } }class Disciplina{ long id; private String nome; public Disciplina(long id,String nome){  this.id = id;  this.nome = nome; } public long getId(){ return id; } public String toString(){ return this.nome ; } public boolean equals(Object o){  boolean test = false;

  if (!(o instanceof Disciplina))   test = super.equals(o);  else    test = ((Disciplina) o).getId() == this.id;   return test; }}class Turma{ long id; private String nome; private Disciplina disciplina; private Professor  professor; public Turma(long id, String nome,Disciplina disciplina){  this.id = id;  this.nome = nome;  this.disciplina = disciplina; } public void setProfessor(Professor  professor){  this.professor = professor; } public long getId(){ return id; } public String toString(){   return this.nome + " [" + this.disciplina          + "] c/ " + this.professor ;  } public boolean equals(Object o){  boolean test = false;

  if (!(o instanceof Turma))   test = super.equals(o);  else    test = ((Turma) o).getId() == this.id;   return test; } }public class Main { public static void main(String[] args) {  /* objetos bem comportados */  Professor  oseias     = new Professor(1L,"Oseias");  Disciplina matematica = new Disciplina(1L,"Matematica");  Turma matA = new Turma(1L,"Matematica A", matematica);  matA.setProfessor(oseias); 

  System.out.println("Professor  " + oseias);      System.out.println("Disciplina " + matematica);    System.out.println("Turma      " + matA);

  /* objetos mal comportados    * Sujeitos a NullPointerException    */  Professor juca = new Professor(2L,null);  Disciplina calculo = new Disciplina(2L,null);  Turma matB = new Turma(2L,"Matematica B", null);  matB.setProfessor(null); // nem precisava mas...  Turma matC = new Turma(3L,"Matematica C",calculo);    Turma matD = new Turma(4L,"Matematica D",calculo);  matD.setProfessor(juca);

  System.out.println("Juca?   " + juca);  System.out.println("Calculo?" + calculo);  System.out.println("matB?   " + matB);    System.out.println("matC?   " + matC);  System.out.println("matD?   " + matD); }}</pre>
<p></code></p>
<p>Mas que raios eu estou fazendo? veja a saída desse programa:</p>
<pre>Professor  OseiasDisciplina MatematicaTurma      Matematica A [Matematica] c/ OseiasJuca?   nullCalculo?nullmatB?   Matematica B [null] c/ nullmatC?   Matematica C [null] c/ nullmatD?   Matematica D [null] c/ null</pre>
<p>Qual o significado? Bom... eu tenho uma forma razoavel de representar um professor, disciplina e turma, porém não é pratico, o construtor está gigante e, em muitas situações, eu posso ter parâmetros nulos, o que pode ser uma fonte de problemas. Existem muitas formas de refatorar estas classes, eu nem toquei no <a href="http://blog.caelum.com.br/2006/09/04/ensinando-que-e-o-hashcode/">HashCode</a>, enfim, tem muito pano pra manga. </p>
<p>Apresento a vcs o desenvolvimento em etapas, iterativo. Eu estou chutando requisitos aos poucos, é verdade, mas eu entrego um codigo testável e completo e cada ciclo. Com os usuarios testando esse código (nesse caso, uma API, mas enfim...)  eu obtenho um feedback interessante. O que vc acha?</p>
]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/java/analise-orientada-a-objetos-com-java-parte-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aprenda Java com os melhores versão Tropa de Elite</title>
		<link>http://pacman.blog.br/blog/java/aprenda-java-com-os-melhores-versao-tropa-de-elite/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=aprenda-java-com-os-melhores-versao-tropa-de-elite</link>
		<comments>http://pacman.blog.br/blog/java/aprenda-java-com-os-melhores-versao-tropa-de-elite/#comments</comments>
		<pubDate>Mon, 01 Oct 2007 00:01:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Bope]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/dicas/aprenda-java-com-os-melhores-versao-tropa-de-elite/</guid>
		<description><![CDATA[Exatamente: Não vem com essa que vc é istudante, vai tomar tapa na cara se não aprender Java. Saiba que, de cada 100, só 5 terminam o curso. Nem na Sun se treina programador assim. /** O Bope foi criado &#8230; <a href="http://pacman.blog.br/blog/java/aprenda-java-com-os-melhores-versao-tropa-de-elite/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Exatamente: Não vem com essa que vc é <span style="font-style:italic;">istudante</span>, vai tomar tapa na cara se não aprender Java. Saiba que, de cada 100, só 5 terminam o curso. Nem na Sun se treina programador assim.</p>
<pre><code>/** O Bope foi criado para atuar quando a policia perde o controle* E no rio de janeiro isso acontece com bastante frequencia*/class Bope{

 private String nome;  private int vitimas;

 public Bope(String nome){  this.nome = nome;  this.vitimas =0; }

 public void matou(int tantas_vitimas_agora){      this.vitimas = this.vitimas + tantas_vitimas_agora; }

 public int quantas_vitimas(){  return this.vitimas; }}

public class Programa{ public static void main(String [] xxx){  // Apresento o capitão nascimento  Bope capitao = new Bope("Capitao Nascimento");

  // quando o capitão sobe a favela, é pra matar, não pra morrer  capitao.matou(1000);

  // agora ele subiu o morro de novo, com ele não tem erro.  capitao.matou(2000);

  // e a farda dele não é azul, é PRETA  System.out.println("O Bope matou: " + capitao.quantas_vitimas()); }}</code></pre>
<p>Entendeu? Não?</p>
<p>ENTÃO PEDE PRA SAIR, GUERREIRO!<br />TU É CORRUPTO, TEU LUGAR É COM .NET, É COM VB! JOCKEY DE IDE! PEDE PRA SAIR AGORA!</p>
]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/java/aprenda-java-com-os-melhores-versao-tropa-de-elite/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>JEDI &#8211; Java Education and Development Initiative</title>
		<link>http://pacman.blog.br/blog/java/jedi-java-education-and-development-initiative/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=jedi-java-education-and-development-initiative</link>
		<comments>http://pacman.blog.br/blog/java/jedi-java-education-and-development-initiative/#comments</comments>
		<pubDate>Sat, 18 Aug 2007 18:22:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/dicas/jedi-java-education-and-development-initiative/</guid>
		<description><![CDATA[JEDI e o ensino de Java gratuito Iniciado pela Universidade das Filipinas e apoiado pela Sun Microsystems, nasce através do Java Research &#038; Development Center, a iniciativa JEDI (Java Education and Development Initiative), em Fevereiro de 2005. A partir desta &#8230; <a href="http://pacman.blog.br/blog/java/jedi-java-education-and-development-initiative/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><span style="font-weight:bold;">JEDI e o ensino de Java gratuito</span></p>
<p>Iniciado pela Universidade das Filipinas e apoiado pela Sun Microsystems, nasce através do Java Research &#038; Development Center, a iniciativa JEDI (Java Education and Development Initiative), em Fevereiro de 2005.</p>
<p>A partir desta data, o JEDI vem sendo desenvolvido como um projeto colaborativo, que conta com o apoio da comunidade Java em todo o mundo. Tem como principais objetivos o de melhorar a experiência do ensino e da aprendizagem; Aumentar a qualidade dos graduados em Ciência da Computação e Tecnologia da Informação (disponibilizando os materiais de seus cursos gratuitamente para quem se interessar); Aumentar o banco de especialistas em Java e, Fornecer serviços e produtos a altura das necessidades do mercado mundial.</p>
<p>Tecnologia Java</p>
<p>A tecnologia Java está presente, hoje, em 2 bilhões de dispositivos tecnológicos em todo o planeta &#8211; e também fora dele, já que podemos localizar dispositivos Java rodando até em Marte. Existem hoje, no mundo, cerca de 579 milhões de celulares com Java, 93 operadoras de telefonia móvel, 750 milhões de cartões SmartCard (do tipo JavaCard) distribuídos, 650 milhões de computadores pessoais e com 2 milhões de cópias da plataforma empresarial J2EE. Por isto, 68% das novas aplicações, hoje, são desenvolvidas em Java, que substituiu o C++ como a competência mais procurada pelos profissionais. É executado em múltiplas plataformas e em uma ampla gama de dispositivos, indo de um pequeno chip em SmartCards aos servidores dos Grandes Data Centers.</p>
<p>Demanda por Profissionais</p>
<p>Com tudo isso, existe hoje, uma demanda por 2 milhões de novos profissionais de TI a cada ano. Desenvolvedores Java, devem prover soluções nas mais diversas áreas de tecnologia. Torna-se crescente a necessidade, por exemplo, do desenvolvimento de soluções para aparelhos celulares que demandam uma integração com sistemas legados, de maneira a fornecer soluções corporativas. A partir disto, o conhecimento de Java e de sistemas abertos, são imprescindíveis para profissionais de TI.</p>
<p>Além da demanda, a tendência é um outro fator motivador para este mercado. No Brasil, esta aponta para direção de trabalhos realizados para clientes de fora do país &#8211; o outsourced. É crescente a procura por parte das organizações, o desenvolvimento de projetos baseados em tecnologia Java, distribuindo-se as aplicações desenvolvidas aqui pela Internet.</p>
<p>Todavia, a busca do mercado por esse perfil de profissional vai de encontro com a capacidade de fornecimento do conhecimento Java. O fato é que, o mercado tem dificuldade em encontrar desenvolvedores com competência nos fundamentos de Tecnologia da Informação, orientação a objetos, conhecimento e experiência em Java avançado, competência em comunicação e nas relações interpessoais.</p>
<p>A industria de software supre o despreparo dos profissionais formados pelo mercado, com a necessidade de re-treinamento interno dos novos contratados, muitos graduados sem conhecimento em TI. A grande maioria não tem uma certificação, que tem um valor adicional no mercado, especialmente para trabalhos executados fora do pais. Outro fator que colabora para o despreparo do profissional é fato do treinamento oficial Java da Sun ser relativamente caro e os programas de treinamento interno das empresas atuais serem pouco abrangentes. Disso resulta uma contratação de apenas 5% dos currículos recebidos nas empresas.</p>
<p>Academicamente o treinamento é, muitas vezes gratuito e de boa qualidade, é acessível. Contrastando, os professores não possuem experiência prática das demandas da indústria e não há, por parte de centros acadêmicos, a compreensão com respeito ás preocupações da industria de software, que não conseguem cobrir as necessidades que o mercado exige. Aliado a isso, está a dificuldade de alterar os currículos acadêmicos.</p>
<p>E o JEDI ?</p>
<p>O JEDI, entra neste contexto de forma totalmente gratuita para a comunidade e disponibiliza todo o acesso aos cursos e materiais. O aluno terá ao seu dispor manuais, slides de apresentação das aulas, provas, exercícios e material de referência e vídeo-aulas. Contando ainda com os softwares, o treinamento de instrutores, o acesso a suporte e a lista de discussão da comunidade.</p>
<p>Na Filipinas já existe uma estrutura acadêmica dividida em fases. Na primeira fase foram disponibilizados os cursos de Introdução a programação I (versão 1.3); Introdução a Programação II (versão 1.1) e Estruturas de Dados (versão1.1). Na segunda fase os cursos de Engenharia de software (versão 1.0); Desenvolvimento de aplicações móveis (versão 1.0); Programação Web (versão 1.0). Na terceira fase, os cursos de Web Services; Segurança em Java e Programação, modelagem e análise orientada à objetos. Completando quatro semestres de curso com: Sistemas operacionais; Gerenciamento de projetos orientados à objetos e Inteligência artificial. Todo este material está atualmente disponível para download, em Inglês, no site Java.net.</p>
<p>A comunidade JEDI tem contribuído bastante para o sucesso desta iniciativa, em todo o mundo existem mais de 80 pessoas contribuindo ativamente. Os treinamentos são realizados pelos membros do JEDI que conduzem os testes e recebem cada vez mais pessoas como voluntárias. O JEDI possui, atualmente, parcerias globais nas Filipinas através de JP Petines (Java champion), no Brasil através de Daniel deOliveira (Java champion), na França através de Vicent Brabant (Java champion) e de coordenações na Malásia, Tailândia, Singapura, Japão e Vietnam.</p>
<p>Hoje o JEDI concentra o maior número de membros nas Filipinas. Desde fevereiro de 2005 até abril de 2006 são 110 escolas &#8211; 10% de todas as universidades e faculdades das Filipinas aderentes ao programa; Foram realizados 13 treinamentos e formados 207 instrutores multiplicadores, que formaram 1.318 instrutores que atendem a 48.205 estudantes.</p>
<p>Países de Língua Portuguesa</p>
<p>O Brasília Java Users Group &#8211; DFJUG é responsável pela coordenação do JEDI em países de língua portuguesa. Angola, Cabo Verde, Guiné-Bissau, Brasil, Moçambique, Portugal, São Tomé e Príncipe; Timor Leste serão países que poderão fazer o treinamento em língua nativa, com todos os recursos que a iniciativa provê. O DFJUG possui mais de 9.900 membros e é totalmente baseado em trabalho voluntário, sem personalidade jurídica e patrocinado pelo Instituto CTS, OSCIP, voltada para a pesquisa e desenvolvimento de tecnologias de software, que fornece ao grupo apoio logístico, administrativo e jurídico.</p>
<p>Atualmente, o Brasil conta, segundo a SUN Microsystems, com 70 mil desenvolvedores Java e 43 grupos de usuários Java, com mais de 25 mil membros participantes. É através do apoio destes grupos distribuídos em todos os estados da nação que esta iniciativa espera se consolidar, para elevar o nível de aprendizado Java, provendo melhores profissionais para atender as exigências do mercado mundial.</p>
<p>Como participar do JEDI ?</p>
<p>No momento estamos trabalhando na tradução e adaptação do material utilizado na Filipinas. Um vez que este esteja concluído, os cursos poderão ser acessados pelo site. Ao concluir o processo cada aluno terá que fazer uma prova presencial para obter a sua certificação, que será oferecida agentes que serão certificados em todo Brasil.</p>
<p>O DFJUG necessita de pessoas para corrigir e dar opiniões sobre todo o material produzido e realizar testes de Stress no site aonde o JEDI será hospedado, isso é um trabalho que somente poderá ser realizado com o apoio de toda a comunidade javanesa existente no Brasil. Quem quiser participar da iniciativa, no Brasil, deve acessar a página do DFJUG (www.dfjug.org) e entrar em contato com o grupo. Junte-se a nós, participe no instrutor ou como aluno desta iniciativa, poderemos assim enriquecer o conhecimento da linguagem e difundi-la de uma forma totalmente gratuita, voluntária e colaborativa, no Brasil e em diversos paises de língua portuguesa, será seu trabalho e seu empenho que ajudará elevar o Brasil ao hall dos melhores desenvolvedores JAVA no mundo.</p>
]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/java/jedi-java-education-and-development-initiative/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

