<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DEcNR34zfyp7ImA9WhRRFE4.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714</id><updated>2011-11-27T21:21:36.087-02:00</updated><category term="Pubs" /><category term="pessoal" /><category term="Performance" /><category term="OSGi" /><category term="Dicas" /><category term="C" /><category term="SmallTalk" /><category term="OSL" /><category term="UI" /><category term="XML" /><category term="Mock" /><category term="Build" /><category term="DistributedObjetcs" /><category term="FILOSOFIA_DE_BOTECO" /><category term="Multi thread" /><category term="JS" /><category term="Linguagens Funcionais" /><category term="OO" /><category term="Java" /><category term="SOA" /><category term="CodeGen" /><category term="Gestão" /><category term="Ajax" /><category term="git tips dicas" /><category term="Web" /><category term="DI" /><category term="C++" /><category term="Cerveja" /><category term="Reflection" /><category term="XQuery" /><category term="TDD" /><category term="Arquitetura" /><category term="Criticas" /><category term="Maven" /><category term="Mac" /><category term="GC" /><category term="Qt" /><category term="OFFTOPIC" /><category term="Estatistica" /><category term="Classloader" /><category term="J2EE" /><category term="ObjectiveC" /><category term="digressões" /><category term="OS" /><category term="Numerica" /><category term="Erlang" /><title>opɐqǝq ɹopɐɯɐɹƃoɹd oʇıpןɐɯ</title><subtitle type="html">Divagações sobre programação, cerveja e outros assuntos relevantes...</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>47</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/OpqqopodOp" /><feedburner:info uri="opqqopodop" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DEECRng8eyp7ImA9WxBXF0U.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-587081659356516414</id><published>2010-01-24T21:57:00.005-02:00</published><updated>2010-01-29T15:37:47.673-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-29T15:37:47.673-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OFFTOPIC" /><title>Novo endereço do blog - feuteston.com</title><content type="html">Senhores,&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Vou mudar o blog para a wordpress, vou por num  dominio e vou parar de blogar em português. Escrever em inglês ter uma série de vantagens, tais como:&lt;/div&gt;&lt;div&gt;- Como não é minha lingua nativa, tenho mais desculpas para erros gramaticais ;-)&lt;/div&gt;&lt;div&gt;- Posso pagar uma de bonzão escrevendo em inglês, já que, como disse o &lt;a href="http://twitter.com/aldrinleal"&gt;@aldrinleal&lt;/a&gt;, eu fui alfabetizado em inglês ;-)&lt;/div&gt;&lt;div&gt;- Ok, agora o único motivo sério mesmo: percebi que muito material que eu leio é escrito em inglês por pessoas que não têm o inglês como lingua nativa. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Aahhh! Mas eu sou programador e não sei falar inglês! É raro, mas já conheci gente assim. Bixo, se alguém se encaixa nesta situação, vá estudar inglês. Pelo menos saber ler sem dificuldades é obrigação e facilita muito a vida! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Não que eu tenha escrito algo realmente novo ou bom neste, sei lá, mais ou menos 1 ano que escrevo aqui. Mas o analytics mostrou que tem bastante gente lê o que eu escrevo (e isso me deixa feliz pacas). Comprei o dominio feuteston.com já criei uma conta no wordpress para meus posts em inglês. Alias, o wordpress deixa o blogger morrendo de vergonha em termos de recursos e facilidade de uso. Sério mesmo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Então é isso: atualizem seus agregadores RSS para&lt;a href="http://feuteston.com/"&gt; http://feuteston.com&lt;/a&gt; (redireciona para &lt;a href="http://feuteston.wordpress.com"&gt;http://feuteston.wordpress.com&lt;/a&gt; se o ip do godaddy.com não estiver na blacklist de seu firewall :D )&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ah, não tem nada de util ainda! Provavelmente só depois de fevereiro...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;See ya!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-587081659356516414?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZIv61N4D_UvDAhDKuwD9dpb5gn4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZIv61N4D_UvDAhDKuwD9dpb5gn4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZIv61N4D_UvDAhDKuwD9dpb5gn4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZIv61N4D_UvDAhDKuwD9dpb5gn4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/PSDUaWVMbEU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/587081659356516414/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2010/01/novo-endereco-do-blog-feutestoncom.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/587081659356516414?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/587081659356516414?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/PSDUaWVMbEU/novo-endereco-do-blog-feutestoncom.html" title="Novo endereço do blog - feuteston.com" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2010/01/novo-endereco-do-blog-feutestoncom.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkECSXszeyp7ImA9WxBQF0o.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-774490154646059634</id><published>2010-01-17T22:02:00.005-02:00</published><updated>2010-01-17T23:37:48.583-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-17T23:37:48.583-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Multi thread" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Performance" /><title>Dead locks, programadores smarty pants e a api de concorrência do Java 5</title><content type="html">&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.geekologie.com/2008/04/04/defendius-door-lock.jpg"&gt;&lt;img src="http://www.geekologie.com/2008/04/04/defendius-door-lock.jpg" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 450px; height: 437px; " /&gt;&lt;/a&gt;&lt;/span&gt;Antes do assunto do post, um pequeno "prefácio"&lt;/b&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Trabalho faz algum tempo com Java e Java não é o tipo de linguagem que você precisa re-inventar a roda o tempo todo. Tem muita coisa pronta e muita coisa pronta é de qualidade. Os desenvolvedores Java de um modo geral trabalham em ambiente multi-thread o tempo todo e não percebem. Isto é ótimo na minha opinião, pois mostra que as frameworks estão fazendo um bom trabalho escondendo detalhes de implementação. Antes do projeto atual precisei usar threads poucas vezes em situações simples. Sem me dar conta, em ambas as vezes copiei objetos ao invés de compartilha-los e assim evitei problemas. Agora no projeto atual fui obrigado a estudar mais para evitar e/ou corrigir problemas. Vamos ao que interessa...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;O que são os dead locks?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;É quase um problema do tipo "ovo-ou-galinha". Imagine duas crianças chatas, uma falando pra outra: "só vou depois que ele for!". Da wikipedia:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"deadlock refers to a specific condition when two or more processes are each waiting for each other to release a resource."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Podemos pensar que se existir dois locks, A e B, e uma thread tentar adquirir os locks na ordem A, e depois B, e outra thread adquirir os locks na ordem B, e depois A, o risco de cagada é eminente! Vamos imaginar as duas threads trabalhando para adicionar uma nova linha em dois arquivos:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Thread 1:&lt;/b&gt; O arquivo lalala.txt é meu e ninguém mexe nele até eu terminar! Agora falta pegar o arquivo lelele.txt e adicionar uma linha a ambos. Alguém pegou o lelele.txt. Vou esperar até terminarem de usa-lo...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Thread 2:&lt;/b&gt; O arquivo lelele.txt é meu e ninguém mexe nele até eu terminar! Agora falta pegar o arquivo lalala.txt e adicionar uma linha a ambos. Alguém pegou o lalala.txt. Vou esperar até terminarem de usa-lo...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Repare duas coisas: &lt;/div&gt;&lt;div&gt;1 - Se estivessem mexendo em apenas um arquivo (um só lock envolvido), não teria problema; 2 - Se estivessem pegando os arquivos (ou locks) na mesma ordem, também não teria problema.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://telephonecompanymusic.com/index_files/smarty-pants-logo-with-photo.jp"&gt;&lt;img src="http://telephonecompanymusic.com/index_files/smarty-pants-logo-with-photo.jp" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 279px; height: 351px; " /&gt;&lt;/a&gt;&lt;div&gt;Ahhhh tá! Você como um bom programador "smarty pants" que é já pensou na solução para todos os problemas de concorrência do mundo: "Vamos usar um só lock global em tudo quanto é coisa que não tem perigo!". &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sinto dizer, mas você não foi o primeiro a ter esta "grande" idéia. No linux existia (ou ainda existe, não sei) o BKL, ou Big Kernel Lock, que foi criado para isso. Existia (ou existe, não sei) algumas linguagens de script famosas também fazem uso de mecanismos de lock global. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tá, então, pensando de forma "smarty pants": Se todo mundo usa deve ser bom! Uma coisa é certa: evita problemas de dead lock. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A segurança vem com um preço: evita paralelismo. Todo mundo esperando um mesmo lock ficar disponível só irá deixar o ambiente menos paralelizável. Tá, então como fazer? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Um bom começo é &lt;a href="http://malditoprogramadorbebado.blogspot.com/2009/12/assobiando-e-chupando-cana.html"&gt;evitar side-effects&lt;/a&gt;. Antes de falar mais sobre isso, é importante conhecer os locks envolvidos. Vamos falar de alguns deles agora:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Métodos e blocos sincronizados&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Este é o &lt;a href="http://java.sun.com/docs/books/tutorial/essential/concurrency/locksync.html"&gt;lock intrinseco do Java&lt;/a&gt;. Num passo de mágica, ao adicionar a palavra reservada &lt;b&gt;synchronized&lt;/b&gt; na declaração do método, ele não poderá ser chamado por mais de uma thread ao mesmo tempo. Assim ele irá usar o lock intrinseco da instancia atual. Se outro método tiver esta palavra reservada ele será sincronizado usando o mesmo lock. Outra forma, é usar o lock intrinseco de outro objeto. Por exemplo, sincronizando métodos:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;class SynchronizedMethods{&lt;/div&gt;&lt;div&gt;public synchronized void doStuff(){&lt;/div&gt;&lt;div&gt;// lots of stuff...&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;public synchronized void doAnotherStuff(){&lt;/div&gt;&lt;div&gt;// lots of stuff...&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;E sincronizando usando o lock intrinseco de outro objeto:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;class SynchronizedMethodsTwo{&lt;/div&gt;&lt;div&gt;&lt;div&gt;private final Object lockDoStuff = new Object();&lt;/div&gt;&lt;div&gt;&lt;div&gt;private final Object lockDoAnotherStuff = new Object();&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;public void doStuff(){&lt;/div&gt;&lt;div&gt; synchronized(lockDoStuff){&lt;/div&gt;&lt;div&gt;// lots of stuff...&lt;/div&gt;&lt;div&gt; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;public void doAnotherStuff(){&lt;/div&gt;&lt;div&gt; synchronized(lockDoAnotherStuff){&lt;/div&gt;&lt;div&gt;// lots of stuff...&lt;/div&gt;&lt;div&gt; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Na primeira opção os dois métodos não podem ser chamados ao mesmo tempo. Na segunda opção cada método não pode ser chamado ao mesmo tempo, mas admite uma thread chamando o primeiro método e outra thread chamando o segundo. Isso por que eles não usam o mesmo lock. Estes locks são "nativos" do Java. Em uma situação de dead lock a JVM para e imprime uma stacktrace dos objetos locados envolvidos. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.picallo.info/wp-content/uploads/2007/09/semaforo.jpg"&gt;&lt;img src="http://www.picallo.info/wp-content/uploads/2007/09/semaforo.jpg" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 375px; height: 500px; " /&gt;&lt;/a&gt;&lt;div&gt;Importante lembrar que estes locks intrínsecos do Java são reentrantes. Ou seja, a thread atual pode adiquirir um locks quantas vezes quiser. As outras threads só irão poder adquirir aquele lock quando a thread atual libera-lo o mesmo número de vezes que o adquiriu. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Algumas novidades do Java 5&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Este mecanismo de uso dos locks é bem simples e poderoso. Mas no Java 5 a api de concorrência melhorou bastante e ganhou novos integrantes. Grande parte graças ao &lt;a href="http://en.wikipedia.org/wiki/Doug_Lea"&gt;Doug Lea&lt;/a&gt; (sou fã deste cara!). Existem objetos como &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html"&gt;ReentrantLock&lt;/a&gt; ou &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/ReadWriteLock.html"&gt;ReadWriteLock&lt;/a&gt;, sendo o primeiro deles um lock reentrante que consegue escolher (quando o parametro &lt;b&gt;fair&lt;/b&gt; do construtor for true) qual a thread que irá adquirir o lock baseado no tempo que a coitada está esperando. O ReadWriteLock consegue liberar sempre quem estiver lendo, e locar todo mundo apenas quando alguém estiver escrevendo. Boa abstração essa para o problema dos arquivos citado acima, imaginando que existem algumas threads lendo os arquivos e outras tentando escrever. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Existem os &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Semaphore.html"&gt;semáforos&lt;/a&gt;, que são locks que só deixam um determinado número X de threads adquirir o lock ao mesmo tempo. Podemos pensar no lock "padrão" como sendo um &lt;a href="http://en.wikipedia.org/wiki/Mutual_exclusion"&gt;Mutex&lt;/a&gt;, ou seja, um semáforo de apenas uma thread permitida. Imaginando um sistema que só pode abrir 3 conecções ao banco de dados, o uso de um semaforo na implementação do pool de conecções pode ser coerente. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Existe também o &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html"&gt;CountDownLatch&lt;/a&gt;, que é um mecanismo que você precise acionar X vezes para desbloquear quem estiver chamando o metodo &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html#await()"&gt;await&lt;/a&gt; dele. Exemplo de uso: estas threads que estão esperando só podem começar a trabalhar quando eu deixar (acionar X=1 vez). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Existem collections &lt;a href="http://en.wikipedia.org/wiki/Copy-on-write"&gt;CopyOnWrite&lt;/a&gt; no Java 5. Estas collections copiam toda a estrutura interna cada vez que ocorre uma alteração. Com isso, iteradores ativos não precisam serem bloqueados cada vez que outra thread mexe nesta collection. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Existem mais coisas interessantes na &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html"&gt;api de concorrência&lt;/a&gt; a partir do Java 5. Para quem programa em Java com coisas não triviais sugiro dar uma olhada na api de concorrência do java 5 ou então ler o livro &lt;a href="http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601"&gt;JCIP&lt;/a&gt; (que inclusive estou acabando, e considero tão importante quanto o &lt;a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1263776765&amp;amp;sr=1-1"&gt;Effective Java&lt;/a&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Caramba! Você falou que sincronizar é perigoso e depois ficou falando sobre várias formas de sincronizar! Não entendi...&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://volokh.com/files/jim-southparka1003.gif"&gt;&lt;img src="http://volokh.com/files/jim-southparka1003.gif" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 150px; height: 110px; " /&gt;&lt;/a&gt;&lt;div&gt;Ok. A falta de sincronização é mais perigosa ainda! Eu deveria ter explicado sobre ela no início do post para fazer mais sentido. Mas vamos lá: Imaginem só duas threads tentando atualizar o número de acessos de um site numa variável "global". Imaginem isso usando o código abaixo:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;código das Threads 1 e 2: &lt;/div&gt;&lt;div&gt;long numeroDeAcessos = NumeroDeAcessos.get();&lt;/div&gt;&lt;div&gt;numeroDeAcessos = numeroDeAcessos + 1;&lt;/div&gt;&lt;div&gt;NumeroDeAcessos.set(numeroDeAcessos);&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Agora veja como o código pode ser executado:&lt;/div&gt;&lt;div&gt;&lt;div&gt;thread 1: pega o numero de acessos com valor 10&lt;/div&gt;&lt;div&gt;&lt;div&gt;thread 2: também pega o numero de acessos com valor 10&lt;/div&gt;&lt;div&gt;Daí as duas incrementam e atualizam. O valor real deveria ser 12, mas fica sendo 11. Isto ocorre por que a operação de ler, atualizar e escrever não é atômica. Para ser atômica, uma estratégia possível é executa-la dentro de um lock. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Esta foi uma visão macro de como acontecem as &lt;a href="http://en.wikipedia.org/wiki/Race_condition#Computing"&gt;race conditions&lt;/a&gt;. Uma forma de evita-las é usando locks. Mas isto acontece também em operações do tipo atribuir variáveis e outras coisas bem básicas. A JVM e o Hotspot otimizam algumas operações copiando os valores para cache no processador e coisas do tipo. Até é possível falar para a JVM não fazer uso de cache para algum atributo com a palavra chave &lt;b&gt;volatile&lt;/b&gt;, mas nem sempre isso é suficiente. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Ok, já estou assustado o bastante! Como que eu me livro destes problemas?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://xenophanessmith.files.wordpress.com/2008/09/you_make_kitty_scared.jpg"&gt;&lt;img src="http://xenophanessmith.files.wordpress.com/2008/09/you_make_kitty_scared.jpg" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 405px; height: 411px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;O principal é evitar os side-effects que existem as dicas &lt;a href="http://malditoprogramadorbebado.blogspot.com/2009/12/assobiando-e-chupando-cana.html"&gt;no mesmo link que citei acima&lt;/a&gt;, sempre copie objetos ao invés de compartilhar. Quando compartilhar for necessário, pense e teste bem sua estratégia de locking, inclusive escrevendo testes que simulem o acesso concorrente. Evite uma estrutura complexa de objetos. Quanto mais simples estiver seu código, mais fácil de cuidar dele será. Isto também funciona no mundo da execução paralela. Minha sugestão principal é: estude linguagens funcionais. Mesmo que você não trabalhe com elas, poderá aprender muito! &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(Ah, desculpem erros de português! irei revisar quando der tempo! :D )&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;E é isso! See ya!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-774490154646059634?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AsKBM2y5SU1iMNH-j6ak9GMPGF4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AsKBM2y5SU1iMNH-j6ak9GMPGF4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AsKBM2y5SU1iMNH-j6ak9GMPGF4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AsKBM2y5SU1iMNH-j6ak9GMPGF4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/O2Y88M0rsDg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/774490154646059634/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2010/01/dead-locks-programadores-smarty-pants-e.html#comment-form" title="1 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/774490154646059634?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/774490154646059634?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/O2Y88M0rsDg/dead-locks-programadores-smarty-pants-e.html" title="Dead locks, programadores smarty pants e a api de concorrência do Java 5" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2010/01/dead-locks-programadores-smarty-pants-e.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08ARH89eyp7ImA9WxBREk8.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-8399646780426836975</id><published>2009-12-30T23:17:00.007-02:00</published><updated>2009-12-31T00:17:25.163-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-31T00:17:25.163-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OFFTOPIC" /><category scheme="http://www.blogger.com/atom/ns#" term="FILOSOFIA_DE_BOTECO" /><title>Filosofia de boteco - feliz ano novo</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://z.about.com/d/animatedtv/1/0/2/6/mayor.gif"&gt;&lt;img src="http://z.about.com/d/animatedtv/1/0/2/6/mayor.gif" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 400px; height: 300px; " /&gt;&lt;/a&gt;&lt;div&gt;Este é um post&lt;i&gt; off topic.&lt;/i&gt; O blog é meu e me reservo o direito de escrever bobagens (apenas?). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Como diria o Eric Cartman: &lt;i&gt;"Respect my authoritah" or "I kick you in the nuts".&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pois é. Não gosto das festas de fim de ano pela hipocrisia alheia que se propaga. Planejei meus objetivos para o dito "ano que vem" já em agosto, e já estou "implementando" parte das coisas que planejei para o ano que vem. Mas independente disso tudo meu ano que passou foi bom.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Algumas lições que aprendi:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;As pessoas não tem palavra. Eu me esforço para ter. Perdi muito e me tornei uma pessoa mais chata e madura depois de aprender esta lição. Ganhei muito em maturidade. &lt;/li&gt;&lt;li&gt;"A jornada é mais importante que o destino." Li isso num artigo sobre o Knuth. Ele ainda não terminou os livros dele depois de 30 anos escrevendo e mesmo assim realizou muito.&lt;/li&gt;&lt;li&gt;"Liberdade é uma outra palavra para 'nada a perder'." Li ou ouvi isso em algum material sobre o Steve Jobs. Me sinto livre em muitos aspectos. &lt;/li&gt;&lt;li&gt;"Se treine para deixar ir embora tudo do que você tem medo de perder." Isto aqui é parte da filosofia "self-less" dos Jedis. O Yoda falou isso para o Anakin e ele não seguiu a sugestão. Deu em merda no filme e dá em merda na vida real.&lt;/li&gt;&lt;li&gt;"Muitos dos obstáculos que encontramos estão na nossa cabeça." Li isso em algum livro de filosofia chinesa. Ainda estou aprendendo isso mas já pude constatar que é verdade :-)&lt;/li&gt;&lt;li&gt;"As pessoas mentem por vários motivos. Mas sempre existe um motivo." Vi isso assistindo House MD. O mais próximo que tenho feito ao invés de mentir é omitir. Não sei mentir. Mas sofri consequencias de mentiras alheias.&lt;/li&gt;&lt;li&gt;"Estudo é a única coisa que ninguém vai poder tirar de você. As pessoas podem roubar o seu dinheiro, mas nunca irão tirar de você algo que você aprendeu." Minha mãe dizia isso. Talvez essa tenha sido a única coisa que aprendi com ela. Mas sem dúvida foi das coisas mais importantes que aprendi em minha vida. &lt;/li&gt;&lt;li&gt;O principal: não culpe ninguém pelo seus atos e assuma o controle e a responsabilidade pelas cagadas e coisas boas que você fizer. Fiz muito isso. E vi muita gente (umas 4 pessoas que gosto muito) jogar muita coisa fora por falta de coragem de assumir o controle de determinadas situações. Não é fácil mas o resultado compensa. Principalmente a longo prazo.&lt;/li&gt;&lt;li&gt;Estou mais Joselito do que antigamente. Estou sem paciência para algumas coisas e isso tem me poupado dores de cabeça. Também estou Joselito pelo simples ato de "joselitar" em situações idiotas. Fiz coisas memoráveis este ano como sair correndo de sunga dentro de um supermercado numa cidade de interior e também pulei bêbado em uma pilha de caixas de sapato fazendo montinho (ou bolinho) com mais um monte de malditos programadores bêbados. Não tenho mais 15 anos, mas a minha vida continua divertida como na época dos meus 15 anos.&lt;/li&gt;&lt;li&gt;A galera "do mau" do kung fu é gente boa pra KCT. Estava puto um dia destes e ainda tive que ir no amigo secreto do pessoal do kung fu. Este singelo amigo secreto despretencioso se transformou num bate papo regado a cerveja e cachaça mineira que valeu muito a pena! Ganhei novos e bons amigos! Eu escrevi "do mau" por que eles foram os únicos "não geração saúde" que aceitaram ir beber comigo :-)&lt;/li&gt;&lt;li&gt;A vida nunca foi fácil para mim. Isso não significa que ela precise ser sofrida. Isso vale para tudo. Tive uma equipe de uns 15 programadores iniciantes e pude mostrar para eles na prática que produtividade pode ser obtida com bom humor e em ambiente agradável. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;No meio desta filosofia de boteco barata tenho o resumo do que o ano que passou representa para mim. Fiz muita merda, mas as coisas boas superaram em muito as merdas que fiz. Posso dizer que estou muito satisfeito com o ano que passou. O ano que vem promete? Para mim ele já está acontecendo faz tempo. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Feliz ano novo a todos!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-8399646780426836975?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kwg8tgTrJbL4jeArlyZvBWDQtMQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kwg8tgTrJbL4jeArlyZvBWDQtMQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kwg8tgTrJbL4jeArlyZvBWDQtMQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kwg8tgTrJbL4jeArlyZvBWDQtMQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/9p734yOJsa4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/8399646780426836975/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/12/filosofia-de-boteco-feliz-ano-novo.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/8399646780426836975?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/8399646780426836975?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/9p734yOJsa4/filosofia-de-boteco-feliz-ano-novo.html" title="Filosofia de boteco - feliz ano novo" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/12/filosofia-de-boteco-feliz-ano-novo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEMRH0zfSp7ImA9WxBREUU.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-4770559856579463658</id><published>2009-12-30T13:45:00.003-02:00</published><updated>2009-12-30T13:58:05.385-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-30T13:58:05.385-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git tips dicas" /><title>Git tips</title><content type="html">So, a lot of times I see some people anxious to use git. I started to use git a few months ago after loosing a lot of local changes during a huge refactor. At the first moment I just used git together with svn. The problems I faced was all related to svn. After some time and a lot of talk I could see my project scm been changed from svn to git. Everybody liked that. The only thing git isn't good is Windows support. This is really weak. A good option to use at Windows should be mercurial. I won't write a post about git or how to use it. There's a lot of good posts about that. I just gonna put the links that was useful to me. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://git.or.cz/course/svn.html&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://metypefunny.blogspot.com/2009/01/git-it-together-with-subversion.html&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;http://github.com/guides/git-cheat-sheet&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://stackoverflow.com/questions/629048/git-svn-dcommit-error-restart-the-commit&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just start to use without much study. After a while it will be natural. Git doesn't need to have a ui tool. The commands are really easy. I use at macos the GitX. But GitK (which comes with git) can be used as well. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A good friend just told me that "Linus gave the world a wonderful gift by developing git. Better than linux.". IMHO sometimes I agree. :-) &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hope you guys enjoy git as much as I do. &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-4770559856579463658?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dIp6fIgIDV1aM9xwB5ShxhFLveY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dIp6fIgIDV1aM9xwB5ShxhFLveY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dIp6fIgIDV1aM9xwB5ShxhFLveY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dIp6fIgIDV1aM9xwB5ShxhFLveY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/l3n1mfdcQEw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/4770559856579463658/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/12/git-tips.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/4770559856579463658?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/4770559856579463658?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/l3n1mfdcQEw/git-tips.html" title="Git tips" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/12/git-tips.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EEQn08fyp7ImA9WxBSFEg.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-8478722050446445819</id><published>2009-12-21T23:52:00.004-02:00</published><updated>2009-12-22T01:13:23.377-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-22T01:13:23.377-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OFFTOPIC" /><title>Relembrando velhos tempos...</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_i7IthHt_cmg/Rnqq_Y7r7oI/AAAAAAAAAKs/ymgQ7jLvAiE/s200/Cartman-Cop1.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 136px;" src="http://1.bp.blogspot.com/_i7IthHt_cmg/Rnqq_Y7r7oI/AAAAAAAAAKs/ymgQ7jLvAiE/s200/Cartman-Cop1.jpg" border="0" alt="" /&gt;&lt;/a&gt;Este é um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;&lt;i&gt;post&lt;/i&gt;&lt;/span&gt;&lt;i&gt; &lt;/i&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;&lt;i&gt;off&lt;/i&gt;&lt;/span&gt;&lt;i&gt; &lt;/i&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;&lt;i&gt;topic&lt;/i&gt;&lt;/span&gt;. O blog é meu e me reservo o direito de escrever &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;bobagens&lt;/span&gt; (apenas?). Como diria o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Eric&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Cartman&lt;/span&gt;: &lt;i&gt;"&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Respect&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;my&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;authoritah&lt;/span&gt;" &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;or&lt;/span&gt; "I &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;kick&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;you&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;in&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;nuts&lt;/span&gt;"&lt;/i&gt;. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Brincadeiras a parte, vou falar de alguns eventos engraçados que &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_15"&gt;contribuíram&lt;/span&gt; tanto para a minha vida &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;profissional&lt;/span&gt; quanto para a vida pessoal durante minha infância e adolescência. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Morava na praia e era bem moleque. O filho de um dos &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;diretores&lt;/span&gt; do jornal da cidade da época era meu melhor amigo e eu vivia na casa dele. Sempre tive curiosidade de "mexer em computador". Embora eu não soubesse ao certo para que servia aquilo, eu me lembrava de filmes de ficção sempre que via um computador. O pai do meu amigo me emprestou um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;TK&lt;/span&gt;-85. Ele vinha com um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;tecladinho&lt;/span&gt; com teclas de borracha com a letra e um comando de &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_20"&gt;BASIC&lt;/span&gt; escrito em cada tecla. Eu não fazia a menor &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;idéia&lt;/span&gt; do que era isso, mas eu tinha que digitar um programa para poder escrever. Por &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;&lt;i&gt;default&lt;/i&gt;&lt;/span&gt; ele escrevia os comandos em &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_23"&gt;BASIC&lt;/span&gt; quando uma tecla era &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_24"&gt;pressionada&lt;/span&gt;, e para poder escrever meu nome eu precisava digitar um programa (mínimo). Para mim aquilo era uma eternidade. E, como eu diria na época: "é &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;mór&lt;/span&gt; legal!". &lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.mci.org.br/micro/microdigital/tk85_01.jpg"&gt;&lt;img src="http://www.mci.org.br/micro/microdigital/tk85_01.jpg" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 398px; height: 257px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Agora eu tinha um computador em casa! Consegui um livrinho de programas, que na época já era velho! Tinha até um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;joguinho&lt;/span&gt; o qual você controlava um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;tirinho&lt;/span&gt; que deveria impedir que uma &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;navinha&lt;/span&gt; tosca pousasse e "invadisse a terra". O legal é que por &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;&lt;i&gt;default&lt;/i&gt;&lt;/span&gt; o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;tirinho&lt;/span&gt; já acertava a nave. Sou folgado desde aquela época: enchi o saco do primo de um amigo meu, que eu achava que era programador, para ele digitar o código do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;joguinho&lt;/span&gt; para mim. Na época eu não sabia gravar o código em fita cassete (e graças a Deus eu não me lembro como faz isso hoje em dia!). Então eu devo ter jogado aquele jogo uns 10 minutos e deixei o computador ligado para não perder o que estava digitado. Lógico que alguém que foi assistir alguma novela desligou o computador. Foi a primeira vez que eu perdi um trabalho não salvo. Mais tarde descobri que o primo do meu amigo foi trabalhar com manutenção de computadores. Por ironia, eu virei programador e ele não. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Um lindo dia o fio da fonte se rompeu. Eu morria de medo do pai do meu amigo, mas eu tinha que avisar a ele que eu havia quebrado o computador dele. Quando cheguei na casa do meu amigo, o pai dele não estava. A mãe dele pegou o saco plástico preto que eu havia colocado o computador e colocou &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;direto&lt;/span&gt; no lixo. E ainda disse: "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;Ahhh&lt;/span&gt; não, ele não vai ficar guardando estas porcarias!". Hoje imagino que se fosse comigo eu teria ficado muito &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;puto&lt;/span&gt; :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Passou algum tempo e &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_35"&gt;podíamos&lt;/span&gt; brincar no 486 que tinha na sala. Meu amigo me ensinou a programar. &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_36"&gt;Fazíamos&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;scripts&lt;/span&gt; para &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;Mirc&lt;/span&gt; para poder derrubar usuários por &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;flood&lt;/span&gt;. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;ICQ&lt;/span&gt; ainda não estava pensando em nascer e &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;MSN&lt;/span&gt; era apenas uma sigla que aparecia em um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;screenshot&lt;/span&gt; na instalação do Windows 95. Não, o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;MSN&lt;/span&gt; não era &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;chat&lt;/span&gt; na época. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.mfarris.com/Store/Floppy/floppy_gif/lgblfl.jpg"&gt;&lt;img src="http://www.mfarris.com/Store/Floppy/floppy_gif/lgblfl.jpg" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 391px; height: 388px; " /&gt;&lt;/a&gt;&lt;div&gt;Alguns meses se passaram e eu ganhei um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;XT&lt;/span&gt;. Sim, as pessoas tinham 386, 486 e eu tinha um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_46"&gt;XT&lt;/span&gt;. Tinha drive de disquetes de 5,1/4''. Mesmo as máquinas &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;atuais&lt;/span&gt; que &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_48"&gt;possuíam&lt;/span&gt; "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_49"&gt;kit&lt;/span&gt; &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_50"&gt;multimedia&lt;/span&gt;" tinham drives de 5,1/4'' e de 3,1/2''. Eu lembro que eu me achava novo por não conhecer os disquetes de 8''. Agora eu tinha DOS e um monte de disquetes com &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_51"&gt;joguinhos&lt;/span&gt;, programas e afins. Como eu disse, eu morava na praia. Mofava tudo. Eu achava que apertar a tecla I para ignorar erros durante a cópia de arquivos era algo normal e já fazia isso sem pensar. Morria de inveja do pessoal que "sabia programar" e fazia aqueles arquivos &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_52"&gt;autoexec&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_53"&gt;bat&lt;/span&gt; com menus numéricos para abrir programas. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Algum tempo depois, com uns 15 anos mais ou menos, comecei a trabalhar de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_54"&gt;office&lt;/span&gt;-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_55"&gt;boy&lt;/span&gt;. Pouco tempo depois eu consegui convencer sem querer um dos rapazes do meu serviço que abrir uma empresa de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_56"&gt;design&lt;/span&gt; gráfico seria um bom negócio. Colocar uma empresa na mão de um moleque de 16 (eu) e de outro de 18 não seria de qualquer forma uma decisão sábia. Mas a empresa não deu &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_57"&gt;prejuizo&lt;/span&gt;. Conseguimos dividir os equipamentos quando a empresa foi fechada depois de 6 meses. 6 meses dormindo 3 horas por dia valeram a pena, apesar de eu ter repetido o colegial por falta. Então eu havia conseguido meu primeiro computador. Um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_58"&gt;MMX&lt;/span&gt; 233&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_59"&gt;MHz&lt;/span&gt; com &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_60"&gt;HD&lt;/span&gt; de 2&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_61"&gt;gb&lt;/span&gt; e 32 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_62"&gt;mb&lt;/span&gt; de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_63"&gt;ram&lt;/span&gt;! A máquina do meu trabalho, que era &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_64"&gt;ótima&lt;/span&gt; na época era um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_65"&gt;pentium&lt;/span&gt; 100&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_66"&gt;MHz&lt;/span&gt; com 800&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_67"&gt;mb&lt;/span&gt; de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_68"&gt;HD&lt;/span&gt;! Era como se hoje em dia eu tivesse um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_69"&gt;Macpro&lt;/span&gt; em casa!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Alguns anos antes uma mãe de um amigo meu me chamou para ensinar a mexer no computador dela. Era um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_70"&gt;Mac&lt;/span&gt;, mas infelizmente não me lembro o modelo. Eu expliquei a ela que ela tinha uma jóia em casa. Ela me insistiu para ficar com o computador e indicar um PC a ela. Eu convenci ela a, pelo menos, insistir mais, e não aceitei o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_71"&gt;Mac&lt;/span&gt;. Meus amigos queriam me matar quando ficaram sabendo. Me conhecendo eu teria feito a mesma coisa hoje em dia :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Voltando ao &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_72"&gt;MMX&lt;/span&gt;. Agora eu poderia fazer o que sempre &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_73"&gt;quis&lt;/span&gt;: instalar Linux nele! Na época as revistas de CD que vinham com &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_74"&gt;distros&lt;/span&gt; do Linux não eram tão populares. Com 1/3 do meu salário mais ou menos eu encomendei pelo correio o envio do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_75"&gt;Connectiva&lt;/span&gt; Linux "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_76"&gt;Marumbi&lt;/span&gt;". Esperei um mês e &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_77"&gt;voilá&lt;/span&gt;! Não funcionava o X. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_78"&gt;Bootava&lt;/span&gt; no Windows o tempo todo para fazer qualquer coisa quando precisava. Fiquei sem paciência e desinstalei o Windows, pois eu deveria me forçar a aprender o Linux. Pelo menos eu aprendi a trabalhar no terminal! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f4/Lilo.png/300px-Lilo.png"&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f4/Lilo.png/300px-Lilo.png" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 300px; height: 167px; " /&gt;&lt;/a&gt;&lt;div&gt;O detalhe é que minha irmã estava fazendo faculdade. Ela pegava 5&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_79"&gt;hs&lt;/span&gt; de &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_80"&gt;ônibus&lt;/span&gt; todo dia, pois não tinha faculdade perto de onde eu morava. Ela fazia os trabalhos de faculdade na partição Windows e precisava do computador. Eu, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_81"&gt;joselito&lt;/span&gt; desde cedo, &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_82"&gt;simplesmente&lt;/span&gt; removi a partição sem a avisar e ainda dei &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_83"&gt;bronca&lt;/span&gt; quando vi que o Linux foi desligado &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_84"&gt;incorretamente&lt;/span&gt;. Alguém lembra da mensagem do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_85"&gt;FSCK&lt;/span&gt;? E os 010100101001010101 do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_86"&gt;Lilo&lt;/span&gt;? Bons tempos aqueles! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blogs.sun.com/amyo/resource/duke.gif"&gt;&lt;img src="http://blogs.sun.com/amyo/resource/duke.gif" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 255px; height: 200px; " /&gt;&lt;/a&gt;&lt;div&gt;Nesta época li alguma sobre uma linguagem de programação que funcionava em qualquer sistema operacional. Chamava Java e tinha "muitos comandos". Não sabia o que significava aquele monte de palavras &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_87"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_88"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;static&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_89"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_90"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;main&lt;/span&gt;&lt;/span&gt; do exemplo do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_91"&gt;&lt;i&gt;hello&lt;/i&gt;&lt;/span&gt;&lt;i&gt; &lt;/i&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_92"&gt;&lt;i&gt;world&lt;/i&gt;&lt;/span&gt;. Sequestrei uma &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_93"&gt;apostila&lt;/span&gt; de Java de um amigo meu e tirei &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_94"&gt;xerox&lt;/span&gt; de tudo. Li e reli umas quinhentas vezes. Foi quando um outro amigo me disse: "pra quê você quer aprender Java? Isso é &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_95"&gt;lerdo&lt;/span&gt;!".  &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_96"&gt;Lerdo&lt;/span&gt; ou não, o engraçado é que eu trabalho com isso até hoje... :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-8478722050446445819?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KWqzuMSOG4bcO03Q0y4XNe1mIwQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KWqzuMSOG4bcO03Q0y4XNe1mIwQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KWqzuMSOG4bcO03Q0y4XNe1mIwQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KWqzuMSOG4bcO03Q0y4XNe1mIwQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/omouBDjgBnM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/8478722050446445819/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/12/relembrando-velhos-tempos.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/8478722050446445819?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/8478722050446445819?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/omouBDjgBnM/relembrando-velhos-tempos.html" title="Relembrando velhos tempos..." /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_i7IthHt_cmg/Rnqq_Y7r7oI/AAAAAAAAAKs/ymgQ7jLvAiE/s72-c/Cartman-Cop1.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/12/relembrando-velhos-tempos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08ESX4ycSp7ImA9WxBSE0g.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-6002918645648191174</id><published>2009-12-20T21:38:00.006-02:00</published><updated>2009-12-20T23:43:28.099-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-20T23:43:28.099-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Multi thread" /><category scheme="http://www.blogger.com/atom/ns#" term="Linguagens Funcionais" /><title>Mais digressões a respeito de imutabilidade e multi-thread programming</title><content type="html">Acho que estou com vontade de falar bastante de &lt;i&gt;multi-thread&lt;/i&gt; e de linguagens funcionais nos últimos tempos, por que o assunto tem sido fonte tanto de alguns problemas que tive que resolver quanto de códigos animais no projeto em que trabalho.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Falei de &lt;i&gt;side-effects&lt;/i&gt; no &lt;a href="http://malditoprogramadorbebado.blogspot.com/2009/12/assobiando-e-chupando-cana.html"&gt;penúltimo post&lt;/a&gt;, mas ultimamente acabei me deparando com &lt;a href="http://clojure.org/"&gt;linguagens de programação&lt;/a&gt;, &lt;a href="http://git-scm.com/"&gt;sistemas de controle de versão&lt;/a&gt;, &lt;a href="http://couchdb.apache.org/"&gt;banco de dados orientados a documentos&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/ZFS"&gt;filesystems&lt;/a&gt; e outras coisas que me fizeram ficar mais curioso a respeito de alguns preceitos de imutabilidade. Inclusive eu achei &lt;a href="http://eclipsesource.com/blogs/2009/12/13/persistent-trees-in-git-clojure-and-couchdb-data-structure-convergence/"&gt;este &lt;i&gt;blogpost&lt;/i&gt;&lt;/a&gt; que comparava alguns dos itens citados. Vou falar um pouco como cada uma destas ferramentas fazem parte do meu dia-a-dia e depois vou falar das semelhanças. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Mudando de SCM&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.safecom.org.au/images/salvador_dali_time.jpg"&gt;&lt;img src="http://www.safecom.org.au/images/salvador_dali_time.jpg" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 400px; height: 292px; " /&gt;&lt;/a&gt;&lt;div&gt;Faz alguns meses que consegui convencer o povo do meu serviço a abandonar o SVN e usar o GIT, mesmo eu não tendo testado sequer um plugin de Eclipse para GIT. Quem trabalha de fato com uma ferramenta que funciona bem em um ambiente que a produtividade é obrigatória sabe que não é fácil abandonar um recurso de uma IDE (o plugin de subversion funciona). A proposta que eu fiz (enchi o saco do pessoal) era que: "os comandos são fáceis, não precisa da IDE e o GIT é rápido". Com alguns exemplos de criação de &lt;i&gt;branch&lt;/i&gt; de forma rápida e usando o GIT local e remoto consegui mostrar o quanto o GIT é bom. Infelizmente a implementação no Windows deixa bastante a desejar (na minha opinião isto é grave), o GIT está nos ajudando bastante! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Como diabos o GIT consegue tanto desempenho? Não conheço muito o funcionamento interno do GIT, e apesar de ter baixado o fonte, ainda não sou fluente em C. Mas parte da mágica do GIT está em estruturas &lt;i&gt;append only&lt;/i&gt; onde ele guarda os conteúdos de arquivos e também as árvores dizendo quais conteúdos fazem parte de quais commits. Compactando os blobs e usando SHA-1 para identificar unicamente cada &lt;i&gt;commit&lt;/i&gt;, o funcionamento interno é simples (perto do que poderia ser). Inclusive existe o comando &lt;b&gt;git gc&lt;/b&gt; para eliminar blobs e outras estruturas internas não utilizadas (imaginando que algumas branches podem ter sido excluídas). Na parte "Implementation" &lt;a href="http://git.or.cz/gitwiki/Git"&gt;deste &lt;i&gt;link&lt;/i&gt;&lt;/a&gt; tem alguma explicação rápida das estruturas do GIT, e neste &lt;a href="http://www.youtube.com/watch?v=8dhZ9BXQgc4"&gt;tech talk&lt;/a&gt; eles falam disso.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Erlang e CouchDB&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://agualisa5.blogs.sapo.pt/arquivo/sofa.JPG"&gt;&lt;img src="http://agualisa5.blogs.sapo.pt/arquivo/sofa.JPG" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 335px; height: 276px; " /&gt;&lt;/a&gt;&lt;div&gt;Existe um ôba-ôba em torno do Erlang (acho que está acabando, mas &lt;i&gt;kind of&lt;/i&gt; está na moda). É uma linguagem de programação concorrente, todo mundo acha legal e ninguém conhece. Eu adoro, mas eu estudei bastante para dizer isto e já fiz alguns testes de performance. É uma linguagem muito simples e que te obriga a pensar de maneira diferente. Em troca, o&lt;i&gt; multi-thread programming&lt;/i&gt; fica mais fácil! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;E agora o ôba-ôba mais recente está em torno do CouchDB. Definindo o CouchDB de forma rápida: ele persiste estruturas &lt;a href="http://www.json.org/"&gt;JSON&lt;/a&gt; e aplica &lt;a href="http://en.wikipedia.org/wiki/MapReduce"&gt;map-reduce&lt;/a&gt; nelas para consultas. Está sendo feito para ser seguro e dar conta de uma demanda bem pesada. O legal é que ele realmente veste a camisa do HTTP. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O uso do CouchDB é simples demais. Inclusive aplicar map-reduce em estruturas JSON fica parecendo tarefa de criança. Gostei demais dele por estas questões.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O cara do &lt;a href="http://incubator.apache.org/cassandra/"&gt;Cassandra&lt;/a&gt; falou &lt;a href="http://spyced.blogspot.com/2008/12/couchdb-not-drinking-kool-aid.html"&gt;algumas questões pertinentes&lt;/a&gt; a respeito do CouchDB. Independente do uso de espaço em disco no CouchDB ser massivo, ou de ele contar com replicações em servidores, mas não necessariamente ser uma persistência distribuida de fato, o CouchDB tem suas vantagens e seus motivos para estes defeitos. O uso massivo de espaço em disco diz respeito a estrutura interna de &lt;i&gt;append only&lt;/i&gt; para salvar itens novos, ou mesmo novas versões do mesmo item. Ele nunca escreve nada por cima de nada. Ou seja, o que foi salvo está seguro. Por isso o "&lt;i&gt;relax&lt;/i&gt;" em seu &lt;i&gt;slogan&lt;/i&gt;. A estrutura JSON é salva em uma B-Tree e isto tem suas vantagens, conforme descrito &lt;a href="http://jchrisa.net/drl/_design/sofa/_show/post/CouchDB-Implements-a-Fundamental-Algorithm"&gt;aqui&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ou seja, no CouchDB as estruturas &lt;i&gt;append only&lt;/i&gt; conseguem aumentar a performance (pelo não uso de &lt;i&gt;locks&lt;/i&gt;) e manter os dados íntegros. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;ZFS&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RtNIafK76uU/SFuiK7vmvtI/AAAAAAAAAIo/Sqa5TIc_59I/s400/Arquivo%2Bde%2Bcart%C3%B5es.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/_RtNIafK76uU/SFuiK7vmvtI/AAAAAAAAAIo/Sqa5TIc_59I/s400/Arquivo%2Bde%2Bcart%C3%B5es.jpg" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 355px; height: 400px; " /&gt;&lt;/a&gt;&lt;div&gt;O ZFS é o melhor sistema de arquivos que existe atualmente. Mesmo. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eu lembro que a primeira coisa que ouvi falar do ZFS foi que o &lt;a href="http://en.wikipedia.org/wiki/Linus_Torvalds"&gt;cara do Linux&lt;/a&gt; &lt;a href="http://lwn.net/Articles/237905/"&gt;estava puto&lt;/a&gt; com o &lt;a href="http://www.sun.com/aboutsun/executives/schwartz/bio.jsp"&gt;cara da Sun&lt;/a&gt; por problemas de licença que poderiam impedir que o ZFS fosse portado para o Linux. Eu pensei comigo: O ZFS deve ser do caralho. Sim. Ele é foda!&lt;/div&gt;&lt;div&gt;Fazem algumas semanas fui no &lt;a href="http://www.suntechdays.com.br/"&gt;Sun Tech Days&lt;/a&gt; e assisti algumas palestras enquanto trabalhava. Eu estava empolgado para ver a de &lt;a href="http://www.sun.com/bigadmin/content/dtrace/index.jsp"&gt;D-Trace&lt;/a&gt; e também de ir no laboratório de ZFS.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O ZFS tem muitas facilidades. Comecei a me sentir no passado por ver que não estou usando ZFS na minha máquina. O ZFS não precisa de particionamento. Jogue seus dispositivos em algum &lt;a href="http://docs.sun.com/app/docs/doc/819-2240/zpool-1m?a=view"&gt;ZPool&lt;/a&gt; e saia utilizando. Crie backups com o uso dos &lt;a href="http://docs.huihoo.com/opensolaris/solaris-zfs-administration-guide/html/ch06.html"&gt;&lt;i&gt;snapshots&lt;/i&gt;&lt;/a&gt; e durma tranquilo. Tem uma pasta de usuário padrão? Faça um &lt;i&gt;clone&lt;/i&gt;. Os comandos são simples. Os &lt;i&gt;snapshots&lt;/i&gt; e &lt;i&gt;clones&lt;/i&gt; são feitos através de lógicas de escrita &lt;i&gt;append only&lt;/i&gt;. É lógico de os dados antigos são desconsiderados, mas a escrita atômica é feita primeiro se escrevendo os blocos novos e depois mudando os ponteiros da estrutura de dados na HD dos blocos antigos para os novos. E um &lt;i&gt;snapshot&lt;/i&gt; ou mesmo a estrutura de pastas atuais é definida através de ponteiros apontando para blocos.  Os dados não são replicados em disco e os blocos possuem um contador de referência. O bloco que tiver zero referências pode ser desconsiderado. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Mais um LISP???&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.softwarepreservation.org/projects/LISP/images/LISP1.5ProgrammersManual.gif"&gt;&lt;img src="http://www.softwarepreservation.org/projects/LISP/images/LISP1.5ProgrammersManual.gif" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 349px; height: 500px; " /&gt;&lt;/a&gt;&lt;div&gt;A primeira vez que eu vi um &lt;a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)"&gt;LISP&lt;/a&gt; eu fiquei assustado com os parênteses. Quando tentei estudar pela primeira vez, cada hora que eu entendia algo me sentia ficando mais inteligente. &lt;a href="http://xkcd.com/224/"&gt;Este post do XKCD&lt;/a&gt; descreve um pouco do que eu sentia conforme eu ia entendendo alguns conceitos de LISP. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Toda a vez que eu vejo uma linguagem bem falada para a JVM eu fico com preconceito inicial, mas muitas vezes depois de ver os motivos envolvidos para a criação da linguagem eu começo a gostar muito. Foi assim com &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; e foi assim recentemente com &lt;a href="http://clojure.org/features"&gt;Clojure&lt;/a&gt;. &lt;a href="http://blip.tv/file/812787"&gt;Este vídeo&lt;/a&gt; descreve alguns aspectos concorrentes do Clojure e as estruturas de dados persistentes. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Estas estruturas são imutáveis para conseguirem ser &lt;i&gt;multi threaded&lt;/i&gt;. O persistente neste contexto não quer dizer que vai ser serializado no banco de dados ou em algum outro lugar. Mas sim que as estruturas são versionadas internamente. Por exemplo, os &lt;i&gt;lists&lt;/i&gt; e &lt;i&gt;maps&lt;/i&gt; do Clojure são imutáveis. Mas a cada inserção é gerado um &lt;i&gt;list&lt;/i&gt; ou &lt;i&gt;map&lt;/i&gt; novo. Este comportamento &lt;i&gt;append only&lt;/i&gt; é possível com performance satisfatória pois os elementos internos são compartilhados entre as versões antigas e novas dos &lt;i&gt;maps&lt;/i&gt; e &lt;i&gt;lists&lt;/i&gt;. &lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Okay, você falou de um monte de coisas mas não falou de &lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;multi-thread&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt; ainda... &lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://thenonist.com/images/uploads/migrnboy2.jpg"&gt;&lt;img src="http://thenonist.com/images/uploads/migrnboy2.jpg" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 300px; height: 342px; " /&gt;&lt;/a&gt;&lt;div&gt;Pois é. Falei bastante de &lt;i&gt;append only&lt;/i&gt;. De fato os programas e ferramentas que apresentei aqui não tem um &lt;i&gt;multi-thread&lt;/i&gt; explicito. Mas muitas das coisas feitas nestes programas são boas práticas de &lt;i&gt;multi-thread programming&lt;/i&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Programação concorrente consiste em ter várias linhas de execução acontecendo (ou parecendo acontecer) ao mesmo tempo. No entanto muitas estruturas de dados não são &lt;i&gt;thread safe&lt;/i&gt; pelo fato de serem mutáveis. O legal de pegar problemas com estas coisas é que você roda um teste. Uma vez funciona e na vez seguinte não. É totalmente não-determinístico. O &lt;i&gt;append only &lt;/i&gt;é uma forma de "simular mutabilidade" sem afetar as &lt;i&gt;threads&lt;/i&gt; que estão usando a estrutura antiga. Isto funciona bem para o CouchDB, para o GIT, para os &lt;i&gt;snapshots&lt;/i&gt; e &lt;i&gt;clones&lt;/i&gt; do ZFS e para as estruturas persistentes do Clojure.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O &lt;a href="http://en.wikipedia.org/wiki/Rich_Hickey"&gt;cara do Clojure&lt;/a&gt; disse uma frase ótima: "&lt;i&gt;Mutable objects are the new spaghetti code&lt;/i&gt;". Estes programas mostram ótimos exemplos de como estruturas &lt;i&gt;append only&lt;/i&gt; podem ser usadas para atingir objetivos de código seguro, simples e &lt;i&gt;side effect free&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;E é isso! See ya!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-6002918645648191174?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CnV4-SABZ3wq_QjNhLFI7TlbL_s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CnV4-SABZ3wq_QjNhLFI7TlbL_s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CnV4-SABZ3wq_QjNhLFI7TlbL_s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CnV4-SABZ3wq_QjNhLFI7TlbL_s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/FEQwuQMEACY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/6002918645648191174/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/12/mais-digressoes-respeito-de.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/6002918645648191174?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/6002918645648191174?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/FEQwuQMEACY/mais-digressoes-respeito-de.html" title="Mais digressões a respeito de imutabilidade e multi-thread programming" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_RtNIafK76uU/SFuiK7vmvtI/AAAAAAAAAIo/Sqa5TIc_59I/s72-c/Arquivo%2Bde%2Bcart%C3%B5es.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/12/mais-digressoes-respeito-de.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcERHsyfSp7ImA9WxBTGE8.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-7558686430730273192</id><published>2009-12-10T21:39:00.008-02:00</published><updated>2009-12-14T17:46:45.595-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-14T17:46:45.595-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="OSL" /><category scheme="http://www.blogger.com/atom/ns#" term="DistributedObjetcs" /><title>Estudo de caso: servidor de objetos remotos do OSL</title><content type="html">&lt;b&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;b&gt;Um rápido overview de um dos módulos do OpenSpotlight&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Trabalho no OpenSpotLight. O OSL é um motor de busca TI, feito em Java, que faz o parsing de várias linguagens e captura metadados dos fontes e coloca isso dentro de um repositório de maneira organizada. Através destes metadados é possível descobrir as dependências entre os diferentes fontes, seja de uma aplicação ou de várias aplicações. Não vou entrar no mérito de explicar todo o processo do OSL neste post, mas sim em um post futuro. &lt;/div&gt;&lt;div&gt;Mas voltando: Falei dos metadados do OSL. Estes metadados são persistidos por uma API de Grafo que pode guardar os metadados e ainda efetuar selects, seja por chamadas fluentes do tipo select().all().from().nodes(), ou por selects feitas em SLQL (SpotLightQueryLanguage). &lt;/div&gt;&lt;div&gt;O módulo do Grafo foi desenvolvido por um de meus amigos do trabalho, o Vitor Hugo Chagas, e o parser foi desenvolvido por outro dos meus amigos do trabalho, Alexandre Porcelli, especialista em parsers, que diga-se de passagem, também é commiter do Drools, Hibernate e JBoss DNA.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Okay, mas onde diabos está o assunto do título do post? Cadê os objetos remotos?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Um módulo como estes é interessante demais para ser enclausurado em uma JVM. Aliás para o OSL ser usado de forma plena, é necessário que estes objetos e o engine de query estejam disponíveis para uso remoto.&lt;/div&gt;&lt;div&gt;Ficou na minha mão deixar este módulo ser usado remotamente. Um belo desafio!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Ooops! Por onde começar?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pensei nisso muito mais do que se imagina. Quem me conhece sabe que eu tenho horror em tentar reinventar a roda. Possibilidades? Cadê as possibilidades? &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;EJB - precisa criar as interfaces e um monte de configurações na versão 2. Na versão 3 precisa de algumas anotações e também existem premissas de não usar coisas "não normais" como threads, native methods e coisas do tipo. Estas premissas são feitas para deixar possivel de clusterizar os EJBs. &lt;/li&gt;&lt;li&gt;RMI puro - Apenas invoca métodos. Não cuida de grafo de objetos retornados e coisas do tipo. &lt;/li&gt;&lt;li&gt;CORBA - Burocratico.&lt;/li&gt;&lt;li&gt;(re) Fazer o módulo pensando que ele seria usado remotamente - Já tava pronto e refazer tudo é inviável.&lt;/li&gt;&lt;li&gt;Fazer um servidor de objetos remotos e rezar para ele conseguir expor o Grafo.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Tentei a penultima opção primeiro. Tentei alterar o Grafo para que ele se tornasse um servidor de objetos. Meti o pé na jaca. Joguei minha branch do git fora e acabei ficando com a ultima opção por falta de escolha. No entanto ao invés de rezar eu tinha a premissa de que os objetos remotos deveriam responder aos testes do Grafo já prontos quando estes fossem aplicados aos objetos remotos. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Agora eu tinha que fazer um servidor de objetos remotos...&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eu deveria expor a árvore de objetos existente no servidor para um dado cliente. Não existe a necessidade de vários clientes enchergarem um mesmo objeto, ou de objetos stateless. A necessidade é simplismente que o cliente possa criar uma arvore de objetos dele no servidor, usar como se fosse local, e deve existir um critério para exclusão destes objetos. Começa o brainstorm...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Qual o critério para criação de referências remotas?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eu tinha que pensar num critério. Fui pegando as classes e dando uma olhada: SLNode precisa ter referencia remota? Sim. SLGraphSession? Sim. String? Não. Number? Não. Date? Não. Rapidamente tive "o estalo". Os objetos com referência remota deveriam ser todos os não serializables. Então, cada um destes objetos não serializáveis devem estar disponíveis no servidor. Criei um DTO que contém estes objetos e um ID na forma de uma String gerada a partir de um random UUID do java.util.  O legal da história é que se algum método retornar um DTO Serializável não será criada a referência remota. Se um método retornar um objeto que exista no cache remoto de objetos do usuário, basta retornar a mesma referência remota. Através deste mecanismo do objeto ser ou não serializável é possível controlar o fluxo de criação de objetos remotos. &lt;/div&gt;&lt;div&gt;Cada usuário/ip possui um cache de objetos remotos preenchidos por demanda. Um usuário não encherga objetos de outro usuário. Um usuário atingindo o timeout configurado tem todos seus objetos perdidos. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Legal, os objetos estão no servidor. Como que eu uso eles como se fossem locais?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Existem duas formas de resolver este problema. Caso estejamos trabalhando apenas com interfaces é possível usar o proxy do Java. Caso estejamos trabalhando com classes, para interceptar-las e extender-las em runtime deve ser usado o CGLib. Usamos a primeira opção, mas o uso do CGLib é bem semelhante ao uso do proxy do Java. Existe um interceptor que passa o nome do método invocado com seus parâmetros. Existe a liberdade de jogar exceptions e de retornar valores. &lt;/div&gt;&lt;div&gt;A lib do client simplismente cria uma intância da classe/interface será usada como um proxy. Este proxy solicita a chamada de um método remoto que pode retornar uma referencia remota. Caso ele retorne esta referência remota, a referência irá efetuar uma chamada remota (RMI por exemplo) em um objeto remoto cada vez que um método for invocado.&lt;/div&gt;&lt;div&gt;Ao invés de expor o objeto "como ele é" eu expus um command que recebe os dados da chamada em dados serializáveis e o retorno por sua vez é um DTO serializável que possui os dados de objetos locais caso o retorno seja local ou serializável ou então um DTO que possui os dados da nova referência remota, caso esta seja necessária. Assim, as invocações de método funcionam como no pattern command. &lt;/div&gt;&lt;div&gt;O que foi trabalhoso aqui foi cuidar dos retornos Collection ou Map, pois estes tem que funcionar bem tanto para objetos serializaveis como para referências remotas. &lt;/div&gt;&lt;div&gt;Para invalidar as referências remotas, os métodos como close(), remove() e outros foram anotados com @DisposeMethod, e estes métodos anotados eram tratados no servidor como para removerem seu objeto após o retorno do invokeMethod. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;b&gt;RMI?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Foi o que eu pensei no inicio. Descobri que existe um projeto opensource chamado CAJO que facilita um horror a invocação remota. Inclusive não foi necessário mexer naqueles arquivos properties da JVM para dar permissões, como seria no RMI. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;E aí? Deu certo?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Os cenários de testes estavam passando todos. Árvore de objetos contendo objetos como referência remota e serializáveis, collections e tudo o que mais imaginar. Auto-relacionamento e coisas do tipo. Tava tudo verde no JUnit. Coloquei o Grafo no servidor de Objetos remotos e fui rodar os testes. Tudo vermelho. Deu aquele frio na barriga. Pensei na hora: "será que vou ter que jogar meu trabalho de duas semanas no lixo?"&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fui percorrendo a arvore de objetos e vi que nas entranhas da api tinha um return de Map.values(). No Java, o Set retornado de Map.values() não é serializável. Substitui este e outros códigos semelhantes por new HashSet(Map.values) e os testes foram ficando verde aos poucos. Funcionou. Não foi fácil, mas funcionou. Tive que arrumar depois uns problemas que não apareceram no Java 5 mas apareceram no Java 6. Mas agora está tudo verde!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Qual é o recado do post?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Não reinvente a roda a não ser quando necessário. Dizer não a tecnologias consagradas (como EJB) pode ser necessário caso ela não resolva o seu problema. Principalmente quando seu problema não é trivial. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-7558686430730273192?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hbWcKWPPwtNYfVpIuXloikLHfHw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hbWcKWPPwtNYfVpIuXloikLHfHw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hbWcKWPPwtNYfVpIuXloikLHfHw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hbWcKWPPwtNYfVpIuXloikLHfHw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/Cq2ibZ8bv0E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/7558686430730273192/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/12/estudo-de-caso-servidor-de-objetos.html#comment-form" title="1 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/7558686430730273192?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/7558686430730273192?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/Cq2ibZ8bv0E/estudo-de-caso-servidor-de-objetos.html" title="Estudo de caso: servidor de objetos remotos do OSL" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/12/estudo-de-caso-servidor-de-objetos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UAQHg8fyp7ImA9WxNaGEQ.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-1993507185963835558</id><published>2009-12-04T00:18:00.007-02:00</published><updated>2009-12-04T02:00:41.677-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-04T02:00:41.677-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Multi thread" /><category scheme="http://www.blogger.com/atom/ns#" term="Performance" /><category scheme="http://www.blogger.com/atom/ns#" term="Linguagens Funcionais" /><title>Abordagem funcional de fazer as coisas</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://dericbownds.net/uploaded_images/sideeffects.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 262px; height: 394px;" src="http://dericbownds.net/uploaded_images/sideeffects.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;O que são side effects?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Antes de falar de multi-thread, vamos falar de side-effects. Li um artigo ótimo que perdi o link no blog do &lt;a href="http://damienkatz.net/"&gt;cara do CouchDB&lt;/a&gt;. Vou condensar um pouco do que eu lembro que li no blog dele. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Imagine uma função na sua linguagem preferida que faz uma soma. Ela se chama soma(a,b) e recebe dois inteiros primitivos (por cópia e não por referência), não possui nenhuma variável estática e retorna um inteiro&lt;/div&gt;&lt;div&gt; primitivo. Simples não? Eu posso chamar esta função quantas vezes eu quiser que não acontece nada demais. Posso passar 2 e 3 que eu sei que ela vai retornar 5 (caso esteja correta). Ela é fácil de testar, certo?  Imagino que sim, por que o dia que testar a função soma não for fácil eu vou deixar meu cabelo crescer...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mas continuando... Vamos chamar "isso que estou falando" de "fácil de testar". A soma fácil de testar segue abaixo: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;int soma_lucida(int a, int b){&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;return a + b;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Está soma é esperada funcionar bem e não influenciar o mundo externo. Podemos chamar ela várias vezes, em paralelo, com vários tipos de processador, com vários alinhamentos diferentes entre jupiter e venus que sempre vai retornar o mesmo valor para os mesmos parametros de entrada. Normalmente as funções definidas na matemática são assim. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;O estado e seu mecanismo opressor&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f1/JStalin_Secretary_general_CCCP_1942.jpg/200px-JStalin_Secretary_general_CCCP_1942.jpg"&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f1/JStalin_Secretary_general_CCCP_1942.jpg/200px-JStalin_Secretary_general_CCCP_1942.jpg" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 200px; height: 277px; " /&gt;&lt;/a&gt;&lt;div&gt;Agora vamos introduzir coisas que irão deixar nossa soma mais "difícil de testar" ou de prever o comportamento. A primeira delas é guardar estado. Estou usando Cê-zão para mostrar isso, mas guardar estado é algo que fazemos ao usar orientação a objetos. Aquela flag inocente, atributos mutantes e coisas do tipo. Depois de terminar de ler este artigo eu espero que algumas pessoas entendam por que diabos String, Integer e afins são imutáveis. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nossa nova função soma "mais difícil de testar" é esta: &lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;int soma_calendario_maia(int* a, int b){&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;int result = *a + b;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;*a += 2012;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;return result;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Repare que ela recebe um ponteiro. Alguém resolveu mudar o parametro de entrada. O legal é que na primeira chamada ela retorna certo, e se chamarem com outro primeiro parametro ela vai funcionar. Vai passar no teste.  Mas em alguma outra parte do sistema vai estourar algum problema. E para achar onde diabos foi alterada a variavel é bem chato, para não dizer outra coisa. Este é o primeiro Side-Effect ou Efeito Colateral. Ele é causado por que o estado (e não o Estado) de algum ponto do sistema foi alterado. Para testar, é necessário simular o estado esperado na primeira chamada da função. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Vamos versar sobre o mesmo tema (a opressão do estado na previsibilidade do código) com outro exemplo. &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;static int estado_interno=0;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;int soma_gulosa(int a, int b){&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;estado_interno +=a;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;return estado_interno + b;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Este aqui é mais "parecido" com o que ocorre na orientação a objetos com atributos mutáveis. O estado interno muda durante a chamada da função a cada vez que a chamada ocorre. Ou então alguém pode mudar o estado interno e o comportamento da função também muda. Eu lembro que antes de aprender a programar OO eu sempre escutava que variáveis globais não são legais. E eu me enrolava quando o programa crescia na época por abusar de variáveis globais. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Aqui para quem quiser ver a chamdada das somas e como elas se comportam: &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;div&gt;#include &lt;stdio.h&gt;&lt;/stdio.h&gt;&lt;/div&gt;&lt;div&gt;#include &lt;stdlib.h&gt;&lt;/stdlib.h&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;int main(void) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;int a1 = 2;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;int b1 = 3;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;int res;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;int b4_a1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;int b4_b1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;b4_a1 = a1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;b4_b1 = b1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;res = soma_lucida(a1,b1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;printf("antes \n a = %d , b = %d \n soma_lucida(a,b) = %d \n depois \n a = %d , b = %d\n\n\n", b4_a1, b4_b1, res, a1, b1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;b4_a1 = a1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;b4_b1 = b1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;res = soma_lucida(a1,b1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;printf("antes \n a = %d , b = %d \n soma_lucida(a,b) = %d \n depois \n a = %d , b = %d\n\n\n", b4_a1, b4_b1, res, a1, b1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;b4_a1 = a1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;b4_b1 = b1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;res = soma_gulosa(a1,b1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;printf("antes \n a = %d , b = %d \n soma_gulosa(a,b) = %d \n depois \n a = %d , b = %d\n\n\n", b4_a1, b4_b1, res, a1, b1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;b4_a1 = a1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;b4_b1 = b1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;res = soma_gulosa(a1,b1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;printf("antes \n a = %d , b = %d \n soma_gulosa(a,b) = %d \n depois \n a = %d , b = %d\n\n\n", b4_a1, b4_b1, res, a1, b1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;b4_a1 = a1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;b4_b1 = b1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;res = soma_calendario_maia(&amp;amp;a1,b1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;printf("antes \n a = %d , b = %d \n soma_calendario_maia(a,b) = %d \n depois \n a = %d , b = %d\n\n\n", b4_a1, b4_b1, res, a1, b1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;b4_a1 = a1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;b4_b1 = b1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;res = soma_calendario_maia(&amp;amp;a1,b1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;printf("antes \n a = %d , b = %d \n soma_calendario_maia(a,b) = %d \n depois \n a = %d , b = %d\n\n\n", b4_a1, b4_b1, res, a1, b1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;return EXIT_SUCCESS;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;E o output:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt;$ ./soma &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt;antes &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; a = 2 , b = 3 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; soma_lucida(a,b) = 5 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; depois &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; a = 2 , b = 3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt;antes &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; a = 2 , b = 3 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; soma_lucida(a,b) = 5 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; depois &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; a = 2 , b = 3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt;antes &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; a = 2 , b = 3 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; soma_gulosa(a,b) = 5 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; depois &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; a = 2 , b = 3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt;antes &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; a = 2 , b = 3 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; soma_gulosa(a,b) = 7 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; depois &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; a = 2 , b = 3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt;antes &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; a = 2 , b = 3 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; soma_calendario_maia(a,b) = 5 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; depois &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; a = 2012 , b = 3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt;antes &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; a = 2012 , b = 3 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; soma_calendario_maia(a,b) = 2015 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; depois &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#000066;"&gt; a = 2012 , b = 3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Okay. Os exemplos podem ser artificias mas na vida real achar um bug causado por um estado alterado é algo realmente complexo. Como minimizar os side effects então?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Tendo uma vida mais saudável, com menos efeitos colaterais&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.istockphoto.com/file_thumbview_approve/4664480/2/istockphoto_4664480-healthy-food-and-body.jpg"&gt;&lt;img src="http://www.istockphoto.com/file_thumbview_approve/4664480/2/istockphoto_4664480-healthy-food-and-body.jpg" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 317px; height: 380px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Basta evitar guardar estado. Para evitar guardar estado existem algumas formas:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Usar funções que não mudem o estado interno. As vezes isto fica incomodo de ser feito, pois a tendência de criar funções que recebem muitos parâmetros é enorme. Isto pode ser minimizado com o uso de estruturas para agrupar as variaveis ou VOs. O código fica previsível, uma vez que basta popular os 500 mil parametros da mesma forma para ter o retorno desejado. Mesmo sendo incomodo de fazer isso, ainda é mais fácil do que gerenciar um grafo de objetos complexo o qual é formado de vários objetos guardando estado. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A outra forma é copiar dados sempre em variáveis imutáveis (ou constantes). Isto pode ser usado de forma defensiva em alguns casos. Por exemplo, vamos retomar a nossa soma calendário maia:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;int copia_a1 = a1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;int copia_b1 = b1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;int temp = soma_calendario_maia(copia_a1, copia_b1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;int res = temp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Maya-Maske.jpg/200px-Maya-Maske.jpg"&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Maya-Maske.jpg/200px-Maya-Maske.jpg" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 200px; height: 150px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Paranoico, não? Pois é. O calendário maia poderia ter exercido seu poder nas nossas variáveis. Como foi feito cópia das entradas, a1 e b1 estão intactas. E o retorno usado será a cópia do que foi retornado, pois vai saber se dentro do calendário maia não foi guardado um ponteiro para o retorno. Esta estratégia é paranoica mas funciona. A desvantagem é que é uma cópia de dados desenfreada. Esta estratégia protege contra side effects. Em Java por exemplo, todo objeto é passado por referência. Alguém pode estar usando ele enquanto você executa um método. Se o objeto for imutável não tem problema. Se o objeto for mutável, copie os parâmetros de entrada antes de usar estes mesmos parametros. Com as classes Wrapper não existe preocupação, pois todas elas são imutáveis. O fato de usar um imutável ser bom, é que como ele não muda, não vai exercer side-effects. Isto não é genial?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Assobiar e chupar cana ao mesmo tempo&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Vamos pensar que estamos usando apenas funções "faceis de testar", ou seja, sem side-effects. Estas funções assim são chamadas de puramente funcionais e são a menina dos olhos das linguagens funcionais. Erlang por exemplo não tem variável e te obriga a copiar tudo. &lt;/div&gt;&lt;div&gt;Vamos pensar na dificuldade de executar nossa função soma_lucida em multi-thread. Humm... não existe dificuldade alguma nisso! Outra coisa: Vamos pensar em executar algum processamento multi-thread em objetos complexos. Se estes objetos forem copiados e distribuidos sem serem compartilhados entre as threads não teremos maiores dores de cabeça. Ou então se tivermos como objetos compartilhados apenas objetos imutáveis também não teremos motivos para preocupação . Nem sempre isto é possível, mas se pensar nisso durante a concepção de um software sua vida pode ser bem mais fácil com isso. &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Reparem que eu não falei uma vez se quer sobre locks neste artigo. Os locks são necessários para assegurar que um valor não está sendo lido em um estado intermediário, antes de ser alterado por outra thread. Se você for compartilhar objetos mutáveis, ai sim, boa sorte com os locks! &lt;/div&gt;&lt;div&gt;Reparem que falei de conceitos simples que podem acelerar o processamento multi thread de forma absurda! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ah, e não pensem que tudo o que é mutável, compartilhado, guarda estado e afim é ruim. Mas para multi-thread nem sempre é coerente. Aqui eu falei de coisas que considero simples e boas práticas para processamento paralelo. Devo abordar isso um pouco mais em artigos posteriores com exemplos em Java. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;See ya!&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-1993507185963835558?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/b52qCAte6jmwqtM3ReaVRwTM3Ds/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b52qCAte6jmwqtM3ReaVRwTM3Ds/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/b52qCAte6jmwqtM3ReaVRwTM3Ds/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b52qCAte6jmwqtM3ReaVRwTM3Ds/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/zSdJuWe6Vhs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/1993507185963835558/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/12/assobiando-e-chupando-cana.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/1993507185963835558?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/1993507185963835558?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/zSdJuWe6Vhs/assobiando-e-chupando-cana.html" title="Abordagem funcional de fazer as coisas" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/12/assobiando-e-chupando-cana.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcMQXc9eyp7ImA9WxNaGEQ.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-9109864980891301004</id><published>2009-12-03T23:59:00.005-02:00</published><updated>2009-12-04T00:18:00.963-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-04T00:18:00.963-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="digressões" /><category scheme="http://www.blogger.com/atom/ns#" term="OFFTOPIC" /><category scheme="http://www.blogger.com/atom/ns#" term="pessoal" /><title>O que diabos eu tenho feito?</title><content type="html">Okay, eu tenho feito ultimamente:&lt;div&gt;&lt;ul&gt;&lt;li&gt;Ho studiato una nuova lingua. Questo me piace molto, ma bisogno di studiare di piú perche non sono veloce per parlare. &lt;/li&gt;&lt;li&gt;Continuo estudando novas linguagens (de programação).&lt;/li&gt;&lt;li&gt;Livros na amazon. Meu cartão de crédito está com a lingua pra fora. Acho que todos os livros que eu gostaria de ter comprado na época que eu estava enrolado acabei comprando. Sou uma pessoa mais feliz com uma pilha de livros enorme para ler. &lt;/li&gt;&lt;li&gt;Trabalhando para caralho. Encarei refactorings grandes para melhorar a qualidade do nosso código do OSL. Pelo o que parece logo logo teremos um release bem funcional. Vou postar com prazer sobre o que diabos o software misterioso que trabalho é capaz. Já tive até que ler specs do JCP! Quem diria ein!&lt;/li&gt;&lt;li&gt;Estou praticando esportes pela primeira vez em quase 10 anos. Estou treinando kung fu estilo louva-a-deus do norte e inclusive já estou pegando armas (e eventualmente me machucando sozinho com elas!). Já perdi 15 quilos e melhorei em muito meu humor e minha disposição. &lt;/li&gt;&lt;li&gt;Ainda não consegui dominar o mundo. Eu tenho problemas menores e mais idiotas para me preocupar e por isso ainda não tive nenhuma idéia genial.&lt;/li&gt;&lt;li&gt;Meus gatos (tenho 2) estão ótimos e não estão mais vomitando bolas de pelo desde que comecei a escovar-los duas vezes por semana. O incrível é que a casa está mais limpa (mas não significa que ela esteja limpa). &lt;/li&gt;&lt;li&gt;Estou cada vez gostando mais de linguagens funcionais. Lê-se Erlang. Ah, e também estou me empolgando com o CouchDB. Vou fazer umas provas de conceitos puxadas para ver se ele segura a onda :-)&lt;/li&gt;&lt;li&gt;Visitei meus parentes. Depois de 5 anos vi meus avós. Consegui ver meu pai antes de ele ser chamado para trabalhar denovo. &lt;/li&gt;&lt;li&gt;O povo do O'malley's já está falando oi quando eu apareço lá. Acho que preciso beber menos, ou pelo menos com maiores intervalos. &lt;/li&gt;&lt;li&gt;Pelo menos umas duas vezes por semana estou trabalhando usando o wi-fi de alguma starbucks. Ajuda a renovar os ares. &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Sobra tempo? Eventualmente sim. Mas faz quase um mês que não pedalo e nem corro. Preciso voltar a fazer isso...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;See ya!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-9109864980891301004?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cr2aiS5SRMPVIydPVfE2nFOSuck/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cr2aiS5SRMPVIydPVfE2nFOSuck/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cr2aiS5SRMPVIydPVfE2nFOSuck/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cr2aiS5SRMPVIydPVfE2nFOSuck/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/tzmikPyIWtQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/9109864980891301004/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/12/o-que-diabos-eu-tenho-feito.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/9109864980891301004?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/9109864980891301004?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/tzmikPyIWtQ/o-que-diabos-eu-tenho-feito.html" title="O que diabos eu tenho feito?" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/12/o-que-diabos-eu-tenho-feito.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEASH06eyp7ImA9WxNUEUs.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-2015459424253774831</id><published>2009-11-02T10:33:00.003-02:00</published><updated>2009-11-02T11:14:09.313-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-02T11:14:09.313-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OFFTOPIC" /><title>Help Desk Gratuito</title><content type="html">Neste feriado aconteceu uma coisa que não acontecia a tempos. Peguei uma maquina para arrumar! Como assim? &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quem me conhece sabe que se estiver alocado no cliente e der, por exemplo, problema na rede, eu não perco tempo para arrumar e ligo &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;direto&lt;/span&gt; para o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;help&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;desk&lt;/span&gt;. Trabalho desenvolvendo software e me esforço para fazer isto bem. Agora sou péssimo fazendo serviço de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;help&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;desk&lt;/span&gt;. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Estresso&lt;/span&gt; a toda, me machuco quando preciso abrir a máquina e normalmente perco horas e não resolvo nada. Uso Linux desde os 15 anos (não significa que eu seja bom nisso, só que faz tempo que eu uso :D) e conheço o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Mac&lt;/span&gt; OS desde a versão 7. Estou usando em casa o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Mac&lt;/span&gt; OS X faz mais de um ano. O que é isso? &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Pagação&lt;/span&gt; de pau para coisas não Windows? Não. &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;Simplesmente&lt;/span&gt; não estou mais acostumado no Windows e nem sei onde diabos ficam as telas do painel de controle no Vista/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Win&lt;/span&gt;7. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Demorei mais ou menos uns 5 meses para instalar o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;Wi&lt;/span&gt;-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;Fi&lt;/span&gt; em casa por preguiça. Na casa da minha &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_13"&gt;família&lt;/span&gt; eu não arrumei o computador da minha irmã quando deu pau. Enfim, dá para ter &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_14"&gt;ideia&lt;/span&gt; do meu gosto por manutenção.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Como quase todo mundo que eu conheço eu comecei em empresas pequenas, onde você é um misto de programador/suporte/suporte ao servidor. Descobri bem cedo que eu preferia estudar igual a um condenado pelo resto da vida do que mexer com estes problemas de hardware...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;Okay&lt;/span&gt;. Já fiz um resumo do quanto eu gosto de manutenção. Agora sobre o porteiro: Um dos porteiros do meu prédio é bem legal e já me ajudou em uma situação que eu estava com uma pessoa passando mal em casa (ligou para o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;Samu&lt;/span&gt; e foi ligeiro, pois eu, na época bem cabaço, estava totalmente sem saber o que fazer). Fiquei amigo dele depois disso. E isso fazem anos. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ele me perguntou se eu "não dava um jeitinho no computador dele". Por consideração expliquei para ele que "isso não é a minha &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_17"&gt;área&lt;/span&gt;, fazem anos que eu não faço isso, trabalho com programação, etc" ao invés de ser mal educado com um seco "NÃO!". &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Uns meses depois (sério, ele esperou meses) ele se fez de besta e apareceu com o computador. Segundo ele "precisava dum &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;cd&lt;/span&gt; para instalar a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;internet&lt;/span&gt;". Pensei comigo: nem &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;fudendo&lt;/span&gt; vou instalar estes modems &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;onboard&lt;/span&gt;, mas não custa ligar para ver o que que é. Relutei para ligar uns 5 dias, e quando o mal humor de olhar aquela máquina fazendo parte da "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;bagunça&lt;/span&gt; natural de casa" superou o mal humor de mexer na maquina, pensei: preciso me livrar disso!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fui ligar o gabinete. Preciso de um cabo &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;AC&lt;/span&gt;, teclado e &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;mouse&lt;/span&gt;. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;Oooops&lt;/span&gt;! Uso &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;macbook&lt;/span&gt;! Eu &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;estressei&lt;/span&gt; faz mais ou menos um ano e joguei minha tralha fora. Sem cabos, teclados e afins em casa! Mais 3 dias para pedir os cabos/teclado/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;mouse&lt;/span&gt; para o porteiro...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;Ok&lt;/span&gt;. Agora (ontem) tenho tudo! Vamos ligar a máquina... &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;pí&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;pí&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;pí&lt;/span&gt;... &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;tac&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;tac&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;tac&lt;/span&gt;...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nunca ouvi tanto barulho! O estalo típico de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;hd&lt;/span&gt; com pau estava assustando meus gatos. Dei graças a Deus que mesmo que eu tivesse com boa vontade não poderia ajudar (é bom que dai não se acostuma a fazer isso toda a vez). Levei a máquina para ele. Expliquei: "tá vendo, não consigo resolver o problema, tem que levar para um cara de &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_37"&gt;manutenção&lt;/span&gt;, sou programador, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;blá&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;blá&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;blá&lt;/span&gt;...".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Depois voltei para casa e pensei: Quantas pessoas que tem um carro falam para o amigo &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_41"&gt;mecânico&lt;/span&gt; "dar um jeitinho no motor"? Esta história do "povo de mais idade" que dizem que "não entendo destes negócios de computador" algumas vezes é bem coerente. Já acho falta de respeito colocar as linguagens de programação no mesmo saco, imagina colocar manutenção e programação no mesmo saco! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mesmo quando eu encho o saco da minha amiga médica eu pergunto com respeito e entendo o quanto ela se &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;fudeu&lt;/span&gt; para estudar medicina e conhecer doenças e afins. Nunca disse que "essa dor de garganta é &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;rapidinha&lt;/span&gt; de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;diagnosticar&lt;/span&gt;". Depois de participar de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;projetos&lt;/span&gt; gigantes e de ter que ouvir gerentes de comercial falando que este "recurso é &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_46"&gt;rapidinho&lt;/span&gt; de implementar" ainda tenho que ouvir o porteiro falando a mesma coisa do problema no computador dele! É complicado manter a educação de vez em quando. Sou fã &lt;a href="http://www.thinkgeek.com/tshirts-apparel/unisex/frustrations/388b/"&gt;desta camisa do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;think&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_48"&gt;geek&lt;/span&gt;&lt;/a&gt; inclusive! Vou acabar comprando uma destas em português qualquer dia&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt; :D&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-2015459424253774831?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WQP3AURt5q6MkyJyypCOel_aXZE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WQP3AURt5q6MkyJyypCOel_aXZE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WQP3AURt5q6MkyJyypCOel_aXZE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WQP3AURt5q6MkyJyypCOel_aXZE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/VoMy3pW0A60" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/2015459424253774831/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/11/help-desk-gratuito.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/2015459424253774831?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/2015459424253774831?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/VoMy3pW0A60/help-desk-gratuito.html" title="Help Desk Gratuito" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/11/help-desk-gratuito.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MESHs6fip7ImA9WxNWE0w.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-1220340116815042727</id><published>2009-10-11T22:29:00.003-03:00</published><updated>2009-10-11T22:36:49.516-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-11T22:36:49.516-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Cerveja" /><title>Ótima opção para tomar cervejas na Zona Norte</title><content type="html">&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;Sem papo furado de "estou muito tempo sem postar nada" por que isso já encheu o saco. &lt;div&gt;Apenas um post sucinto e rápido. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hoje fui no Empório Laura Aguiar, ou Bar do Zé para os amigos. O Zé conhece cerveja e ir para lá para ficar conversando uns 5 minutos com ele e entender por que diabos uma cerveja se chama "Old Engine Oil" e por que tem um rato na tampinha já vale a pena! &lt;/div&gt;&lt;div&gt;Para quem olha de fora o lugar parece um boteco... Agora depois de entrar no lugar já se pode apreciar a quantidade absurda de cervejas para todos os gostos (mesmo). Experimentei 3 Stouts que eu nunca tinha visto na vida já na primeira vez que fui. &lt;/div&gt;&lt;div&gt;Os petiscos são ótimos! Peguei uma linguiça com provolone e azeitona e uma porção de bolinhos de carne estilo Bar Barão. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mas vamos ao que interessa: O Bar do Zé fica na rua Gabriel Piza, 559 tel 6977-0471, próximo do metro Jardim São Paulo. Eu com certeza volto lá mais vezes :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Xq12n58OrDM/StKIGeC4apI/AAAAAAAAAC8/gU2CvTPNy3E/s1600-h/Photo+102.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/_Xq12n58OrDM/StKIGeC4apI/AAAAAAAAAC8/gU2CvTPNy3E/s320/Photo+102.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5391521348641647250" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 240px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-1220340116815042727?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3-PlvlDjo7o3AbuG8oQStX7rjg4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3-PlvlDjo7o3AbuG8oQStX7rjg4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3-PlvlDjo7o3AbuG8oQStX7rjg4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3-PlvlDjo7o3AbuG8oQStX7rjg4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/5RmHzeAQ4eo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/1220340116815042727/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/10/otima-opcao-para-tomar-cervejas-na-zona.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/1220340116815042727?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/1220340116815042727?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/5RmHzeAQ4eo/otima-opcao-para-tomar-cervejas-na-zona.html" title="Ótima opção para tomar cervejas na Zona Norte" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Xq12n58OrDM/StKIGeC4apI/AAAAAAAAAC8/gU2CvTPNy3E/s72-c/Photo+102.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/10/otima-opcao-para-tomar-cervejas-na-zona.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UHRnY5eyp7ImA9WxJaGUs.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-8109970896893614247</id><published>2009-08-10T23:33:00.006-03:00</published><updated>2009-08-11T00:27:17.823-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-11T00:27:17.823-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OFFTOPIC" /><title>Home office e meu projeto atual</title><content type="html">&lt;div&gt;Primeiro desculpas e &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;blá&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;blá&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;blá&lt;/span&gt;: Peço desculpas pelo tempo que não escrevo. Era realmente divertido olhar os gráficos do google &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;analytics&lt;/span&gt; e ver a cada &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;post&lt;/span&gt; publicado mais visitas. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Pois é! Perdi a conta de quanto tempo faz que eu não escrevo no meu Blog. Estou fazendo &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;home&lt;/span&gt;-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;office&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;full&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;time&lt;/span&gt;, e isso na cabeça de 90% da população brasileira é motivo para eu ter mais tempo para fazer outras coisas, como escrever no meu blog, correto? Pois é! Meu trabalho tem sido bem divertido e eu tenho realmente me dedicado bastante para escrever código de qualidade (ou pelo menos um código que eu tenha orgulho de mostrar). &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eu lembro que havia lido &lt;a href="http://www.driverentry.com.br/blog/2008/07/agora-que-virei-home.html"&gt;um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;post&lt;/span&gt; no blog do Fernando Roberto&lt;/a&gt; falando sobre as situações que ele passava no &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;home&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;office&lt;/span&gt;, e na época eu dei risada. Mas estou sentindo na pele quando saio de casa, as vezes para almoçar, e vejo o porteiro e o zelador me olhando com aquela cara de "o que diabos ele faz para pagar o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;aluguel&lt;/span&gt;?". Ou o pessoal engravatado do restaurante do lado de casa com aquela cara de incomodado ao ver um cabeludo de chinelo no meio dos engravatados. Eu mesmo me cansei disso, e quando não almoço em casa, vou na padaria da esquina, que é mais a minha cara e ninguém fica me olhando :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eu já havia feito um mês de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;home&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;office&lt;/span&gt; em outra empresa que trabalhei, numa empresa "séria" mais &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;JEE&lt;/span&gt; e menos ágil. Quando se &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_16"&gt;mantém&lt;/span&gt; uma distância segura entre trabalho e diversão, realmente fica simples "bater ponto". Eu sempre tive excesso de bom senso neste ponto e trabalhei sempre minhas 8 horas diárias &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;direitinho&lt;/span&gt;, salvo raras e necessárias &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;excessões&lt;/span&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Possuo um perfil &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;JEE&lt;/span&gt; avançado. Já entreguei &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;projetos&lt;/span&gt; e resolvi problemas &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_21"&gt;bizarros&lt;/span&gt; que o pessoal de negócio inventava. Também já vi &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;projetos&lt;/span&gt; não serem entregues por motivos políticos. Já fiz módulos de auditoria automática de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;persistência&lt;/span&gt; ou mesmo geração de código. Automação de tarefas e outras coisas que eu enchia o peito para falar: "sou &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;foda&lt;/span&gt;". Sempre disse a mim mesmo: "Não preciso estudar mais nada de Java". Realmente, para as coisas que eu fazia, estava bom demais o conhecimento que eu &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_25"&gt;possuía&lt;/span&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pois bem, tudo o que eu sempre &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;quiz&lt;/span&gt; aconteceu: Tenho um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;projeto&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;home&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;office&lt;/span&gt;. Mas esse não é o melhor. O melhor é: Core &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;development&lt;/span&gt; na veia. Tenho problemas de baixo nível para resolver. Tenho que me preocupar com um monte de coisas. Processamento paralelo, elegância no código, testes, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;BDD&lt;/span&gt;, e etc. Foi quando eu percebi: Preciso estudar Java!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Terminei recentemente o livro &lt;a href="http://www.amazon.com/Effective-Java-Programming-Language-Guide/dp/0201310058"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;Effective&lt;/span&gt; Java&lt;/a&gt; e devo ler logo mais o &lt;a href="http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/ref=sr_1_1?ie=UTF8&amp;amp;qid=1249959258&amp;amp;sr=8-1"&gt;Java &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;Concurrency&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;in&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;Practice&lt;/span&gt;&lt;/a&gt; e também &lt;a href="http://www.amazon.com/Java-Generics-Collections-Maurice-Naftalin/dp/0596527756/ref=sr_1_3?ie=UTF8&amp;amp;qid=1249959284&amp;amp;sr=8-3"&gt;o Livro de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;Generics&lt;/span&gt;&lt;/a&gt;. É &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;impressionante&lt;/span&gt; o quanto a qualidade do meu código melhorou em pouco tempo. O mérito é dos autores dos livros, que são realmente fáceis de ler!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O &lt;a href="http://openspotlight.dev.java.net/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;projeto&lt;/span&gt; que estou trabalhando&lt;/a&gt; é &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;open&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;source&lt;/span&gt;, e logo mais, quando estiver mais "usável" eu devo postar pelo menos algo falando que saiu o primeiro &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;release&lt;/span&gt;. O software &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;propriamente&lt;/span&gt; dito daria um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;post&lt;/span&gt; enorme :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Voltando ao ponto do "manter uma distância segura entre trabalho e diversão". Hoje em dia esta distância é zero. A &lt;a href="http://www.caravelatech.com"&gt;empresa que trabalho&lt;/a&gt; possui uma filosofia diferenciada, permeada de bom senso e &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;open&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;source&lt;/span&gt;. Isto tudo aumenta a responsabilidade por fazer um trabalho bem feito. O fato do meu código estar exposto no SVN também é motivo para "caprichar um pouco mais". Mas existem prazos também. Documentar, testar e codificar (nesta &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_46"&gt;ordem&lt;/span&gt;) são coisas que tem acontecido naturalmente. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;Refactors&lt;/span&gt; grandes podem quebrar muitos testes. Mas aos poucos o código que tenho feito tem ficado mais do jeito que eu quero. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Estou trabalhando num &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_48"&gt;time&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_49"&gt;foda&lt;/span&gt;. Muitas vezes a competência do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_50"&gt;time&lt;/span&gt; passa por &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_51"&gt;osmose&lt;/span&gt;, e tem feito um bem enorme para mim trabalhar com o meu &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_52"&gt;time&lt;/span&gt;, e também ter &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_53"&gt;contato&lt;/span&gt; com outros &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_54"&gt;projetos&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_55"&gt;open&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_56"&gt;source&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Li um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_57"&gt;post&lt;/span&gt; uma vez, que prefiro não colocar o link (sim, fiquei P. na &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_58"&gt;época&lt;/span&gt;) o qual um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_59"&gt;desenvolvedor&lt;/span&gt; baixo nível citava Java como sendo algo &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_60"&gt;newbe&lt;/span&gt; demais para "programadores de verdade". O mesmo &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_61"&gt;post&lt;/span&gt; falava que o autor não era tão bom, pois tinha programadores melhores programando foguetes e naves. Passou um tempo, e eu estava olhando o fonte de &lt;a href="http://jboss.org/dna/"&gt;um dos &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_62"&gt;projetos&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_63"&gt;open&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_64"&gt;source&lt;/span&gt;&lt;/a&gt; que estou usando. Resolvi olhar o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_65"&gt;linked&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_66"&gt;in&lt;/span&gt; de um dos caras do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_67"&gt;projeto&lt;/span&gt; e vi que um deles antes de mexer com Java já havia programado software para &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_68"&gt;projeto&lt;/span&gt; de aeronaves. Mas a qualidade do fonte não deixava mentir também. É bonito, coeso e limpo. Algo que fica simples de dar manutenção e mesmo de entender.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sempre gostei de ver discussões sobre linguagens, mas sei que isso nunca levou a lugar nenhum. Mas ao mesmo tempo, estou permeando cada vez mais no Java e ganhando mais fluência na linguagem. Já percebi que tem muita coisa que não é trivial fazer em outras linguagens. Minha &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_69"&gt;toolbox&lt;/span&gt; está cada vez mais madura, e minha pilha de livros para ler vai aumentando...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;E é isso! Conforme eu for ficando mais livre, vou postar mais (e dormir um pouco menos)... &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-8109970896893614247?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aWf6hjDHvkiVoVB5rEa876Bjhnc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aWf6hjDHvkiVoVB5rEa876Bjhnc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aWf6hjDHvkiVoVB5rEa876Bjhnc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aWf6hjDHvkiVoVB5rEa876Bjhnc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/LFU-PGbK9EQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/8109970896893614247/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/08/home-office-e-meu-projeto-atual.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/8109970896893614247?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/8109970896893614247?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/LFU-PGbK9EQ/home-office-e-meu-projeto-atual.html" title="Home office e meu projeto atual" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/08/home-office-e-meu-projeto-atual.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4CQXg_fip7ImA9WxJQFUs.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-6306013292489084074</id><published>2009-05-28T22:11:00.003-03:00</published><updated>2009-05-28T23:09:20.646-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-28T23:09:20.646-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Dicas" /><title>Melhorando a qualidade do código</title><content type="html">&lt;div style="text-align: left;"&gt;Nada do que eu vou falar aqui é novo. Mas muita coisa do que eu vou falar aqui você provavelmente não pratica. Eu tenho que me policiar para praticar coisas como &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Javadoc&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;TDD&lt;/span&gt;, e etc. Coisas tidas como frescura, mas que funcionam para deixar o código mais coeso.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Vamos começar do começo: Nomeando suas classes e métodos&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Teve uma época que eu achava "testes uma frescura desnecessária" e também que "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Javadoc&lt;/span&gt; é para os fracos: o código tem que ser legível". &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Ok&lt;/span&gt;, uma coisa não exclui a outra, mas em se tratando de qualidade do código existem pequenas regras que são encontradas facilmente no google, como por exemplo as regras citadas &lt;a href="http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html"&gt;aqui&lt;/a&gt;, &lt;a href="http://geosoft.no/development/javastyle.html"&gt;aqui&lt;/a&gt; e &lt;a href="http://www.ibm.com/developerworks/library/ws-tip-namingconv.html"&gt;aqui&lt;/a&gt; que recomendam algumas coisas, tais como:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Nomes de classes sendo substantivos, em &lt;b&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;CamelCase&lt;/span&gt;&lt;/b&gt; com a primeira letra &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;maiúscula&lt;/span&gt;, como por exemplo &lt;b&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;DataStore&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;ProdutoEmEstoque&lt;/span&gt;&lt;/b&gt; e etc. &lt;/li&gt;&lt;li&gt;Nomes de métodos sendo &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;ações&lt;/span&gt;, em &lt;b&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;camelCase&lt;/span&gt;&lt;/b&gt; com a primeira letra minúscula, como por exemplo &lt;b&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;saveInvoice&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;validarEntrada&lt;/span&gt;&lt;/b&gt; e etc.&lt;/li&gt;&lt;li&gt;Nomes de interface sempre que possível como &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;adjetivos&lt;/span&gt;, seguindo as mesmas regras da nomenclatura de classes, como por exemplo &lt;b&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;Auditable&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;Serializavel&lt;/span&gt;&lt;/b&gt; e etc.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;O que eu acho mais legal aqui é: não estamos mais nos anos 80 e é possível colocar nomes &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_15"&gt;legíveis&lt;/span&gt;. Conheço muita gente que diz que os nomes não podem ser muito longos, e também sempre tem um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;DBA&lt;/span&gt; pronto para impor regras de nomenclatura de tabelas que encaixam naqueles nomes estilo DOS do tipo &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;NFFNEN&lt;/span&gt;. Ou então pode-se dizer que "vai estar na documentação".  Eu penso sempre no pior cenário: estão vendo os fontes de sua classe no &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;JAD&lt;/span&gt;. Um nome de variável grande e explicativo pode ser grande, mas é explicativo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Se o seu método faz uma validação e muda um pequeno &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;status&lt;/span&gt; o nome dele não deve ser apenas validar, mas sim &lt;b&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;validarAlterandoStatus&lt;/span&gt;&lt;/b&gt;. O ultimo nome é feio, mas não deixa sombra de dúvidas sobre o que ele faz para quem o usa. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O ideal é que alguém que não saiba programar consiga pelo menos fazer &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;idéia&lt;/span&gt; do que o seu código está fazendo. Por exemplo: &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;new&lt;/span&gt; File("&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;aaa&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;txt&lt;/span&gt;").&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;open&lt;/span&gt;() é mais legível do que &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;fopen&lt;/span&gt;("&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;aaa&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;txt&lt;/span&gt;") :-) .&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Tá bom, vou fazer o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;JavaDOC&lt;/span&gt;...&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pois é: este vício eu comecei recentemente. Mesmo! Um amigo meu (que desenvolve pro &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;hibernate&lt;/span&gt;) recebeu uma dica de um amigo dele (do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;hibernate&lt;/span&gt;) que diz o seguinte: "no &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;JavaDOC&lt;/span&gt; explique para seu amigo imaginário o que a classe/método que você está escrevendo irá fazer". O legal disso é que você pega problemas conceituais ao explicar para seu amigo imaginário o que você quer fazer e o código fica mais bonito e de fácil manutenção. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Da mesma forma, no meu antigo emprego o pessoal chamava sempre alguém para servir de "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;rubber&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;duck&lt;/span&gt;", ou "pato de borracha". Você simplesmente chama alguém para ficar do seu lado sem fazer nada. Explica o que não consegue terminar para este alguém e pronto! Você mesmo achou a resposta para seu problema. Na pior das hipóteses a pessoa te ajuda, mas isto era raro, pois normalmente quem perguntava e explicava o problema já tinha a resposta.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mas fazendo o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;JavaDOC&lt;/span&gt; com a explicação além de ajudar e servir de referência mais tarde não para o trabalho de ninguém :-) .&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Li também um artigo no &lt;a href="http://www.codinghorror.com"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;coding&lt;/span&gt; horror&lt;/a&gt; que falava sobre os benefícios do &lt;a href="http://www.codinghorror.com/blog/archives/001264.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;pseudo&lt;/span&gt; código&lt;/a&gt;, explicando que você desenvolve e melhora a lógica enquanto escreve o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;pseudo&lt;/span&gt; código. Mais coisas boas para o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;JavaDOC&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Principalmente, nas classes principais faça uma boa explicação e um tutorial de como usar as classes ou &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;artefatos&lt;/span&gt;. Depois de tudo isso fica fácil e &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_41"&gt;útil&lt;/span&gt; rodar o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;javadoc&lt;/span&gt; ou mesmo o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;doxygen&lt;/span&gt; em seu &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;projeto&lt;/span&gt;. Comecei a fazer isso e tem sido bom para todos que trabalham comigo! Inclusive eu!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Para que testes? Meu código funciona!&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Parabéns! Você além de ser o melhor programador do mundo ainda sabe prever o futuro! Na prática a história é outra: Num cenário &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;OO&lt;/span&gt; muitas vezes uma alteração em uma classe utilitária acaba &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_46"&gt;influenciando&lt;/span&gt; uma parte crítica do sistema. Nestas horas o teste &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_47"&gt;mantém&lt;/span&gt; o sistema em produção sem dores de cabeça.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O primeiro tipo, e mais comum são os testes unitários. Eles testam uma pequena parte do código (normalmente uma classe) considerando que o resto do sistema funciona. O legal de desenvolver testes unitários é que a classe fica mais facilmente utilizável e coesa. Por exemplo, hoje eu escrevia uma classe com alguns métodos privados que cuidavam de coisas baixo nível que não poderiam ser expostas. Eu precisava testar esta parte mas não queria expor estes métodos como métodos públicos daquela classe. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_48"&gt;Fiz&lt;/span&gt; o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_49"&gt;refactor&lt;/span&gt; e passei os métodos de baixo nível para outra classe, e testei &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_50"&gt;unitariamente&lt;/span&gt; as duas. O código ficou mais coeso, reutilizável e facilmente &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_51"&gt;testável&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O segundo tipo são os testes integrados. Estes testes testam a comunicação entre todas as classes de ponta a ponta. Podem ser testes que &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_52"&gt;comitem&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_53"&gt;transações&lt;/span&gt; no banco de dados por exemplo testando desde o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_54"&gt;objeto&lt;/span&gt; de negócio até as &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_55"&gt;DAOs&lt;/span&gt; ou mesmo testando a interface com o usuário. Suas classes podem cumprir o papel e executar os testes unitários sem problemas e ao mesmo tempo ter alguma falha em arquivos de configuração que invalidem o pacote em produção. Os testes integrados pegam isso. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ambos os tipos de testes (unitários e integrados) devem ser feitos de forma automática. E devem ser executados como parte do desenvolvimento (no &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_56"&gt;maven&lt;/span&gt;2 isso é natural). A grande questão é: falhou o teste? tivemos problemas então. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Deixar a maior parte dos problemas &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_57"&gt;precoçes&lt;/span&gt; é a melhor forma de evitar problemas em produção. Lance &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_58"&gt;exception&lt;/span&gt; e invalide o seu sistema o quanto antes quando der merda. Com certeza alguém vai perceber e arrumar logo :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Espero que mais gente pratique estas coisas no dia-a-dia. Infelizmente as pessoas desenvolvem software como quem anda pelado no meio de um tiroteio. O teste é uma garantia. Por mais ruim que seja o teste ele garante que seu código faz algo. E quando ele parar de fazer algo você vai ficar sabendo.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-6306013292489084074?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4gW68mhwbrl-5LBk0NHbbqh7Ls8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4gW68mhwbrl-5LBk0NHbbqh7Ls8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4gW68mhwbrl-5LBk0NHbbqh7Ls8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4gW68mhwbrl-5LBk0NHbbqh7Ls8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/MMvSMpuC9ek" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/6306013292489084074/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/05/melhorando-qualidade-do-codigo.html#comment-form" title="1 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/6306013292489084074?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/6306013292489084074?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/MMvSMpuC9ek/melhorando-qualidade-do-codigo.html" title="Melhorando a qualidade do código" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/05/melhorando-qualidade-do-codigo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IHRH48fSp7ImA9WxJREEQ.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-190943334135763109</id><published>2009-05-11T22:52:00.006-03:00</published><updated>2009-05-11T23:32:15.075-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-11T23:32:15.075-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Cerveja" /><category scheme="http://www.blogger.com/atom/ns#" term="Pubs" /><title>Mais pubs e bares...</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3148/2294287856_2c1e4e0b55_o.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 243px; height: 471px;" src="http://farm4.static.flickr.com/3148/2294287856_2c1e4e0b55_o.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Estes dias muitos problemas vieram a tona... E para compensar resolvi dar uma relaxada e tomar um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;chopp&lt;/span&gt; com alguns amigos no &lt;a href="http://www.omalleysbar.net/"&gt;O'&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;malley&lt;/span&gt;'s&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Old&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Splecked&lt;/span&gt; para começar, seguida por uma &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Guinnes&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;New&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Castle&lt;/span&gt; (ruim!), e para fechar com chave de ouro &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Strong&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Suffolk&lt;/span&gt; e &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Albot&lt;/span&gt; Ale, ambas da &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Greene&lt;/span&gt; King, minha cervejaria inglesa preferida!&lt;br /&gt;&lt;br /&gt;E no dia seguinte fui relembrar os tempos de Bar Barão. O falecido Bar Barão &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_11"&gt;possuía&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;IMHO&lt;/span&gt; o melhor &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;chopp&lt;/span&gt; de São Paulo. Era um bar alemão que &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_14"&gt;possuía&lt;/span&gt; além do melhor &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;chopp&lt;/span&gt; o melhor custo-benefício. Bebia &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;bem&lt;/span&gt; a noite, e comia muitos petiscos, bolinhos de bacalhau e carne, e no fim da noite a conta ficava em menos de 40 reais normalmente!&lt;br /&gt;&lt;br /&gt;Mas enfim! Onde diabos eu iria achar um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;chopp&lt;/span&gt; comparável ao do Bar Barão? Na &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;av&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;lavandisca&lt;/span&gt;, próximo a avenida &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;ibirapuera&lt;/span&gt; existe o &lt;a href="http://www.joansehn.com.br/"&gt;Joan &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;Sehn&lt;/span&gt; bar &lt;/a&gt;(procure no google o endereço). O &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;chopp&lt;/span&gt; na temperatura e &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;cremosidades&lt;/span&gt; ideais, e comida típica alemã da melhor qualidade :D&lt;br /&gt;&lt;br /&gt;Vou voltar mais vezes para ambos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-190943334135763109?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0jJatYEP3HNmmiBTxMel92dpAQ4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0jJatYEP3HNmmiBTxMel92dpAQ4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0jJatYEP3HNmmiBTxMel92dpAQ4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0jJatYEP3HNmmiBTxMel92dpAQ4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/IjWbndu5VDs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/190943334135763109/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/05/mais-pubs-e-bares.html#comment-form" title="3 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/190943334135763109?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/190943334135763109?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/IjWbndu5VDs/mais-pubs-e-bares.html" title="Mais pubs e bares..." /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/05/mais-pubs-e-bares.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAFRHszeyp7ImA9WxJREEQ.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-6567980828277146531</id><published>2009-05-11T21:35:00.004-03:00</published><updated>2009-05-11T22:11:55.583-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-11T22:11:55.583-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OFFTOPIC" /><category scheme="http://www.blogger.com/atom/ns#" term="Criticas" /><title>Humildade faz bem, obrigado!</title><content type="html">Com relação a humildade conheço programadores dos seguintes tipos (por ordem de importância): metido e incompetente, inseguro e incompetente, inseguro e competente, metido e competente e humilde e competente.&lt;br /&gt;&lt;br /&gt;O programador metido e incompetente é o pior de todos. Não é &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;necessariamente&lt;/span&gt; alguém que está começando, mas um cara que se perde em sua mediocridade. Pode ter anos de mercado inclusive. É dos caras que valorizam a frase "em terra de cegos quem tem um olho é rei". Adora dar &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;broncas&lt;/span&gt; e criticar mas não &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;sugere&lt;/span&gt; nada que fuja do "arroz-com-feijão".&lt;br /&gt;&lt;br /&gt;Me deparei com uns 3 caras assim em quase 10 anos de mercado aqui em &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;SP&lt;/span&gt;. O primeiro tinha um currículo melhor do que o meu na época. O cara era tão bom e fazia tudo tão bem, que gastou mais tempo explicando como fazia tudo muito bem e não deu conta do serviço simples que eu havia passado para ele. Ele não durou 1 semana. &lt;br /&gt;&lt;br /&gt;O segundo se achava tão competente que não sabia que desenvolver a melhor &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;framework&lt;/span&gt; do universo levava tempo. E lá foi ele desenvolver a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;framework&lt;/span&gt;... durante quase 1 mês a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;framework&lt;/span&gt; iria ficar pronta no dia &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_7"&gt;seguinte&lt;/span&gt;... Ninguém me ouviu e lá se foi o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;projeto&lt;/span&gt;...&lt;br /&gt;&lt;br /&gt;O terceiro sabia tanta coisa e já tinha mexido com tanta coisa que mal soube explicar como fez qualquer dos seus milhares de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;projetos&lt;/span&gt;... Só repetia que já havia mexido com tudo o que eu possa imaginar, mas não citou uma &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;framework&lt;/span&gt; sequer...&lt;br /&gt;&lt;br /&gt;O programador inseguro e incompetente muitas vezes é alguém com pouca experiência, e que, por ser inseguro pode estudar e recuperar o prejuízo, acaba virando um programador competente.&lt;br /&gt;&lt;br /&gt;O programador inseguro e competente é um programador que nunca acha que sabe o suficiente. As vezes se desvaloriza achando que sabe pouco, mas resolve os problemas que vê pela frente. É um dos melhores de se ter na equipe. E muitas vezes o mais confiável. O único defeito é não se valorizar o suficiente. É dos caras que se as empresas cuidarem bem cultivam por mais de 10 anos e a própria empresa irá crescer junto com o programador...&lt;br /&gt;&lt;br /&gt; O programador metido e competente tem o defeito que é se achar bom pelo fato de ser bom. Não que isso seja uma atitude louvável, mas pelo menos o cara resolve os problemas. E tem mérito. É do tipo que é melhor não ter mais de um na equipe. Muitas vezes é um cara com perfil de liderança e que resolve os principais problemas. É um cara que merece ser valorizado. Eu já fui assim! Hoje sou só metido, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;rsrsrsrs&lt;/span&gt; ;-)&lt;br /&gt;&lt;br /&gt;O programador humilde e competente é de longe dos caras mais &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;foda&lt;/span&gt;. Eu queria ser mais assim, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;rsrsrsrs&lt;/span&gt;... Mas voltando a falar sério: Os melhores programadores, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;arquitetos&lt;/span&gt; e afins que eu conheci são humildes. A primeira característica destes caras é que inevitavelmente eles não sabem tudo! Olha só que legal: se você realmente tem muita experiência e muito tempo de mercado você sabe mais do que ninguém que se você não sabe algo você tem condições de ir atrás caso seja necessário. Você é referência para muitas pessoas e você tem muitas referências. Se você nunca fez algo você simplesmente fala que não sabe para não dar informações erradas para amigos e/ou colegas de trabalho. E o melhor: você não se sente ameaçado por não saber algo.&lt;br /&gt;&lt;br /&gt;O que eu acho mais legal de ter muito tempo de mercado é poder tomar &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;chopp&lt;/span&gt; com estes caras, que muitas vezes são verdadeiras &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;lendas&lt;/span&gt; vivas e nem por isso vivem de ego cheio... E conheço muitos caras assim! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-6567980828277146531?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/W_6fvRSqunUBj0ZvyyjeDhNKW7c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W_6fvRSqunUBj0ZvyyjeDhNKW7c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/W_6fvRSqunUBj0ZvyyjeDhNKW7c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W_6fvRSqunUBj0ZvyyjeDhNKW7c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/pskaQqMAzpY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/6567980828277146531/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/05/humildade-faz-bem-obrigado.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/6567980828277146531?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/6567980828277146531?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/pskaQqMAzpY/humildade-faz-bem-obrigado.html" title="Humildade faz bem, obrigado!" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/05/humildade-faz-bem-obrigado.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cNQHw5fCp7ImA9WxJSFE0.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-1649915223190961435</id><published>2009-05-03T22:17:00.004-03:00</published><updated>2009-05-03T22:38:11.224-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-03T22:38:11.224-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="J2EE" /><category scheme="http://www.blogger.com/atom/ns#" term="DI" /><category scheme="http://www.blogger.com/atom/ns#" term="Arquitetura" /><title>DI com Guice</title><content type="html">&lt;div&gt;Eu estava assistindo alguns dos Google &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Tech&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Talks&lt;/span&gt;, quando vi &lt;a href="http://video.google.com/videoplay?docid=6068447410873108038"&gt;um &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;vídeo&lt;/span&gt;&lt;/a&gt; sobre o &lt;a href="http://code.google.com/p/google-guice/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Guice&lt;/span&gt;&lt;/a&gt;.  O &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Guice&lt;/span&gt; é a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;framework&lt;/span&gt; de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Dependency&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Injection&lt;/span&gt; feita no Google. Me perguntava sobre por que diabos alguém não iria usar o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Spring&lt;/span&gt; para fazer &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;DI&lt;/span&gt; em um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;projeto&lt;/span&gt;. Existem no google algumas comparações do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;Guice&lt;/span&gt; com o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;Spring&lt;/span&gt; como por exemplo &lt;a href="http://www.jroller.com/habuma/entry/guice_vs_spring_javaconfig_a"&gt;essa&lt;/a&gt;, então para não ficar falando a toa coisas que podem ser achadas no google vou as minhas &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;concusões&lt;/span&gt; rápidas:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;Spring&lt;/span&gt; com XML fica "chato de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;gerenciar&lt;/span&gt;" com o tempo. O &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;Guice&lt;/span&gt; admite configuração programática simples e isolada. Gostei da abordagem. E fica mais &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;gerenciável&lt;/span&gt; do que &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;Spring&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;Autowired&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;O &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;Guice&lt;/span&gt; pode ter sua configuração programática &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;modularizada&lt;/span&gt;. Achei isso genial!&lt;/li&gt;&lt;li&gt;Não vi nada sobre o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;Guice&lt;/span&gt; usar &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;JNDI&lt;/span&gt; por exemplo. O &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;Spring&lt;/span&gt; com certeza é mais maduro para tarefas do dia a dia.&lt;/li&gt;&lt;li&gt;Por outro lado, o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;Autowired&lt;/span&gt; com identificador em strings do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;Spring&lt;/span&gt; fica atrás das &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;annotations&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;customizadas&lt;/span&gt; do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;Guice&lt;/span&gt;. Tem que ler algo sobre, ou assistir o vídeo para entender o que eu disse aqui. Achei genial esta abordagem também!&lt;/li&gt;&lt;li&gt;O &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;Guice&lt;/span&gt; foca em performance, coisa que o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;Spring&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;Autowired&lt;/span&gt; pena um pouco. Mas o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;Autowired&lt;/span&gt; do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;Spring&lt;/span&gt; é mais automático e poderoso. Fiquei imaginando um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;projeto&lt;/span&gt; "arroz com feijão" no &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;Guice&lt;/span&gt;, com um monte de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;DAOs&lt;/span&gt; configuradas na mão. Seria mais chato.&lt;/li&gt;&lt;li&gt;As formas que o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;Guice&lt;/span&gt; aborda o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;gerenciamento&lt;/span&gt; de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;escopo&lt;/span&gt; parecem ser mais &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;flexiveis&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Não vi nada de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;AOP&lt;/span&gt; no &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;Guice&lt;/span&gt;, mas no geral eu não gosto de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;AOP&lt;/span&gt; para fazer mais coisas do que Logs e &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;gerenciamento&lt;/span&gt; de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_46"&gt;transações&lt;/span&gt;. Isso é algo que eu queria ver na prática como que o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;Guice&lt;/span&gt; funciona. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_48"&gt;Gerenciar&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_49"&gt;transações&lt;/span&gt; é algo "chato" que o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_50"&gt;Spring&lt;/span&gt; faz muito bem... &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_51"&gt;Ok&lt;/span&gt;, preciso ler mais um pouco sobre... :-)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-1649915223190961435?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4xKAREEnbyuIq_LBUIonBBEtOz8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4xKAREEnbyuIq_LBUIonBBEtOz8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4xKAREEnbyuIq_LBUIonBBEtOz8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4xKAREEnbyuIq_LBUIonBBEtOz8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/H3M9FTeNOT0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/1649915223190961435/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/05/di-com-guice.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/1649915223190961435?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/1649915223190961435?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/H3M9FTeNOT0/di-com-guice.html" title="DI com Guice" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/05/di-com-guice.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UARnY8fip7ImA9WxJTF0g.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-481999046850727451</id><published>2009-04-26T07:12:00.004-03:00</published><updated>2009-04-26T10:07:27.876-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-26T10:07:27.876-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Numerica" /><category scheme="http://www.blogger.com/atom/ns#" term="Estatistica" /><title>Programação numérica e as ferramentas que conheci nos tempos de IFUSP</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Sin_x%5E-1.svg/300px-Sin_x%5E-1.svg.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 174px; height: 208px;" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Sin_x%5E-1.svg/300px-Sin_x%5E-1.svg.png" alt="" border="0" /&gt;&lt;/a&gt;Hoje me atentei para algo que já deveria ter postado sobre: programação numérica.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Intro&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Quem me conhece pessoalmente sabe que fiquei uns 5 anos tentando fazer bacharelado em física na &lt;a href="http://www.usp.br/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;USP&lt;/span&gt;&lt;/a&gt;. Tive um monte de problemas pessoais que foram a desculpa perfeita para trancar a faculdade e ficar estudando programação por conta própria. Mas ao mesmo tempo, nestes 5 anos (que andaram apenas 2 anos e meio) aprendi muita coisa e mandei bem em assuntos que &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;incluíam&lt;/span&gt; programação e o uso de computadores para ajudar a resolver problemas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;Laboratórios&lt;/span&gt; de física - um primeiro desafio estatístico&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.dismated.com/imagenes/laboratorio_fisica.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 271px;" src="http://www.dismated.com/imagenes/laboratorio_fisica.gif" alt="" border="0" /&gt;&lt;/a&gt;Os &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Labs&lt;/span&gt; de física são feitos da seguinte forma no &lt;a href="http://www.if.usp.br/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;IFUSP&lt;/span&gt;&lt;/a&gt;: Você deve reproduzir uma &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;experiência&lt;/span&gt; do passado nos laboratórios &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;didáticos&lt;/span&gt;. O material disponibilizado para os alunos, apesar de ser dos melhores da &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;américa&lt;/span&gt; latina é tosco. E é tosco de propósito, pois a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;ideia&lt;/span&gt; é mostrar para o aluno como usar as ferramentas matemáticas para eliminar erros de medição. As ferramentas matemáticas usadas são... bem, na verdade é só uma: estatística.&lt;br /&gt;&lt;br /&gt;Apenas uma chance para adivinhar qual programa tinha a honra de tratar dados dados retirado em até 3 aulas de 4 ou 5 horas? &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Excel&lt;/span&gt;. Sim, para um primeiro &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;contato&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;tava&lt;/span&gt; bom &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;né&lt;/span&gt;? &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_14"&gt;Tínhamos&lt;/span&gt; até uma &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;planilha&lt;/span&gt; feita por um professor que fazia "sozinha" o gráfico dos &lt;a href="http://en.wikipedia.org/wiki/Least_squares"&gt;mínimos quadrados&lt;/a&gt;. Nas primeiras experiências como o pêndulo que devia ter apenas poucas centenas de medições e apenas um gráfico para ser feito a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;planilha&lt;/span&gt; funcionava bem. Quando tive que fazer trinta gráficos já vi que a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;planilha&lt;/span&gt; não funcionava e fui atrás de ferramentas novas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ferramentas de programação estatística&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eu sou fluente em Java faz algum tempo e quando estou com pressa e quero resolver um problema logo normalmente escolho Java. Mas as ferramentas que encontrei em outras linguagens foram &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;show&lt;/span&gt;! Curva de aprendizado mínima se a pessoa souber programar em algo e tiver algum controle do computador.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scipy.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;Sci&lt;/span&gt;-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;Py&lt;/span&gt;&lt;/a&gt; foi a primeira ferramenta que me fez fazer algo útil de forma elegante. Ela gera gráficos e resolve mínimos quadrados, gera &lt;a href="http://en.wikipedia.org/wiki/Histogram"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;histogramas&lt;/span&gt;&lt;/a&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;plota&lt;/span&gt; os mais diversos tipos de gráficos, resolve equações e etc. Pensem em: 30 medições x 20 pontos, retiradas de 5 vídeos gerando 30 gráficos e mais um ultimo gráfico e &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;MMQ&lt;/span&gt; feitos a partir destas 30 medições. Foi feito tudo no &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;Sci&lt;/span&gt;-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;Py&lt;/span&gt;. Nada de ficar &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;puto&lt;/span&gt; com o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;excel&lt;/span&gt; travando! Meus problemas foram mais elegantes, como por exemplo "por que diabos isso aqui não tá certo?"&lt;br /&gt;&lt;br /&gt;O &lt;a href="http://www.r-project.org/"&gt;R&lt;/a&gt; foi a segunda e melhor ferramenta. Uma linguagem funcional (na época eu nem sabia o que diabos era uma linguagem funcional) focada em resolver problemas estatísticos. Na página de entrada do R já dá para ver os gráficos que o R gera. Além de gerar gráficos o R resolve muitos, mas muitos problemas de estatística. E um ponto curioso que eu só vi no R e em nenhuma outra linguagem de programação: O &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;workspace&lt;/span&gt; do R guarda estado. Por exemplo, você abre o shell, abre o shell do R em uma dada pasta, e carrega um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;array&lt;/span&gt; de valores em uma variável.  Depois que você vai para a mesma pasta e abre o R &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_30"&gt;de novo&lt;/span&gt;, pimba! Sua variável continua lá! Isso foi muito produtivo, pois eu ia tentando resolver os problemas e quando resolvia, se estivesse com preguiça de reproduzir tudo, não tinha problema. Meus valores continuavam lá e o histórico da linha de comandos do R também!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Resolvendo equações de forma simbólica&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.mathhelpforum.com/math-help/attachments/calculus/8260d1224281565-plz-help-me-solve-indefinite-integral-clipboard.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 241px; height: 177px;" src="http://www.mathhelpforum.com/math-help/attachments/calculus/8260d1224281565-plz-help-me-solve-indefinite-integral-clipboard.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Conheci o &lt;a href="http://maxima.sourceforge.net/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;Maxima&lt;/span&gt;&lt;/a&gt; e o &lt;a href="http://wxmaxima.sourceforge.net/wiki/index.php/Main_Page"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;wxMaxima&lt;/span&gt;&lt;/a&gt; (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;estenção&lt;/span&gt; do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;Maxima&lt;/span&gt; em &lt;a href="http://www.wxwidgets.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;wxWidgets&lt;/span&gt;&lt;/a&gt;) em uma matéria do ex-professor do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;IFUSP&lt;/span&gt;, Mário &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;Ferraretto&lt;/span&gt;. Este professor tinha as matérias mais úteis e divertidas do instituto. Foi uma pena para o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;IFUSP&lt;/span&gt; ele se aposentar e me arrependo de não ter feito mais matérias com ele. Deixando a agua-com-açúcar de lado, o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;Ferrareto&lt;/span&gt; apresentou o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;Maxima&lt;/span&gt; para mim. Ela resolve equações de forma simbólica (integral, derivadas, etc), &lt;a href="http://en.wikipedia.org/wiki/Laplace_transform"&gt;transformadas de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;laplace&lt;/span&gt;&lt;/a&gt;, e mais um monte de coisas que eu não tinha visto até então. Meus relatórios de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;Lab&lt;/span&gt; ficaram mais rápidos, pois eu poderia resolver as equações ou mesmo confirmar se a resolução que eu tinha feito sozinho estava correta! Essa foi uma das melhores dicas!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Gráficos com &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;GNUPlot&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.gnuplot.info/figs/title2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 307px; height: 180px;" src="http://www.gnuplot.info/figs/title2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Um dos meus melhores amigos fez Cálculo Numérico em outra turma, e acabou pegando umas equações em 3 dimensões para resolver. A resolução foi feita em C mas os gráficos foram feitos no &lt;a href="http://www.gnuplot.info/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;GNUPlot&lt;/span&gt;&lt;/a&gt;. E na boa, os gráficos ficaram legais &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;pacas&lt;/span&gt;! Parecia coisa de filme de ficção!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ferramentas que estudei pouco e vou dar mais atenção quando tiver tempo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Deveria ter estudado &lt;a href="http://www.gnu.org/software/octave/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_46"&gt;Octave&lt;/span&gt;&lt;/a&gt; (versão &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;opensource&lt;/span&gt; que compete com &lt;a href="http://www.maplesoft.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_48"&gt;Maple&lt;/span&gt;&lt;/a&gt;, que também não tive &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_49"&gt;contato&lt;/span&gt;), e principalmente deveria ter brincado mais com o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_50"&gt;Root&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;O &lt;a href="http://root.cern.ch/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_51"&gt;Root&lt;/span&gt;&lt;/a&gt; é um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_52"&gt;projeto&lt;/span&gt; de bibliotecas físicas em C++ focadas em física nuclear e de partículas. Substituto do &lt;a href="http://wwwasd.web.cern.ch/wwwasd/paw/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_53"&gt;PAW&lt;/span&gt;&lt;/a&gt;, uma ferramenta antiga feita em Fortran, o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_54"&gt;Root&lt;/span&gt; é usado até para cálculos com dados retirados do &lt;a href="http://lhc.web.cern.ch/lhc/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_55"&gt;LHC&lt;/span&gt;&lt;/a&gt; por exemplo, além de dados do &lt;a href="http://public.web.cern.ch/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_56"&gt;CERN&lt;/span&gt;&lt;/a&gt; em geral.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://hcc.web.cern.ch/hcc/file/field_lhc.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 242px;" src="http://hcc.web.cern.ch/hcc/file/field_lhc.png" alt="" border="0" /&gt;&lt;/a&gt;Se você gosta de física, ou mesmo de ficção científica, vá no &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_57"&gt;youtube&lt;/span&gt; e procure por &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_58"&gt;CERN&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_59"&gt;LHC&lt;/span&gt; e coisas do tipo que será divertido!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-481999046850727451?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/R-51dQCeYixggcNbGYk2VMQI0YQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R-51dQCeYixggcNbGYk2VMQI0YQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/R-51dQCeYixggcNbGYk2VMQI0YQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R-51dQCeYixggcNbGYk2VMQI0YQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/iIy7omDXjXY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/481999046850727451/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/04/programacao-numerica-e-as-ferramentas.html#comment-form" title="1 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/481999046850727451?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/481999046850727451?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/iIy7omDXjXY/programacao-numerica-e-as-ferramentas.html" title="Programação numérica e as ferramentas que conheci nos tempos de IFUSP" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/04/programacao-numerica-e-as-ferramentas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMMSHY4eip7ImA9WxJTE0w.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-7437630718085017331</id><published>2009-04-20T21:46:00.005-03:00</published><updated>2009-04-21T07:41:29.832-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-21T07:41:29.832-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Erlang" /><category scheme="http://www.blogger.com/atom/ns#" term="Linguagens Funcionais" /><title>Linguagens funcionais: uma ginástica mental</title><content type="html">&lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;Linguagens funcionais&lt;/a&gt; tem tido alguma prioridade no meu "&lt;a href="http://en.wikipedia.org/wiki/Scheduling_%28computing%29"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;scheduler&lt;/span&gt;&lt;/a&gt; de estudos". Não sou um especialista em funcionais, mas apenas um entusiasta... E tenho ficado cada vez mais entusiasmado com linguagens funcionais...&lt;br /&gt;&lt;br /&gt;Estou lendo &lt;a href="http://www.pragprog.com/titles/jaerlang/programming-erlang"&gt;aquele livro&lt;/a&gt; de &lt;a href="http://www.erlang.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Erlang&lt;/span&gt;&lt;/a&gt; da série do &lt;a href="http://www.pragprog.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Pragmatic&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Programmer&lt;/span&gt;&lt;/a&gt;... E o mais engraçado foi que uma vez um amigo meu que está usando F# faz algum tempo me disse que ao estudar linguagens funcionais você acaba mudando seu jeito de programar.&lt;br /&gt;&lt;br /&gt;Uma característica de linguagens funcionais (pelo menos de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Erlang&lt;/span&gt;) é que não existem variáveis, mas apenas constantes. E com isso percorrer listas tem que ser por recursividade, pois não temos como ir alterando as variáveis dentro de um &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;while&lt;/span&gt;. &lt;a href="http://en.wikipedia.org/wiki/Tail_recursion"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Tail&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;recursion&lt;/span&gt;&lt;/a&gt; aparece nestas horas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Ao invés de:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;for(&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;int&lt;/span&gt; i=0;i&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;size;i++){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    // faz algo com array[i]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;temos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;faz_algo([]) -&gt; 0 ; %apenas para casar o tail recursion no final da lista&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;faz_algo([H|T]) -&gt; % faz algo com H e chama faz_algo(T)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Não temos um loop explicito, mas sim funções que são chamadas recursivamente de acordo com os parametros passados... Por exemplo, o for vira duas funções: uma para aceitar lista cheia e outra para aceitar lista vazia. O barato é que o loop vira naturalmente chamadas de função. E inner loops viram chamadas de função. Não teremos milhares de loops alinhados, o que iria dificultar a leitura do código. Ou alguém gosta daqueles códigos que parece desenho de escadas?&lt;br /&gt;O mesmo se aplica para os IFs:&lt;br /&gt;&lt;br /&gt;Ao invés de:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if(i==0){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   // faz algo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;} else {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  // faz outra cosia&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;temos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;func(0) -&gt; faz_algo;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;func(N) -&gt; faz_outra_coisa .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Naturalmente as linguagens funcionais evitam condicionais e &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;loops&lt;/span&gt;&lt;/span&gt; pois a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;runtime&lt;/span&gt;&lt;/span&gt; acaba &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;casando&lt;/span&gt; as chamadas de acordo com o padrão. Ele tem a inteligência de quando o input da função for 0 ele chama a primeira, caso contrário chama a segunda. E o código fica naturalmente &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_12"&gt;legível&lt;/span&gt; mais uma vez.&lt;br /&gt;&lt;br /&gt;Temos também as variáveis que não variam! Para que servem então? Ajudam a manter o código legível, mas por outro lado não deixam dúvidas sobre onde em que parte do código tal valor foi inserido e gerou mudança. Por exemplo: imagine um código comum de umas 2000 linhas. Imagine a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_13"&gt;variável&lt;/span&gt; x mudando N vezes no meio do código, e o bug sendo causado por um valor errado em x. Em &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Erlang&lt;/span&gt;&lt;/span&gt;, teremos que criar uma nova &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_15"&gt;variável&lt;/span&gt; para cada atribuição de x. O ponto de erro ficara mais claro, pois o erro vai estar na x1, ou na x2, ou na &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;xn&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;O mais engraçado foi eu me pegar durante uma codificação em &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_17"&gt;Java&lt;/span&gt; com navegação em árvores eu fazendo N chamadas de função e ainda por cima sentir falta de escrever uma função que recebesse &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;null&lt;/span&gt;&lt;/span&gt; para economizar uns &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;ifs&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ah, e temos mais vantagens nestas abordagens: Com as variáveis constantes acaba sendo simples de distribuir o código. A abordagem do Erlang é usar mensagens entre Threads. Então não temos os locks explícitos no código, o que simplifica um bocado a programação multi-threaded.&lt;br /&gt;&lt;br /&gt;Estudar funcionais tem sido uma ginástica mental. Novos pontos de vista acabam alterando para melhor a forma de codificar. Para quem não quer sair da &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;JVM&lt;/span&gt;&lt;/span&gt; existe &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;. Também tem a &lt;a href="http://caml.inria.fr/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;OCaml&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; que tem sido uma linguagem funcional de destaque.&lt;br /&gt;&lt;br /&gt;Ah sim, se você não entender muita coisa, saiba que eu não fui muito didático neste post. Quem tem alguma noção de funcionais sabe o quanto de informação simples existe aqui! Começe a "ginástica mental" e procure alguma linguagem funcional para estudar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-7437630718085017331?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sdDFnzMbD51eql_o3hry2agW0R4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sdDFnzMbD51eql_o3hry2agW0R4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sdDFnzMbD51eql_o3hry2agW0R4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sdDFnzMbD51eql_o3hry2agW0R4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/aF_9LlGyYKg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/7437630718085017331/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/04/linguagens-funcionais-uma-ginastica.html#comment-form" title="2 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/7437630718085017331?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/7437630718085017331?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/aF_9LlGyYKg/linguagens-funcionais-uma-ginastica.html" title="Linguagens funcionais: uma ginástica mental" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/04/linguagens-funcionais-uma-ginastica.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAHR3kycCp7ImA9WxJTEk8.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-6849185091828006362</id><published>2009-04-20T06:41:00.005-03:00</published><updated>2009-04-20T07:35:36.798-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-20T07:35:36.798-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OFFTOPIC" /><category scheme="http://www.blogger.com/atom/ns#" term="Criticas" /><category scheme="http://www.blogger.com/atom/ns#" term="Dicas" /><title>COBOL ainda é bastante usado...</title><content type="html">Já tive algum &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;contato&lt;/span&gt; com &lt;a href="http://en.wikipedia.org/wiki/Clipper_programming_language"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;CLIPPER&lt;/span&gt;&lt;/a&gt; e &lt;a href="http://en.wikipedia.org/wiki/Delphi_%28programming_language%29"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Delphi&lt;/span&gt;&lt;/a&gt; em épocas que eu não sabia a programar, mas sabia fazer &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;copy&lt;/span&gt;-n-paste. Mesmo sem saber programar desenvolvi software e dei manutenção durante meses. Assim que aprendi a programar fui "trabalhar com programação mesmo". De fato, existem ferramentas e linguagens com curva de aprendizado bem curta, o que é uma vantagem para quem contrata, pois o programador custa barato e não existe dor de cabeça para encontrar programadores.&lt;br /&gt;&lt;br /&gt;O que existe é dor de cabeça para escrever software de qualidade. A partir do momento que um programador menos experiente é contratado ele não irá escrever software de qualidade. Já vi muita coisa boa escrita em &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;VB&lt;/span&gt; e &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Delphi&lt;/span&gt; por pessoas que gostavam de estudar a fundo estas ferramentas. Para mim são ferramentas ou linguagens + ferramentas e não apenas linguagens. As IDEs são excelentes, e diga-se de passagem, mais produtivas do que muita IDE Java paga que existe hoje em dia.&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;CLIPPER&lt;/span&gt; eu realmente acho muito "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;old&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;style&lt;/span&gt;". Apesar dos recursos que eu já vi programadores experientes em &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;clipper&lt;/span&gt; usando serem realmente bons. Os mesmos programadores experientes que conheci não escreviam, digamos "bom software".&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;PL&lt;/span&gt;/SQL é outra linguagem fácil de aprender que já vi ficar em mão de estagiários sem base alguma e ver que eles escreviam "algo" (existem &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;ótimos&lt;/span&gt; estagiários que não se encaixam neste comentário.). A questão é quando temos uma base com milhões de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;registros&lt;/span&gt; e relacionamentos complicados. Se o cara não souber ler o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;explain&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;plan&lt;/span&gt; e fazer algo direito, problemas de performance irão brotar. Muitas vezes isso é diagnosticado apenas em produção e aí sim vemos que a economia na hora de colocar o programadores &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_15"&gt;inexperientes&lt;/span&gt; não compensa.&lt;br /&gt;&lt;br /&gt;O mesmo cenário é &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_16"&gt;repetido&lt;/span&gt; muitas vezes: Os líderes acostumados com a curva de aprendizado nestas linguagens querem que os novos programadores aprendam &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_17"&gt;Java&lt;/span&gt; na mesma velocidade. Para aprender Java direito (o que não é difícil, mas demorado) é necessário aprender a linguagem, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;OO&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;Design&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;Patterns&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;Frameworks&lt;/span&gt;...&lt;br /&gt;&lt;br /&gt;Agora vamos falar do tópico do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;post&lt;/span&gt;: COBOL&lt;br /&gt;&lt;br /&gt;Não conheço muito COBOL mas inevitavelmente tenho que conversar com programadores COBOL. Já peguei programadores COBOL com mais de 20 a 40 anos de experiência (isso é sério) que mal sabiam mexer no Windows ou mesmo viraram péssimos analistas de negócio. Voltaram a trabalhar com COBOL assim que possível... Eu lembro que eu brincava "Programar COBOL é virar &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;digitador&lt;/span&gt; de regras de negócio". Mas até então nunca havia ficado em ambiente misto com programadores COBOL.&lt;br /&gt;&lt;br /&gt;Hoje estou numa sala com aproximadamente 14 caras de Java para uns 40 de COBOL e mais uma quantidade pouco menor de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;PL&lt;/span&gt;/SQL. Aliás quem mexe com &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;PL&lt;/span&gt; nesta empresa mexe com COBOL. Mesmo que seja novo. E o pessoal aprende COBOL. Fácil.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/4/49/Ibm704.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 360px; height: 235px;" src="http://upload.wikimedia.org/wikipedia/commons/4/49/Ibm704.gif" alt="" border="0" /&gt;&lt;/a&gt;Já conversei com gente vivida e depois confirmei o que disseram na &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;internet&lt;/span&gt; sobre os Mainframes COBOL. Eles usam &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;virtualização&lt;/span&gt; desde antes de eu nascer e são escalonáveis de forma bem fácil. Tem que pagar o preço, mas você consegue melhoras o mesmo servidor. Nada de se preocupar com &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;clustering&lt;/span&gt; para melhorar performance. Melhorando a mesma máquina não temos problema de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;IO&lt;/span&gt; de rede. E ainda por cima uma linguagem que surgiu em meados de 1960 teve algum tempo para ter seu hardware e software &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_30"&gt;evoluídos&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Vi a ferramenta que eles desenvolvem e parece ser algo produtivo. Navegam pelos fontes de forma bem rápida. Mas de fato ao ler o código tive uma sensação de nojo. Pode ser apenas preconceito meu, mas eu tive.&lt;br /&gt;&lt;br /&gt;No&lt;a href="http://en.wikipedia.org/wiki/COBOL"&gt; artigo da &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;Wikipedia&lt;/span&gt; sobre COBOL&lt;/a&gt;, vi uma frase do &lt;a href="http://en.wikipedia.org/wiki/Edsger_W._Dijkstra"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;Dijkstra&lt;/span&gt;&lt;/a&gt; retirada deste &lt;a href="http://www.cs.utexas.edu/users/EWD/transcriptions/EWD04xx/EWD498.html"&gt;link&lt;/a&gt; que achei bem interessante:&lt;br /&gt;&lt;br /&gt;"&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;The&lt;/span&gt; use &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;of&lt;/span&gt; COBOL &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;cripples&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;mind&lt;/span&gt;; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;its&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;teaching&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;should&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;therefore&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;be&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;regarded&lt;/span&gt; as a criminal &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;offence&lt;/span&gt;."&lt;br /&gt;&lt;br /&gt;Concordo que milhões foram gastos para desenvolver o legado de COBOL existente hoje, e que as empresas precisam dar manutenção nisto tudo. Mas para o programador realmente a frase faz sentido. As soluções propostas pelos programadores COBOL para problemas sérios normalmente são gambiarras que não irão funcionar. Ter que ficar imerso neste mundo tão diferente do meu &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_45"&gt;enquanto&lt;/span&gt; desenvolvo software tem sido um exercício e tanto!&lt;br /&gt;&lt;br /&gt;PS: uma linguagem pode ter curva de aprendizado curta, ser rica em recursos e ainda ser elegante e &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_46"&gt;útil&lt;/span&gt; mesmo para o programador experiente. &lt;a href="http://en.wikipedia.org/wiki/Ruby_%28programming_language%29"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;Ruby&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Groovy_%28programming_language%29"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_48"&gt;Groovy&lt;/span&gt;&lt;/a&gt; e &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_49"&gt;principalmente&lt;/span&gt; a mais madura &lt;a href="http://en.wikipedia.org/wiki/Python_%28programming_language%29"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_50"&gt;Python&lt;/span&gt;&lt;/a&gt; são &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_51"&gt;ótimos&lt;/span&gt; exemplos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-6849185091828006362?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wc4yQ-dKc1s97cj8ahVlYoOoux0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wc4yQ-dKc1s97cj8ahVlYoOoux0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wc4yQ-dKc1s97cj8ahVlYoOoux0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wc4yQ-dKc1s97cj8ahVlYoOoux0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/pxoLy0X53zw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/6849185091828006362/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/04/cobol-ainda-e-bastante-usado.html#comment-form" title="2 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/6849185091828006362?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/6849185091828006362?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/pxoLy0X53zw/cobol-ainda-e-bastante-usado.html" title="COBOL ainda é bastante usado..." /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/04/cobol-ainda-e-bastante-usado.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EDRXk6eyp7ImA9WxVaGEg.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-910571083381934312</id><published>2009-04-15T23:47:00.002-03:00</published><updated>2009-04-16T00:14:34.713-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-16T00:14:34.713-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OFFTOPIC" /><category scheme="http://www.blogger.com/atom/ns#" term="Dicas" /><title>Qual é a melhor [digite algo polêmico aqui]??</title><content type="html">Já vi e vejo muitas discussões, seja em listas de discussão, botecos e etc., sobre qual a melhor IDE, linguagem de programação, biblioteca, etc. Aliás, eu mesmo já iniciei discussões do tipo...&lt;br /&gt;&lt;br /&gt;Existem algumas respostas padrão em cima do muro que são por exemplo: "use a ferramenta certa para resolver o problema certo", "a ferramenta certa é a que você sabe usar", ou a "estas opções são complementares e não concorrentes". A ultima resposta "default" é a melhor delas com certeza. Apesar de eu gostar de ver opiniões como "O Eclipse é melhor pelos recursos de refactor", "C é melhor por que você tem noção do assembly gerado enquanto Java carrega uma VM gorda" a resposta de "estas opções não são concorrentes" abre espaço para uso de tudo.&lt;br /&gt;&lt;br /&gt;Minha preferência por IDE de longe é o Eclipse, seja para C, seja para Java. Em Java eu instalo sempre o Netbeans e o JDeveloper, e sempre mantenho um Emacs por perto. Já viram os diagramas ER com JDeveloper, ou mesmo os UMLs? São ótimos! Gerar JPA no Netbeans economiza um tempo de não precisar configurar o Hibernate Tools e configs JPA no Hibernate Tools no Eclipse (que é um pé no saco).&lt;br /&gt;&lt;br /&gt;Em C tenho usado Eclipse na maior parte do tempo, e QtCreator, que é muito bom mas perde no code complete para o Eclipse CDT. O XCode é divertido para desenvolvimento plataforma Mac/ObjC/Cocoa e já brinquei com ele e gostei.&lt;br /&gt;&lt;br /&gt;Resumindo, para IDEs estou sempre procurando "a melhor", mas instalo tudo. E sim, mantenho a opção que mais uso e domino, e tenho as outras como "cartas na manga".&lt;br /&gt;&lt;br /&gt;Linguagens de programação já foram mitos para mim. Não conhecia C/C++ e achava melhor pelos problemas de performance que tive em alguns projetos grandes em Java. Conheci C e entendi as diferenças que C++ adiciona. Tenho noção do poder de C++, mas ao mesmo tempo curva de aprendizado é um "concern" a ser considerado. Adorei Qt. Gostei do Boost mas não sou produtivo com ele. Sou fã das linguagens funcionais, e se pudesse só usaria elas para server side. Mas para interface com usuário ainda não achei algo que gostasse 100% (Qt e Cocoa se aproximam mas não me convenceram). Linguagens de script me ajudam no dia-a-dia e vejo que as vezes sinto falta da tipagem. Especialmente quando preciso reutilizar algo que fiz de forma diferente...&lt;br /&gt;&lt;br /&gt;Por um lado não parei de procurar a linguagem/ferramenta/framework ideal para resolver alguns problemas, mas por outro lado trabalho com Java e preciso usar as frameworks em Java para resolver meus problemas. Mas estudar outras formas muda constantemente meu estilo de programar para melhor, e me sinto de olhos abertos para o mundo. Como disse um amigo meu: "programar direito eu programo em casa" e "trabalho é para ganhar dinheiro". Vou praticar mais em futuros opensources ;-)&lt;br /&gt;&lt;br /&gt;Ah, e adoro quando acho alguma Thread em lista de discussão sobre "qual é o melhor blablabla"! Ou aquelas infinitas "Vim vs Emacs". Sempre acho algo que não tinha visto no meio dos ataques! e independente de ataques sempre tem alguma coisa de útil para peneirar em tais Threads...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-910571083381934312?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/komuf995u6bGxdTkVrjKVOLMDV4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/komuf995u6bGxdTkVrjKVOLMDV4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/komuf995u6bGxdTkVrjKVOLMDV4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/komuf995u6bGxdTkVrjKVOLMDV4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/DUNQE4zpAw8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/910571083381934312/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/04/qual-e-melhor-digite-algo-polemico-aqui.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/910571083381934312?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/910571083381934312?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/DUNQE4zpAw8/qual-e-melhor-digite-algo-polemico-aqui.html" title="Qual é a melhor [digite algo polêmico aqui]??" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/04/qual-e-melhor-digite-algo-polemico-aqui.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIBQXozfSp7ImA9WxVbFUk.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-2414094593952128809</id><published>2009-03-31T21:16:00.003-03:00</published><updated>2009-03-31T21:42:30.485-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-31T21:42:30.485-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OFFTOPIC" /><category scheme="http://www.blogger.com/atom/ns#" term="OS" /><category scheme="http://www.blogger.com/atom/ns#" term="Mac" /><title>Ficando fã de maças</title><content type="html">Fiz minha melhor aquisição de todos os tempos no ano passado: um MacBook. Depois de arranjar desculpas para instalar o Linux nele (como todo bom Xiita de Linux, como eu iria usar MacOS?) usei Linux nele durante uns 3 meses. A bateria durava apenas umas 3 horas e era possível fritar um ovo no Mac durante o uso do Linux. Vi o MacBook de um amigo meu, e com Windows fica igualzinho.&lt;br /&gt;&lt;br /&gt;Estava de saco cheio de cozinhar qualquer objeto que eu colocasse o MacBook em cima. Depois de refletir um pouco e ver que de fato quem projeta o hardware pode fazer um software melhor, acabei por tentar o MacOS. Desde então estou cada vez mais fã de MacOS.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.jeb.be/Apple/apple_logo_%28640x480%29.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 213px; height: 160px;" src="http://images.jeb.be/Apple/apple_logo_%28640x480%29.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Andei estudando &lt;a href="http://en.wikipedia.org/wiki/Cocoa_%28API%29"&gt;Cocoa&lt;/a&gt; e Objective C. Uma framework de aplicações genial e bela. Uma prova de que softwares elegantes podem evoluir e ir para frente. Como um programador Java, apesar de algumas coisas que não gostei em Objective C, Cocoa mostrou que o comportamento dinâmico de uma linguagem, quando utilizado da forma correta, pode ser extremamente poderoso.&lt;br /&gt;O único defeito de Cocoa é não ser multi-plataforma (até onde eu sei). Isto me faz pensar em Qt para desenvolver multi plataforma para códigos nativos. Mas estudar Cocoa mostra um uso interessante de programação OO e comportamentos dinâmicos.&lt;br /&gt;&lt;br /&gt;Agora a ultima coisa que gostei pacas no Mac é o próprio sistema operacional!&lt;br /&gt;&lt;br /&gt;O &lt;a href="http://en.wikipedia.org/wiki/XNU"&gt;XNU&lt;/a&gt; (XNU is Not Unix), Kernel do MacOS foi feito de forma bem interessante: Foi utilizada uma arquitetura de &lt;a href="http://en.wikipedia.org/wiki/Microkernel"&gt;MicroKernel&lt;/a&gt; (baseada em mensagem entre os componentes) retirada do &lt;a href="http://en.wikipedia.org/wiki/Mach_%28kernel%29"&gt;Mach 3&lt;/a&gt;. A questão de mensagens entre os componentes tem uma coisa boa e uma coisa ruim. A coisa boa é elegancia e fácil manutenção pois o kernel fica baseado em componentes que enviam e recebem mensagens, da forma como o Tanenbaum prega. Ao mesmo tempo, o Kernel monolítico (apenas em um bloco) não tem o overhead de envio de mensagens entre os componentes, o que o torna mais rápido. Até teve a &lt;a href="http://www.dina.kvl.dk/%7Eabraham/Linus_vs_Tanenbaum.html"&gt;famosa discussão&lt;/a&gt; entre o Linus e o Tanenbaum que versava sobre as vantagens e desvantagens de cada abordagem. Este tipo de discussão nos dias de hoje em que os processadores evoluem de forma absurda perde um pouco (eu disse um pouco) a razão de ser.&lt;br /&gt;&lt;br /&gt;Enfim, o XNU foi feito com partes do FreeBSD e partes do Mach 3. O FreeBSD tem licença mais flexivel que a do Linux e o código muda menos, o que o torna mais fácil de ser escolhido, correto? Não sei. O que eu vi no Sr Google é que a Apple chegou a ajudar o projeto mkLinux, que é um Linux com uso de MicroKernel. Não sei se eles já pretendiam fazer algo do tipo desde então, mas que o fato é interessante, ah, isso é!&lt;br /&gt;&lt;br /&gt;Ok, o XNU tem MicroKernel com mesclas de FreeBSD. Tem algo a mais que eu achei que fechou com chave de ouro: A parte de Drivers é OO. Não posso arriscar a falar muito, mas o I/O Kit (arquitetura de drivers do XNU) é feito usando um sub-set do C++, o que torna o código OO de forma mais natural do que ficar preenchendo structs de ponteiros de função e coisas do tipo!&lt;br /&gt;&lt;br /&gt;Adoro Macs!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-2414094593952128809?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/INI6QDOfnV5wx3C1-dgzREzavL0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/INI6QDOfnV5wx3C1-dgzREzavL0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/INI6QDOfnV5wx3C1-dgzREzavL0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/INI6QDOfnV5wx3C1-dgzREzavL0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/o-Mi4psitm0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/2414094593952128809/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/03/ficando-fa-de-macas.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/2414094593952128809?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/2414094593952128809?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/o-Mi4psitm0/ficando-fa-de-macas.html" title="Ficando fã de maças" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/03/ficando-fa-de-macas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4HRnk8fCp7ImA9WxVbFUk.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-5698616566965087318</id><published>2009-03-31T21:04:00.003-03:00</published><updated>2009-03-31T21:15:37.774-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-31T21:15:37.774-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Cerveja" /><category scheme="http://www.blogger.com/atom/ns#" term="Dicas" /><title>Cervejas belgas em alto level</title><content type="html">Não me lembro ao certo quantos dias fazem, mas fui com uns amigos tomar cerveja e comer pasteis no &lt;a href="http://www.tortula.com.br/"&gt;Tortula&lt;/a&gt;. A princípio parece destas padarias frescas com muita variedade e produtos de primeiríssima linha. Além disso tudo, o cardápio de cervejas é dos mais variados que já vi! Deixa muitos empórios com vergonha, pois a variedade é absurda. Especialmente no caso de cervejas belgas! O único ponto negativo (porém justificável tanto pela variedade quanto pela região) é o preço. Muitas cervejas ráras com o preço justo de uma raridade.&lt;br /&gt;&lt;br /&gt;Achei a variedade de Ales do &lt;a href="http://www.thejoy.com.br"&gt;The Joy&lt;/a&gt; melhor e mais barato para as cervejas de custo médio (entre 6 e 50 reais). A variedade do Tortula é melhor para cervejas com custo mais caro (entre 50 e 400 reais). Como ainda não ganhei na sena e não executei nenhuma das ideias possivelmente boas que eu já tive para ganhar dinheiro não pude desfrutar da variedade do Tortula. Mas para quem gosta de beber coisas boas vale a pena conferir! Ah sim, e lá tem coisas mais comuns como Skol (eca!), Bohemia/Original (argh!) e chopp de Erdinger e Guinness...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-5698616566965087318?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mRrDnd9W3yBRiIDXuTnvlb28Suk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mRrDnd9W3yBRiIDXuTnvlb28Suk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mRrDnd9W3yBRiIDXuTnvlb28Suk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mRrDnd9W3yBRiIDXuTnvlb28Suk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/yOy_iCM95-k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/5698616566965087318/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/03/cervejas-belgas-em-alto-level.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/5698616566965087318?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/5698616566965087318?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/yOy_iCM95-k/cervejas-belgas-em-alto-level.html" title="Cervejas belgas em alto level" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/03/cervejas-belgas-em-alto-level.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUFR309fyp7ImA9WxVbFUk.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-4899316361959975400</id><published>2009-03-31T20:51:00.002-03:00</published><updated>2009-03-31T21:03:36.367-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-31T21:03:36.367-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OFFTOPIC" /><title>Sim, de volta a vida!</title><content type="html">Pois é! Ganhei uma equipe só depois que o prazo do meu projeto atual apertou um bocado! Mas enfim, os tickets do sprint atual estão andando mais rápido do que o esperado! O "sprint" para quem não está acostumado com scrum é um dos muitos ciclos curtos de um projeto. Maiores informações numa &lt;a href="http://en.wikipedia.org/wiki/Scrum_%28development%29"&gt;wikipedia&lt;/a&gt; próxima de você.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.bwingames.se/begood/image_db.php?id=81"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 340px; height: 255px;" src="http://www.bwingames.se/begood/image_db.php?id=81" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;O legal não é exatamente os tickets estarem andando, mas sim estarem andando mais rápido do que o esperado, num cenário totalmente complexo tecnicamente e SEM OVERTIME!&lt;br /&gt;&lt;br /&gt;Apesar de não ser pago para isso, eu fico revoltado de ver gente fazendo overtime sem o serviço render de fato. Fiz um discurso bonito dizendo que nenhum dos programadores Jr da equipe precisariam fazer overtime, nem que para isso eu e mais uns amigos fossem "sacrificados".&lt;br /&gt;&lt;br /&gt;Discurso bonito a parte, eu tinha quase certeza absoluta que pelo menos eu precisaria fazer overtime neste sprint. Mas acabamos fazendo um "quase pair programming" para agilizar o mentoring. E acabou que a galera está evoluindo mais rápido do que eu esperava!&lt;br /&gt;&lt;br /&gt;Aos poucos estou voltando a blogar e beber cerveja com os amigos com mais frequência!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-4899316361959975400?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hYemRSNMRF9bV8X_nNVzUVOiFJI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hYemRSNMRF9bV8X_nNVzUVOiFJI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hYemRSNMRF9bV8X_nNVzUVOiFJI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hYemRSNMRF9bV8X_nNVzUVOiFJI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/q2WZDWQni14" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/4899316361959975400/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/03/sim-de-volta-vida.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/4899316361959975400?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/4899316361959975400?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/q2WZDWQni14/sim-de-volta-vida.html" title="Sim, de volta a vida!" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/03/sim-de-volta-vida.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUCQnw8fSp7ImA9WxVUGEs.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-853826758922041598</id><published>2009-03-24T00:19:00.003-03:00</published><updated>2009-03-24T01:01:03.275-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-24T01:01:03.275-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OFFTOPIC" /><category scheme="http://www.blogger.com/atom/ns#" term="Dicas" /><title>De volta a vida?</title><content type="html">Postura profissional, ética, comprometimento e coisas do tipo podem ter um alto preço de vez em quando. Nas ultimas semanas tenho dado pouca atenção aos meus amigos, meu rolo e etc, pois estava (continuo) apagando incêndio no cliente. Tivemos uma semana para produzir um parser de fórmulas, desenvolver um monte de webservices em jaxws com muitas restrições e resolver inúmeros problemas técnicos graças a algumas imposições políticas. O gerador de códigos que eu fiz (e que dentro de algumas semanas estarei publicando) foi útil. Muito útil.&lt;br /&gt;&lt;br /&gt;Muitas vezes se conformar com o cenário proposto não é suficiente. O cenário proposto não estava funcionando. Por outro lado, uma equipe de programadores competentes e porra-loucas só consegue confiança mostrando serviço. Foi isso o que fizemos nas ultimas semanas. Fizemos mantendo o bom humor, falando bobagens o dia inteiro e tirando sarro dos colegas de trabalho sempre que possível. Entregamos os tickets do sprint no prazo combinado. E agora acumulamos responsabilidades. Ter o controle do processo tem seu preço. Mas é melhor confiar em si mesmo do que nos outros, não é mesmo? :D&lt;br /&gt;&lt;br /&gt;Passamos pelo menos 8h/dia no trabalho. Isso equivale a 1/3 do dia. Se considerarmos uma semana, podemos pensar em 1/3 de cinco dias por semana: 5/7 x 1/3 = 5/21 ~ 1/4. Aproximadamente 1/4 de nossa vida (para quem não tira férias) é passado trabalhando. E pretendo viver uma vida de bom humor. Não abro mão de 1/4 dela. Trabalhar não precisa ser um castigo. Certas horas é difícil lutar contra isso. Vivemos em um mundo com pessoas inesperientes e/ou incompetentes, que acreditam que para trabalhar direito e entregar projetos desafiadores é necessário se sacrificar. E ainda acreditam que ao pressionar programadores conseguirão entregas mais rápidas. Continuo não acreditando nisso.&lt;br /&gt;&lt;br /&gt;Uma coisa que aprendi desde de cedo: Se passo tanto tempo em algum lugar tenho que fazer o que gosto. Por sorte escolhi e gosto de uma profissão rentável. Porém não trabalho carimbando papeis o dia inteiro. Programar significa a cada projeto ter que se adaptar a um cenário político e técnico considerávelmente diferente. Este tipo de coisa acaba consumindo muito a sua mente caso não tome cuidado. Mas este tipo de dinamismo é ao mesmo tempo desafiador e empolgante. Tédio é algo que dificilmente tenho trabalhando.&lt;br /&gt;&lt;br /&gt;Tem uma história que sempre conto que éra de um projeto com prazo de 2 meses para entrega de um software desktop com servidor de aplicação customizado para empréstimos. Ele era razoavelmente complexo. Como sempre eu chegava atrazado. Mas dava o fora da empresa pontualmente, e muitas vezes fazia 2h de almoço. Entreguei todas minhas atividades pontualmente. E 30% das atividades dos meus colegas de empresa na época foram entregues por mim pontualmente. Eu fui o único funcionário que não fazia horas extras e apesar de ter entregue tudo o que eu devia e mais um pouco era taxado de folgado na empresa. Mas ao sair da empresa, recebi tudo o que foi possível de propostas para ficar.&lt;br /&gt;&lt;br /&gt;O recado é mais para o pessoal que está começando na profissão: Você não precisa se sacrificar para mostrar serviço. Você precisa se dedicar. E é possível trabalhar com bom humor e qualidade de vida. Basta fazer uso de seu bom senso. Você não será mandado embora por recusar trabalhar aos sabados e domingos de graça. Você pode trabalhar 8 horas por dia ou menos e ser altamente produtivo. A produtividade do programador não é uma função temporal linear. Eu diria que é uma função de N variáveis caótica.&lt;br /&gt;&lt;br /&gt;Hoje voltei a sair no horário, e estou voltando aos poucos ao normal com meu ritmo de estudos pessoal. Devo voltar a publicar artigos interessantes (e não um monte de blá blá blá off topic) logo mais.&lt;br /&gt;&lt;br /&gt;Um abraço a todos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-853826758922041598?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VY3Yh7uTcFPGoOrDmmOVpq1pv2I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VY3Yh7uTcFPGoOrDmmOVpq1pv2I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VY3Yh7uTcFPGoOrDmmOVpq1pv2I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VY3Yh7uTcFPGoOrDmmOVpq1pv2I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/CpIfvKBZSAw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/853826758922041598/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/03/de-volta-vida.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/853826758922041598?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/853826758922041598?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/CpIfvKBZSAw/de-volta-vida.html" title="De volta a vida?" /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/03/de-volta-vida.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYHQXY6fip7ImA9WxVVGU4.&quot;"><id>tag:blogger.com,1999:blog-4861028728666322714.post-2828520839421794385</id><published>2009-03-13T06:42:00.003-03:00</published><updated>2009-03-13T06:55:30.816-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-13T06:55:30.816-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OFFTOPIC" /><category scheme="http://www.blogger.com/atom/ns#" term="CodeGen" /><category scheme="http://www.blogger.com/atom/ns#" term="Dicas" /><title>Geração de código, a saga continua...</title><content type="html">Meu &lt;a href="http://malditoprogramadorbebado.blogspot.com/2009/02/geracao-automatica-de-codigo-diferentes.html"&gt;post anterior&lt;/a&gt; precisa de um "@Deprecated" por um simples motivo: XQuery precisa gerar XML válido. Quando fui amadurecer os templates em XQuery e precisei gerar uma simples lista de propriedades, vi que não tinha como gerar cada propriedade usando XQuery sem que cada item fosse um XML válido.&lt;br /&gt;&lt;br /&gt;O problema estava na minha frente: projetei mal e tive uma péssima idéia achando que iria dominar o mundo (de geração de código). Mas ainda queria os metadados em XML e queria não meter a mão no código java para adicionar/modificar os templates. Descobri que o &lt;a href="http://freemarker.sourceforge.net/"&gt;Freemarker&lt;/a&gt;  lê os XMLs de entrada e transforma em metadados legíveis pelo template! Meu objetivo de gerar código a partir dos metadados de um XML ainda era possível com relativo "pouco custo".&lt;br /&gt;&lt;br /&gt;O protótipo de meu futuro primeiro projeto opensource já está gerando código para algum projeto de alguma grande instituição financeira próxima de você. Logo mais irei publicar. Mas já dá para comentar algo sobre a abordagem de gerar código a partir de metadados em XML:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Funciona: funciona bem e está salvando minha pele. Tenho muitas entregar para fazer (meus amigos, rolo e leitores do blog que o digam! eu desapareci por um tempo :D)&lt;/li&gt;&lt;li&gt;Novos problemas: a manutenção dos templates fica difícil com o tempo. Eles ganham complexidade para gerar código complexo. Gerar DTOs, XMLs e coisas do tipo é tranquilo. Mas temos templates que geram chamadas delegadas de código!&lt;/li&gt;&lt;li&gt;Baixa curva de aprendizado: um grande amigo meu que trabalha comigo "tomou conta da criança" e está escrevendo e dando manutenção nos templates. Tudo bem que o cara manja, mas em menos de 1 dia ele estava metendo a mão nos templates e melhorando consideravelmente a qualidade do código gerado!&lt;/li&gt;&lt;li&gt;Não é só para Java ou código: É um gerador de arquivos texto baseado em entrada de metadados. Serve para qualquer coisa que seja uma tarefa repetitiva de escrever arquivos texto.&lt;/li&gt;&lt;/ol&gt;Pois é! Na próxima semana ainda devo estar off-line, mas logo logo publico o projeto. Falta escrever documentação e preparar bem os exemplos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4861028728666322714-2828520839421794385?l=malditoprogramadorbebado.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Wkb2mkcSysQn47GW7UBhLF2-9WQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Wkb2mkcSysQn47GW7UBhLF2-9WQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Wkb2mkcSysQn47GW7UBhLF2-9WQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Wkb2mkcSysQn47GW7UBhLF2-9WQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/OpqqopodOp/~4/z0Ny4dJD8Ok" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://malditoprogramadorbebado.blogspot.com/feeds/2828520839421794385/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://malditoprogramadorbebado.blogspot.com/2009/03/geracao-de-codigo-saga-continua.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/2828520839421794385?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4861028728666322714/posts/default/2828520839421794385?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OpqqopodOp/~3/z0Ny4dJD8Ok/geracao-de-codigo-saga-continua.html" title="Geração de código, a saga continua..." /><author><name>Feu Teston</name><uri>http://www.blogger.com/profile/09353906071753829290</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/_Xq12n58OrDM/SvyGmyfqrYI/AAAAAAAAAD0/_OWNQvAvimg/S220/Photo+144.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://malditoprogramadorbebado.blogspot.com/2009/03/geracao-de-codigo-saga-continua.html</feedburner:origLink></entry></feed>

