<?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.caelum.com.br &#187; erlang</title>
	<atom:link href="http://blog.caelum.com.br/tag/erlang/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.caelum.com.br</link>
	<description>blog dos desenvolvedores da Caelum</description>
	<lastBuildDate>Thu, 09 Feb 2012 13:04:59 +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>Concorrência ou paralelismo: Threads, Processes, Fibers e Actors</title>
		<link>http://blog.caelum.com.br/concorrencia-ou-paralelismo-threads-processes-fibers-e-actors/</link>
		<comments>http://blog.caelum.com.br/concorrencia-ou-paralelismo-threads-processes-fibers-e-actors/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 08:59:10 +0000</pubDate>
		<dc:creator>Guilherme Silveira</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[atores]]></category>
		<category><![CDATA[concorrência]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[fibers]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[juc]]></category>
		<category><![CDATA[paralelismo]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[scala]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=1092</guid>
		<description><![CDATA[Quanto mais processamento é necessário para resolver um problema, mais nos deparamos com projetos que envolvem questões de paralelismo, concorrência e distribuição de tarefas. Quais seriam as opções que existem e quais as características de cada uma delas? Como já sabemos, o problema em escrever código para ser rodado paralelamente é grande quando temos acesso <a href="http://blog.caelum.com.br/concorrencia-ou-paralelismo-threads-processes-fibers-e-actors/#more-1092'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Quanto mais processamento é necessário para resolver um problema, mais nos deparamos com projetos que envolvem questões de paralelismo, concorrência e distribuição de tarefas. Quais seriam as opções que existem e quais as características de cada uma delas?</p>
<p>Como já sabemos, o problema em escrever código para ser rodado paralelamente é grande quando temos  acesso a dados compartilhados (shared memory) e existe uma ou mais escritas ocorrendo no mesmo dado.</p>
<p>A abordagem dos monitores do  Java (<code>wait</code>/<code>notify</code>) e das <a href="http://en.wikipedia.org/wiki/POSIX_Threads">pthreads do C</a> estão ligadas a objetos que sinalizam quando podemos e quando não devemos escrever nessa memória compartilhada e, apesar de extremamente poderosa, vem se mostrando difícil de ser trabalhada e mantida pelos desenvolvedores. Tudo isto está conectado com a questão de concorrência preemptiva, onde um escalonador agenda e executa as threads/processos, inclusive em mais de um processador simultaneamente.</p>
<p>Existem duas outras alternativas que ganham força hoje em dia: os <strong>atores e processos</strong> de linguagens como Erlang e Scala, e as <strong>fibers</strong> do ruby 1.9.</p>
<p>Em linguagens como Erlang, onde as &#8220;variavéis&#8221; são imutáveis, não existem efeitos colaterais ao se executar uma função, portanto podemos dizer que a &#8220;memória compartilhada&#8221; não sofre dos males das outras linguagens, já que não há estado que possa ser alterado. Muitos dizem que <a href="http://blog.lucindo.com.br/2008/05/22/state-youre-doing-it-wrong/">o grande problema das linguagens atuais é justo o estado</a>.</p>
<p>Qual a grande vantagem da imutabilidade fazer parte de uma lingaugem? Duas invocações poderiamm ser paralelizadas pelo interpretador/compilador, como o exemplo de pseudo código Java abaixo mostra:</p>
<pre class="brush: java; title: ; notranslate">
String geraCorpo(Movimentacao[] movimentacoes) {
  String conteudo = &quot;&quot;;
  for (Movimentacao m : movimentacoes) {
    conteudo += m.geraConteudo();
  }
  return conteudo;
}

String geraRodape(Informacao[] informacoes) {
  String rodape = &quot;&quot;;
  for(Informacao info : informacoes) {
    rodape += info.geraConteudo();
  }
  return rodape;
}

String processaRelatorio (Movimentacao[] movimentacoes,
         Informacao[] informacoes ) {
  return geraCorpo(movimentacoes) + geraRodape(informacoes)
}
</pre>
<p>Repare que quando invocarmos o <code>processaRelatorio</code> as duas outras funções seriam executadas sequencialmente, mas um compilador/interpretador inteligente poderia executar as duas invocações em paralelo e concatenar o resultados assim que ambos estiverem disponíveis. Ele poderia ir mais além, invocando partes de cada laço em paralelo em processadores diferentes. Isso se tivessemos a garantia de que não haveria efeitos colaterais ao invocarmos cada uma dessas funções, garantia a qual não se da para fazer com o Java.</p>
<p><strong>Funções que não causam efeitos colaterais</strong> permitem otimizações impressionantes por parte do interpretador/compilador e são uma ótima alternativa para fazer uso de todos os <em>cores</em> que temos disponibilizados (número que só cresce) evitando o desperdício.</p>
<p>Por outro lado, existem partes do sistema que podem ser manualmente agendados para executarem <a href="http://www.javaworld.com/javaworld/jw-09-1998/jw-09-threads.html?page=1">concorrentemente e &#8211; as vezes &#8211; até mesmo em paralelo</a>.</p>
<p>Em sites de verificação de rotas de vôo, diversas requisições para diferentes sites podem ser executadas simultaneamente com uma tarefa extra que que concatena todos os resultados. Para que essa tarefa final receba as respostas, precisamos trocar mensagens entre aqueles que processam as diversas requisições e a tarefa que concatena as informações. Alguém responsável por pegar informação de um site seria aquele que recebe o identificador do site que será pesquisado (por exemplo tam, gol etc), os critérios de pesquisa, e quem é responsável pela tarefa final, de concatenar os resultados.</p>
<p>Dada as 3 informações, esse alguém executa uma requisição que é blocante, isto é, segura a sua thread até obter a resposta, executa transformações (parseia) a mesma, e termina notificando o responsável da finalização do processo, como o pseudo-código abaixo:</p>
<pre class="brush: scala; title: ; notranslate">
class Agente {
  def recebe(site, pesquisa, callback) {
    resposta = http.request(site + &quot;?search_for=&quot; + pesquisa)
    resultado = parseia(resposta)
    callback.recebe (resultado)
  }
}
</pre>
<p>E então alguém responsável por concatenar os resultados:</p>
<pre class="brush: scala; title: ; notranslate">
class TarefaFinal {
  final = []
  def recebe(resultado_parcial) {
    final.add resultado_parcial
  }
  def aguarda_ate_o_fim {
    // aguarda ate o fim de todos os parciais
    // e entao retorna o resultado total
  }
}
</pre>
<p>A tarefa mãe seria quem dispara diversos agentes que farão as pesquisas e o agente final, que colherá os resultados, ainda com pseudo-código:</p>
<pre class="brush: scala; title: ; notranslate">
class Pesquisador {
  def busca(opcoes) {
    concatenador = new TarefaFinal
    sites = {'www.tam.com.br', 'www.voegol.com.br',
                 'www.aerolinhascaelum.com.br'}
    for site in sites {
      new Agente().envia (site, opcoes, concatenador)
    }
    return concatenador.aguarda_ate_o_fim
  }
}
</pre>
<p>Em Java, por exemplo, utilizariamos uma thread para cada agente, para que cada requisição blocante não impedisse a execução das outras em <strong>paralelo</strong>. Com isso, podemos utilizar todos os processadores de uma máquina, mas o peso de gerenciar muitas threads em Java é algo que queremos evitar.</p>
<p>Outra solução, ainda em Java, é utilizar a api de NIO, permitindo executar tarefas de entrada e saída sem que a thread atual aguarde o resultado final. Por um lado essa alternativa aumentaria a possibilidade de atendermos muito mais requisições, porém há um custo aí de ficar perguntando se o resultado &#8220;já está pronto&#8221;. É um trade-off  entre performance e escalabilidade. Essa abordagem pode ser feita de maneira um pouco mais elegante e transparente através de <a href="http://code.google.com/p/gparallelizer/wiki/DataflowConcurrency">bibliotecas de dataflow concurrency</a>.</p>
<p>A solução que algumas linguagens apresentam é chamada de processos. Esses processos serão executados concorrentemente, e, como o código é escrito visando minimizar efeitos colaterais, em grande parte ele poderá ser executado em paralelo. Esses processos são mais leves pois não implicam em um overhead de informações devido a troca do estado de memória e de pilha de execução quanto a implementação de threads em Java.</p>
<p>Ainda mais impressionante é a capacidade de executar cada um desses processos em máquinas diferentes da atual. Se o código do agente é  facilmente serializável, ou que permita um rápido bootstrap em diversas máquinas remotas, fica muito barato rodar esses processos em diversas máquinas, inclusive efetuando concatenações parciais, até obter o resultado final, se aproximando das idéias do <a href="http://en.wikipedia.org/wiki/MapReduce">Map Reduce</a>, <a href="http://labs.google.com/papers/mapreduce-osdi04.pdf">descrito pelo google em 2004</a>.</p>
<p>Por fim, existe a opção de <a href="http://en.wikipedia.org/wiki/Coroutine">co-rotinas que voltam a ser abordadas</a>, nesse caso no mundo Ruby, <a href="http://www.infoq.com/news/2007/08/ruby-1-9-fibers">através de Fibers</a>.</p>
<p>O uso de Fibers permite escrever um código onde N processos mantem a comunicação entre si, dizendo uns aos outros quando é o momento de deixar de executar para dar espaço para execução do outro processo. Muitos se lembrarão do método <code>Thread.yield()</code> de Java, que tem um comportamento definido parecido com o mencionado. Mas ele <strong>não garante que a thread atual para</strong> e deixa outro processo rodar.</p>
<p>Por outro lado, fibers garantem que aquele processo pare momentaneamente para deixar aquele que o invocou continuar sua execução. A grande vantagem está em poder separar, com isso, o código que controla diversos processos (fibers) e o código que executa cada processamento. A desvantagem está em que os processos estão rodando concorrentemente, não em paralelo.</p>
<p>Hoje em dia, outro<a href="http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/index.htm#beautiful"> assunto que está sendo muito discutido</a> é a questão da <a href="http://en.wikipedia.org/wiki/Software_transactional_memory">memória transacional</a>. Uma maneira que, resumidamente, permite criar transações em cima de suas variáveis de memória para que, em casos onde imutabilidade de dados compartilhados não é possível, haja um controle automático.</p>
<p>Mas essa abordagem apresenta certas dificuldades e detalhes importantes de serem estudados, como as dificuldades de se fazer operações de IO durante uma transação dessas &#8211; o problema  de &#8220;como efetuar o rollback do lançamento de um foguete?&#8221;. Quem implenta uma possível solução para isso é o haskell, através dos <a href="http://en.wikipedia.org/wiki/Monad_(functional_programming)">monads</a>.</p>
<p>Só enxergaremos melhor as todas as vantagens e desvantagens de cada uma dessas opções aqui citadas quando elas quando elas forem parte do dia a dia de muitos programadores, um futuro não tão distante. </p>
<p>Agradeço ao <a href="http://blog.rafaelferreira.net/">Rafael Ferreira</a> e ao <a href="http://blog.lucindo.com.br/">Renato Lucindo</a> pelas discussões e revisões.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/concorrencia-ou-paralelismo-threads-processes-fibers-e-actors/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>A JVM e as outras linguagens: você está preparado?</title>
		<link>http://blog.caelum.com.br/a-jvm-e-as-outras-linguagens-voce-esta-preparado/</link>
		<comments>http://blog.caelum.com.br/a-jvm-e-as-outras-linguagens-voce-esta-preparado/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 12:36:33 +0000</pubDate>
		<dc:creator>Paulo Silveira</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[dynamic languages]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[fj-91]]></category>
		<category><![CDATA[linguages]]></category>
		<category><![CDATA[mit]]></category>
		<category><![CDATA[poliglota]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=796</guid>
		<description><![CDATA[Um outro assunto que tem aparecido com cada vez mais frequência na lista interna da Caelum são as diversas linguagens que rodam sob a JVM. Sejam elas compiladas diratamente para bytecode Java, ou interpretadas através da Java Scripting API adicionada no Java 6. O Fábio Kung fez no início do ano um acalorado post intitulado <a href="http://blog.caelum.com.br/a-jvm-e-as-outras-linguagens-voce-esta-preparado/#more-796'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Um outro assunto que tem aparecido com cada vez mais frequência na lista interna da Caelum são as diversas linguagens que rodam sob a JVM. Sejam elas compiladas diratamente para bytecode Java, ou interpretadas através da Java Scripting API adicionada no Java 6.</p>
<p>O Fábio Kung fez no início do ano um acalorado post intitulado <a href="http://blog.caelum.com.br/2009-ano-do-ruby-on-rails-no-brasil/">2009 o ano do Ruby on Rails no Brasil</a>, e podemos ir além: diversas linguagens que não <strike>fazem</strike> faziam parte do <em>mainstream</em> corporativo vem ganhando muita força por todos os lugares.</p>
<p>Martin Fowler fez um trabalho minucioso em suas considerações ao <a href="http://martinfowler.com/articles/rubyAtThoughtWorks.html">uso de Ruby pela ThoughtWorks</a> (<a href="http://www.akitaonrails.com/2009/06/15/tradu--o-ruby-na-thoughtworks">traduzido pelo Fábio Akita aqui</a>). Fowler discorre a respeito das opiniões e sentimentos dos lideres técnicos de cada projeto que optou por Ruby, e poucos deles (5 de 41) disseram que Ruby foi a escolha errada. </p>
<p>Mas será que apenas o Ruby tem ganho toda essa notoriedade e força?</p>
<p>O <a href="http://blog.rafaelferreira.net/">Rafael Ferreira</a> compartilhou comigo recentemente um <a href="http://www.info.ucl.ac.be/~pvr/VanRoyChapter.pdf">excelente artigo que discute os diferentes paradigmas de programação</a>, citando vantagens e desvantagens, culminando na importância do aprendizado de diferentes linguages, em especial para tirar proveito das que facilitam o desenvolvimento de sistemas com muita concorrência. </p>
<p>O <a href="http://blog.lucindo.com.br/">Renato Lucindo</a> me mostrou também o quão grande  tem sido a repercussão do Scala em grandes ambientes, como é <a href="http://www.scala-lang.org/node/2200">esse caso da Électricité de France Trading que trocou 300 mil linhas de Java por Scala</a>.</p>
<p>Vale também citar a troca de linguagens num dos cursos mais famosos de computação do mundo: <a href="http://mitpress.mit.edu/sicp/">o Structure and Interpretation of Computer Programs</a>, curso que inicia os graduandos de ciência da computação e engenharia elétrica do MIT. Este curso foi sempre famoso por ser ministrado em Scheme, e agora depois de uma série de debates e justificativas, <a href="http://blog.snowtide.com/2009/03/24/why-mit-now-uses-python-instead-of-scheme-for-its-undergraduate-cs-program">foi reformulado usando Python</a>, novamente sem usar uma das linguagens <em>enterprisey</em>.</p>
<p>Pedro Matiello, que trabalha aqui com a gente, é o lider de desenvolvimento da biblioteca <a href="http://code.google.com/p/python-graph/">python-graph</a>, que implementa diversos algoritmos para grafos em python e possui <a href="http://code.google.com/p/python-graph/wiki/Credits">colaboração dos mais variados países</a>.</p>
<p>Aqui na Caelum, além de usarmos extensivamente Ruby e Rails em projetos e termos estendido o tempo do nosso <a href="http://www.caelum.com.br/curso/rr-11-ruby-on-rails/">curso RR-11</a> para 32 horas ja há algum tempo, há um pedaço de um sistema desenvolvido em Scala e ainda temos o curso de <a href="http://www.caelum.com.br/curso/cs-01-logica-de-programacao/">Lógica de Programação</a> é realizado em grande parte com Groovy.</p>
<p>São muitos meus amigos e colegas de trabalho estudando LISP, Erlang, OCaml, Scala e outras linguagens, sem contar Ruby/Rails e Python/Django. Todas essas linguagens podem de certa forma rodar sobre a JVM. É um lugar-comum (e é uma das dicas do excelente <a href="http://www.pragprog.com/ppbook/index.shtml">Pragmatic Programmer</a>) dizer que devemos aprender mais linguanges de programação para ampliar nossa visão e formas de ataque a um problema. Já disse Peter Norvig que <a href="http://norvig.com/21-days.html">é necessário 10 anos para que adquiramos fluência numa linguagem de programação</a>, mas sempre há o momento de começar.</p>
<p>E você? Como está seu contato com essas linguagens? Sua empresa está usando algo &#8220;novo&#8221; em seus projetos?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/a-jvm-e-as-outras-linguagens-voce-esta-preparado/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Effective Java: segunda edição</title>
		<link>http://blog.caelum.com.br/effective-java-segunda-edicao/</link>
		<comments>http://blog.caelum.com.br/effective-java-segunda-edicao/#comments</comments>
		<pubDate>Fri, 25 Jul 2008 11:56:29 +0000</pubDate>
		<dc:creator>Paulo Silveira</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[composição]]></category>
		<category><![CDATA[effective java]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[fj-16]]></category>
		<category><![CDATA[herança]]></category>
		<category><![CDATA[imutabilidade]]></category>
		<category><![CDATA[interfaces]]></category>
		<category><![CDATA[orientação a objetos]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/2008/07/25/effective-java-segunda-edicao/</guid>
		<description><![CDATA[Como sabemos, a segunda edição do Effective Java foi publicada. O autor é Joshua Bloch, um dos principais responsáveis pelo generics do Java, e atualmente chief java architect no Google. Esse livro é dividido em 78 itens, cada um com cerca de 3 páginas, atacando um ponto específico do java e orientação a objetos, explicando <a href="http://blog.caelum.com.br/effective-java-segunda-edicao/#more-237'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Como sabemos, a segunda edição do <a href="http://java.sun.com/docs/books/effective/">Effective Java</a> foi publicada. O autor é <a href="http://en.wikipedia.org/wiki/Joshua_Bloch">Joshua Bloch</a>, um dos principais responsáveis pelo generics do Java, e atualmente chief java architect no Google. Esse livro é dividido em 78 itens, cada um com cerca de 3 páginas, atacando um ponto específico do java e orientação a objetos, explicando uma boa ou má prática. Simplesmente incrível, durante a leitura você sempre reconhece muita coisa que já aprendeu durante sua experiência de desenvolvimento. </p>
<p>Essa nova edição está estendida e revista, para cobrir as grandes mudanças do Java 5. Esse, juntamente com <a href="http://blog.caelum.com.br/livros-escolhendo-a-trindade-do-desenvolvedor-java/">outros dois livros</a> (e atualmente incluiríamos também o <a href="http://en.wikipedia.org/wiki/The_Mythical_Man-Month">The Mythical Man-month</a>), são de extrema importância para todo desenvolvedor na nossa opinião.</p>
<p>O <a href="http://www.boaglio.com/">Fernando Boaglio</a> tem <a href="http://www.boaglio.com/index.php/2007/10/01/effective-java-depois-de-6-anos/">um resumo</a> em seu blog, sobre todos os itens dessa nova versão. A <a href="http://www.java.blogger.com.br/">Vanessa Sabino</a> publicou anos atrás um resumo completo sobre a primeira edição, que você pode conferir na coluna da direita do seu blog. </p>
<p>O Fernando também <a href="http://www.guj.com.br/posts/list/90779.java">postou no GUJ</a> um link para <a href="http://www.infoq.com/articles/bloch-effective-java-2e">uma excelente entrevista do Joshua Bloch</a>, onde ele tenta resumir as más práticas, o java inefetivo: <strong>otimização prematura</strong>, e <strong>escrever o próprio código quando bibliotecas boas já existem</strong>. Além disso, Joshua Bloch é categório sobre a grande importância dos testes unitários: &#8220;<em>Unit testing is key. And writing your tests first is a great thing.</em>&#8221;</p>
<p>Lendo essa nova edição e relembrando muito da edição anterior, escolhi aqui quatro itens que considero vitais, e vou falar sucintamente sobre cada um deles. Curiosamente todos os selecionados aqui já existiam na edição anterior, e estão mais relacionados a design que a idiomismos da linguagem, mas isso não tira a  importância dos outros aqui não citados. Esses itens são muito debatidos no capítulo de Tópicos em Orientação a Objetos no nosso <a href="http://www.caelum.com.br/curso/fj-91-arquitetura-design-projetos-java/">trienamento de Design e Arquitetura de projetos Java</a>. Vamos a eles:</p>
<p><strong>Item 15: Minimize mutabilidade</strong></p>
<p>Classes imutáveis possuem uma série de vantagens: fáceis de manter, não possuem efeitos colaterais e acima de tudo são thread safe. Uma classe deve ser imutável a não ser que você tenha muito bons motivos para isso. Mesmo se não for possível tornar sua classe imutável, minimize a quantidade de métodos que alteram o estado do objeto. Um objeto previsível é muito mais simples de manter. Joshua Bloch cita <code>String</code>, <code>BigInteger</code> e diz que <code>java.util.Date</code> e <code>java.awt.Point</code> deveriam ter sido criadas imutáveis! Muitas APIs novas abusam da imutabilidade, como a Joda Time, classes wrapper, Money and Time do Eric Evans, etc. Aliás, é com o slogan da imutabilidade que linguagens como <a href="http://clojure.org/">clojure</a> e <a href="http://www.erlang.org/">erlang</a> tem chamado tanta atenção. Leia também <a href="http://blog.lucindo.com.br/2008/05/22/state-youre-doing-it-wrong/">essa citação</a> no blog do Renato Lucindo.</p>
<p><strong>Item 16: Favoreça composição em vez de herança</strong></p>
<p>Esse é um tópico que já foi <a href="http://blog.caelum.com.br/como-nao-aprender-orientacao-a-objetos-heranca/">discutido anteriormente nesse post</a>. O fato é o seguinte: é muito fácil usar herança de maneira errada, como é o caso de <code>Stack extends Vector</code> e <code>Properties extends Hashtable</code>. Mesmo quando usada corretamente, herança pode causar efeitos colaterais com muita facilidade, sendo que utilizar interfaces e composição pode substitui-la por completo, com o pequeno acréscimo de algumas linhas de delegação. Esse item também é citado no livro <em>Design Patterns</em> como um dos dois princípios básicos do bom design orientado a objetos.</p>
<p><strong>Item 47: Conheça e use as bibliotecas!</strong></p>
<p>Você conhece a <code>ArrayDeque</code> do java 6? Sabia que a <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Scanner.html">java.util.Scanner</a> pode ler facilmente arquivos com formatos caseiros, e já trazer para você <code>double</code>s, <code>String</code>s e até mesmo <code>BigDecimal</code>s? Que JAXB e JAXWS podem agora ser usados apenas com Java SE? Sabia que a <code>Collections</code> possui hoje métodos para calcular a frequência de um elemento e inverter a ordem de um <code>Comparator</code>?. Conhecer bem a biblioteca padrão do Java pode te salvar de escrever muito código já existente, testado e de qualidade. <code>java.io</code>, <code>java.lang</code> e <code>java.util</code> são APIs que funcionam como base para todo desenvolvedor e merecem um estudo aprofundado.</p>
<p><strong>Item 52: Refira a objetos pelas suas interfaces</strong><br />
Sem dúvida uma boa prática mais que necessária. Através dela conseguimos diminuir muito o acoplamento entre classes, deixando apenas uma fina camada entre elas: as interfaces. Sempre usar <code>InputStream</code> em vez de se acoplar em <code>FileInputStream</code>, sempre usar <code>List</code> em vez de se acoplar a <code>ArrayList</code>. Muitas vezes podemos ir mais longe, nesse último caso <code>Collection</code> pode ser o suficiente, ou até mesmo <code>Iterable</code>! Algumas pessoas levam isso tão a sério que nunca criam uma única classe concreta que não implemente uma interface. Esse item também é citado no livro <em>Design Patterns</em>, e é o outro princípio básico do bom design orientado a objetos desta forma: &#8220;<em>Programe voltado a interface, e não a implementação</em>&#8220;.</p>
<p>Ainda existem itens fundamentais sobre Enums, Exceptions, Concorrência e Generics. Esse livro é realmente importante na sua cabeceira. Boa leitura!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/effective-java-segunda-edicao/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

