<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8900086</id><updated>2012-01-20T09:05:48.107-02:00</updated><category term='tipagem estática'/><category term='hibernate'/><category term='generalizações lição_aprendida hibernate JSTL clojure'/><category term='arquitetura de software'/><category term='ironia'/><category term='framework'/><category term='estúpido cerimoniosa linguagem Java'/><category term='reclamação nota_mental publicidade chefes'/><category term='java'/><category term='suntechdays'/><category term='blogs popularidade'/><category term='java suntechdays'/><title type='text'>MecanicaMente</title><subtitle type='html'>Alucinações de uma mente mecânica</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default?start-index=101&amp;max-results=100'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>128</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8900086.post-1854495327294002509</id><published>2011-02-12T12:57:00.000-02:00</published><updated>2011-02-12T12:57:04.700-02:00</updated><title type='text'>Arquitetura de Software: Performance</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: large;"&gt;Como garantir que seu software tenha Performance?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
As pessoas da área de exatas normalmente se esquecem, mas a comunicação verbal não é uma coisa lá muito certinha, grande parte das palavras não possui definição exata e depende muito do contexto. Então, antes de começar, vamos evitar a confusão e a baderna e vamos definir direitinho o que é "Performance" no contexto desse artigo.&lt;br /&gt;
&lt;br /&gt;
Quando digo "Perfomance" estou falando do &lt;i&gt;tempo que leva entre o usuário disparar uma operação e o sistema &lt;b&gt;retornar o resultado&lt;/b&gt; desejado&lt;/i&gt;. Quanto menor o tempo, mais "performance"&amp;nbsp;[&lt;a href="http://www.amazon.com/Software-Architecture-Practice-2nd-Bass/dp/0321154959"&gt;SAIP&lt;/a&gt;].&lt;br /&gt;
&lt;br /&gt;
Outro conceito que quero deixar claro é o de "Tempo de Resposta", que defino aqui como o &lt;i&gt;tempo que leva entre o usuário disparar uma operação e o sistema &lt;b&gt;responder algo&lt;/b&gt; de volta&lt;/i&gt;. Quanto menor o tempo, menos "tempo de resposta".&amp;nbsp;[&lt;a href="http://en.wikipedia.org/wiki/Response_time_(technology)"&gt;WKRT&lt;/a&gt;]&lt;br /&gt;
&lt;br /&gt;
Repare na importante diferença: "retornar o resultado" vs "responder algo".&lt;br /&gt;
&lt;br /&gt;
Não é a mesma coisa? Não, não é. Eu posso ter uma operação extremamente lenta (baixa performance), mas se ela for respondendo de tempos em tempos "estou trabalhando" (&lt;i&gt;responder algo&lt;/i&gt;), o usuário não vai ter a impressão que meu sistema está travado. O exemplo mais típico é o de cópia de arquivos, sem aquela barra de progresso, qualquer usuário acharia que a máquina travou.&lt;br /&gt;
&lt;br /&gt;
Por que essa diferença é tão importante? Porque, dependendo do sistema que você está envolvido, "performance" não é o que você quer, e sim "tempo de resposta". Um dos casos mais típicos é o da aplicação web que demora para responder, o usuário pensa que travou e clica no botão "refresh", disparando a operação uma segunda vez. Encontre um usuário com o dedo nervoso e você terá dezenas de operações iguais concorrendo no servidor e um usuário cada vez mais frustrado do outro lado.&lt;br /&gt;
&lt;br /&gt;
Então, antes de fazer a pergunta "como garantir que meu software tenha Performance", você deve responder "&lt;b&gt;preciso de Performance ou de Tempo de Resposta?&lt;/b&gt;"&lt;br /&gt;
&lt;br /&gt;
Um boa "thumb rule" é que &lt;b&gt;sistemas para o público em geral&lt;/b&gt; devem perseguir primeiro &lt;b&gt;Tempo de Resposta&lt;/b&gt;, já &lt;b&gt;sistemas que são suporte a outros sistemas&lt;/b&gt; (APIs, Frameworks e Linguagens de Programação, por exemplo), devem perseguir &lt;b&gt;Performance&lt;/b&gt; antes de qualquer coisa.&lt;br /&gt;
&lt;br /&gt;
Esclarecido o ponto, vamos ver o que podemos fazer para garantir Tempo de Resposta e o que podemos fazer para garantir Performance.&lt;br /&gt;
&lt;br /&gt;
Ambas são qualidades de software que podem ser garantidas com "táticas arquiteturais" [&lt;a href="http://www.amazon.com/Software-Architecture-Practice-2nd-Bass/dp/0321154959"&gt;SAIP&lt;/a&gt;]. Uma "tática" é uma decisão de design, ou seja, uma &lt;b&gt;diretiva de como o software vai ser feito&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Táticas para Tempo de Resposta&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
O importante do tempo de resposta passar para o usuário percepção de que o sistema não travou e continua trabalhando.&lt;br /&gt;
&lt;br /&gt;
Segundo Jakob Nielsen&amp;nbsp;[&lt;a href="http://www.useit.com/papers/responsetime.html"&gt;JNRT&lt;/a&gt;], o comportamento do usuário varia com o tempo de resposta:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;até 0,1 segundos;&lt;/li&gt;
&lt;li&gt;entre 0,1 e 1 segundo;&lt;/li&gt;
&lt;li&gt;entre 1 e 10 segundos;&lt;/li&gt;
&lt;li&gt;acima de 10 segundos.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
Um tempo de resposta de &lt;b&gt;até 0,1 segundo&lt;/b&gt; é o que o usuário espera de coisas em que ele está no controle, tais como bater uma tecla e ver a letra aparecer na tela.&lt;br /&gt;
&lt;br /&gt;
De &lt;b&gt;0,1 até 1,0 segundo&lt;/b&gt; é o tempo que o usuário espera que o sistema esteja "fazendo algo". Operações como salvar ou apagar devem ter &lt;i&gt;mais&lt;/i&gt; de 0,1 segundo, caso contrário o usuário vai pensar que nada aconteceu e tentar novamente. Em algumas operações AJAX, por exemplo, a resposta pode ser imediata (salvar em &lt;i&gt;background&lt;/i&gt; ao clicar, por exemplo), então, uma &lt;b&gt;tática&lt;/b&gt; interessante é adicionar um pequeno delay nessas operações se elas não ultrapassarem 0,1 segundo.&lt;br /&gt;
&lt;br /&gt;
De &lt;b&gt;1 até 10 segundo&lt;/b&gt;, o usuário começa a perder o foco que você precisa indicar que está trabalhando. Grande parte das páginas web possui carregamento entre 1 e 3 segundos&amp;nbsp;[&lt;a href="http://events.jquery.org/2010/boston/video/video.php?talk=matt-kelly"&gt;MTBC&lt;/a&gt;], em sistemas web, esse tempo tende a ser maior devido a operações mais complexas. Ou seja, se você está trabalhando em sistemas web, conte com o "loading" do browser para ajudar, mas se você está usando AJAX, a &lt;b&gt;tática&lt;/b&gt; recomendada é sempre colocar alguma dica visual ("loading" animado, por exemplo) de que o sistema está trabalhando, pois é quase certo que várias requisições levarão mais de 1 segundo para responder.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Acima de 10 segundos&lt;/b&gt;, o usuário pára de esperar a operação finalizar e começa a fazer outra coisa. A &lt;b&gt;tática&lt;/b&gt; recomendada nesse caso é &amp;nbsp;apresentar uma barra de progresso ou ao menos um "loading" animado. Uma &lt;b&gt;tática interessante&lt;/b&gt; apresentada por&amp;nbsp;&lt;a href="http://www.zurb.com/team/matt-kelly"&gt;Matt Kelly&lt;/a&gt;, é colocar algo divertido, como uma pequena animação não convencional ou algo que o usuário possa interagir enquanto espera.&lt;br /&gt;
&lt;br /&gt;
Se a operação puder levar &lt;b&gt;minutos&lt;/b&gt; para completar, a &lt;b&gt;tática&lt;/b&gt; recomendada é dispará-la em background e avisar ao usuário para buscar o resultado mais tarde. Em tempos de internet, isso pode significar algo do tipo "mandaremos um e-mail (sms/twitter/IM) com o link para os resultados quando o processo estiver concluído". Essa é tática usada pela &lt;a href="http://pragprog.com/"&gt;Pragmatic Programmer Bookshelf&lt;/a&gt;, por exemplo, quando se pede para baixar um e-book e ele ainda não foi gerado.&lt;br /&gt;
&lt;br /&gt;
A &lt;a href="http://events.jquery.org/2010/boston/video/video.php?talk=matt-kelly"&gt;apresentação&lt;/a&gt; de &amp;nbsp;&lt;a href="http://www.zurb.com/team/matt-kelly"&gt;Matt Kelly&lt;/a&gt;&amp;nbsp;da&amp;nbsp;&lt;a href="http://www.zurb.com/"&gt;ZURB&lt;/a&gt;&amp;nbsp;na &lt;i&gt;jQuery Conference&lt;/i&gt; de Boston possui outras táticas muito interessantes de como lidar com esses tempos de resposta em sistemas web [&lt;a href="http://events.jquery.org/2010/boston/video/video.php?talk=matt-kelly"&gt;MTBC&lt;/a&gt;]. Só tenha certeza de pegar os slides para assistir junto com o vídeo.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Táticas para Performance&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&amp;nbsp;"We should forget about small efficiencies, say about 97% of the time: premature&amp;nbsp;optimization&amp;nbsp;is the root of all evil" - Donald Knuth&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Um bom tempo de resposta pode não bastar para as operações mais frequentes no sistema. Como elas são muito utilizadas, o usuário pode ficar irritado se ficar esperando sempre até que a operação seja concluída. Em casos como esse, não há outra alternativa senão tentar melhorar a performance.&lt;br /&gt;
&lt;br /&gt;
Performance ruim é frequentemente causada não pelo sistema como um todo, mas sim por pequenos trechos e operações. Esses são os famigerados "gargalos". O grande trabalho para a arquitetura de software não é evitar esses gargalos, mas sim providenciar maneiras de identificá-los rapidamente.&lt;br /&gt;
&lt;br /&gt;
As táticas, nesse caso, serão focadas em sistemas web para o público em geral, e não APIs ou Frameworks.&lt;br /&gt;
&lt;br /&gt;
Em primeiro lugar, uma boa parte dos sistemas web costumam seguir o modelo arquitetural de repositório [&lt;a href="http://www.cs.cmu.edu/afs/cs/project/vit/ftp/pdf/intro_softarch.pdf"&gt;SAIN&lt;/a&gt;]. Ou seja, um banco de dados (o repositório) é o centro do sistema e a maior interação é entre banco e a página web (a parte) ao invés das páginas interagirem fortemente entre si.&lt;br /&gt;
&lt;br /&gt;
Esse é um excelente modelo, pois é bastante desacoplado. É possível trocar a partes com relativa facilidade, desde que não se &amp;nbsp;modifique muito o repositório. Ele possui um problema com o rastreio das informações, pois é difícil descobrir qual parte alterou um dado que outra parte precisa, ou seja, existe uma dependência indireta via dados.&lt;br /&gt;
&lt;br /&gt;
Nesse tipo de sistema, os maiores gargalos de performance inevitavelmente se concentram ao se movimentar grandes massas de dados no repositório, seja criando, recuperando ou alterando. Em miúdos: &lt;i&gt;o gargalo de performance está normalmente em operações pesadas de banco de dados&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Uma tática NÃO recomendada é tentar aliviar o banco de dados passando o processamento para a aplicação. Isso normalmente diminui a performance, pois toda a operação que seria feita diretamente &amp;nbsp;agora precisa ser passada pela rede até a aplicação, carregada em memória (novamente, pois se ela foi recuperada do banco, teve que ser carregada na memória do banco também), processada e novamente serializada e enviada de volta para o banco de dados.&lt;br /&gt;
&lt;br /&gt;
Outra tática NÃO recomendada é tentar otimizar o sistema enquanto não se sabe onde no sistema a performance é pior [&lt;a href="http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf"&gt;DKSP&lt;/a&gt;]. Essa "tática" é &amp;nbsp;conhecida como "otimização prematura" e aumenta a complexidade do sistema sem garantias de resultado.&lt;br /&gt;
&lt;br /&gt;
A melhor das abordagens para problemas de performance é monitorar a execução do sistema para identificar quais operações são mais lentas e então remover o gargalo.&lt;br /&gt;
&lt;br /&gt;
A primeira &lt;b&gt;tática&lt;/b&gt; recomendada é monitorar o tempo de todas operações de banco de dados da aplicação, isso pode ser feito facilmente, bastando logar seu tempo de execução. Para isso, é preciso que todas as operações de bancos de dados (consultas, inserções, alterações), sejam&lt;b&gt; executadas por um único mecanismo&lt;/b&gt;, dessa maneira, registrar o tempo de execução não custa mais quem meia dúzia de linhas de código.&lt;br /&gt;
&lt;br /&gt;
Além de monitorar o tempo de execução da operações de banco de dados, é interessante monitor o tempo de execução das páginas (tempo entre a "request" recebida e "response" enviada). Assim, mesmo quando o gargalo não está no banco, ainda é possível identificá-lo. Ao se monitorar os ambos, é possível saber não somente em que parte do sistema está o gargalo, mas se ele é causado pela aplicação ou pelo banco de dados.&lt;br /&gt;
&lt;br /&gt;
Uma prática controversa, mas que me deu excelentes resultados, foi logar a pilha de execução (stack trace) junto com o tempo de execução do banco de dados. Dessa forma, consegui identificar rapidamente em que parte do sistema o SQL estava sendo gerado, por vezes, o sistema gerava partes do SQL em lugares diferentes. Recomendo essa prática para os primeiros meses de vida do sistema e principalmente se seu sistema possuir muitas consultas dinâmicas.&lt;br /&gt;
&lt;br /&gt;
Outra &lt;b&gt;tática&lt;/b&gt; é usar "timeouts", para garantir que as operações de banco de dados não ultrapassem um limite tolerável [&lt;a href="http://pragprog.com/titles/mnee/release-it"&gt;MNRI&lt;/a&gt;][&lt;a href="http://www.amazon.com/Software-Architecture-Practice-2nd-Bass/dp/0321154959"&gt;SAIP&lt;/a&gt;]. Apesar dessa ser uma tática recomendada para "Estabilidade", ela é muito útil para impedir que uma operação pesada deixe o sistema lento para todos os outros usuários.&lt;br /&gt;
&lt;br /&gt;
Ambas as táticas devem ser usadas não somente com o banco de dados, mas também com qualquer dependência que o software tenha com sistemas externos, tais como web APIs.&lt;br /&gt;
&lt;br /&gt;
Uma tática extra ao se lidar com sistemas externos é o uso do padrão "Circuit Break"[&lt;a href="http://pragprog.com/titles/mnee/release-it"&gt;MNRI&lt;/a&gt;][&lt;a href="http://timross.wordpress.com/2008/02/10/implementing-the-circuit-breaker-pattern-in-c/"&gt;TRCB&lt;/a&gt;]. Apesar de não estar diretamente relacionado com performance, ele garante que o software não sofra com instabilidade de sistemas externos.&lt;br /&gt;
&lt;br /&gt;
Uma vez identificado o gargalo, basta aplicar uma série de técnicas para tentar removê-lo. Coisas como "memoization", "buffers", "índices e planos de execução forçados" e principalmente melhoria de algoritmos. Infelizmente essas técnicas estão além do escopo desse (já longo) artigo. Por outro lado, recomendo muito que a equipe tenha pessoas bem versadas nessas técnicas para que os gargalos sejam removidos rapidamente assim que identificados.&lt;br /&gt;
&lt;br /&gt;
Espero que tanto texto tenha sido de alguma utilidade!&lt;br /&gt;
&lt;br /&gt;
[SAIP] - Software Architecture In Practice -&amp;nbsp;&lt;a href="http://www.amazon.com/Software-Architecture-Practice-2nd-Bass/dp/0321154959"&gt;http://www.amazon.com/Software-Architecture-Practice-2nd-Bass/dp/0321154959&lt;/a&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;[WKRT] -&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Response_time_(technology)"&gt;http://en.wikipedia.org/wiki/Response_time_(technology)&lt;/a&gt;&lt;/div&gt;[JNRT] -&amp;nbsp;&lt;a href="http://www.useit.com/papers/responsetime.html"&gt;http://www.useit.com/papers/responsetime.html&lt;/a&gt;&lt;br /&gt;
[MTBC] -&amp;nbsp;&lt;a href="http://events.jquery.org/2010/boston/video/video.php?talk=matt-kelly"&gt;http://events.jquery.org/2010/boston/video/video.php?talk=matt-kelly&lt;/a&gt;&lt;br /&gt;
[SAIN] -&amp;nbsp;&lt;a href="http://www.cs.cmu.edu/afs/cs/project/vit/ftp/pdf/intro_softarch.pdf"&gt;http://www.cs.cmu.edu/afs/cs/project/vit/ftp/pdf/intro_softarch.pdf&lt;/a&gt;&lt;br /&gt;
[DKSP] - &lt;a href="http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf"&gt;http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf&lt;/a&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;[MNRI] - Release It! -&amp;nbsp;&lt;a href="http://pragprog.com/titles/mnee/release-it"&gt;http://pragprog.com/titles/mnee/release-it&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;[TRCB] -&amp;nbsp;&lt;a href="http://timross.wordpress.com/2008/02/10/implementing-the-circuit-breaker-pattern-in-c/"&gt;http://timross.wordpress.com/2008/02/10/implementing-the-circuit-breaker-pattern-in-c/&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/8900086-1854495327294002509?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/1854495327294002509/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2011/02/arquitetura-de-software-performance.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/1854495327294002509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/1854495327294002509'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2011/02/arquitetura-de-software-performance.html' title='Arquitetura de Software: Performance'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-1212991399413722403</id><published>2010-10-30T12:29:00.003-02:00</published><updated>2010-11-04T12:02:39.332-02:00</updated><title type='text'>Compilando Vim 7.3 para Ubuntu</title><content type='html'>&lt;div&gt;Direto ao ponto:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Instale xorg-dev e libgtk2.0-dev. Sem isso, não rola o &lt;i&gt;gVim&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;./configure --enable-gui=gtk2 --enable-multibyte --with-features=huge --enable-rubyinterp&lt;/li&gt;
&lt;li&gt;make&lt;/li&gt;
&lt;li&gt;sudo make install&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;Os executáveis vão estar em /usr/local/bin&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Se quiser suporte ao Python, ao invés de usar &lt;i&gt;--enable-rubyinterp&lt;/i&gt;, use &lt;i&gt;--enable-pythoninterp&lt;/i&gt;. De qualquer maneira, você vai precisar dos headers de ambas as linguagens.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Como instalei o Ruby via RVM, ele encontrou o source do Ruby facilmente. Mas um aviso: o interpretador do ruby dentro do Vim vai ser sempre aquele em que o RVM estava quando você compilou, mudar a versão do Ruby via RVM não tem efeito nenhum no interpretador usado pelo Vim.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
O tiuzão metaleiro TaQ apontou esse instalador que ele fez:&amp;nbsp;&lt;a href="https://github.com/taq/viminstall"&gt;https://github.com/taq/viminstall&lt;/a&gt;&amp;nbsp;que é muito bom. Mesmo que você não queira usá-lo e quiser instalar tudo na mão, o script é uma ótima referência!&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
Editado:&lt;br /&gt;
1 - A opção para interpretador do Ruby estava errada: &lt;i&gt;--with-rubyinterp&lt;/i&gt; deve ser &lt;i&gt;--enable-rubyinterp&lt;/i&gt;.&lt;br /&gt;
2 - Adicionada referência ao instalador do TaQ.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-1212991399413722403?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/1212991399413722403/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2010/10/compilando-vim-73-para-ubuntu.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/1212991399413722403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/1212991399413722403'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2010/10/compilando-vim-73-para-ubuntu.html' title='Compilando Vim 7.3 para Ubuntu'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-8431718285204934768</id><published>2010-10-01T12:44:00.000-03:00</published><updated>2010-10-01T12:44:19.392-03:00</updated><title type='text'>Qual o real papel de um Arquiteto de Software</title><content type='html'>A questão apareceu em uma &lt;a href="http://www.tectura.com.br/topics/qual_o_real_papel_do_arquiteto/posts?page=1"&gt;discussão&lt;/a&gt; da &lt;a href="http://www.tectura.com.br/"&gt;Tectura&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Comecei a escreve uma resposta, mas a coisa ficou tão longa que resolvi postar aqui =\&lt;br /&gt;
&lt;br /&gt;
Versão para apressados:&lt;br /&gt;
&lt;br /&gt;
0 - IMHO, acho que estamos respondendo na discussão &lt;i&gt;como &lt;/i&gt;o arquiteto de agir, mas não o &lt;i&gt;o quê&lt;/i&gt; (papel) ele deve fazer...&lt;br /&gt;
1 - Simplificando absurdamente um arquiteto de software cuida da arquitetura de sofware (duh, momento Homer)&lt;br /&gt;
2 - Infelizmente, Arquitetura de software NÃO é um conceito aceito universalmente, nem é um conceito bem definido, &lt;a href="http://www.sei.cmu.edu/architecture/start/community.cfm"&gt;muito pelo contrário&lt;/a&gt;. Cada um fala o que quer sobre o assunto e ninguém está errado :)&lt;br /&gt;
3 - &lt;a href="http://goo.gl/ucNC"&gt;Um dos melhores trabalhos&lt;/a&gt; sobre o tema é de Bass et al.&lt;br /&gt;
4 - Segundo ele, uma das principais funções do arquiteto é cuidar das "ilities" do software e documentá-lo.&lt;br /&gt;
5 - Pessoalmente, acho que documentação de software é só uma tática para atingir "modificabilidade".&lt;br /&gt;
6 - Conclusão: se o raciocínio desses caras estiver correto e se a minha opinião estiver correta, o papel do arquiteto é garantir as &lt;a href="http://en.wikipedia.org/wiki/Software_quality"&gt;"ilities"&lt;/a&gt; de software, e para isso, precisamos nos meter em tudo qto é buraco do desenvolvimento de software, da negociação ao código.&lt;br /&gt;
7 - Mas todos nós podemos estar errados ;)&lt;br /&gt;
&lt;br /&gt;
Versão para pacientes:&lt;br /&gt;
&lt;br /&gt;
Acho q estamos confundindo a resposta, ou talvez eu não tenha entendido bem a pergunta. IMHO, boa parte das nossas respostas estão indo no caminho "como um arquiteto de software deve se comportar" e não "o que um arquiteto de software deve fazer".&lt;br /&gt;
&lt;br /&gt;
Digo, se ele é um ditador, um comunicador, um líder nato, se é up front, "ágil" ou whatever, isso é COMO ele faz, e não O QUÊ ele faz. (tá correto isso?).&lt;br /&gt;
&lt;br /&gt;
Tentando colocar a questão de outra maneira: "O que (papel) um Arquiteto de Software faz?"&lt;br /&gt;
&lt;br /&gt;
Resposta óbvia: "Cuida da arquitetura" (duh)&lt;br /&gt;
&lt;br /&gt;
E aí caímos na questão do Guilherme Silveira: "Uma questão anterior ao papel do arquiteto é o que é arquitetura"&lt;br /&gt;
&lt;br /&gt;
Consultando a wikipedia (&lt;a href="http://en.wikipedia.org/wiki/Software_architecture"&gt;http://en.wikipedia.org/wiki/Software_architecture&lt;/a&gt; e &lt;a href="http://en.wikipedia.org/wiki/Software_architect"&gt;http://en.wikipedia.org/wiki/Software_architect&lt;/a&gt;) e mais algumas fontes (&lt;a href="http://goo.gl/ucNC"&gt;http://goo.gl/ucNC&lt;/a&gt;, &lt;a href="http://www.sei.cmu.edu/architecture/start/community.cfm"&gt;http://www.sei.cmu.edu/architecture/start/community.cfm&lt;/a&gt;, por exemplo, mas vc pode procurar por mais) dá pra perceber rapidamente que não existe um conceito uniformizado sobre o que é a bagaça. Ou seja, cada um de nós tem uma concepção diferente do que é arquitetura, e nenhum de nós está errado, simplesmente pq não existe resposta certa aceita por todos.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://goo.gl/ucNC"&gt;Um trabalho&lt;/a&gt; sobre o assunto que é sempre citado é o de Bass et al, mesmo assim, se vc lê-lo atentamente, vai perceber alguns conceitos que vêm "from thin air" (ou seja, sem referência a outros trabalhos), embora sejam caras experientes com vários projetos de sucesso na bagagem.&lt;br /&gt;
&lt;br /&gt;
Segundo esse trabalho, uma das preocupações do arquiteto é garantir as "ilities" de um software (&lt;a href="http://en.wikipedia.org/wiki/Software_quality"&gt;http://en.wikipedia.org/wiki/Software_quality&lt;/a&gt;) e documentar a coisa toda.&lt;br /&gt;
&lt;br /&gt;
Opinião pessoal, eu concordo com a parte de garantir as "ilities", mas acho que a documentação é só uma outra tática para se atingir "modificability" ou "manutenability".&lt;br /&gt;
&lt;br /&gt;
E se isso está certo, desde "Time to Market" até "Performance" e "Usabilidade" são responsabilidade do arquiteto. Para poder garantir isso, então, o arquiteto deveria se meter desde a negociação do software até programação e interações com o usuário.&lt;br /&gt;
&lt;br /&gt;
Por outro lado, podemos estar todos redondamente errados. Por quê? Bom, "arquitetura" de software e "arquiteto" de software são papéis que foram criados por similaridade metafórica com construção civil. Se você já trabalhou desenvolvendo software, sabe que essa metáfora é muito frágil. Ou seja, podemos estar tentando criar um papel que não faz sentido existir. Por outro lado, existe algo realmente de alto nível que precisa ser cuidado, e que está muito mais alto nível do que estamos acostumados a pensar.&lt;br /&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/8900086-8431718285204934768?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/8431718285204934768/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2010/10/qual-o-real-papel-de-um-arquiteto-de.html#comment-form' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/8431718285204934768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/8431718285204934768'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2010/10/qual-o-real-papel-de-um-arquiteto-de.html' title='Qual o real papel de um Arquiteto de Software'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-5397581761217966777</id><published>2010-09-20T17:22:00.000-03:00</published><updated>2010-09-20T17:22:41.613-03:00</updated><title type='text'>Duvidando do óbvio: Gravidade?</title><content type='html'>Não sou nenhuma sumidade no assunto, aliás, sou uma porta de leigo nessa bagaça... mas... e se ao invés de vivermos um mundo redondo, estivermos na verdade em um mundo chato, mas com a gravidade torcendo o espaço sobre si mesmo?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-5397581761217966777?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/5397581761217966777/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2010/09/duvidando-do-obvio-gravidade.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5397581761217966777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5397581761217966777'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2010/09/duvidando-do-obvio-gravidade.html' title='Duvidando do óbvio: Gravidade?'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-2919195447829386964</id><published>2010-09-18T15:43:00.000-03:00</published><updated>2010-09-18T15:43:30.072-03:00</updated><title type='text'>Ruby 1.9.2 - diferenças com expressões regulares</title><content type='html'>O Ruby 1.9.2 veio com algumas poucas incompatibilidades com as versões anteriores. Duas delas me parecem um pouco "inconvenientes", a primeira comentei no post anterior. A segunda tem a ver com mudanças em expressões regulares.&lt;br /&gt;
&lt;br /&gt;
Do ruby-lang.org (&lt;a href="http://svn.ruby-lang.org/repos/ruby/tags/v1_9_2_0/NEWS"&gt;http://svn.ruby-lang.org/repos/ruby/tags/v1_9_2_0/NEWS&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;* \d, \s, and \w are now ASCII only; use POSIX bracket classes and \p{} for Unicode semantics&lt;/blockquote&gt;&lt;br /&gt;
O que significa que no Ruby 1.8.7, isso aqui funciona:&lt;br /&gt;
&lt;br /&gt;
&amp;gt; irb -Ku&lt;br /&gt;
&amp;gt; "você" =~ /\w$/&lt;br /&gt;
=&amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
Mas não no Ruby 1.9.2:&lt;br /&gt;
&lt;br /&gt;
&amp;gt; irb&lt;br /&gt;
&amp;gt; "você" =~ /\w$/&lt;br /&gt;
=&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Para que a coisa funcione corretamento no 1.9.2 é preciso usar "\p{Alpha}":&lt;br /&gt;
&lt;br /&gt;
&amp;gt; irb&lt;br /&gt;
&amp;gt; "você" =~ /\p{Alpha}$/&lt;br /&gt;
=&amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;Perfeito, mas se você tenta a mesma solução no Ruby 1.8.7:&lt;/div&gt;&lt;br /&gt;
&amp;gt; irb -Ku&lt;br /&gt;
&amp;gt; "você" =~ /\p{Alpha}$/&lt;br /&gt;
(irb):1: warning: regexp has invalid interval&lt;br /&gt;
(irb):1: warning: regexp has `}' without escape&lt;br /&gt;
=&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;Okay... nada que seja um absurdo, mas para quem trabalha com a língua portuguesa isso fica um pouco chato.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-2919195447829386964?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/2919195447829386964/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2010/09/ruby-192-diferencas-com-expressoes.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/2919195447829386964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/2919195447829386964'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2010/09/ruby-192-diferencas-com-expressoes.html' title='Ruby 1.9.2 - diferenças com expressões regulares'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-7126831590599692980</id><published>2010-09-14T11:45:00.001-03:00</published><updated>2010-09-14T11:45:20.683-03:00</updated><title type='text'>Ruby 1.9.2 primeiras experiências</title><content type='html'>A versão final do Ruby 1.9.2 foi &lt;a href="http://www.ruby-lang.org/en/news/2010/08/18/ruby-1-9-2-is-released"&gt;liberada mês passado&lt;/a&gt; (agosto/2010), e só agora comecei a meter a mão na massa nele pra valer.&lt;br /&gt;
&lt;br /&gt;
Logo de cara, já tive alguns problemas menores, mas importantes:&lt;br /&gt;
&lt;br /&gt;
O primeiro foi no "require", a partir dessa versão o diretório atual não está mais incluído no $LOAD_PATH. O que significa que essa construção passa a ter problemas:&lt;br /&gt;
&lt;blockquote&gt;require File.dirname(__FILE__) + '/algum_subdiretorio/algum_ruby'&lt;/blockquote&gt;Para resolver isso, duas soluções:&lt;br /&gt;
&lt;br /&gt;
A primeira é expandir o caminho:&lt;br /&gt;
&lt;blockquote&gt;require File.expand_path(File.dirname(__FILE__)) + '/algum_subdiretorio/algum_ruby'&lt;/blockquote&gt;A segunda, mais sensata, é adicionar especificamente o diretório "raiz" da aplicação ao $LOAD_PATH, como sugerido &lt;a href="http://blog.8thlight.com/articles/2007/10/08/micahs-general-guidelines-on-ruby-require"&gt;aqui&lt;/a&gt;)&lt;br /&gt;
&lt;blockquote&gt;$LOAD_PATH &amp;lt;&amp;lt; File.expand_path(File.dirname(__FILE__)) + '/../lib'&lt;/blockquote&gt;&lt;blockquote&gt;require 'algum_subdiretorio/algum_ruby'&lt;/blockquote&gt;&lt;blockquote&gt;require 'outro_subdir_dentro_de_lib/outro_arquivo_ruby'&lt;/blockquote&gt;Com algum esforço, dá até pra criar um script pra arrumar isso automaticamente ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-7126831590599692980?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/7126831590599692980/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2010/09/ruby-192-primeiras-experiencias.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/7126831590599692980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/7126831590599692980'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2010/09/ruby-192-primeiras-experiencias.html' title='Ruby 1.9.2 primeiras experiências'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-5144361494807958393</id><published>2010-06-21T14:09:00.001-03:00</published><updated>2010-06-21T14:10:19.414-03:00</updated><title type='text'>Eu tenho todo o conhecimento do mundo...</title><content type='html'>Ontem estava no mercado com minha esposa e ela disse: "Queria fazer um molho de maracujá, como será que faz?"&lt;br /&gt;
&lt;br /&gt;
Dei de ombros e continuamos pegando os refrigerantes, de repente parei e disse: "Peraí, eu SEI como fazer esse molho!".&lt;br /&gt;
&lt;br /&gt;
Saquei o celular, abri o browser, Google, "molho de maracujá" e... bingo! Primeiro resultado já tinha a receita com todos os ingredientes. Compramos tudo e almocei um pelo pernil regado a molho agridoce.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Eu tenho todo o conhecimento do mundo...&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;...eu, e qualquer pessoa com acesso a internet. :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Desde que comprei esse celular, e acesso a internet com ele, me pareceu que consigo fazer ou saber qualquer coisa que eu precise. Nós de gravata? Fácil! Receitas? Imediatamente! O que significa "nó cego"? Tá na mão! Algoritmos? Pra qualquer coisa que vc deseje...&lt;br /&gt;
&lt;br /&gt;
Assinei o &lt;a href="http://safari.oreilly.com/"&gt;Safari&lt;/a&gt; (da O'Reilly), coloquei o &lt;a href="http://www.lexcycle.com/"&gt;Stanza&lt;/a&gt; e comecei a baixar livros gratuitos e comprar outros da &lt;a href="http://www.pragprog.com/"&gt;Pragmatic Bookshelf&lt;/a&gt;&amp;nbsp;(fazem meses que não leio um livro "físico"). E posso consultar toda minha biblioteca de conhecimento a qualquer momento.&lt;br /&gt;
&lt;br /&gt;
Isso começou a me dar a impressão que consigo saber qualquer coisa que eu queira, de qualquer assunto, a qualquer momento.&lt;br /&gt;
&lt;br /&gt;
Não bastasse isso, esse nossos pequenos e maravilhosos "gadgets" nos dão "super-poderes" (hmm... essa palavra ainda tem hífen?)&lt;br /&gt;
&lt;br /&gt;
Memória fotográfica? Bom... o celular tem uma câmera e um gravador de som. Também tem uma agenda "buzina" meus compromissos.&lt;br /&gt;
&lt;br /&gt;
Senso de direção? Viva o Google Maps e o TomTom.&lt;br /&gt;
&lt;br /&gt;
Telepatia? Experimente SMS (boooommm... dá pra simplesmente fazer uma ligação :-p)&lt;br /&gt;
&lt;br /&gt;
Pare um momento e pense como uma pessoa de 1980... "tudo isso é ficção científica!" =\&lt;br /&gt;
&lt;br /&gt;
Acho que estou ficando velho...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-5144361494807958393?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/5144361494807958393/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2010/06/eu-tenho-todo-o-conhecimento-do-mundo.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5144361494807958393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5144361494807958393'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2010/06/eu-tenho-todo-o-conhecimento-do-mundo.html' title='Eu tenho todo o conhecimento do mundo...'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-4422874381274848165</id><published>2010-05-19T10:26:00.004-03:00</published><updated>2010-05-19T10:40:55.823-03:00</updated><title type='text'>Apanhando das expressões regulares no Ruby</title><content type='html'>Estava eu brincando com o Ruby 1.9 e tentando fazer uma expressão regular bem simples: &lt;br /&gt;
&lt;pre&gt;#encoding: utf-8
puts "isso é inaceitável".scan(/&lt;b&gt;\w&lt;/b&gt;+/)&lt;/pre&gt;resultado:&lt;br /&gt;
&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;isso
inaceit
vel
&lt;/pre&gt;Uh-oh... =/ nada bom.&lt;br /&gt;
&lt;br /&gt;
Procurei por todo lado, tentando achar o que eu estava fazendo de errado. Achei vários posts dizendo que isso deveria funcionar e ninguém com o mesmo problema que eu. Não sei o que fiz de errado até agora, se alguém souber, por favor me avise =/&lt;br /&gt;
&lt;br /&gt;
De qualquer maneira, tentei resolver o problema sem sucesso. Então, na &lt;a href="http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt"&gt;documentação do Oniguruma&lt;/a&gt;, achei um "paliativo":&lt;br /&gt;
&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;#encoding: utf-8
puts "isso é aceitável".scan(/&lt;b&gt;\p{Word}&lt;/b&gt;+/)&lt;/pre&gt;&lt;br /&gt;
E o resultado:&lt;br /&gt;
&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;isso
é
aceitável
&lt;/pre&gt;&lt;br /&gt;
Ótimo!&lt;br /&gt;
&lt;br /&gt;
Além disso, fuçando lá vi várias outras classes bastante úteis, como "\p{Alpha}", "\p{Alnum}, "\p{Upper}" e "\p{Lower}" entre outros. É possível também negar a classe usando um "\P" (maiúsculo) como prefixo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-4422874381274848165?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/4422874381274848165/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2010/05/apanhando-das-expressoes-regulares-no.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/4422874381274848165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/4422874381274848165'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2010/05/apanhando-das-expressoes-regulares-no.html' title='Apanhando das expressões regulares no Ruby'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-3671846125924087923</id><published>2010-04-14T09:15:00.002-03:00</published><updated>2010-04-14T09:43:24.277-03:00</updated><title type='text'>Java missed the boat?</title><content type='html'>Ontem eu estava dando uma olhada no JDK 7 para ver em que pé estava. Queria saber principalmente de closures que, a priori, iam ficar de fora.&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Para minha surpresa (tá, tá... cheguei atrasado na festa), estava lá na página da Sun um &lt;a href="http://blogs.sun.com/mr/entry/closures"&gt;pequeno artigo&lt;/a&gt; sobre closures de Dezembro de 2009 dizendo: "Vamos colocar uma versão de closures simplificada no JDK 7":&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;... It’s time to learn from the past debate and move forward. &lt;b&gt;Sun will initiate the design and implementation of a simple closures feature, as outlined above, and add it to JDK 7&lt;/b&gt; so as to enable broad experimentation. If all goes well then we’ll later submit a language-change JSR which would, in turn, be proposed as a component of the eventual Java SE 7 JSR. &lt;i&gt;(ênfase minha)&lt;/i&gt;
&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;Não entendi nada =/ Depois de tanto afirmarem que não ia, pra que a pressa agora? Colocar closures em Java vai ser um "puta trampo". Não pelos closures em si, mas muito da API deveria ser reescrita ou expandida.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Procurando um pouco mais achei &lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5014235"&gt;um bug (ID: 5014235) na Sun Developer Network&lt;/a&gt; que acho que explica bem o que significa colocarem closures agora.&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;Closures are a great thing.  Unfortunately, Java missed the boat in 1997.

Since then, we've added a collections framework without closures (one of the prime uses), built graphics APIs around nested classes etc. We have tons of control constructs that could be defined using closures but aren't (assert and foreach, for example).

&lt;b&gt;So the advantage of adding closures now would be relatively small compared to the huge benefit you get if you add them from day one&lt;/b&gt;.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;(ênfase minha de novo)&lt;/i&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Resumo da ópera: o trampo de colocar vai trazer um benefício bem menor que o esperado, já que todos os lugares onde closure seria realmente bom já estão usando outros esquemas.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Se colocarem agora, para não tornar o código anterior incompatível, terão que adicionar vários métodos e maneiras "alternativas" de se fazer as coisas. Não sei vocês, mas acho que isso vai embananar o código, ora com closures, ora sem.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Não me leve a mal, adoro closures e acho que deveriam ser parte essencial de qualquer linguagem, mas colocar elas no Java &lt;i&gt;agora&lt;/i&gt; vai dar um tremendo trabalho e quebrar a integridade conceitual da coisa (popular: "bagunçar o coreto").&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Quer closures, gosta da JVM e de tipagem estática? Vai pro &lt;a href="www.scala-lang.org"&gt;Scala&lt;/a&gt; que você vai estar mais bem servido e com uma linguagem conceitualmente consistente. De quebra, você ainda ganha type inference, currying,  pattern matching, operator overloading (hmmm... na verdade é notação infix, mas dá na mesma), imutabilidade fácil e mais um paco de técnicas realmente úteis para programar.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Muito tarde para o Java.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-3671846125924087923?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/3671846125924087923/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2010/04/java-missed-boat.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/3671846125924087923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/3671846125924087923'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2010/04/java-missed-boat.html' title='Java missed the boat?'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-5785020354700773842</id><published>2010-03-31T00:52:00.005-03:00</published><updated>2010-04-14T09:14:53.303-03:00</updated><title type='text'>Sobre a carreira</title><content type='html'>Eu estava revisando meu currículo esses tempos atrás e comecei a ver no que já trabalhei, não em tecnologia, mas os &lt;i&gt;negócios&lt;/i&gt; em que trabalhei, e fiquei surpreso com a quantidade de coisa que 'entuia os meu norônio'. Olha que beleza:&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Comecei dando aula de &lt;i&gt;DOS&lt;/i&gt;, &lt;i&gt;WordStar&lt;/i&gt;, &lt;i&gt;Lotus-123&lt;/i&gt; e &lt;i&gt;QuattroPro&lt;/i&gt;, depois seguem aulas de &lt;i&gt;Windows&lt;/i&gt;, &lt;i&gt;Access&lt;/i&gt; e &lt;i&gt;3DStudio&lt;/i&gt; (versão DOS!).&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Largo as aulas e vou dar manutenção em um sistema auxiliar de uma indústria de celulose e papel.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Pouco tempo depois começo a mexer com &lt;i&gt;e-commerce&lt;/i&gt; e um &lt;i&gt;portal&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Mais um ano e vou pra bioinformática mexer com &lt;i&gt;análise de DNA&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Saio e vou trabalhar com &lt;i&gt;e-government&lt;/i&gt; na Secretaria da Fazenda do Estado de São Paulo.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Na sequência engata um sistema para &lt;i&gt;configuração de equipamento de medição remota&lt;/i&gt;, e o front-end de um &lt;i&gt;e-banking&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Fico 2 meses parado e vou trabalhar com &lt;i&gt;replicação de autorização&lt;/i&gt; em catracas eletrônicas, middleware para transferência de dados entre &lt;i&gt;fabricantes de móveis&lt;/i&gt;, &lt;i&gt;CRM&lt;/i&gt;, e um site para &lt;i&gt;corrida de cavalos&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Nesse meio tempo correm em paralelo: mais aulas e mais sistemas para bioinformática.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Saio e vou trabalhar com &lt;i&gt;logística&lt;/i&gt;, &lt;i&gt;segurança pública&lt;/i&gt; e &lt;i&gt;análise de recursos hídricos&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;E agora, fazem duas semanas, &lt;i&gt;&lt;del&gt;tráfego de controle aéreo&lt;/del&gt;&lt;/i&gt; &lt;i&gt;controle de tráfego aéreo&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;De DNA a burocracia, de caminhões e cavalos a aeronaves. Tenho certeza que tenho alguma lição pra tirar disso, mas não sei qual :D&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;O mais engraçado é que, no final de cada sistema, eu (e todo mundo que tinha trabalhado no projeto) sabia mais que muita gente da área. Acho que é efeito colateral de quando você tem que esmiuçar tudo quanto é regra para poder fazer o software. Depois que passa o projeto a memória faz seu trabalho e lentamente você vai esquecendo tudo que aprendeu. Eu me divirto no processo, mas às vezes me parece um tremendo esforço em vão, já que vou esqueçendo tudo. =/&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-5785020354700773842?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/5785020354700773842/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2010/03/sobre-carreira.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5785020354700773842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5785020354700773842'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2010/03/sobre-carreira.html' title='Sobre a carreira'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-2778517392394297590</id><published>2010-03-31T00:30:00.004-03:00</published><updated>2010-03-31T00:50:51.026-03:00</updated><title type='text'>Ginger - Scratch you own itch</title><content type='html'>3 meses que não escrevo nada... não sei pq insisto em manter um blog :) Vai ver é pro meu ego ter algum lugar onde estravazar.&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Já ouvi aquela idéia do "&lt;a href="http://gettingreal.37signals.com/ch02_Whats_Your_Problem.php"&gt;scratch you own itch&lt;/a&gt;"? Dizem que muitos produtos legais vêm disso, ou seja, quando o desenvolvedor fica incomodado o suficiente com algo e faz um programa pra resolver seu problema.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Bom, eu trabalho com Java 8 horas por dia (e Ruby nas outras 2 horas) e estou sempre reescrevendo os mesmos utilitários o tempo todo para todo projeto que entro. Então, resolvi "coçar minha coceira" e montar uma lib de uma vez com esses utilitários. Aproveitando para dar uma polida geral neles para ficarem bem bacanas.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Nasce então a "&lt;a href="http://github.com/ruliana/ginger"&gt;Ginger&lt;/a&gt;", uma pretensiosa biblioteca que promete acabar com todos os seus problemas (haha! Silver bullet!!! haha!). Brincadeira! Ginger ainda é pré-adolescente e vai levar um tempo até servir de algo. Mas ela está lá, para quem quiser apreciar e, principalmente, criticar.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Ginger hoje tem um objeto "DuckType", que facilita a parte de reflexão, e estou trabalhando em facilitar expressões regulares e manipulação de texto.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Acabou que me empolguei com umas idéias nessa parte e resolvi fazer umas experimentações. Acho que descobri um jeito de expandir expressões regulares para fazer algumas coisas "impossíveis" do tipo "encontre tudo que &lt;i&gt;não&lt;/i&gt; for isso", e facilitar o uso de lookahead e lookbehind, que são sempre complicadas.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;É isso aí, opiniões são bem vindas. :)&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&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/8900086-2778517392394297590?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/2778517392394297590/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2010/03/scratch-you-own-itch.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/2778517392394297590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/2778517392394297590'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2010/03/scratch-you-own-itch.html' title='Ginger - Scratch you own itch'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-1522750135721540825</id><published>2010-01-18T13:42:00.003-02:00</published><updated>2010-01-18T13:58:36.210-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogs popularidade'/><title type='text'>Sensatez não dá Ibope</title><content type='html'>&lt;div&gt;(Edição: arrumando acentuação [você não odeia quando essa bagaça zoa com os acentos?])&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;Eu estava conversando com um colega hoje sobre &lt;a href="http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion"&gt;esse artigo&lt;/a&gt; sobre Injeção de Dependência e comentando sobre a polêmica levantada. A conclusão foi "O artigo é bom, mas bem que o Uncle Bob podia ser um pouco mais imparcial; existem casos onde Injeção de Dependência é bom, ele poderia ter falado neles também".

Só que se ele tivesse sido imparcial, provavelmente o artigo não teria tanta popularidade :) A gente instintivamente vai atrás de polêmica.

Moral da história: "Sensatez não faz sucesso".

Taí uma coisa realmente preocupante...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-1522750135721540825?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/1522750135721540825/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2010/01/sensatez-no-d-ibope.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/1522750135721540825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/1522750135721540825'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2010/01/sensatez-no-d-ibope.html' title='Sensatez não dá Ibope'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-5178490996303824963</id><published>2009-12-23T11:07:00.003-02:00</published><updated>2009-12-23T11:11:02.460-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ironia'/><category scheme='http://www.blogger.com/atom/ns#' term='arquitetura de software'/><title type='text'>Desenvolvimento de software é uma coisa irônica</title><content type='html'>Engraçado como o desenvolvimento de software tem uma tend?ncia a ser irônico e tirar um sarro dos seus esforços:

1 - Quanto mais flexível você tenta fazer o software, menos flexível ele fica.

2 - Quanto mais rápido você tenta contruí-lo, mas demora terminá-lo.

3 - Quanto mais simples você o faz, mais robusto ele fica.

4 - Mas quanto mais você tenta fazê-lo robusto e escalável, menos ele fica.

5 - Se você faz direito, demora menos tempo.

6 - Se você faz nas coxas pra ganhar tempo, você perde tempo.

7 - E quanto mais você estuda, mais aprende que nâo sabe o suficiente.

8 - Mas se não estuda, tem absoluta certeza que sabe tudo o que precisa.

Tem horas que acho que o negócio é pensar de ponta-cabeça =/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-5178490996303824963?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/5178490996303824963/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2009/12/desenvolvimento-de-software-irnico.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5178490996303824963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5178490996303824963'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2009/12/desenvolvimento-de-software-irnico.html' title='Desenvolvimento de software é uma coisa irônica'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-301168227046656850</id><published>2009-10-29T02:19:00.002-02:00</published><updated>2009-10-29T02:24:36.718-02:00</updated><title type='text'>O mito da "recuperação do atraso"</title><content type='html'>Não tem dessa de "recuperar o atraso" em um projeto de software...

&lt;object id="prezi_fyjtqpvyrd1o" name="prezi_fyjtqpvyrd1o" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="550" height="400"&gt; &lt;param name="movie" value="http://prezi.com/bin/preziloader.swf"/&gt;  &lt;param name="allowfullscreen" value="true"/&gt;  &lt;param name="allowscriptaccess" value="always"/&gt;  &lt;param name="bgcolor" value="#ffffff"/&gt;  &lt;param name="flashvars" value="prezi_id=fyjtqpvyrd1o&amp;amp;lock_to_path=1&amp;amp;color=ffffff&amp;amp;autoplay=no"/&gt;  &lt;embed id="preziEmbed_fyjtqpvyrd1o" name="preziEmbed_fyjtqpvyrd1o" src="http://prezi.com/bin/preziloader.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="550" height="400" bgcolor="#ffffff" flashvars="prezi_id=fyjtqpvyrd1o&amp;amp;lock_to_path=1&amp;amp;color=ffffff&amp;amp;autoplay=no"&gt; &lt;/embed&gt; &lt;/object&gt;

Boa referência aqui também: &lt;a href="http://www.stickyminds.com/s.asp?F=S12529_ART_2"&gt;What Is the Cost of a Requirement Error?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-301168227046656850?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/301168227046656850/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2009/10/o-mito-da-recuperacao-do-atraso.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/301168227046656850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/301168227046656850'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2009/10/o-mito-da-recuperacao-do-atraso.html' title='O mito da &quot;recuperação do atraso&quot;'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-8340739282029539219</id><published>2009-10-26T15:36:00.004-02:00</published><updated>2009-10-26T15:50:09.737-02:00</updated><title type='text'>Técnicas, não ferramentas</title><content type='html'>Acho que nós da área de desenvolvimento temos um grande problema onde focamos nossos estudos. Normalmente estudamos demais a coisa errada, e as coisas certas não estudamos o suficiente.&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Também é difícil dizer qual é o foco "correto". Cada um vai ter uma opinião diferente e não há estudos pra basear nenhum dos nossos "achismos". (Hmmm... já reparou como quase todo desenvolvimento de software comercial/corporativo tem esse problema?)&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Pessoalmente, depois de ficar perdendo muito tempo estudando frameworks, descobri que o que interessa são &lt;b&gt;técnicas, não ferramentas&lt;/b&gt;. Tenho hoje a nítida percepção que a ferramenta vêm naturalmente se você tem a técnica.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;O que seriam as técnicas?&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Idiomas das linguagens&lt;/li&gt;&lt;li&gt;Patterns dos mais variados&lt;/li&gt;&lt;li&gt;Modelos de arquitetura&lt;/li&gt;&lt;li&gt;TDD/BDD&lt;/li&gt;&lt;li&gt;Paradigmas de programação (OO / Funcional / Imperativo / Declarativo)&lt;/li&gt;&lt;li&gt;DSLs ou Interfaces Fluentes&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Ou seja, independente da linguagem, os &lt;i&gt;conceitos &lt;/i&gt;serão úteis.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;E as ferramentas?&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Qualquer linguagem (Ruby, Java, Haskell...)&lt;/li&gt;&lt;li&gt;Qualquer framework (Rails, Spring...)&lt;/li&gt;&lt;li&gt;Qualquer biblioteca ou API (REXML, JDOM...)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Hoje, eu foco o máximo na técnica e só estudo a ferramenta até o nível suficiente para o problema atual. O efeito que isso causa é bastante interessante, normalmente consigo responder se algo existe na ferramenta sem conhecê-la, porque, conceitualmente, a coisa deveria estar lá. :)&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Estou certo? Sei lá. Pra mim funciona melhor do que antes, quando eu me matava pra ficar aprendendo ferramenta e a cada 3 anos vinha uma nova e todo o conhecimento era perdido. Agora o conhecimento &lt;i&gt;acumula&lt;/i&gt;, e o que tenho que &lt;i&gt;renovar &lt;/i&gt;é menor.&lt;/div&gt;&lt;div&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/8900086-8340739282029539219?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/8340739282029539219/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2009/10/o-foco-correto.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/8340739282029539219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/8340739282029539219'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2009/10/o-foco-correto.html' title='Técnicas, não ferramentas'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-5283263481753657745</id><published>2009-10-01T02:31:00.002-03:00</published><updated>2009-10-01T02:45:08.010-03:00</updated><title type='text'>Metaphone em português para Java</title><content type='html'>Custou um pouquinho para achar um banco com nomes para testar e acertar as rebarbas, mas finalmente está aí: codificação fonética em Metaphone para português (&lt;a href="http://github.com/ruliana/MTFN"&gt;http://github.com/ruliana/MTFN&lt;/a&gt;) :)

Se você quiser saber do que estou falando:
&lt;a href="http://en.wikipedia.org/wiki/Metaphone"&gt;http://en.wikipedia.org/wiki/Metaphone&lt;/a&gt; e &lt;a href="http://www2.varzeapaulista.sp.gov.br/metaphone"&gt;http://www2.varzeapaulista.sp.gov.br/metaphone&lt;/a&gt;.

Muito simples de usar, muito simples de customizar e vem com um banco de dados de teste, cortesia do Marco "Kiko" Carnut (&lt;a href="http://www.postcogito.org/"&gt;http://www.postcogito.org/&lt;/a&gt;) e seu trabalho sobre descobrir o sexo da pessoa somente pelo nome (&lt;a href="http://www.postcogito.org/Kiko/PlanilhaMascFemPtBr.html"&gt;http://www.postcogito.org/Kiko/PlanilhaMascFemPtBr.html&lt;/a&gt;, trabalho muito legal, vale a pena conferir!)

Só que, com a massa de testes e estudando um pouco melhor a fonética da língua portuguesa, deu pra perceber que a coisa pode ser melhorada. Como por exemplo, considerar "P" e "B" como equivalentes, assim como "M" e "N". Desconsiderar algumas consoantes nos finais dos nomes e assim por diante.

Optei primeiro por liberar um algoritmo bastante similar àquele que me baseei, que já é muito bom! Agora começo a refiná-lo com meus próprios "achismos". Vamos ver no que vai dar. ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-5283263481753657745?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/5283263481753657745/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2009/10/metaphone-em-portugues-para-java.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5283263481753657745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5283263481753657745'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2009/10/metaphone-em-portugues-para-java.html' title='Metaphone em português para Java'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-4482990764365017768</id><published>2009-09-27T20:43:00.002-03:00</published><updated>2009-09-27T20:57:42.410-03:00</updated><title type='text'>Functors? Hmmm... nhammy</title><content type='html'>Ando estudando Haskell de farra ultimamente, confesso que ainda não entendi ainda qual é o barato dos monads, mas funções como cidadãos de primeira classe, combinação de funções e currying são conceitos bem legais.

Dei uma checada no que havia para Java (é... Java) e esbarrei com alguns projetos interessantes, mas todos muito trabalhosos para minha preguiça. Então, como todo bom nerd, se você não acha uma ferramenta que goste, você cria uma.

Então, com um pouco de Java Voodoo do Brabo,  fiz o "&lt;a href="http://github.com/ruliana/YoDaFunkta"&gt;Yo da Funkta!&lt;/a&gt;" pra satisfazer meu ego e minha preguiça. Acho que ficou bonzinho...

Agora... estou muito interessado em... Metaphone...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-4482990764365017768?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/4482990764365017768/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2009/09/functors-hmmm-nhammy.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/4482990764365017768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/4482990764365017768'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2009/09/functors-hmmm-nhammy.html' title='Functors? Hmmm... nhammy'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-3050853828185860582</id><published>2009-06-15T13:24:00.002-03:00</published><updated>2009-06-15T13:26:56.378-03:00</updated><title type='text'>Sims ensina</title><content type='html'>Sou um jogador casual de "Sims", jogando ele acabei aprendendo algumas dicas boa para o dia a dia:

- Compre uma boa cama (com um excelente colchão), vale a pena!
- Não dá tempo de fazer tudo o que se quer.
- Gastar todo seu tempo livre com diversão não te leva a lugar nenhum, mas é preciso gastar algum tempo só com diversão.
- É possível aprender se divertindo, mas nem sempre dá pra se divertir aprendendo.
- Investir na carreira é ótimo, e tem que ser feito com intenção.
- Sozinho não se vai muito longe.

E por aí vai...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-3050853828185860582?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/3050853828185860582/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2009/06/sims-ensina.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/3050853828185860582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/3050853828185860582'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2009/06/sims-ensina.html' title='Sims ensina'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-5256109779581037998</id><published>2009-06-03T00:13:00.006-03:00</published><updated>2009-06-03T00:30:47.357-03:00</updated><title type='text'>A difícil arte de explicar o abstrato</title><content type='html'>Tenho um problema básico de comunicação quando tratando com pessoal "não-nerd" como os gerentes (e a minha esposa). Toda vez que tenho que explicar "o código está ruim", eles me olham com aquela cara de tela azul do windows. Dá quase pra ouvir o somzinho no fundo: "pãm...!"

Aí comento que é difícil dar manutenção, que leva mais tempo, que para fazer algo precisamos arrumar um pouco a coisa, que as estimativas não são confiáveis.

"pãm...!?"

Torna explicar que mexer ali pode causar problemas em outros lugares, que pode quebrar o que funciona, etc... etc...

"pãm... pãm...!?"


Finalmente, achei um jeito bom de explicar quando digo "o código está nojento" e eles entenderem a encrenca que é mexer naquilo. As imagens abaixo (do post &lt;a href="http://www.tvsnob.com/archives/016683.php"&gt;http://www.tvsnob.com/archives/016683.php&lt;/a&gt; ) ajudaram muito:

Primeiro, isso é um código bom:

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_r2sndwUwTPI/SiXs3KM2x5I/AAAAAAAAACg/Vb14JKt39vA/s1600-h/cable2.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_r2sndwUwTPI/SiXs3KM2x5I/AAAAAAAAACg/Vb14JKt39vA/s320/cable2.jpg" alt="" id="BLOGGER_PHOTO_ID_5342936965320198034" border="0" /&gt;&lt;/a&gt;













E isso aqui é "código ruim:

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_r2sndwUwTPI/SiXtLiKKjfI/AAAAAAAAACw/7JsGOi0n6_c/s1600-h/cablemess.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_r2sndwUwTPI/SiXtLiKKjfI/AAAAAAAAACw/7JsGOi0n6_c/s320/cablemess.jpg" alt="" id="BLOGGER_PHOTO_ID_5342937315348745714" border="0" /&gt;&lt;/a&gt;
Leia novamente as frases acima, mas observando as imagens... não fica óbvio?

Agora, sempre que vamos conversar, eu mantenho essa imagens por perto, hora que o pessoal começa a viajar muito, eles colocam o povo na terra. E tudo mundo entende o problema que temos nas mãos.

As imagens corretas valem por um milhão de palavras.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-5256109779581037998?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/5256109779581037998/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2009/06/dificil-arte-de-explicar-o-abstrato.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5256109779581037998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5256109779581037998'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2009/06/dificil-arte-de-explicar-o-abstrato.html' title='A difícil arte de explicar o abstrato'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_r2sndwUwTPI/SiXs3KM2x5I/AAAAAAAAACg/Vb14JKt39vA/s72-c/cable2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-5788108488722340098</id><published>2009-04-26T03:50:00.002-03:00</published><updated>2009-04-26T04:16:35.556-03:00</updated><title type='text'></title><content type='html'>É tarde da noite... passei horas incontáveis programando. Tomo um banho e tento dormir, não consigo. Linhas de código passam pela minha cabeça, penso em "if levantar", "sono -= 1", "sono += ler", blog, blog, coisas esquecidas...

Levanto, pego o Mac e abro. Fico olhando a tela azul, quando me dou conta, me loguei mas não consigo me lembrar quando digitei a senha.

O blog aparece, também não lembro de ter entrado aqui. Começo a digitar a esmo, as palavras vão saindo antes que eu consiga montar uma frase completa na cabeça. E agora, o que estou escrendo?

Continuo vendo linhas de código passando na minha frente, o Código chama. Não posso responder ao Código, preciso programar. Não posso, fiz isso por tempo demais. Preciso escrever, já estou, mas não me dei conta.

Queria poder escrever rápido como o Akita, programar como Kent Beck, arquiteturar como Fowler, ter a consciência do _Why. Pra quê? Não sei bem, mas imagino que deve ser divertido.

Abro o terminal, "ruby -v". 

__"ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-darwin9.6.0]" - a máquina responde feliz.

"irb", eu digo a ela.

Um prompt me saúda, o cursor pisca, perguntando o que eu quero.

text = &amp;lt;&amp;lt;TEXT

Colo o texto que escrevi

TEXT

words = text.split
words[rand(words.size)]

O prompt responde: 

"dormir"

Sensato como Ronaldo Ferraz. Deveria, mas ainda náo consigo. Se eu rodar de novo, acho que ele responde "Deixa de frescura e vai pra cama". Direto e contundente como o TaQ. Fico com medo que ele responda isso mesmo e fecho o terminal.

Me dou por vencido.

Fecho o Mac, uma luzinha branca me lembra que ele ainda vigia. Desisto e fecho os olhos. Amanhã vou rir disso... acho.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-5788108488722340098?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/5788108488722340098/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2009/04/e-tarde-da-noite.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5788108488722340098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5788108488722340098'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2009/04/e-tarde-da-noite.html' title=''/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-6286155381334181138</id><published>2009-03-30T19:34:00.003-03:00</published><updated>2009-03-30T19:41:32.617-03:00</updated><title type='text'>case-insensitive e accent-insensitive no PostgreSQL</title><content type='html'>Gosto muito do PostgreSQL. Pessoalmente é um dos bancos que menos me causa o efeito "WTF", quando estou trabalhando com ele, com uma notável exceção... não tem nenhum parâmetro nem coisa parecida para poder fazer pesquisas case-insensitive e accent-insensitive.

E isso é um grande "WTF" pra qualquer um que possua acentos na língua.

Procurando uma solução, encontrei esses posts aqui:

&lt;a href="http://www.laudatio.com/wordpress/2008/11/05/postgresql-83-to_ascii-utf8/"&gt;http://www.laudatio.com/wordpress/2008/11/05/postgresql-83-to_ascii-utf8/&lt;/a&gt;
&lt;a href="http://www.mail-archive.com/pgsql-general@postgresql.org/msg112591.html"&gt;http://www.mail-archive.com/pgsql-general@postgresql.org/msg112591.html&lt;/a&gt;
&lt;a href="http://www.postgresonline.com/journal/index.php?/archives/9-How-to-create-an-index-based-on-a-function.html"&gt;http://www.postgresonline.com/journal/index.php?/archives/9-How-to-create-an-index-based-on-a-function.html&lt;/a&gt;

Como meu banco é UTF-8, combinei elas em uma única solução:

&lt;pre&gt;
CREATE OR REPLACE FUNCTION to_ascii(bytea, name)
RETURNS text STRICT AS 'to_ascii_encname' LANGUAGE internal;

CREATE OR REPLACE FUNCTION norm(a_string text)
RETURNS text AS $$
  BEGIN
    RETURN lower(to_ascii(convert_to(a_string, 'latin1'), 'latin1'));
  END
$$ LANGUAGE plpgsql
&lt;/pre&gt;

E como quando fazemos isso sempre precisamos de índice, em tese podemos criar os índices assim: 

&lt;pre&gt;
CREATE INDEX norm_tabela_campo_idx
  ON tabela
  USING btree norm(campo);
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-6286155381334181138?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/6286155381334181138/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2009/03/case-insensitive-e-accent-insensitive.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/6286155381334181138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/6286155381334181138'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2009/03/case-insensitive-e-accent-insensitive.html' title='case-insensitive e accent-insensitive no PostgreSQL'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-9153211828875171150</id><published>2009-03-29T03:29:00.002-03:00</published><updated>2009-03-29T03:30:06.438-03:00</updated><title type='text'>Sugestões para programar</title><content type='html'>Aqui tem uma lista de sugestões que eu uso quando estou programando.

Faço questão de colocar elas para mim mesmo de uma maneira um tanto... "enfática", digamos assim. Descobri que quando fico indignado eu lembro melhor das coisas. Por isso, perdoe minhas "ênfases".

Sugestão 1

Nomes significativos: pelo amor de JC e sua gangue, pare um pouco e coloque um nome decente nas coisas que faz (variáveis, métodos e classes). Sempre vale a pena colocar um bom nome, mesmo que isso custe vários minutos pensando. A razão disso? Crie um programa com nomes bem ruins e pouco significativos e depois tente dar manutenção nele, você vai lembrar do que eu disse agora.

Sugestão 2 

Indireção: use e abuse. Crie métodos a rodo, crie dezenas de classes pequenas, jogue o que puder para uma classe pai, abstraia ao máximo. O efeito disso é criar naturalmente Template Methods e DSLs, sem falar em diminuir a duplicação. Aliás, já repararam como template methods se parecem com micro DSLs?

Sugestão 3 

Valide o que vai usar para o método que está escrevendo. Se vai usar parâmetros, alguns "ifs" para validar que não está vindo lixo sempre são bemvindos. Se vai usar atributos, teste para ver se estão do jeito que você esperava encontrá-los. Se estiver com muita preguiça, mas muita mesmo, valide ao menos os nulos. Ah... e antes que eu me esqueça... NÃO, isso NÃO vai fazer seu programa ficar lento.

Sugestão 4

Estado: se você está programando orientado a objeto. USE A PORRA DO ESTADO! Comece a computação em um método, termine em outro, jogue todas as variáveis possíveis para atributos. Se ficar com atributos de computações diferentes em uma única classe, use a dica 2. Se essa classe for compartilhada por múltiplas threads, não use essa sugestão.

Sugestão 5

Pais? Sim, use muito classes pais, evite delegação. Ela dá um trabalho danado (principalmente se sua linguagem do coração não tiver proxies dinâmicos) e o benefício é mais teórico que prático. Ahhmm... mas todo mundo diz que é melhor usar delegação do que herança. Poisé, e eu estou dizendo o contrário. Você está programando orientado a objeto ou não, afinal? Delegação é boa sim, onde fizer sentido, como por exemplo, em wrappers.

Sugestão 6

Não use cegamente sugestões e boas práticas. Sempre, sempre, sempre (eu falei SEMPRE, caralho!) conheça os prós e principalmente os contras de toda técnica que você vai usar. Boa prática só é boa se você sabe quando não deve usá-la. Isso vale especialmente para as sugestões que acabei de listar. ;)

Que sugestões você colocaria na lista? Ou modificaria?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-9153211828875171150?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/9153211828875171150/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2009/03/sugestoes-para-programar-aqui-tem-uma.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/9153211828875171150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/9153211828875171150'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2009/03/sugestoes-para-programar-aqui-tem-uma.html' title='Sugestões para programar'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-2871099653285883092</id><published>2009-03-25T01:58:00.001-03:00</published><updated>2009-03-25T02:06:38.080-03:00</updated><title type='text'>Flamings e Einstein</title><content type='html'>É muito comum ver por aí nos fóruns de tecnologias alguns tópicos que são "&lt;a href="http://en.wikipedia.org/wiki/Flaming_(Internet)"&gt;flamings&lt;/a&gt;". Fiquei imaginando o que causam esses flames e como é difícil distinguir idéias completamente furadas das idéias que realmente tem algo de bom. Acho que consegui chegar em uma pequena fórmula que deve resolver parte do problema, ao menos para mim.

O raciocínio veio quando estava lembrando do que fez Albert Einstein. O cara foi tão ponto fora da curva que criou sua teoria da relatividade de cabeça, não por que ele quis assim, mas porque simplesmente não havia (e acho que ainda não há) experimentos possíveis para provar que a idéia é verdadeira ou não. Aliás, no meio acadêmico, isso é bastante comum.

Como ele fez isso (e aliás, como os cientistas fazem isso, normalmente)? Ele partiu de um "pressuposto" e começou a raciocinar em cima dele. No caso, o pressuposto é de que a luz possui velocidade constante. Matutando e pensando, ele chegou a conclusões incríveis... desde que a velocidade da luz seja constante.

O que tem isso de importante? Bom, se provarem que realmente é uma constante (se já não provaram), é grande a chance de que toda a teoria esteja correta. Se provarem que não é constante, então toda a teoria vai pro brejo.

Aí nossa opinião sobre a teoria da relatividade se resume a analisar 2 coisas:

1 - Se concordamos com o pressuposto;

2 - Se achamos que o raciocínio do cara não tem falhas lógicas.

Em software temos um problema similar ao que tinha o tio Einstein. Temos grandes dificuldades de provar nossas idéias e teorias sobre software. Acho que daí nascem os flamings e todas essas discussões que ficam parecendo mais discussões religiosas do que discussões sobre uma ciência exata.

Como em software não temos quase limitação nenhuma, quase qualquer idéia dá certo com o esforço suficiente aplicado, mesmo as idéias muito idiotas.

Essas idéias, idiotas ou não, também são criadas a partir de pressupostos. Não sei se todos, mas todos os softwares, apis, frameworks e posts de blog que consigo lembrar são baseados em alguns pressupostos.

O problema é que nunca deixamos claros quais pressupostos são esses. Então nossas idéias são analisadas a partir dos pressupostos que cada pessoa escolhe. Depende do que ele escolhe como pressuposto, sua opinião vai ser favorável ou não a nossa idéia.

A "pequena fórmula" para resolver o problema dos flamings, e também o problema para se detectar uma idéia boa de uma idéia idiota é simplesmente deixar bem claro os pressupostos que se tomou para a idéia.

Não, não foi dessa vez que descobri a América ou inventei algo novo e inédito, pelo visto. Mas para mim é um coisa que vem dando certo quando tenho que analisar algumas coisas, como Frameworks e posts de blogs. :)

Querem ver um pequeno exercício? Você pode concordar ou discordar de tudo isso que eu disse, mas se ela é uma boa idéia ou não é mais fácil analisar se eu colocar os pressupostos aqui. Aí vão eles:

- É comum flaming nos fóruns de tecnologia;
- O que causa o flaming é a dificuldade de se separar idéias boas das ruins;
- É difícil separar as idéias porque é difícil prová-las;
- É difícil prová-las porque quase qualquer idéia sobre software funciona se aplicarmos esforço suficiente;
- As pessoas tendem a analisar as idéias pelos seus próprios pressupostos;
- Podemos separar as idéias se conhecermos claramente os pressupostos em que foram baseadas;

Parece uma linha de raciocínio, mas na verdade não é. Cada linha da lista acima pode ser contestada facilmente e não pode ser provada, são pressupostos. Se você concordar com todos eles, provavelmente vai concordar com a minha teoria como um todo. Se deixar de concordar com qualquer uma delas, provavelmente vai achar minha teoria um lixo.

Se todos eles puderem ser provados com sucesso, então a teoria é verdadeira. Se qualquer um deles for provado em contrário, então ela é furada.

Com tantos pressupostos (são ao menos seis, se não esqueci nada), dá pra ver que essa minha idéia é bem frágil.

Bom, agora você conhece a teoria e conhece claramente no que me baseei para montá-la. Espero que fique fácil analisar se ela tem fundamento ou não para você e o porquê disso.

E aí? Tem fundamento?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-2871099653285883092?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/2871099653285883092/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2009/03/flamings-e-einstein.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/2871099653285883092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/2871099653285883092'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2009/03/flamings-e-einstein.html' title='Flamings e Einstein'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-466921944136969277</id><published>2009-02-06T13:08:00.001-02:00</published><updated>2009-02-06T13:08:13.647-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reclamação nota_mental publicidade chefes'/><title type='text'>Da série "notas mentais"</title><content type='html'>Não aconteceu comigo, mas com um amigo... &lt;br /&gt;&lt;br /&gt;Quem efetivamente resolve o problema e faz acontecer não aparece em jornal. Quem aparece é o chefe, que é incapaz de gerar soluções e que mentiu o tempo todo para o cliente.&lt;br /&gt;&lt;br /&gt;C'est la vie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-466921944136969277?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/466921944136969277/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2009/02/da-serie-mentais.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/466921944136969277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/466921944136969277'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2009/02/da-serie-mentais.html' title='Da série &amp;quot;notas mentais&amp;quot;'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-3143373375774965618</id><published>2009-01-30T16:12:00.001-02:00</published><updated>2009-01-30T16:12:08.230-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='estúpido cerimoniosa linguagem Java'/><title type='text'>Fadado a ser estúpido</title><content type='html'>Tentei escrever um pequeno mecanismo para transações explícitas em Java. Na primeira versão, ou o programador faz "try catch" direitinho (e repetitivamente), ou a coisa não funciona. &lt;br /&gt;&lt;br /&gt;Implementei depois usando uma classe anônima. Fica parecido com closure, e resolve esse problema, mas ficou desagradável e com aquele gosto de "gambiarra" na boca.&lt;br /&gt;&lt;br /&gt;A solução mais estúpida pareceu melhor...&lt;br /&gt;&lt;br /&gt;Tentei também um mecanismo simples de reflexão no banco para poder gravar tabelas simples sem precisar fazer "dança da chuva" toda hora. Consegui, mas ainda ficou um negócio meio repetitivo e com o mesmo gosto de "gambiarra".&lt;br /&gt;&lt;br /&gt;A solução mais idiota, criar beans pra tudo, tinha uma aparência melhor.&lt;br /&gt;&lt;br /&gt;Moral da história: Ou sou realmente estúpido e minhas soluções são idiotas, ou sou esperto e a linguagem me faz parecer um estúpido. Ou seja, de qualquer maneira, sou estúpido.&lt;br /&gt;&lt;br /&gt;Veja, eu adoro Java, é uma linguagem excelente. Mas ela não presta para fazer coisas dinâmicas do mesmo jeito que Ruby não presta pra fazer concorrência.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-3143373375774965618?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/3143373375774965618/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2009/01/fadado-ser-estupido.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/3143373375774965618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/3143373375774965618'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2009/01/fadado-ser-estupido.html' title='Fadado a ser estúpido'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-5684077771517797160</id><published>2009-01-28T19:20:00.001-02:00</published><updated>2009-01-28T19:20:42.158-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='generalizações lição_aprendida hibernate JSTL clojure'/><title type='text'>Generalizando como o diabo...</title><content type='html'>Flash 1:&lt;br /&gt;Estava aprendendo "clojure" (http://clojure.org) esses dias e o autor (Rich Hickey) fala sobre os problemas de variáveis mutáveis para multi-threading. Aí advoga sobre linguagens funcionais são melhores para multi-thread.&lt;br /&gt;&lt;br /&gt;Flash 2:&lt;br /&gt;Hoje, esbarrei com um código JSP e para tentar fazer uma besteirinha (colocar um valor padrão se um atributo não era fornecido) precisei de 5 linhas de "JSTL". Fiquei indignado e meti um operador ternário dentro da Expression Language.&lt;br /&gt;&lt;br /&gt;Flash 3:&lt;br /&gt;Estamos em um sistema que quase não possui regras de negócio. 90% são cadastros com simples validações (tem uma parte de GIS, mas essa é outra história). E temos dezenas de cadastros. Ao invés de criar um objeto "bean burro" para cada entidade e usar o hibernate como manda a cartilha, fizemos um objeto parecido com um Map que resolve pra todo mundo. O resultado é conseguimos fazer um CRUD simples com regras de validação em 4 minutos (mais ou menos), e esse tempo ainda vai cair...&lt;br /&gt;&lt;br /&gt;O que esses 3 flashes me ensinam? Generalizações são extremamente perigosas. Se você não tem discernimento suficiente para saber quando quebrar um regra, tome cuidado ao segui-la. Você não sabe por que a está seguindo...&lt;br /&gt;&lt;br /&gt;Adição: sempre existem regras que não sabemos quando quebrar.&lt;br /&gt;&lt;br /&gt;Corolário: só respeitar a opinião de alguém se ele souber me dar um contra-exemplo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-5684077771517797160?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/5684077771517797160/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2009/01/generalizando-como-o-diabo.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5684077771517797160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5684077771517797160'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2009/01/generalizando-como-o-diabo.html' title='Generalizando como o diabo...'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-7674179385802873220</id><published>2008-06-02T11:37:00.002-03:00</published><updated>2008-06-19T15:33:27.317-03:00</updated><title type='text'>Princípios de OO segundo Alan Knight (e Dilbert) (parte 2)</title><content type='html'>Essa é a segunda parte &lt;a href="http://mecanicamente.blogspot.com/2008/05/princpios-de-oo-segundo-alan-knight-e.html"&gt;desse post aqui&lt;/a&gt;.

&lt;h2&gt;Evite responsabilidades&lt;/h2&gt;

Objetos devem ser preguiçosos ao extremo. Evite responsabilidades, se tiver que aceitá-las, mantenha-as vagas e delegue o trabalho de verdade para outros.

O efeito final é que cada método vai fazer um fragmento muito pequeno de trabalho. Segundo o próprio Alan Kay, em um sistema orientado a objetos bem feito, você não consegue saber onde o trabalho está sendo realmente feito, quando você vê, já foi.

Apesar de um fluxo em específico ser mais difícil de seguir (experimenta debugar em Smalltalk q vc vai entender do que eu estou falando), os métodos todos são tão simples que você consegue entendê-los em segundos.

A segunda parte da proposição: "mantenha a responsabilidade vaga", significa que você deve desconfiar de especificações do tipo "o objeto deve persistir em banco todas as entradas". Isso porque ele contém detalhes de implementação, na verdade, o que interessa para os outros objetos não é como a informação vai ser guardada, mas como ela vai ser recuperada. Uma especificação melhor seria "o objeto deve saber informar as entradas feitas". Se isso será feito em banco de dados, em arquivo texto, distribuído na rede ou por sinal de fumaça, não interessa, o que nos dá muito mais flexibilidade.

No final a idéia é aumentar o reuso. Evitando responsabilidades e delegando o trabalho, na verdade estou procurando reutilizar o que outras classes já fazem. Mantendo as responsabilidades vagas estou escondendo como faço as coisas (encapsulamento).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-7674179385802873220?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/7674179385802873220/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2008/06/princpios-de-oo-segundo-alan-knight-e.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/7674179385802873220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/7674179385802873220'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2008/06/princpios-de-oo-segundo-alan-knight-e.html' title='Princípios de OO segundo Alan Knight (e Dilbert) (parte 2)'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-1277117498888385662</id><published>2008-05-20T15:36:00.010-03:00</published><updated>2008-05-28T10:21:01.399-03:00</updated><title type='text'>Princípios de OO segundo Alan Knight (e Dilbert) (parte 1)</title><content type='html'>(nossa como faz tempo que não posto... :p)

Faz uns anos eu achei um artigo &lt;a href="http://www.cincomsmalltalk.com/userblogs/cincom/digest?content=2001-files-ooprinciples"&gt;artigo obscuro escrito por Alan Knight por volta de 2000 ou 2001&lt;/a&gt; que é um excelente resumo de como deve ser um bom código orientado a objetos. O mais interessante é que o artigo faz analogia aos princípios "Dilbert", e por incrível que pareça, a analogia encaixa como uma luva.

O texto é curto e muito divertido, recomendo a leitura!

Como sempre mostro esse artigo pra todo mundo que eu conheço, achei que já era hora de citar ele no blog e fazer um resumo em português pra quem não conhece bem o gringolês. Como posts grandes ninguém lê, vou postando os princípios aos poucos.

Nota: &lt;span style="color:red"&gt;AS IDÉIAS AÍ EMBAIXO NÃO SÃO MINHAS, OKAY? EU GOSTO MUITO DELAS, MAS O AUTOR ORIGINAL É O "TIUZÃO TOP FODA" ALAN KNIGHT!&lt;/span&gt;

Avisados? Ótimo! Senão depois o TaQ briga comigo por estar levando crédito por idéias alheias :).

&lt;hr /&gt;

&lt;h2&gt;Princípio 1: Nunca faça nada que alguém possa fazer para você.&lt;/h2&gt;

Esse é basicamente o princípio do "tell, don't ask". Basicamente, objetos não podem ser caras legais. Nada de "Olha, preciso do total dos custos desde o começo do mês, mas não se incomode, me dê os dados aí que eu mesmo faço o cálculo, não deve ser muito complicado, não é?"
&lt;pre&gt;
  total = centro_de_custo.itens.inject(0) do|soma, item| 
    if item.data &gt; Date.parse('2008-05-01')
      soma += item.valor 
    else
      soma
    end
  end
&lt;/pre&gt;
Objetos devem ser grandes FDPs. Objeto bom é grosso como seu chefe: "Cara, quero o total dos custos desde o começo do mês! Não quero nem saber e não me interessa como você calcula isso, quero o resultado, e quero JÁ!".
&lt;pre&gt;
  total = centro_de_custo.total_desde('2008-05-01')
&lt;/pre&gt;
Em Java, vejo muito uma coisa um pouco mais esquisita, normalmente envolve um DAO, injeção de dependência e costumeiramente um Date que não se pode construir diretamente pois o construtor está "deprecated":
&lt;pre&gt;
  // getCentroDeCustoDAO foi alimentado antes pelo Spring
  // e "new Date" costuma ser gerado via Calendar, pq esse
  // construtor está deprecated faz tempo...
  List&lt;Item&gt; itens = getCentroDeCustoDAO().procurarPorDataDesde(new Date(2008, 4, 1));
  BigDecimal resultado = new BigDecimal(0);
  for(Item item : itens) {
    resultado = resultado.add(item.getCusto());
  }
&lt;/pre&gt;
Mesmo que você goste muito desse padrão, seria um pouco melhor do jeito abaixo. Embora já tenha ouvido que isso é regra de negócio e não deveria ser feita no DAO.
&lt;pre&gt;
  // getCentroDeCustoDAO foi alimentado antes pelo Spring
  // e "new Date" costuma ser gerado via Calendar, pq esse
  // construtor está deprecated faz tempo...
  BigDecimal resultado = getCentroDeCustoDAO().calcularCustoTotalPorDataDesde(new Date(2008, 4, 1));
&lt;/pre&gt;
"Tell, don't ask" &lt;= "Mande, não peça"...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-1277117498888385662?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/1277117498888385662/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2008/05/princpios-de-oo-segundo-alan-knight-e.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/1277117498888385662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/1277117498888385662'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2008/05/princpios-de-oo-segundo-alan-knight-e.html' title='Princípios de OO segundo Alan Knight (e Dilbert) (parte 1)'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-1521210158418256713</id><published>2008-03-17T12:50:00.002-03:00</published><updated>2008-03-17T13:07:41.348-03:00</updated><title type='text'>Avanço tecnológico às avessas...</title><content type='html'>Não sei se porque ando lendo coisas subversivas mas ando com a nítida impressão que estamos andando em círculos ao invés de fazer avanços na área de software...

Alguns fatos me deram essa impressão:

1 - "Redescoberta" de closures -&gt; coisa que antes do hype do Ruby ninguém dava bola, e agora é a discussão do momento. Só que isso existe desde 58 com LISP. Ou, se vc quiser uma roupagem mais moderna, desde 78 com Smalltalk. (Clipper tb tinha, alguém lembra?)

2 - Domain Driven Development -&gt; não entrei muito a fundo, mas me parece basicamente o que o pessoal do movimento O.O. de 1970 e uns quebrados pregava.

3 - TDD -&gt; okay, mesmo o Kent Beck confessava que isso não era novidade.

4 - Uma &lt;a href="http://www.infoq.com/interviews/mccarthy-elephant-2000"&gt;entrevista&lt;/a&gt; com John McCarthy (criador do LISP) na InfoQ -&gt; Tem uma pergunta quase no final da entrevista sobre LISP sendo citado como influência para novas linguagens:

"...many modern programming languages like Ruby are claiming big influences from Lisp..."

McCarthy confessa que não conhece Ruby, mas pergunta:

"Does it use, for example, list structures as data?"

O entrevistador responde negativamente, e McCarthy completa:

"So if you want to compute with sums and products, you have to parse every time? So, in that respect Ruby still isn't up to where Lisp was in 1960."

Interessante...

Existem alguns outros pequenos fatos aqui e ali, pequenos demais pra eu estar totalmente consciente deles, mas ando sentindo um "deja vu" desgramado. Será que sei pouco e na verdade há um avanço nessas coisas que não estou percebendo ou será que sei o suficiente e realmente estamos andando em círculos em algumas coisas?

Como eu sempre assumo que não sei o suficiente, a questão agora está em saber o que não estou percebendo. Toca estudar mais... :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-1521210158418256713?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/1521210158418256713/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2008/03/avano-tecnolgico-s-avessas.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/1521210158418256713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/1521210158418256713'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2008/03/avano-tecnolgico-s-avessas.html' title='Avanço tecnológico às avessas...'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-5814911958952515910</id><published>2008-03-12T18:18:00.007-03:00</published><updated>2008-03-12T18:51:05.169-03:00</updated><title type='text'>Sobrecarga de métodos em Ruby</title><content type='html'>Uma das coisas muito legais que o Java possui é sobrecarga de métodos (várias vezes confundido com polimorfismo) que é a capacidade de possuir métodos diferentes com mesmo nome, mas com parâmetros diferentes.

Bom, isso não existe em Ruby, mas nada impede que isso seja implementado. Rascunhei isso aqui:

&lt;span class="S5"&gt;class&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S8"&gt;Object&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="S5"&gt;def&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S9"&gt;self&lt;/span&gt;&lt;span class="S10"&gt;.&lt;/span&gt;generate_method_name_for&lt;span class="S10"&gt;(&lt;/span&gt;method_name&lt;span class="S10"&gt;,&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S10"&gt;*&lt;/span&gt;parameter_types&lt;span class="S10"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="S2"&gt;# Usamos espaços no nome dos métodos gerados para evitar chamadas acidentais&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="S6"&gt;"&lt;/span&gt;&lt;span class="S10"&gt;#{&lt;/span&gt;method_name&lt;span class="S10"&gt;}&lt;/span&gt;&lt;span class="S6"&gt;_&lt;/span&gt;&lt;span class="S10"&gt;#{&lt;/span&gt;parameter_types&lt;span class="S10"&gt;.&lt;/span&gt;collect&lt;span class="S10"&gt;{|&lt;/span&gt;it&lt;span class="S10"&gt;|&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;it&lt;span class="S10"&gt;.&lt;/span&gt;to_s&lt;span class="S10"&gt;}.&lt;/span&gt;join&lt;span class="S10"&gt;(&lt;/span&gt;&lt;span class="S7"&gt;' '&lt;/span&gt;&lt;span class="S10"&gt;)}&lt;/span&gt;&lt;span class="S6"&gt;"&lt;/span&gt;&lt;span class="S10"&gt;.&lt;/span&gt;to_sym&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="S5"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="S5"&gt;def&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S9"&gt;self&lt;/span&gt;&lt;span class="S10"&gt;.&lt;/span&gt;def_method&lt;span class="S10"&gt;(&lt;/span&gt;method_name&lt;span class="S10"&gt;,&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S10"&gt;*&lt;/span&gt;parameter_types&lt;span class="S10"&gt;,&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S10"&gt;&amp;amp;&lt;/span&gt;block&lt;span class="S10"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="S2"&gt;# Definindo o método genérico da classe,&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;define_method&lt;span class="S0"&gt; &lt;/span&gt;method_name&lt;span class="S10"&gt;.&lt;/span&gt;to_sym&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S5"&gt;do&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S10"&gt;|*&lt;/span&gt;params&lt;span class="S10"&gt;|&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;send&lt;span class="S10"&gt;(&lt;/span&gt;&lt;span class="S6"&gt;"&lt;/span&gt;&lt;span class="S10"&gt;#{&lt;/span&gt;method_name&lt;span class="S10"&gt;}&lt;/span&gt;&lt;span class="S6"&gt;_&lt;/span&gt;&lt;span class="S10"&gt;#{&lt;/span&gt;params&lt;span class="S10"&gt;.&lt;/span&gt;collect&lt;span class="S10"&gt;{|&lt;/span&gt;it&lt;span class="S10"&gt;|&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;it&lt;span class="S10"&gt;.&lt;/span&gt;class&lt;span class="S10"&gt;.&lt;/span&gt;to_s&lt;span class="S10"&gt;}.&lt;/span&gt;join&lt;span class="S10"&gt;(&lt;/span&gt;&lt;span class="S7"&gt;' '&lt;/span&gt;&lt;span class="S10"&gt;)}&lt;/span&gt;&lt;span class="S6"&gt;"&lt;/span&gt;&lt;span class="S10"&gt;,&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S10"&gt;*&lt;/span&gt;params&lt;span class="S10"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="S5"&gt;end&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S29"&gt;unless&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S5"&gt;self&lt;/span&gt;&lt;span class="S10"&gt;.&lt;/span&gt;method_defined?&lt;span class="S10"&gt;(&lt;/span&gt;method_name&lt;span class="S10"&gt;.&lt;/span&gt;to_sym&lt;span class="S10"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="S2"&gt;#Definindo cada método específico&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;specific_method&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S10"&gt;=&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;generate_method_name_for&lt;span class="S10"&gt;(&lt;/span&gt;method_name&lt;span class="S10"&gt;,&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S10"&gt;*&lt;/span&gt;parameter_types&lt;span class="S10"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;define_method&lt;span class="S10"&gt;(&lt;/span&gt;specific_method&lt;span class="S10"&gt;,&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S10"&gt;&amp;amp;&lt;/span&gt;block&lt;span class="S10"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="S5"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="S5"&gt;end&lt;/span&gt;&lt;br /&gt;

E para usar:

&lt;span class="S5"&gt;class&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S8"&gt;Test&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;def_method&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S14"&gt;:test&lt;/span&gt;&lt;span class="S10"&gt;,&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;String&lt;span class="S10"&gt;,&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;String&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S5"&gt;do&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S10"&gt;|&lt;/span&gt;a&lt;span class="S10"&gt;,&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;b&lt;span class="S10"&gt;|&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;puts&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S6"&gt;"Duas strings"&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="S5"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;def_method&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S14"&gt;:test&lt;/span&gt;&lt;span class="S10"&gt;,&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;String&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S5"&gt;do&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S10"&gt;|&lt;/span&gt;a&lt;span class="S10"&gt;|&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;puts&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S6"&gt;"Uma string"&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="S5"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;def_method&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S14"&gt;:test&lt;/span&gt;&lt;span class="S10"&gt;,&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;Fixnum&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S5"&gt;do&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S10"&gt;|&lt;/span&gt;a&lt;span class="S10"&gt;|&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;puts&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S6"&gt;"Um número"&lt;/span&gt;&lt;br /&gt;&lt;span class="S0"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="S5"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="S5"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;x&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S10"&gt;=&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;Test&lt;span class="S10"&gt;.&lt;/span&gt;new&lt;br /&gt;&lt;br /&gt;x&lt;span class="S10"&gt;.&lt;/span&gt;test&lt;span class="S10"&gt;(&lt;/span&gt;&lt;span class="S6"&gt;"a"&lt;/span&gt;&lt;span class="S10"&gt;,&lt;/span&gt;&lt;span class="S0"&gt; &lt;/span&gt;&lt;span class="S6"&gt;"b"&lt;/span&gt;&lt;span class="S10"&gt;)&lt;/span&gt;&lt;br /&gt;x&lt;span class="S10"&gt;.&lt;/span&gt;test&lt;span class="S10"&gt;(&lt;/span&gt;&lt;span class="S6"&gt;"a"&lt;/span&gt;&lt;span class="S10"&gt;)&lt;/span&gt;&lt;br /&gt;x&lt;span class="S10"&gt;.&lt;/span&gt;test&lt;span class="S10"&gt;(&lt;/span&gt;&lt;span class="S4"&gt;1&lt;/span&gt;&lt;span class="S10"&gt;)&lt;/span&gt;&lt;br /&gt;

É lógico que isso custa desempenho, mas serve. Acho também que o código poderia ser grandemente melhorado, até pq não sei se isso funcionaria corretamente com herança e polimorfismo, mas não quis perder mais tempo brincando nisso :)

Moral da história: adoro classes abertas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-5814911958952515910?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/5814911958952515910/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2008/03/sobrecarga-de-mtodos-em-ruby.html#comment-form' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5814911958952515910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5814911958952515910'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2008/03/sobrecarga-de-mtodos-em-ruby.html' title='Sobrecarga de métodos em Ruby'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-8585298871890345690</id><published>2008-01-14T18:49:00.000-02:00</published><updated>2008-01-14T18:47:00.807-02:00</updated><title type='text'>O que é preciso para DSLs?</title><content type='html'>(Se vc não sabe o que é DSL, &lt;a href="http://www.balanceonrails.com.br/articles/2006/08/02/a-fronteira-do-dsl"&gt;Akita explica&lt;/a&gt;... se quiser uma discussão aprumada e ajeitada sobre o assunto, dá uma olhada no que &lt;a href="http://logbr.reflectivesurface.com/2008/01/10/domain-specific-languages-implementando-magica/"&gt;diz o tio Ronaldo&lt;/a&gt;)

Alguns dizem que Smalltalk, Ruby e Lisp são boas linguagens para criar DSLs. Mas Java, C# e afins não são tão boas? Por quê?

Depois de ler um tanto e experimentar mais outro tanto, acredito que para criar DSLs internas (veja o que &lt;a href="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html"&gt;diz Martin Fowler&lt;/a&gt; sobre DSLs internas e externas), uma linguagem precisaria dos seguintes items:

&lt;ol&gt;
&lt;li&gt;Reflexão(de verdade), ou seja, capacidade de inspecionar e alterar suas próprias definições em tempo de execução - DSL normalmente envolve criar e inspecionar código, e sem reflexão decente não dá pra fazer metaprogramação&lt;/li&gt;

&lt;li&gt;Metaprogramação, ou seja, código que gera código - Muito da DSL na verdade é fazer com que pouco código faça muita coisa, às vezes de maneiras pouco convencionais. Para isso sua linguagem precisa conseguir criar código "on the fly" sem grandes maracutaias, porque afinal, você já vai estar fazendo maracutaias, aí a metaprogramação fica maracutaia ao quadrado :p
&lt;/li&gt;

&lt;li&gt;Closures (ou lambdas) - Permitir passar blocos de código pra cima e pra baixo são essencias para você codificar em um ponto e poder executar em outro, normalmente após preparar o terreno para a execução da closure&lt;/li&gt;

&lt;li&gt;Sintaxe flexível - Não é essencial, mas ajuda a vc criar uma DSL simples. Sintaxes rígidas limitam a maneira com a qual você pode se expressar nas DSLs e elas acabam ficando mais complicadas sem necessidade. Um exemplo desse princípio é a tal da &lt;a href="http://martinfowler.com/bliki/FluentInterface.html"&gt;"interface fluente"&lt;/a&gt;. Sem um sintaxe flexível, ela fica meio canhestra.&lt;/li&gt;

&lt;li&gt;Classes abertas - Isso é uma extensão da "Reflexão", na verdade é permitir que você possa redefinir tipos básicos como String, Integer e outros. Se você olhar a tal da "interface fluente" vai ver que com classes abertas ficaria bem mais fácil criá-las&lt;/li&gt;
&lt;/ol&gt;Tem gente que acha que uma linguagem de programação que permita essas coisas deveria ser queimada, triturada, empalada e que todos que programam nela são hereges que deveriam queimar no Inferno de Knuth.

No final, tenho uma teoria (grandes coisa minhas teorias, mas como o blog é meu, vou postar). Tenho a teoria que, na verdade, Orientação a Objeto é uma maneira de criar DSLs internas, mas sem que pensemos em termos de linguagem. Toda boa API OO me lembra muito DSLs.

Acho que nosso trabalho é puramente criar abstrações, quanto melhores, mais somos produtivos e menos dores de cabeça temos. Em um texto, as abstrações são tão maiores quanto mais técnico é o texto, onde uma única palavra (por exemplo: "Façade") abstrai uma idéia um bocado complexa. Do nosso lado, criar classe, métodos e refatorar código  é basicamente melhorar as abstrações.

Estou certo? Estou errado? Não importa muito, isso é mais retórico do que prático, no final. Mas esse tipo de pensamento muda um pouco minha maneira de encarar o que eu aprendo de novo...

Editado: um "PS" aqui... esse artigo estava rascunhado no meu blog faz quase um ano... tou ficando velho e preguiçoso, e talvez um pouco lelé...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-8585298871890345690?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/8585298871890345690/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/02/o-que-preciso-para-dsls.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/8585298871890345690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/8585298871890345690'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/02/o-que-preciso-para-dsls.html' title='O que é preciso para DSLs?'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-1334328495827115536</id><published>2008-01-10T14:49:00.000-02:00</published><updated>2008-01-10T15:00:01.219-02:00</updated><title type='text'>Desgaste de informação</title><content type='html'>Hoje me deparei com uma situação que todo mundo passa, conhece, mas parece que ninguém toma medidas para conter o problema: quanto mais gente no meio entre a fonte de informação e o utilizador (EU!), pior a informação vai ficando.

Cliente pede uma feature -&gt; Relacionamento com cliente repassa para Gerente de projeto -&gt; Gerente de projeto passa para Analista -&gt; Analista passa para desenvolvedor.

Nesse caminho, o que o cliente pediu já foi interpretado de maneiras diferente QUATRO vezes (Relacionamento, Gerente, Analista e Desenvolvedor). Em cada interpretação a informação sofreu um certo desgaste, detalhes se perderam e o pior: detalhes que podem ser irrelevantes foram adicionados.

Esse é de longe o maior problema da informática, depois da comunicação falha (que é relacionada, mas não é a mesma coisa). Alguém sabe se existe alguma área que estuda o que acontece com a informação?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-1334328495827115536?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/1334328495827115536/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2008/01/desgaste-de-informao.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/1334328495827115536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/1334328495827115536'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2008/01/desgaste-de-informao.html' title='Desgaste de informação'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-8809168785220954547</id><published>2007-12-20T17:27:00.001-02:00</published><updated>2007-12-20T17:37:45.319-02:00</updated><title type='text'>Closures para quê?</title><content type='html'>&lt;blockquote&gt;
 &lt;p&gt;“Beware of the Turing tar-pit in which everything is possible but nothing of interest is easy.”—Alan Perlis, “Epigrams on Programming”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(Esse artigo tem exemplos em Java e Ruby. Estou ignorando as sutis diferenças entre closures e blocos de código no Ruby)&lt;/p&gt;

&lt;p&gt;Outro dia, num papo nerd com um colega (“O Francês”), ele me disse que não via &lt;del&gt;nenhuma utilidade para closures&lt;/del&gt; com bons olhos a inclusão de Closures no Java. &lt;del&gt;Que até já tinha olhado e brincado um pouco, mas que tudo que closures fazem é perfeitamente possível de fazer sem usá-las.&lt;/del&gt;(É... ele me fez corrigir o texto :) )&lt;/p&gt;

&lt;p&gt;Bom, ficou bem difícil argumentar aquilo no momento. Realmente, tudo que se pode fazer com closures também é possível fazer sem, da mesma maneira que é possível escrever um programa web em C (muita gente ainda faz e adora) ou escrever um aplicativo comercial em Assembly.&lt;/p&gt;

&lt;p&gt;Depois dessa conversa comecei a tentar catalogar usos interessantes de closures. Pode ser que isso não convença ninguém de que são úteis, mas ao menos me serviu para organizar minhas próprias idéias. A seguir listo uma série de usos bem interessantes e bastante comuns de closures.&lt;/p&gt;

&lt;p&gt;Bom, minha intenção não é explicar o que são closures – para isso o Akita tem um &lt;a href="http://www.akitaonrails.com/2007/11/30/anatomia-de-ruby-blocks-closures"&gt;excelente artigo&lt;/a&gt; – mas sim mostrar onde o uso de closures é legal.&lt;/p&gt;

&lt;h1&gt;Callbacks&lt;/h1&gt;

&lt;p&gt;Talvez um dos melhores usos de closures sejam &lt;a href="http://en.wikipedia.org/wiki/Callback_%28computer_science"&gt;callbacks&lt;/a&gt;), ou seja, uma função que será executada posteriormente. Trocando em miúdos, é um código que queremos que seja executado quando algum evento acontece no sistema, por exemplo quando um botão é pressionado (conhecido como “events”...), quando uma aplicação inicia, quando algo é gravado ou alterado (“triggers” ou “listeners”...?), ou quando algum estado no sistema muda (“hooks”...?).&lt;/p&gt;

&lt;p&gt;Cada linguagem tem sua solução para implementar callbacks, como ponteiros para funções (C e afins), a função como “cidadão de primeira classe” (Python, Javascript), classes anônimas (Java), “delegates” (C#) ou … closures, óbvio (que é solução para Smalltalk e Ruby)!&lt;/p&gt;

&lt;p&gt;Cada um defende sua linguagem como gosta, mas independente disso, closures são muito práticas. Eu posso definir um callback de um botão da seguinte forma:&lt;/p&gt;

&lt;p&gt;(Código em Ruby/GTK2)&lt;/p&gt;

&lt;pre&gt;
 # Cria um botão
 button = Gtk::Button.new("Click me")

 # Quando clicar, imprime "Cliquei no botão"
 button.signal_connect("clicked") { puts "Cliquei no botão" }
&lt;/pre&gt;

&lt;p&gt;A parte do ’{ puts “Cliquei no botão” }’ é um closure. Nesse caso, é o código que vai ser usado quando o botão for ativado (“puts” é para imprimir o texto na console).&lt;/p&gt;

&lt;p&gt;Simples assim, sem declarações, sem pré-requisitos, sem detalhes. Simplesmente “toma aqui esse código para executar depois”.&lt;/p&gt;

&lt;h1&gt;Iteradores (“visitors”)&lt;/h1&gt;

&lt;p&gt;Estamos sempre processando coleções e iterando sobre elementos. Na maior parte dos casos, um simples loop resolve o problema, mas em outros, somos obrigados a repetir o mesmo loop em uma série de métodos diferentes pois as operações são parecidas, mas não idênticas. Em outros casos a lógica de iteração é um pouco mais complexa e se mistura com a lógica que processa cada elemento.&lt;/p&gt;

&lt;p&gt;Closures são fantásticos para resolver esses problemas. Vejamos um exemplo que aconteceu recentemente comigo. Eu precisava substituir o mapeamento do Hibernate em umas 400 classes java. Fiz um pequeno método que encontrava as classes e para cada uma encontrada, eu aplicava a lógica de substituição.&lt;/p&gt;

&lt;p&gt;O método para percorrer as classes ficou assim:&lt;/p&gt;

&lt;pre&gt;
 def on_java_classes
   Find.find(@root) do |file_name|
     yield(file_name) if file_name =~ /\/vo\/.*\.java$/
   end
 end
&lt;/pre&gt;

&lt;p&gt;Esse método percorre toda a árvore de diretórios abaixo de @root e se o arquivo encontrado estiver sob um diretório “vo” e terminar com ”.java”, o bloco de código é executado.&lt;/p&gt;

&lt;p&gt;E para usar o método para trocar um mapeamento fica assim:&lt;/p&gt;

&lt;pre&gt;
 on_java_classes do |file_name|
   change_hibernate_mapping(file_name)
 end
&lt;/pre&gt;

&lt;p&gt;É lógico que eu poderia usar esse loop e meu método tudo em um bolo só, mas agora eu tenho um método genérico que me permite percorrer essas classes e executar o que eu quiser com elas &lt;em&gt;sem duplicar a lógica que itera sobre as classes&lt;/em&gt;. Posso, por exemplo, listar todos os mapeamentos, contar quantos “VOs” tenho, vasculhar se existem mapeamentos fora do padrão e outras coisas do tipo.&lt;/p&gt;

&lt;p&gt;A coisa fica tão transparente, que posso usar coisas como “next” (para processar o próximo elemento) e “break” (para parar a iteração) dentro dos closures e eles funcionam como esperado. Por exemplo, se eu quisesse apenas fazer um teste com os 10 primeiros arquivos, poderia colocar um “break” no meio, dessa forma:&lt;/p&gt;

&lt;pre&gt;
   i = 1
   on_java_classes do |file_name|
       break if i &amp;gt; 10 # passou de 10 arquivos, caia fora do método
       change_hibernate_mapping(file_name)
       i += 1
   end
&lt;/pre&gt;

&lt;h1&gt;Processamento “durante”&lt;/h1&gt;

&lt;p&gt;Quase todas as operações que fazemos de IO precisam de algo para “abrir” a operação e garantir que ela seja “fechada” quando terminamos o que precisamos. Isso vale para streams, arquivos, sockets, transações, record sets e sei lá mais quantas coisas.&lt;/p&gt;

&lt;p&gt;Isso implica em uma lógica bastante incoveniente que costuma ser repetida à exaustão: abra conexão, execute o que precisar, garanta que foi fechado (normalmente com um bloco para tratamento de exceção).&lt;/p&gt;

&lt;p&gt;Conexões com bancos de dados são particularmente um porre, porque costumam abrir e fechar vários objetos.&lt;/p&gt;

&lt;p&gt;Com closures, resolvemos isso com facilidade. Aqui um exemplo de como se usar o &lt;a href="http://ruby-dbi.rubyforge.org/"&gt;Ruby-DBI&lt;/a&gt; da maneira tradicional. O exemplo foi tirado da própria página do Ruby-DBI, mas com o tratamento de exceções apropriado.&lt;/p&gt;

&lt;pre&gt;
 require 'dbi'

 dbh = nil

 begin
   dbh = DBI.connect('DBI:Mysql:test', 'testuser', 'testpwd')

   sth = nil
   begin
     sth = dbh.prepare('select * from simple01')
     sth.execute

     while row = sth.fetch do
       p row
     end

   # Precisamos tentar fechar o statement, não importa qual o erro
   ensure
     sth.finish if sth
   end

 # Precisamos tentar fechar a conexão também
 ensure
   dbh.disconnect if dbh
 end
&lt;/pre&gt;

&lt;p&gt;Com closures, a coisa fica bem mais simples. Podemos criar coisas para serem executadas &lt;em&gt;ao redor&lt;/em&gt; do bloco de código e simplesmente esquecermos da necessidade de ficar abrindo e fechando objetos. (Aviso: o DBI já tem métodos que funcionam assim).&lt;/p&gt;

&lt;p&gt;Primeiro, criamos dois métodos:&lt;/p&gt;

&lt;pre&gt;
 # Esse método cuida de abrir a conexão, executar algo
 # e garantir q a conexão seja fechada.
 def connect(uri, user, password)
   dbh = nil
   begin
     dbh = DBI.connect(uri, user, password)
     yield(dbh)
   ensure
     dbh.disconnect if dbh
   end
 end

 # Esse método executa algo para cada registro recuperado
 # em um SQL. Ele cuida de fechar os objetos envolvidos
 # no processo. 
 def for_each_record_in(dbh, sql)
   sth = nil
   begin
     sth = dbh.prepare(sql)
     sth.execute

     while row = sth.fetch do
       yield(row)
     end
   ensure
     sth.finish if sth
   end
 end
&lt;/pre&gt;

&lt;p&gt;E agora, o código para fazer exatamente a mesma coisa que o primeiro exemplo passa a ser:&lt;/p&gt;

&lt;pre&gt;
 connect('DBI:Mysql:test', 'testuser', 'testpwd') do |connection|
   for_each_record_in(connection, 'select * from simple01') do |record|
     p record
   end
 end
&lt;/pre&gt;

&lt;p&gt;Toda vez que precisamos de um código “de preparação” e um código “de finalização” podemos usar closures para poupar trabalho. Além das óbvias vantagens de redução de duplicação, fica bem mais difícil esquecer de fechar algo :)&lt;/p&gt;

&lt;p&gt;Só para constar, existe um padrão pra isso, é o “Open During” do Kent Beck. Está no livro dele de “Best Smalltalk Patterns”.&lt;/p&gt;

&lt;h1&gt;Lógica condicional&lt;/h1&gt;

&lt;p&gt;Não somente de “ifs” e “switches” vivem os condicionais. Com closures, podemos simular condicionais para condições mais complexas.&lt;/p&gt;

&lt;p&gt;Digamos que eu tenha um analisador de texto que me retorne palavrões encontrados em um HTML qualquer. Caso eu encontre qualquer palavrão, quero mostrar uma mensagem de erro.Uma maneira de fazer isso seria assim:&lt;/p&gt;

&lt;pre&gt;
 # O método "find_dirty_words me retorna a coleção de palavrões
 # encontrados no texto.
 dirty_words = html.find_dirty_words
 unless words.empty?
   show_error_message(html, dirty_words, "Bad, bad, no cookies for you.")
 end
&lt;/pre&gt;

&lt;p&gt;Por outro lado, posso criar isso em um método com closures dessa maneira:&lt;/p&gt;

&lt;pre&gt;
 class Html
   def when_dirty_words_found
     dirty_words = html.find_dirty_words
     yield(dirty_words) unless words.empty?
   end
 end
&lt;/pre&gt;

&lt;p&gt;E agora, posso usar assim:&lt;/p&gt;

&lt;pre&gt;
 html.when_dirty_words_found do |dirty_words|
   show_error_message(html, dirty_words, "Bad, bad, no cookies for you.")
 end
&lt;/pre&gt;

&lt;p&gt;Aliás, agora posso executar qualquer lógica com esses palavrões. Posso tentar limpá-los, contar sua frequência (estatística?), colocá-los em uma lista negra e assim por diante.&lt;/p&gt;

&lt;p&gt;O melhor exemplo real de execução condicional com closures talvez seja o &lt;a href="http://www-128.ibm.com/developerworks/java/library/j-cb08016/#N101FF"&gt;uso de REST no Rails&lt;/a&gt; (veja o método “respond_to” no “Listing.5”).&lt;/p&gt;

&lt;h1&gt;Domain Specific Language&lt;/h1&gt;

&lt;p&gt;Arrisco dizer que é impossível implementar uma boa DSL Interna (definição segundo &lt;a href="http://martinfowler.com/articles/languageWorkbench.html#InternalDsl"&gt;Martin Fowler&lt;/a&gt;) sem closures.&lt;/p&gt;

&lt;p&gt;Isso porque eles permitem uma grande flexibilidade na sintaxe, permitindo que você use os closures como blocos de código que podem ser armazenados, executados, repetidos, omitidos, reestruturados, postergados ou quaisquer que sejam as transformações necessárias para sua DSL funcionar.&lt;/p&gt;

&lt;p&gt;Exemplos ótimos de DSL são o &lt;a href="http://builder.rubyforge.org/"&gt;XML Builder&lt;/a&gt; e o &lt;a href="http://rake.rubyforge.org/"&gt;Rake&lt;/a&gt;. Com pouco esforço você conseguem sintaxes perfeitas que se encaixam dentro do Ruby como se fosse parte da linguagem.&lt;/p&gt;

&lt;p&gt;Veja por exemplo, como construir um xml com o XML Builder:&lt;/p&gt;

&lt;pre&gt;
 require 'builder'

 xml = Builder::XmlMarkup.new(:target=&amp;gt;STDOUT, :indent=&amp;gt;2)
 xml.usuario(:id =&amp;gt; 127) do
 xml.nome("Ronie")
 xml.sobrenome("Uliana")
 xml.idade(31, :type =&amp;gt; "integer")
 xml.preferencias do
   ["strogonoff", "lasanha", "bolo de carne"].each do |item|
     xml.comida(item)
   end
 end
&lt;/pre&gt;

&lt;p&gt;Isso gera o seguinte xml:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;usuario id="127"&amp;gt;
 &amp;lt;nome&amp;gt;Ronie&amp;lt;/nome&amp;gt;
 &amp;lt;sobrenome&amp;gt;Uliana&amp;lt;/sobrenome&amp;gt;
 &amp;lt;idade type="integer"&amp;gt;31&amp;lt;/idade&amp;gt;
 &amp;lt;preferencias&amp;gt;
   &amp;lt;comida&amp;gt;strogonoff&amp;lt;/comida&amp;gt;
   &amp;lt;comida&amp;gt;lasanha&amp;lt;/comida&amp;gt;
   &amp;lt;comida&amp;gt;bolo de carne&amp;lt;/comida&amp;gt;
 &amp;lt;/preferencias&amp;gt;
&amp;lt;/usuario&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Nesse exemplo, cada aninhamento é um closure, e o builder os rastreia para saber como montar o xml. Muito simples e prático, na verdade.&lt;/p&gt;

&lt;h1&gt;Generators&lt;/h1&gt;

&lt;p&gt;Esse eu confesso que nunca me resolveu nenhum grande problema até o momento, mas é uma técnica boa para se ter no cinto de utilidades.&lt;/p&gt;

&lt;p&gt;Basicamente, é uma função que retorna outra, a primeira “configura” a segunda. Um exemplo simples que achei foi esse aí abaixo. Ele gera um closure que adiciona sempre o mesmo número ao número passado como parâmetro. Por exemplo, gero uma closure que adiciona sempre 5 a qualquer número que eu passe para ela. No exemplo abaixo criei dois desses, um “adicionador de cincos” e um “adicionador de oitos”.&lt;/p&gt;

&lt;p&gt;O exemplo é meio bobo, mas se você pensar um pouco vai achar possibilidades interessantes para isso. Não sei se essas idéias seriam práticas, mas com certeza serão interessantes.&lt;/p&gt;

&lt;pre&gt;
 def create_adder(number)
   lambda {|x| number + x}
 end

 add5 = create_adder(5)
 add8 = create_adder(8)

 puts add5.call(10) # retona 15, ou seja, 10 + 5

 # "add5.call(10)" é a mesma coisa que fazer add5&amp;lt;sup&amp;gt;&amp;lt;a href="#fn10"&amp;gt;10&amp;lt;/a&amp;gt;&amp;lt;/sup&amp;gt;
 # Pra facilitar, vamos usar essa notação nos exemplos abaixo
 puts add8[ 30 ] # retona 38, ou seja, 30 + 8
 puts add8[ add5[ 1 ] ] # retona 14, ou seja, 1 + 5 + 8
 puts add5[ add5[ add5[ 0 ] ] ] # retorna 15... adivinha porquê :)
&lt;/pre&gt;

&lt;p&gt;Um bocado complicado de entender? Bom, “lambda” é uma função que pega um bloco de código (o que está entre ”{}”) e retonar uma closure de verdade. Na prática, estou retornando uma função que será atribuída a uma variável para ser executada mais tarde. A parte legal é que essa função é “configurada” com o parâmetro “number”.&lt;/p&gt;

&lt;p&gt;Esse é realmente embaçado, acho que fazer um equivalente em Java pode ajudar alguns (só espero não complicar o resto do povo)&lt;/p&gt;

&lt;pre&gt;
 public class ClosureExample {

   public static interface Adder {
     public int call ( int x );
   }

   public static Adder createAdder ( final int number ) {
     return new Adder () {
       public int call ( int x ) {
         return x + number;
       }
     };
   }

   public static void main ( String [] args ) {
     Adder add5 = createAdder ( 5 );
     Adder add8 = createAdder ( 8 );

     System.out.println ( add5.call ( 10 ) );
     System.out.println ( add8.call ( 30 ) );
     System.out.println ( add8.call ( add5.call ( 1 ) ) );
     System.out.println ( add5.call ( add5.call ( add5.call ( 0 ) ) ) );
   }
 }
&lt;/pre&gt;

&lt;p&gt;Com uma pequena variação disso da para fazer acumuladores. Ou seja, uma função que preserva a memória cada vez que é executada.&lt;/p&gt;

&lt;pre&gt;
 def create_accum
   memory = 0
   lambda{|x| memory += x}
 end

 accum = create_accum
 puts accum[ 5 ] // retorna 5
 puts accum[ 10 ] // retorna 15
 puts accum[ 130 ] // retorna 145
&lt;/pre&gt;

&lt;h1&gt;Conclusão&lt;/h1&gt;

&lt;p&gt;Closures são muito úteis para várias tarefas comuns da computação. Não é porque sua linguagem favorita não tem e você acha que se vira muito bem nela que Closures deixam de ter sua utilidade. :)&lt;/p&gt;

&lt;p&gt;Fechando o artigo do mesma maneira que abri:&lt;/p&gt;

&lt;blockquote&gt;
 &lt;p&gt;“Beware of the Turing tar-pit in which everything is possible but nothing of interest is easy.”—Alan Perlis, “Epigrams on Programming”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Have a nice coding! :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-8809168785220954547?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/8809168785220954547/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/12/closures-para-qu.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/8809168785220954547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/8809168785220954547'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/12/closures-para-qu.html' title='Closures para quê?'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-5422772668135694274</id><published>2007-10-08T15:26:00.000-03:00</published><updated>2007-10-08T15:34:20.373-03:00</updated><title type='text'>Off-Topic: O Ronie foi abduzido (de novo!!!!)</title><content type='html'>Só pra avisar... Vários colegas andam tentando me contactar e nada d'eu responder. Não fiquei mal-educado de repente, não mais que o habitual, pelo menos. Mas estamos numa das fases mais críticas do projeto, bem no esquema "ou vai ou racha".

Com isso, estou há algumas semanas sem comer ou dormir muito bem, sem abrir meu e-mail pessoal, sem postar no RubyOnBr, sem responder Skype ou Messenger e coisas do tipo. Sei que é uma tremenda viadagem, mas nesse ponto, quero fazer esse projeto funcionar.

Dado esse estado de "podreira-meio-aviadado-não-responde-ao-maldito-e-mail" que eu me encontro, por favor, peço sua compreensão e uma doação pra pagar meu analista, ou então um abraço coletivo.

Juro que antes de Dezembro volto a responder os e-mails.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-5422772668135694274?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/5422772668135694274/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/10/off-topic-o-ronie-foi-abduzido-de-novo.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5422772668135694274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/5422772668135694274'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/10/off-topic-o-ronie-foi-abduzido-de-novo.html' title='Off-Topic: O Ronie foi abduzido (de novo!!!!)'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-7616836149335793642</id><published>2007-09-23T11:20:00.000-03:00</published><updated>2007-09-23T13:12:24.028-03:00</updated><title type='text'>Pra que ORM se não se usa OO?</title><content type='html'>Pra que usar um sistema de mapeamento objeto-relacional se você trata seus objetos como dados?

Objeto sem comportamento é exatamente igual a uma estrutura de dados. Reza o mito que você deve ter "classes de negócio" que executam regras. Bom... essas classes fazem coisas com suas classes sem comportamento... então... qual a diferença disso para uma função PHP que manipula linhas em tabelas?

Bom, UMA das diferenças, certamente, é que usamos um monte de traquitanas a mais para obter os dados. Outra é que ganhamos alguns métodos convenientes para buscar dados relacionados. Mas fora isso, qual o ganho?

Sinceramente, mais de uma vez vejo gente defendendo com unhas e dentes frameworks de ORM e usando ele para fazer sistemas que são basicamente, um PHP com mais camadas. E batem no peito pra dizer que é um "Sistema Grande".

Veja, não tenho nada contra ORM. É algo absolutamente necessário se você usa um sistema &lt;span style="font-weight: bold; font-style: italic;"&gt;realmente &lt;/span&gt;OO... Caso contrário, é só um trambolho a mais para cuidar.

Como vejo gente demais fazendo isso, eu devo estar deixando escapar alguma coisa muito importante. Mas alguém me diga o quê.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-7616836149335793642?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/7616836149335793642/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/09/pra-que-orm-se-no-se-usa-oo.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/7616836149335793642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/7616836149335793642'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/09/pra-que-orm-se-no-se-usa-oo.html' title='Pra que ORM se não se usa OO?'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-3128149986882513306</id><published>2007-09-12T23:15:00.001-03:00</published><updated>2007-09-12T23:19:11.266-03:00</updated><title type='text'>Esbarrando com gente conhecida...</title><content type='html'>Ontem (ou foi anteontem?), entrevistei o Kenobi (posta muito no GUJ) para uma vaga na empresa em que eu trabalho. Fiz a maior confusão com as vagas e acabei falando a vaga errada pra ele :( ê vida besta.

É um cara bastante seguro de si, só acho que causou uma má impressão na moça que comecou a conversa com ele.

Engraçado como a gente vive esbarrando com gente "virtualmente" conhecida. Acho que o mundo da informática (pelo menos no Brasil) é menor do que eu suspeitava... ou então preciso viajar mais para o resto do país e sair um pouco da Cidade da Garoa :p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-3128149986882513306?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/3128149986882513306/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/09/esbarrando-com-gente-conhecida.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/3128149986882513306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/3128149986882513306'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/09/esbarrando-com-gente-conhecida.html' title='Esbarrando com gente conhecida...'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-8389602401154132205</id><published>2007-09-12T19:39:00.001-03:00</published><updated>2007-09-12T20:07:28.190-03:00</updated><title type='text'>Melhorando o detector de "bullshit"</title><content type='html'>Sabe quando você está lendo um texto, não chegou nem na metade e pensa: "bullshit".

Poisé, faz um tempo tenho um "detector mental de bullshit" pra esse tipo de coisa. Funciona igual aos "code bad smells": você está numa conversa, ou está lendo algo, e algumas palavras fazer o detector tilintar. Aí você lê com mais atenção pra ver se é balela mesmo ou se tem fundamento.

Tem algumas palavras que fazem o detector simplesmente gritar :) Muitas delas juntas, então, quase dão dor de cabeça!
&lt;ul&gt;&lt;li&gt;Enterprise (top top!)
&lt;/li&gt;&lt;li&gt;Arquitetura (ou pior, um texto todo em português, mas usando o termo em inglês)&lt;/li&gt;&lt;li&gt;Flexível&lt;/li&gt;&lt;li&gt;Robusto&lt;/li&gt;&lt;li&gt;Ágil (todo mundo virou ágil depois que isso virou &lt;a href="http://en.wikipedia.org/wiki/Power_word"&gt;power word&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Escalável&lt;/li&gt;&lt;li&gt;Performance (principalmente se não vem com NENHUMA medição)&lt;/li&gt;&lt;li&gt;"O correto é" ("correto" depende muuuuito do que você está fazendo)&lt;/li&gt;&lt;li&gt;Grande porte (parece que o povo mistura "muitas regras de negócio", "muitos usuários" ou "transações bagaraio" sem muita discriminação)&lt;/li&gt;&lt;li&gt;
&lt;/li&gt;&lt;/ul&gt;Entre outras...

Recentemente fiz um "upgrade" no detector. Adicionei uma regra: "&lt;span style="font-weight: bold;"&gt;discussões sobre méritos de tecnologias em que o cara dá argumentos sobre performance&lt;/span&gt;". Muito, mas muito raramente mesmo, isso tem algum embasamento maior do que mero "achismo". E, &lt;span style="font-weight: bold;"&gt;pessoalmente&lt;/span&gt;, "rápido o suficiente" já está bom.

Por outro lado, tem palavras que entram no "white list" e aliviam a coisa:
&lt;ul&gt;&lt;li&gt;Teste&lt;/li&gt;&lt;li&gt;Padrão ou Anti-padrão&lt;/li&gt;&lt;li&gt;Pragmático&lt;/li&gt;&lt;/ul&gt;É... minha white list tá pequena! :D

E aí? Alguém tem outras palavras que fazem o "detector de bullshit" tocar? (Garanto que tem gente que coloca a palavra "Rails" na lista :D)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-8389602401154132205?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/8389602401154132205/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/09/melhorando-o-detector-de-bullshit.html#comment-form' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/8389602401154132205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/8389602401154132205'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/09/melhorando-o-detector-de-bullshit.html' title='Melhorando o detector de &quot;bullshit&quot;'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-7801857861966050600</id><published>2007-09-10T14:23:00.000-03:00</published><updated>2007-09-10T14:29:23.305-03:00</updated><title type='text'>Da série "Notas Mentais": Pessoas Sérias</title><content type='html'>Não consigo levar a sério pessoas que se levam muito a sério...

Por quê? Bom, cedo ou tarde, vamos todos virar adubo pra grama, que é a mesma função que um belo monte de merda faz. Aliás, o "belo monte de merda" deve ser um adubo melhor do que nós seremos... :p

Aí que está a parte complicada... O cara vem todo importante, botando marra e arrotando peru... aí me vem esse pensamento em mente e não consigo ficar sério. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-7801857861966050600?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/7801857861966050600/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/09/da-srie-notas-mentais-pessoas-srias.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/7801857861966050600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/7801857861966050600'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/09/da-srie-notas-mentais-pessoas-srias.html' title='Da série &quot;Notas Mentais&quot;: Pessoas Sérias'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-514815549931758518</id><published>2007-08-27T23:58:00.000-03:00</published><updated>2007-08-28T00:02:17.852-03:00</updated><title type='text'>"Pseudo" encapsulamento</title><content type='html'>Junto com "herança" e "polimorfismo", "encapsulamento" é o terceiro pilar da programação orientada a objetos.

Aliás, tentar fazer da programação um aglomerado de "caixas pretas" é uma coisa que tentamos desde que inventaram o Assembly. A idéia sempre foi ocultar detalhes para que se possa modificar o programa facilmente ou, no mínimo, não esquentar a cabeça com detalhes.

&lt;a href="http://www.laputan.org/selfish/selfish.html#LowSurfaceToVolumeRatio"&gt;Um dos melhores patterns&lt;/a&gt; que já vi sobre o assunto faz parte de um catálogo de patterns do Brian Foote chamado "&lt;a href="http://www.laputan.org/selfish/selfish.html"&gt;The Selfish Class&lt;/a&gt;". Ele não foca exatamente sobre mudança, mas sobre facilidade de uso. Mas no fim da contas, fazer muito através de uma interface mínima é o melhor ponto sobre encapsulamento.

O que vemos muito por aí é encapsulamento "pra inglês ver". Só funciona na teoria, porque na prática, é igual tentar se esconder tampando os olhos, no melhor estilo: "se eu não o vejo, ele também não me vê".

Ao longo do tempo, comecei a encarar alguns items como &lt;span style="font-style: italic;"&gt;bad smell&lt;/span&gt; de "encapsulamento pra inglês ver" e gostaria de compartilhar eles:

&lt;span style="font-weight: bold;"&gt;Métodos de acesso&lt;/span&gt; : Talvez o &lt;span style="font-style: italic;"&gt;bad smell&lt;/span&gt; mais comum e o mais polêmico. Métodos de acesso (gets e sets) quebram encapsulamento. Não sou o único a pensar assim (procure no google, você vai achar mais alguns doidos, inclusive com muito mais cacife que eu).

Basicamente a idéia é a seguinte: você está expondo seus dados internos, mesmo que seja atráves de um método. Isso não é muito problema, desde que, em 90% do tempo, você trate o objeto como um todo ao invés de ficar cutucando seus dados (do objeto, não os seus) Mas quando você começa a pegar os dados de uma tela web e jogar campo a campo no seu objeto, isso significa que você quebrou o encapsulamento. Uma maneira "caixa preta" de fazer isso seria jogar os dados todos pra dentro do objeto e ele pegar o que precisa OU fazer a atribuição via reflexão.

O ponto é o seguinte: se você alterar um campo e tiver que mexer em algum lugar que não seja &lt;span style="font-style: italic;"&gt;tela&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;banco &lt;/span&gt;ou &lt;span style="font-style: italic;"&gt;regra de negócio&lt;/span&gt;, então seu encapsulamento está quebradão. Caso típico é quando você precisa ficar"repassando" os campos.

Não concorda? Não tem problema, é um feeling meu (e de alguns outros doidos). Coloca o seu aí, então, ué :)

&lt;span style="font-weight: bold;"&gt;Delegate&lt;/span&gt; : Delegates são uma ótima forma de diminuir o número de objetos que você tem que trabalhar. Mas quando você começa a delegar TUDO, ou então os mesmo dados (parâmetros e retorno) são simplesmente passados sem alteração ou qualquer outro comportamento por 2 ou 3 métodos... hmmm... tem algo estranho.

Já vi isso sendo usado como uma forma de manter as coisas no lugar quando se está em uma arquitura com muitas camadas. Mas sinceramente, isso é só uma maneira muito esquisita de violar camadas, não de preservá-las. Se você precisa de algo lááá do fundo em uma camada da frente, sem alterações, melhor repensar sua arquitetura nesse ponto.

&lt;span style="font-weight: bold;"&gt;Iteradores externos&lt;/span&gt; : (essa vai fazer alguém querer comer meu fígado... sem tempero!!!) Essa viola &lt;a href="http://www.surfscranton.com/architecture/KnightsPrinciples.htm"&gt;a máxima do "Tell, don't ask"&lt;/a&gt; sem dó nem perdão. A moral da história é a seguinte, ao invés de pedir para as coleções trabalharem para você, somos obrigados a pedir licença, pegar tudo o que elas têm e ficar item a item vendo o que precisa ser feito.

A solução para isso seriam &lt;span style="font-weight: bold;"&gt;iteradores internos&lt;/span&gt;, implementados lindamente com &lt;span style="font-weight: bold; font-style: italic;"&gt;closures&lt;/span&gt; (viva Smalltalk, &lt;span style="font-weight: bold;"&gt;30&lt;/span&gt; anos atrás já fazia isso!). À primeira vista, quem não conhece vai achar que dá na mesma, só quando você olha mais de perto vê que várias operações básicas que fazemos todos os dias podem ser encapsuladas com isso. Tais como "selecionar o primeiro que satisfaz uma condição", "fazer um 'de-&gt;para' com os objetos da coleção", "acumular valores segundo uma fórmula qualquer", e por aí vai.

"&lt;span style="font-weight: bold;"&gt;Data Transfer Objects&lt;/span&gt;" ou "&lt;span style="font-weight: bold;"&gt;Value Objects&lt;/span&gt;" : Essa viola o "&lt;span style="font-style: italic;"&gt;objetos devem ter comportamento&lt;/span&gt;". Veja bem, um Objeto (com "O" maíusculo) é justamente a junção de DADOS + FUNCIONALIDADE (comportamento), se você tem dados em um objeto, então a  funcionalidade que atua sobre esse objetos está em outro lugar... separando dados e funcionalidades voltamos a programação procedural (ou funcional).

E no que isso viola encapsulamento? Viola porque outros objetos precisam conhecer os detalhes do seu DTO para poderem trabalhar com ele. Trocando em miúdos, esse "pseudo-objeto" está com suas estranhas completamente expostas e a mercê de outros objetos malignos que querem comer seu coração (do objeto, não o seu).

Okay, como tudo na vida, existem lugares onde DTOs são legais e bemvindos. Mas quando eles começam a aparecer demais, aí dá pra começar a ficar desconfiado. Se a gente realmente caprichar no uso dos DTOs, vamos acabar com um sistema OO com a cara de um ASP dos antigos, mas com mais camadas...

No geral, são esses meus &lt;span style="font-style: italic;"&gt;bad smells &lt;/span&gt;de encapsulamento. E são realmente &lt;span style="font-style: italic;"&gt;bad smells&lt;/span&gt;, ou seja, pode ser que não seja nada e que o uso esteja correto, mas não custa dar uma verificada. Outra coisa é que encapsulamento é legal, mas não é nenhuma vaca sagrada (é?). Violo ela com muito gosto e uma pitada de sal se for para deixar meu sistema mais simples. Infelizmente, normalmente é o contrário... :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-514815549931758518?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/514815549931758518/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/05/pseudo-encapsulamento.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/514815549931758518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/514815549931758518'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/05/pseudo-encapsulamento.html' title='&quot;Pseudo&quot; encapsulamento'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-566871340095220094</id><published>2007-08-10T11:01:00.001-03:00</published><updated>2007-08-10T18:57:05.958-03:00</updated><title type='text'>Linguagens do futuro</title><content type='html'>Um colega meu ("O Francês") me apontou &lt;a href="http://www.cincomsmalltalk.com/userblogs/ralph/blogView?showComments=true&amp;printTitle=Erlang,_the_next_Java&amp;amp;entry=3364027251"&gt;alguns &lt;/a&gt;&lt;a href="http://pinderkent.blogsavy.com/archives/97"&gt;links &lt;/a&gt;que o pessoal aposta no Erlang como próximo sucessor do java.

Isso me deu vontade e exercitar minha "veia futuróloga". Não que eu seja um bom futurólogo, mas é que é divertido ficar fazendo extrapolações.

Na minha humilde opinião, acho que existe um buraco a ser preenchido para a "Próxima Grande Linguagem". Explico:

Nos anos recentes, ando observando uma crescente valorização das linguagens de script, acho que principalmente por causa do Javascript, Ruby e Python (não descartando PHP) que vêm ganhando atenção. Com isso, vi que certas coisas, como "closures" ganharem bastante importância conforme o pessoal começou a perceber que isso facilita muito a programação.

Essas funcionalidades todas, até onde percebo, são justamente as que facilitam a criação de DSLs (Domain Specific Languages). Nota pessoal: um bom sistema Orientado a Objeto é praticamente uma DSL. As boas práticas de programação OO parecem levar inadvertidamente a uma DSL.

Se esse pressuposto for correto, a próxima grande linguagem deveria ter funcionalidades boas para gerar DSLs. As melhores que conheço hoje são Lisp e depois Ruby.

Para o Lisp virar a "Próxima Grande Linguagem", me parece que faltam duas coisas: uma sintaxe mais digerível para os desenvolvedores que estão acostumados com linguagens de sintaxe "C-like" e uma "killer application" (ou deveria dizer "killer framework") para web. Digo isso porque aplicações web são o que está quente hoje, com tendência a ficar mais quente :)

Para o Ruby virar a "Próxima Grande Linguagem", sinto que falta uma boa máquina virtual, talvez com compilação para alguma linguagem intermediária. Aí entra a competência do YARV ou do JRuby (ou IronRuby também).

Conclusão: acho que existe um buraco aí que poderia ser preenchido por algo que compilasse em bytecode de Lisp, mas que tivesse uma sintaxe mais similar ao que a grande maioria dos desenvolvedores está acostumado. Eu estava trabalhando em algo na linha, só por farra, mas minhas habilidades em compiladores ainda é meio crua e vai demorar um bom tempo até aparecer algo que valha a pena brincar :)

Vamos ver no que dá.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-566871340095220094?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/566871340095220094/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/08/linguagens-do-futuro.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/566871340095220094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/566871340095220094'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/08/linguagens-do-futuro.html' title='Linguagens do futuro'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-3189208768356380172</id><published>2007-07-30T10:12:00.000-03:00</published><updated>2007-07-30T10:32:39.459-03:00</updated><title type='text'>Da série "Notas mentais": Pessoas</title><content type='html'>Elas são como livros, só mais inconstantes...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-3189208768356380172?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/3189208768356380172/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/07/da-srie-notas-mentais-pessoas.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/3189208768356380172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/3189208768356380172'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/07/da-srie-notas-mentais-pessoas.html' title='Da série &quot;Notas mentais&quot;: Pessoas'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-696244368937555325</id><published>2007-07-30T09:58:00.000-03:00</published><updated>2007-07-30T10:12:09.139-03:00</updated><title type='text'>Da série "Notas mentais": Livros</title><content type='html'>1 - Nunca acredite piamente em um livro. Exceto pela matemática (e mesmo alguns desses), o resto são apenas opiniões e hipóteses.

2 - Nunca duvide demais de um livro. Mesmo em um livro totalmente errado, algumas idéias podem estar certas.&lt;span style="font-size:78%;"&gt; (A idéia que um relógio quebrado ainda está certo duas vezes ao dia)&lt;/span&gt;

3 - Consolide sua opinião frequentemente, a maior parte do que é certo hoje se torna errado cedo ou tarde, basta dar tempo o suficiente.

Pode me chamar de "descrente", se é que isso tem a ver com "crer" :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-696244368937555325?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/696244368937555325/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/07/da-srie-notas-mentais-livros.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/696244368937555325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/696244368937555325'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/07/da-srie-notas-mentais-livros.html' title='Da série &quot;Notas mentais&quot;: Livros'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-3824423365468861791</id><published>2007-06-28T16:04:00.000-03:00</published><updated>2007-06-28T19:47:54.379-03:00</updated><title type='text'>Candidatos a idiomas no Java</title><content type='html'>Apesar de focar muito em Ruby, é o Java quem paga o pão nosso de cada dia. E apesar de eu ter algumas encrespadas com a linguagem, ela é muito competente no que faz. Um pouco travada, talvez, mas ninguém é perfeito :)

O interessante é que depois de um tempo, vamos pegando alguns "idiomas", ou seja, mini-padrões que vivem se repetindo. Acho que já li esses dois em algum lugar (muito provável), mas como estou usando eles com muita frequência, gostaria de deixá-los registrados:
&lt;hr /&gt;
Idioma: Parâmetros Opcionais Explícitos

Problema: Você tem um método quem tem parâmetros opcionais. Frequentemente, a opção não passada é "null" ou tem um valor padrão bem definido.

Solução: Crie um método para cada configuração de parâmetros que você tenha e faça os com menos parâmetros chamarem os de mais parâmetros. Apenas o método com mais parâmetros tem a lógica.

Reasoning: Sempre usar um único método pode ser um problema se na maior parte das vezes o valor passado é o mesmo. Se você quiser alterar o "padrão", tem que caçar em todo o código. Por outro lado, travar um valor fixo faz você ter que alterar o código se quiser algo ligeiramente diferente. Oferecendo um bom padrão e , ao mesmo tempo, flexibilidade, resolve os dois usos e o custo é baixo.

Exemplo:
&lt;code&gt;&lt;pre&gt;
public Autocomplete ( String className, Object parameter, int maxSize,
 String highlightTemplate ) {
    try {
        this.klass = Class.forName ( className + "Option" );
        this.parameter = parameter;
        this.maxSize = maxSize;
        this.highlightTemplate = highlightTemplate;
        initialize ();
    } catch ( ClassNotFoundException e ) {
        throw new RuntimeException ( "Class not found for \"" + className + "\"", e );
    }
}

public Autocomplete ( String className, Object parameter, int maxSize ) {
    this ( className, parameter, maxSize, "&lt;b&gt;$1&lt;/b&gt;" );
}

public Autocomplete ( String className, Object parameter ) {
    this ( className, parameter, 8 );
}
&lt;/pre&gt;&lt;/code&gt;
Parece que dá um pouco de trabalho (e até dá), mas é uma maneira muito clara de você passar a idéia de ter parâmetros opcionais, e depois que você acostuma, é completamente trivial alterar os valores padrão.

Como experiência própria, só procure evitar "explodir" o número de métodos, procure só fazer os métodos mais usados como padrão e usar a versão "expandida" para flexibilidade total.

----

Idioma: Parâmetros Nomeados

Problema: Você tem uma classe que precisa de muitos parâmetros (principalmente opcionais) para ser configurada.

Solução: Para cada parâmetro, crie um método "set" que retorna o próprio objeto, assim, você pode encadear os métodos ("method chaining") em um única chamada.

Reasoning: Criar construtores com muitos parâmetros torna a classe difícil de usar, e forçar um série de métodos "set" repetindo o mesmo objeto torna o código chato de digitar e às vezes pouco óbvio de ser lido.

Exemplo:
(Tirado da biblioteca JDOM)
&lt;code&gt;&lt;pre&gt;
new Element("book").setAttribute ( "id", "1" ).setText("Java Idioms");
&lt;/code&gt;&lt;/pre&gt;
O equivalente sem o idioma seria:
&lt;code&gt;&lt;pre&gt;
Element element = new Element("book")
element.setAttribute ( "id", "1" )
element.setText("Java Idioms");
&lt;/code&gt;&lt;/pre&gt;

&lt;hr /&gt;

Bom, é isso. Nenhuma invenção nova, só catalogando idiomas que vivo esbarrando e acho legais :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-3824423365468861791?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/3824423365468861791/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/06/candidatos-idiomas-no-java.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/3824423365468861791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/3824423365468861791'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/06/candidatos-idiomas-no-java.html' title='Candidatos a idiomas no Java'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-3126487985177077059</id><published>2007-05-03T21:08:00.000-03:00</published><updated>2007-05-03T22:44:10.403-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='tipagem estática'/><title type='text'>Estaticamente trabalhoso</title><content type='html'>Tava observando um amigo meu trabalhar em um framework ontem e percebi umas coisas interessantes. O processo foi mais ou menos assim:

O framework era em Java e ele precisava pegar uns registros no banco de dados pra montar uma combo. O framework tinha sido criado em cima do Hibernate e já cuidava de toda parte xarope de sessions e afins.

Pra pegar os dados ele criou um Criteria e passou pro framework. Como não havia um DAO para aquele objeto, ele precisou criá-lo, declarar a coisa no Spring e montar o método que buscava o DAO de lá (tá acompanhando? Se perdeu? Inda não acabou). Para preservar a tipagem estática e encapsular as chamadas nas camadas corretas, ele ainda teve que fazer mais três ou quatro declarações de métodos onde a única diferença era o tipo da variável.

Fiquei observando e percebi que a única coisa que realmente havia mudado era o Criteria, o resto, todo o resto incluindo o DAO, só foi feito para preservar a tipagem estática e "isolar" as camadas (isso mesmo, "isolar" entre aspas. Tenho ressalvas com isso, mas é papo pra outro post).

Não acho tipagem estática ruim e não estou pregando contra divisão de software em camadas, mas fiquei me perguntando o quão longe a gente vai e o quanto a gente complica as coisas onde não há necessidade &lt;span style="font-weight: bold;"&gt;real&lt;/span&gt;.

Nesse exemplo não havia. Um simples hql "select x from Classe as x" enviado para um DAO genérico resolveria de sobra.

Será que a gente não anda inventando mais coisa do que seria necessário só por questões de "assim o desenvolvedor idiota não vai usar errado" e "assim fica mais flexível"? Precisamos &lt;span style="font-weight: bold;"&gt;de verdade&lt;/span&gt; dessa proteção e dessa "flexibilidade"?

O tempo passa, vou ficando mais cético. Só queria saber se pra bem ou pra mal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-3126487985177077059?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/3126487985177077059/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/05/estaticamente-trabalhoso.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/3126487985177077059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/3126487985177077059'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/05/estaticamente-trabalhoso.html' title='Estaticamente trabalhoso'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-2333672287440089782</id><published>2007-04-20T23:02:00.000-03:00</published><updated>2007-04-20T23:04:10.951-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='suntechdays'/><title type='text'>E o que deu o SunTechDays</title><content type='html'>No fim das contas, as palestras estavam todas atrasadas mais de hora e a que eu queria assistir ficou muito tarde. Poisé, fica pro próximo ano...

O que valeu mesmo foi ver um carinha dançando pra ganhar uma jaqueta (mó legal a jaqueta). O cara literalmente "se desdobrou", só quem estava lá pra entender. Nunca ri tanto!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-2333672287440089782?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/2333672287440089782/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/04/e-o-que-deu-o-suntechdays.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/2333672287440089782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/2333672287440089782'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/04/e-o-que-deu-o-suntechdays.html' title='E o que deu o SunTechDays'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-6955960837468790667</id><published>2007-04-20T10:20:00.000-03:00</published><updated>2007-04-20T10:30:55.864-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java suntechdays'/><title type='text'>Ronie no SunTechDays</title><content type='html'>(essa porcaria de computador do evento nao estah com os acentos configurados... jah viu como vai sair o post)

Depois de todo esse tempo mexendo com Java, resolvi vir a um SunTechDays pra "tirar a virgindade..."

Vim soh hoje de manha (dia 20) e pulei o dia 19. Evento bem organizado, tudo muito bonito (sem brincadeira, eh bonito mesmo!). Fui experimentar a palestra do Bruno Souza... ai... ai..., mesma pagacao de pau de sempre, tive que sair logo, antes que ele conseguisse me convencer de que Java era a primeira maravilha do universo e, se Deus usasse Java, o Big Bang teria sido open-source e que eu conseguiria fazer ele no meu celular... Mas o cara eh o "Javaman", entao tah certo.

De resto, soh estou esperando, espero que a palestra sobre Scripts rodando na VM seja boa. Pena nao poder ficar o evento todo...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-6955960837468790667?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/6955960837468790667/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/04/ronie-no-suntechdays.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/6955960837468790667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/6955960837468790667'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/04/ronie-no-suntechdays.html' title='Ronie no SunTechDays'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-6308305413013877018</id><published>2007-04-18T21:07:00.000-03:00</published><updated>2007-04-18T22:17:10.878-03:00</updated><title type='text'>Grandes decepções</title><content type='html'>Eu estava comentando com uns colegas sobre "grandes idéias brochantes", ou seja, idéias que inicialmente pareciam muito boas, mas que depois descobrimos alternativas melhores, ou descobrimos que não eram lá tão boas assim.

&lt;span style="font-size:85%;color:#cc0000;"&gt;[AVISO! O conteúdo a seguir é de alta octanagem e pode causar flame wars ao menor contato com trolls e outros cabeçudos de plantão. Lembre-se que essas opiniões são baseadas na minha experiência pessoal. Sua opinião pode ser diversa e sua experiência pode ser outra, por isso, se quiser dizer que estou errado e sou um idiota, seja no mínimo educado, pra não passar por troll. (E se me ofender, vou aí chutar sua bunda!)]&lt;/span&gt;

Vou colocar meus 2 centavos de "grandes idéias brochantes" que aconteceram comigo:

&lt;strong&gt;Brochante 1: RUP&lt;/strong&gt;

Em idos de 1998, quando descobri RUP, achei que era "O" processo. Que a coisa era a solução definitiva para os problemas de projetos de software mal feitos. Comecei a estudar com afinco, e pensei "Nossa, quanta coisa! Mas um bom processo deve ter definição pra TUDO, então tá certo."

Depois, tive que fazer um projeto que usávamos um pouco de RUP. No início achei que tínhamos problemas porque estávamos usando pouca coisa, aí aumentamos nossa "aderência" ao RUP. Resultado: tempo gasto com documentação, menos desenvolvimento, documentos desincronizados, mais tempo com documentação, menos desenvolvimento... e no final, ainda muitos bugs e nenhuma estimativa confiável. Fiquei meio com um pé atrás, será que eu tinha errado? Primeira experiência com a coisa, acho que não tinha usado certo.

Aí conheci XP. Primeiro projeto besta que apareceu, experimentei. Ótimos resultados. Apareceu um projeto grande, experimentamos XP. A cada prática que colocávamos do XP, melhoravam os resultados. Conclusão: brochei do RUP.

&lt;strong&gt;Brochante 2: SOAP
&lt;/strong&gt;
A primeira vez que vi, achei que web services com soap eram a melhor invenção desde o pão fatiado. Ainda mais a integração que ele tinha com a plataforma .NET, super simples e fácil.

Um pouco mais tarde, descobri que o negócio era meio complicado, já que, fora do .NET, mexer com SOAP era um pesadelo (era o tempo do Apache-SOAP ainda, nem existia o Axis).

Daí, tive que fazer integração com alguns clientes que estavam usando simples "XML Vai, XML Vem" (protocolo "XV2") com posts e gets. Foi simples, fácil e muito rápido. Pronto, brochou geral. Hoje minha mente buzina "muita solução pra pouco problema" toda vez que penso em SOAP. E olha que isso foi antes d'eu conhecer RESTful Web Services.

&lt;strong&gt;Brochante 3: Aspectos
&lt;/strong&gt;
Quando conheci aspectos, achei a coisa mais poderosa do mundo. Simples, não intrusivo e resolvia grandes problemas.

Comecei a estudar. Até ajudei um colega a fazer um chat P2P de brincadeira em que a encriptação das mensagens era feita por aspecto. Colocava aspectos, pum, mensagens encriptadas; tirava aspectos, pam, mensagens plain text. Fantástico! Comecei a sonhar com uma camada de persistência não intrusiva, toda feita com aspectos.

Aí conheci RUBY e o "alias". Fiz tudo que fazia com aspectos sem esquentar a cabeca com pointcuts, advices e outros blah blah blahs. Resultado: brochei de Aspectos.

Hoje, quando Aspectos me vêm à mente, tem uma tag mental escrita: "classes abertas + alias, ponto final". Já tentei não pensar nisso, mas não adianta, encalacrou...

&lt;strong&gt;Brochante 4: Portlets&lt;/strong&gt;

Quando vi, achei uma boa idéia. Era a componentização para web, finalmente! Com um pouco mais de trabalho, a idéia serviria pra fazer componentes que poderiam ser utilizados em aplicações "não-portal". Comecei a estudar...

De cara, achei muito tosco, submeter todo o form e tentar manter o estado de cada Portlet era uma gambiarra sem fim... Mas vá, ossos do ofício, já que a web funciona assim. Comecei a achar que componentes pra web não eram lá uma idéia muito boa (ainda acho isso...).

Aí apareceu o Gmail, com intenso uso de AJAX. Olhei pros Portlets, pensei em como fazer eles em AJAX e pensei... "poisé, tou perdendo tempo"...

Sei que AJAX tem muitas limitações, conheço elas porque uso muito AJAX. O que só reforça minha idéia de que "aplicação web não pode ser pensada como se fosse desktop". Mas sinceramente, entre eles e Portlets... :

&lt;strong&gt;Brochante 5: Java&lt;/strong&gt;

Essa foi engraçada, brochei antes de conhecer a linguagem.

Em meados de 2000 eu trabalhava com Perl Orientado a Objetos (é... existe sim), e fiquei curioso quanto ao Smalltalk, já que todos os lugares falando sobre orientação a objeto mencionavam Smalltalk de um jeito ou de outro. Resolvi aprender...

Fiquei maravilhado com a linguagem: simples, poderosíssima, ambiente integrado onde eu alterava os sistemas "à quente". UAU!

Aí apareceu a oportunidade de trabalhar com Java, uma vontade que eu tinha desde os tempos de faculdade, pois todo mundo elogiava. Cheguei cheio de espectativas: "Java é bem mais novo, é orientado a objetos e deve ter todos os conceitos do Smalltalk, mas com tipagem forte!" ... Frau frau frau... Brochação geral... Collections ridículas, sem closures, pouca extensibilidade, ciclo de compilação full e nada de alterar a coisa "à quente". E a tipagem estática mais atrapalhava do que resolvia.

Conclusão: Hoje gosto muito do Java e desde lá venho usando ele 8 horas por dia, 5 dias por semana. Mas se me perguntarem se é a melhor linguagem pra programação... beeeeemmmm... tenho saudades de collections com closures...

&lt;strong&gt;Lições aprendidas...&lt;/strong&gt;

O que foi que aprendi com essas "brochações"?

Aprendi que nem toda idéia do "mainstream" é uma boa, e a olhar propaganda com muita desconfiança. Aprendi que é bom olhar o underground da computação em busca de idéias novas, ou pior, de velhas idéias fantásticas que nunca caíram no gosto da maioria.

Hoje sei que sou um programador melhor a cada vez que gasto tempo aprendendo algo que me faz pensar diferente... ando aprendendo LISP... espero que dê frutos (já deu, pra ser honesto)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-6308305413013877018?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/6308305413013877018/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/04/grandes-decepes.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/6308305413013877018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/6308305413013877018'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/04/grandes-decepes.html' title='Grandes decepções'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-7615925761163537743</id><published>2007-03-19T16:59:00.000-03:00</published><updated>2007-03-19T18:32:15.356-03:00</updated><title type='text'>Arquitetura três camadas é um mito sobre  desacoplamento...</title><content type='html'>Uma coisa que aprendemos desde nosso primeiro "if-else" em programação é que aplicações devem ser feitas em &lt;a href="http://en.wikipedia.org/wiki/Three-tier_%28computing%29"&gt;3 camadas&lt;/a&gt; (ou mais), a saber: apresentação, aplicação e persistência.

Uma arquitetura muito similar a ela é a popular MVC, que separa as coisas de forma parecida, mas a camada de persistência some dentro do "model" e a camada de aplicação é dividida entre "model" (com regras de negócio) e "controller" (que funciona como "cola" entre View e Model).

Hoje em dia, boa parte das arquiteturas pra web é um misto de MVC com 3 camadas, num&lt;span style="font-style: italic;"&gt; bororô&lt;/span&gt; formado por frameworks de apresentação, controllers temperados com "Dependency Injection" e um mapeador objeto-relacional. Tudo isso somado fornece o melhor nível de desacoplamento possível no sistema. É possível até mesmo trocar de banco de dados Oracle pra SQL-Server trocando apenas umas poucas linhas...

Mas será que é desacoplado mesmo?

Que tal experimentar o desacoplamento com uma alteração bastante comum como, vejamos... adicionar um campo? Bom, temos que mexer na view pra adicionar o campo, tb temos que mexer na camada de negócio para tratar o campo e validar, aí temos o transporte (V.O.s?) onde temos que adicionar o campo, e finalmente, adicionar no banco (o Hibernate até gera o campo pra vc, só que ele não migra os dados quando acontece a evolução do esquema, é na base da recriação da tabela).

Okay, o que temos aqui? Uma simples alteração gerou uma "shotgun surgery" no código, necessitando de alterações em todas as camadas.

Agora a questão é, como eu ISOLO isso? E, sendo mais cínico, de que me adianta trocar de banco com uma linha (e muito raramente eu faria isso), se para adicionar um simples campo eu preciso espalhar as alterações pra todo lado?

Eu já vi a algum tempo atrás na web alguns artigos com a mesma preocupação, eles tinham até um nome pra isso, mas sinceramente não consigo me lembrar, e por consequência, não acho mais os artigos :( Se alguém achar, me dá um toque.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-7615925761163537743?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/7615925761163537743/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/03/o-mito-das-3-camadas.html#comment-form' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/7615925761163537743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/7615925761163537743'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/03/o-mito-das-3-camadas.html' title='Arquitetura três camadas é um mito sobre  desacoplamento...'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-116854421928485581</id><published>2007-01-11T17:31:00.000-02:00</published><updated>2007-01-11T17:36:59.326-02:00</updated><title type='text'>De volta de lugar nenhum, não fui mesmo.</title><content type='html'>Depois de dar um gás no RubyOnBr e ele ocupar todo tempo livre q eu tinha pra escrever besteira, resolvi voltar a blogar.

E como jurei solenemente pela &lt;a href="http://www.malvados.com.br/"&gt;tira dos malvados&lt;/a&gt; que ia ser um cara legal esse ano, vou dar um tempo com meu &lt;a href="http://josebuscape.blogspot.com/"&gt;outro blog&lt;/a&gt; :)

Agora é pau na máquina e no código.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-116854421928485581?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/116854421928485581/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2007/01/de-volta-de-lugar-nenhum-no-fui-mesmo.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/116854421928485581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/116854421928485581'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2007/01/de-volta-de-lugar-nenhum-no-fui-mesmo.html' title='De volta de lugar nenhum, não fui mesmo.'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-114443541616848234</id><published>2006-04-07T15:40:00.000-03:00</published><updated>2006-04-07T15:43:36.180-03:00</updated><title type='text'>Meu último post</title><content type='html'>Vou aposentar meu blog.

É isso mesmo. ("Grandiscoisa", né?)

Depois de ouvir muita piada do Bart e do Marlus sobre como eu só posto reclamações, resolvi assumir que sou um resmungão mesmo. Então estou aposentando esse blog.... ... e criando outro :D

Agora sim o blog vai ficar bom: &lt;a href="http://josebuscape.blogspot.com"&gt;http://josebuscape.blogspot.com&lt;/a&gt;

Poisé... é isso :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-114443541616848234?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/114443541616848234/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2006/04/meu-ltimo-post.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/114443541616848234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/114443541616848234'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2006/04/meu-ltimo-post.html' title='Meu último post'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-114432698276358829</id><published>2006-04-06T09:22:00.000-03:00</published><updated>2006-04-06T09:36:25.520-03:00</updated><title type='text'>Web tranqueiras úteis</title><content type='html'>Engraçado, tou cada vez mais usando coisas web e menos aplicativos locais. Eles são muito mais simples e com menos recursos que os aplicativos locais, mas o fato de você poder compartilhar as coisas faz toda a diferença.

Aqui estão algumas web tranqueiras que eu ando usando:

del.icio.us (http://del.icio.us/rmuliana) -&gt; Meu "bookmark social". Já não vivo sem isso.
blog (http://mecanicamente.blogspot.com) -&gt; Uso mais pra compartilhar idéias com colegas e frequentemente, comigo mesmo.
flickr (http://flickr.com/photos/rmuliana) -&gt; Compartilhar fotos. Uso pouco, mas quando uso, vem muito a calhar.
writely (http://writely.com) -&gt; Escrever e compartilhar documentos de texto. Estou "começando a começar" a usar agora.
jobby (http://www.gojobby.com/Jobby/Resume/?user=986) -&gt; Site para empregos utilizando a filosofia "Web 2.0". Meu currículo está lá e eu assino o RSS com programadores Java no Brasil. Cada indíviduo com o perfil que eu quero que entra lá, meu RSS já "apita".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-114432698276358829?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/114432698276358829/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2006/04/web-tranqueiras-teis.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/114432698276358829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/114432698276358829'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2006/04/web-tranqueiras-teis.html' title='Web tranqueiras úteis'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-114409734673609652</id><published>2006-04-03T17:46:00.000-03:00</published><updated>2006-04-03T17:49:06.746-03:00</updated><title type='text'>Justo quando estou tentando fazer as pazes com Java...</title><content type='html'>Essa eu até tinha esquecido até 5 minutos atrás quando precisei de novo:

"Como você copia um arquivo em Java?"

Resposta: Abra dois streams e copie bytes de um para o outro....

COPIAR BYTES!!!!!! Ahhhh... Fala sério!!!

Entrou pra minha lista negra, junto com Calendar e Date: &lt;span style="font-weight:bold;"&gt;File&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-114409734673609652?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/114409734673609652/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2006/04/justo-quando-estou-tentando-fazer-as.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/114409734673609652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/114409734673609652'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2006/04/justo-quando-estou-tentando-fazer-as.html' title='Justo quando estou tentando fazer as pazes com Java...'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-114312140041760099</id><published>2006-03-23T10:24:00.000-03:00</published><updated>2006-03-23T10:43:20.450-03:00</updated><title type='text'>Parei de brigar com Java</title><content type='html'>Tem um monte de coisas que eu não gosto no Java. Collections meia boca, Date e Calendar cretinos, falta de closures, "estupidamente" tipado e outras coisas mais.

Porém, tenho que reconhecer que ele tem partes excelentes, a nova api para concorrência (do Doug Lea), muitas APIs pra tudo que você puder imaginar, uma comunidade grande (Apache inclusa), excelente IDEs (como o Eclipse, IntelliJ, Netbeans). 

Sem falar que eu trabalha fazem muitos anos com Java, então tenho um domínio da linguagem muito bom.

Então, decidi que ao invés de ficar reclamando como sempre, vou implementar as idéias que eu gosto (a maioria roubada de Smalltalk e Ruby) e fazer o melhor possível com o Java, usando o que é bom dele. Não dá pra fazer milagres, mas dá pra melhorar bastante.

Minha Wishlist:
 - Collections: Por enquanto, acho q vou me limitar a usar o Apache commons
 - Date e Calendar: ("muitas APIs") vou começar a usar Joda-Time. Parece muito boa!
 - Closures: Isso não tem muito jeito. Já via algumas libs legais pra Closures (tem uma aqui muito boa) Mas Closures em Java continua não sendo fácil de usar. Principalmente porque a sintaxe fica desajeitada e porque as coleções não suportam elas (justamente onde são mais úteis). Vou usar o que tem do Apache e provalemente criar uns helpers para classes anônimas, se eu já não achar isso na net.
 - Structs: Tipo beans, mas dinâmicos. Tem o Apache commons pra beans, bem útil. Mas vou criar umas pequenas estruturas para mim. Ia ser legal achar um nome tipo "Beans" :D Sei lá... o que é menor que um feijão (ou grão) e mais gostoso? "Berries"? "Café solúvel"?

Vou ver se junto tudo, faço um Jar legal e adiciono nos meus projetos.

Aquela história: "não adianta reclamar se você não vem com alguma solução"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-114312140041760099?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/114312140041760099/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2006/03/parei-de-brigar-com-java.html#comment-form' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/114312140041760099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/114312140041760099'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2006/03/parei-de-brigar-com-java.html' title='Parei de brigar com Java'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-114071751009991240</id><published>2006-02-23T13:32:00.000-03:00</published><updated>2006-02-23T14:58:30.150-03:00</updated><title type='text'>Onde estão os web designers? (Reclamação!!!)</title><content type='html'>Eu costumo dividir os caras que fazem o visual da página em 3 categorias:

&lt;b&gt;"Fazedor de HTML"&lt;/b&gt; não sabe HTML. Usa só Dreamweaver, ou pior, FrontPage. Não tem noção de cores, uso de espaço em branco, fonte, nem nada. No nível avançado, conhece as tags FONT e TABLE, e sabe fazer borda arredondada. Usa o Photoshop só para fazer as bordas e botões.

O layout das páginas desses caras costuma ter um monte de coisas, todas competindo pela sua atenção. E mesmo qdo parece boa, tem um "ar" de amador, mas não dá pra definir bem o porquê.

&lt;b&gt;"Designer"&lt;/b&gt; fez ou faz faculdade de publicidade e propaganda, marketing ou alguma coisa relacionada. Tem noção de design e ama Mac de paixão, mas continua usando Photoshop no Windows XP da empresa. Volta e meia usa o Dreamweaver. Mas faz o design obrigatoriamente no Photoshop. Conhece um pouco de HTML e um pouco de CSS. Manda bem no Flash.

O layout desses aí é muito profissional. Mas costuma ter 4 problemas: 
 - É pesado pra carvalho
 - Se o usuário não estiver rodando 800x600 com fonte padrão no Internet Explorer (800x600 pro cara é "ser compatível), o layout fica um lixo ou então arrebenta de vez.
 - Usar ele pra programar é um inferno, porque o HTML é tosco e bagunçado (padrão Dreamweaver e FrontPage, muito obrigado)
 - Se for atualizar o conteúdo, melhor republicar a página toda. Não tem como "só alterar um pedacinho".

&lt;b&gt;"Web-Designer"&lt;/b&gt; nunca fez faculdade, ou se fez, fez de alguma área de informática, mas sempre gostou mais de fazer interfaces do que chafurdar no código. Conhece HTML bem, CSS como a palma da mão e um bom tanto de Javascript. Acha falhas no Dreamweaver e excomunga o FrontPage. Rabisca o layout no papel antes de fazer qualquer coisa e quando faz, passa mais tempo mexendo na visão "source code", que na "layout".

Os problemas desse cara? É muito difícil de encontrar um cara desse tipo, e quando se acha, não se paga o que ele merece.

Até hoje, encontrei muito poucos raríssimos dessa espécie. O layout do cara costuma ser leve e limpo, com comentários e ótimo para programar. Sem falar que ele sabe fazer layout líquido numa boa, e a página não estoura se você usar o Ópera ou se seu padrão de fonte for um pouco diferente. 

Fora isso, é do tipo do cara que se você explicar uma linguagem de template pra ele (qq uma, Velocity, JSP, XSLT) ele não só sabe fazer o layout usando ela, como descobre novos e melhores jeitos de usar que você nunca pensou.

Se você é ou conhece um desses, me avisa. Tou precisando conhecer mais!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-114071751009991240?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/114071751009991240/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2006/02/onde-esto-os-web-designers-reclamao.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/114071751009991240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/114071751009991240'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2006/02/onde-esto-os-web-designers-reclamao.html' title='Onde estão os web designers? (Reclamação!!!)'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-114010820746184754</id><published>2006-02-16T11:38:00.000-02:00</published><updated>2006-02-17T08:26:24.596-02:00</updated><title type='text'>Gerentes querem linguagem dinâmica e não sabem.</title><content type='html'>Ando trabalhando com Java e Ruby pra web recentemente e não dá pra evitar notar certas coisas.

Em Ruby, posso alterar o servidor de produção sem parar nada.

Em Java, se altero uma classe, toca reiniciar o servidor pra pegar alterações. Meu chefe fica muito P da vida toda vez que preciso subir uma correção e tenho que fazer isso. Ele fica me torrando pra usar JSP ao invés de classes Java pra não ter que reiniciar :| (Acho que ele gostaria que eu usasse uma linguagem de script e não sabe disso...)

Em Ruby, se eu restarto o servidor de produção por algum motivo, ninguém perde sessão. No máximo a página fica fora alguns segundos. Tem gente que nem percebe...

Em Java, tenho que ter o maior cuidado com isso :| Se restarto com muitos usuários online a aplicação redireciona todo mundo pra tela de login... Não que não dê pra fazer um esquema para persistir, o Tomcat até tem um. Mas não é default, tem que configurar e tudo que tem na sessão tem que ser serializable.

Meu chefe, DE NOVO, me torra as paciências pra eu evitar restartar... (Continuo achando que ele quer é uma linguagem de script e não sabe).

O que eu acho mais engraçado é que você vai procurar por session persistence e a primeira coisa que você acha é cluster de servidores. Será que ninguém pensou que serializar sessão é muito útil por si só? Vai ver, como sempre, sou simplista demais.

Isso sem falar em regras dinâmicas muito loucas que apareceram em um projeto. Tive que usar o BeanShell (muito bom, aliás, bom MEEESMO), senão ia ficar maluco... O chefe adorou! (É... tenho _realmente_ a impressão que ele gostaria de usar uma linguagem de script)

Não me entenda mal, eu gosto de Java, é uma boa linguagem. Mas é muito mais complicada do que poderia ser. Questões de design da linguagem, eu acho...

Só sinto realmente falta de três coisas no Java: Closures, reflexão de verdade e um pouco menos de "estupidamente" tipado... Cansa ficar falando a mesma coisa o tempo todo pro compilador (Usuario usuario = new Usuario(); por exemplo.). Com generics então, que eu achei que ia facilitar isso, só deixou a coisa mais insana:

&lt;code&gt;
Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; map = new HashMap&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt;();
&lt;/code&gt;

Experimente um Map de Map, então :D. Too much fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-114010820746184754?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/114010820746184754/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2006/02/gerentes-querem-linguagem-dinmica-e-no.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/114010820746184754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/114010820746184754'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2006/02/gerentes-querem-linguagem-dinmica-e-no.html' title='Gerentes querem linguagem dinâmica e não sabem.'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-113993545199505285</id><published>2006-02-14T14:38:00.000-02:00</published><updated>2006-02-14T14:44:12.010-02:00</updated><title type='text'>Como traduzir um papo técnico</title><content type='html'>Eu imagino que esses papos técnicos são um tormento pra que não conhece. Eu que sei do que ele tá falando já me embananei...

&lt;hr /&gt;

De: Usuário Interessado 
Para: Programador Nerd
Assunto: pLACA de video

Você tem alguma info ou dica de placa para me dar? Please

--------------------------------------------------------------------------------

De: Programador Nerd 
Para: Usuário Interessado
Assunto: RES: pLACA de video

Usuário Interessado,

Seguinte placa de vídeo é algo complicado e uma das coisas mais caras num micro, hoje em dia como eu já te disse tem placas para todos os gostos e bolsos. Eu posso te dar uma dica melhor se eu souber quais os tipos de jogos que ele gosta e o quão fissurado por “beleza” dos gráficos ele é, eu mesmo não sou muito exigente só preciso de uma placa que rode o jogo, não preciso de algo que me encha os olhos, então eu aconselho algo da linha ATI 9600, modelo PRO ou XT, essas saem por volta de 350 a 400 reais, não tenho muita certeza. As NVidia Geforce 5700 ou 5900 também são muiiiito boas, procure evitar a 5200, no mainstream tem placas de 800 a 1000 que são da linha ATI X800 ou NVIDIA 6000, mas creio que essas não são o seu alvo... Resumindo sem enrolar muito eu aconselho uma ATI 9600 PRO ou XT, eu, Zé e Jão temos essas ai, eu tenho uma 9600 PRO de 128mb o Jão uma PRO de 256mb e o Zé uma XT de 256mb, que é melhor, eu com a minha sendo piorzinha estou muito bem obrigado, hoje em dia acho que por volta de 400, se quiser bater perna na santa ifigênia sempre tem bons negócios... 

            Desculpa o email enorme, tentei dar uma geral e não uma opinião especifica, de qualquer forma se quiser pede pra ele falar comigo no msn ou email mesmo para eu ver o que ele quer e tal :)
 

[]s

 
Programador Nerd

---------------------------------------------------------------
De: Usuário Interessado 
Para: Programador Nerd
Assunto: RES: pLACA de video


Programador, não consegui entender seu email...veja se a tradução está correta! 

Então....eu estou com os olhos cheios de lagrimas e de orelhas compridas, porque a beleza dos gráficos me fazem pensar em mulher, porem mulher ao custo de 5200 eu acho caro pacas, não preciso de algo que me encha os olhos,já o preço de ATI 9600,eu fico 3 noites sem sair de cima com mais de 20 garotas , modelo PROputas ou XoXoTas, essas saem por volta de 350 a 400 reais/por vez,acho.... não tenho muita certeza. As NinfetasVadias 5700 ou 5900 também são muiiiito boas porem muito, muito caras, procure evitar as vagabas de 5200, no mainstream da Republica do Libano tem de 800 a 1000 que são da linha AToxI 800 ou NasVaDIAs 6000, mas creio que essas não são o seu alvo... Resumindo sem enrolar muito eu aconselho uma boa bronha com mão adormecida e camisinha Jontex 9600 o Tião, Zé e Jão temos essas ai, vagabas 9600 PRO de 128 de rola,já o Jão uma PRO de 256 e o Zé uma  de 256, que é melhor, eu com a minha boa maozinha sendo piorzinha estou muito bem obrigado, hoje em dia acho que por volta de 400, se alguém quiser bater uma na santa ifigênia sempre tem bons negócios...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-113993545199505285?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/113993545199505285/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2006/02/como-traduzir-um-papo-tcnico.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113993545199505285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113993545199505285'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2006/02/como-traduzir-um-papo-tcnico.html' title='Como traduzir um papo técnico'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-113862559268631495</id><published>2006-01-30T10:40:00.000-02:00</published><updated>2006-01-30T10:53:14.750-02:00</updated><title type='text'>OffTopic: Filme bom pra caramba</title><content type='html'>Cinema nacional finalmente está saindo daquela utopia de "Cinema Arte" que só agrada aos cinéfilos. Principalmente daquele tipo que adora falar dos filmes usando termos como: "crítica da sociedade", "uma visão diferente", "belo" e por aí vai.

&lt;b&gt;"Se Eu Fosse Você"&lt;/b&gt; cai num tema muito batido (troca de corpos :D ), extremamente comercial, mas é MUITO BOM!!!!

O filme é realmente divertido pra quem já levou (ou leva) uma vida a dois. Fazia tempo que eu não ria tanto com um filme. Não tem pornografia, não pretende ser "artístico", é leve, bem-humorado e tem até a característica "lição de moral" no finalzinho. :)

Glória Pires nem convence tanto, mas manda bem. Agora o Tony Ramos tá MUITO perfeito e MUUUUUUITO engraçado. Eu não botava tanta fé no cara antes, mas depois desse filme, tenho que rever meus conceitos. Parece que dá até pra &lt;i&gt;ver&lt;/i&gt; a Glória Pires dentro do cara.

Assistam, eu recomendo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-113862559268631495?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/113862559268631495/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2006/01/offtopic-filme-bom-pra-caramba.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113862559268631495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113862559268631495'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2006/01/offtopic-filme-bom-pra-caramba.html' title='OffTopic: Filme bom pra caramba'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-113839002971818705</id><published>2006-01-27T17:20:00.000-02:00</published><updated>2006-01-27T18:34:02.050-02:00</updated><title type='text'>Auto-crítica é uma droga mesmo</title><content type='html'>Já fui pior, estou melhorando, mas ainda não cheguei lá.

&lt;a href="http://www.hacknot.info/hacknot/action/showEntry?eid=81"&gt;http://www.hacknot.info/hacknot/action/showEntry?eid=81&lt;/a&gt;

Tem um pouco de vários, pode me chamar de Henry Kevin Zachary :p

Inda chego a ser Quincy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-113839002971818705?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/113839002971818705/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2006/01/auto-crtica-uma-droga-mesmo.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113839002971818705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113839002971818705'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2006/01/auto-crtica-uma-droga-mesmo.html' title='Auto-crítica é uma droga mesmo'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-113812771027940454</id><published>2006-01-24T16:30:00.000-02:00</published><updated>2006-01-24T16:35:10.280-02:00</updated><title type='text'>Arrumando a casa</title><content type='html'>Poisé! Andei dando uma garibada no Blog. Cansei um pouco de ficar colocando minhas viagens &lt;a title="...até porque achei um jeito melhor de anotá-las"&gt;aqui&lt;/a&gt;.

De cara, mudei o modelo do blog (de novo), e agora vou começar a postar mais códigos e menos papo, basicamente, utilidades para Java e Ruby.

Talvez eu comece a escrever em inglês, não sei alguém mais vai ler a bagaça, e com certeza vou &lt;a title="...já que meu inglês é bem toscão"&gt;perder umas piadas&lt;/a&gt;. Mas nunca fui bom piadista mesmo, nem em português nem em qualquer língua.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-113812771027940454?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/113812771027940454/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2006/01/arrumando-casa.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113812771027940454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113812771027940454'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2006/01/arrumando-casa.html' title='Arrumando a casa'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-113709405426223363</id><published>2006-01-12T17:23:00.000-02:00</published><updated>2006-01-27T18:30:38.966-02:00</updated><title type='text'>Duck Type em Java</title><content type='html'>Como o Java é uma linguagem boa e com excelentes APIs, mas muito &lt;span style="font-weight:bold;"&gt;tosca&lt;/span&gt; em algumas coisas básicas (como manipulação de Strings e Coleções), volta e meio fazemos alguns utilitários estúpidos pra facilitar a vida.

Aqui vai um dos meus, um simples wrapper para facilitar a chamada de métodos dinâmicos.

&lt;pre&gt;
package common;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Executes a method in an object dinamically. It's a wrapper to the java
 * reflection way of execute methods dinamically.
 */
public class DuckType {

  public static &lt;T&gt; T execute(Object object, String methodName, Object ... parameters) {

    if (object == null) return null;
    if (methodName == null || methodName.equals("")) return null;
    
    Class[] classes = extractClassesFromParameters(parameters);
    
    try {
      
      return (T) executeEasyWay(object, methodName, classes, parameters);

    } catch (NoSuchMethodException e) {
      
      return (T) executeHardWay(object, methodName, classes, parameters);
      
    } catch (SecurityException e) {
      return null;
    } catch (IllegalArgumentException e) {
      return null;
    } catch (IllegalAccessException e) {
      return null;
    } catch (InvocationTargetException e) {
      return null;
    }
  }

  private static Object executeEasyWay(Object object, String methodName, Class[] classes, Object... parameters) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
    
    Method method = object.getClass().getMethod(methodName, classes);
    return method.invoke(object, parameters);
  }

  private static Object executeHardWay(Object object, String methodName, Class[] classes, Object... parameters) {
    
    // it didn't find the method in the easy way, trying the hard way
    Method[] methods = object.getClass().getMethods();
    
    for (Method method : methods) {
      Class&lt;?&gt;[] methodTypes = method.getParameterTypes();
      
      // Ignore methods with different names
      if (!methodName.equals(method.getName())) continue;
      
      // Ignore methods with different number of parameters 
      if (methodTypes.length != classes.length) continue;
      
      boolean isMethodExecutable = true;
      for (int i = 0; i &lt; methodTypes.length; i++) {
        Class&lt;?&gt; methodType = (Class&lt;?&gt;) methodTypes[i];
        Class parameterType = classes[i];
        
        if (!methodType.isAssignableFrom(parameterType)) {
          isMethodExecutable = false;
          break;
        }
      }
      
      try {
        
        if (isMethodExecutable) return method.invoke(object, parameters);
        
      } catch (IllegalArgumentException e1) {
        return null;
      } catch (IllegalAccessException e1) {
        return null;
      } catch (InvocationTargetException e1) {
        return null;
      }
    }
    
    return null;
  }

  private static Class[] extractClassesFromParameters(Object[] parameters) {
    
    Class[] classes = new Class[parameters.length];
    
    for (int i = 0; i &lt; parameters.length; i++) {
      Object parameter = parameters[i];
      classes[i] = parameter.getClass();        
    }
    
    return classes;
  }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-113709405426223363?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/113709405426223363/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2006/01/duck-type-em-java.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113709405426223363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113709405426223363'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2006/01/duck-type-em-java.html' title='Duck Type em Java'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-113698405656000000</id><published>2006-01-11T10:13:00.000-02:00</published><updated>2006-01-12T17:22:55.236-02:00</updated><title type='text'>Controle de versão para os dados</title><content type='html'>Quanto mais eu penso, mais acredito que preciso experimentar essa idéia o mais rapidamente possível.

Outro dia estava mexendo com as "rules" do PostgreSQL (triggers) para fazer log de uma tabela essencial do sistema. Qualquer alteração criava um registro em uma tabela gêmea, com a data da alteração e o usuário.

Comecei a pensar o que aconteceria se eu fizesse isso para TODAS as tabelas do sistema. Acho que ia virar uma espécie de controle de versão dos dados, e melhor ainda, acho que consigo criar toda essa estrutura, tabelas gêmeas e triggers, com um simples script.

Ainda não pensei direito o efeito disso sobre as tabelas de relacionamento N-M, mas acho q também funciona. Talvez fiquem gigantes, mas não vejo problema nisso. E com certeza, as gêmeas não podem ter "constraints" como "unique" e coisas do tipo, mas também acho isso contornável.

Resta o problema de manutenção, triggers sempre são complicadas. Mas como as tabelas gêmeas não fazem parte realmente do sistema e nenhuma delas vai ter triggers, acho que não vou ter problemas de atualizações em cascata que o pessoal tanto abomina nas triggers.

Acho que dá pra fazer um Engine no Rails (ActiveRecord) pra isso. Já tem um plugin pra isso: &lt;a href="http://wiki.rubyonrails.com/rails/pages/Acts+As+Versioned+Plugin"&gt;acts_as_versioned&lt;/a&gt;

Quem sabe? Só estou jogando idéias pra cima.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-113698405656000000?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/113698405656000000/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2006/01/controle-de-verso-para-os-dados.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113698405656000000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113698405656000000'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2006/01/controle-de-verso-para-os-dados.html' title='Controle de versão para os dados'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-113681606675079232</id><published>2006-01-09T11:47:00.000-02:00</published><updated>2006-01-09T12:14:26.800-02:00</updated><title type='text'>O que me imcomoda em Linguagens e APIs</title><content type='html'>Sabe,

Tava organizando os pensamentos aqui e finalmente achei o motivo pelo qual não simpatizo muito de certas Linguagens e APIs.

O que me torra o saco é quando os designers delas tem a genial idéia de proibir coisas na linguagem para evitar "más práticas". Só que más práticas dependem do contexto onde são usadas.

Eu vejo frequentemente que o resultado disso cai em dois casos:
- Programadores imbecis continuam fazendo imbecilidades de outras formas. ("É muito difícil fazer algo a prova de idiotas, eles são muito imaginativos")
- Programadores menos imbecis tem que fazer imbecilidades para fazer o código funcionar como querem. Quantas vezes você já "hackeou" o Java porque ele não deixava você fazer o que queria de um jeito simples.

A lição que eu tiro disso? Você não pode prever como seus usuário vão usar suas coisas, então é melhor não tentar.

"AH! Mas os outros programadores são muito estúpidos, se eu não travar isso, vão fazer cagada" -- Típico pensamento arrogante que nós programadores temos. Devíamos ser mais humildes ou pelo menos não subestimar nossos pares. (Já ouvi um "Se você fizer algo achando que seus usuário são ignorantes, eles terão de ser ignorantes pra usar o que você fez")

No fim das contas, se o outro programador fizer cagada com sua API/Linguagem, de quem é o problema? Do designer da API?! Isso só pode ser o cúmulo da arrogância, meio querer ser "oniscente e onipotente". Se o imbecil faz imbecilidades, sinceramente, problema dele, devia ter estudado mais antes de ser programador. Se não fizer, tanto melhor!!!

Li em um blog outro dia uma coisa muito legal: "Fazer uma boa linguagem de programação 'segura' é como fazer uma faca afiada que nunca corte o dedo de quem usa".

Mas sabe, eu estava no açougue outro dia e vi o açougueiro estripando a carne com fé e vontade. Fiquei pensando como é que ele não picava os dedos juntos, tal o empenho que ele estava em estripar a pobre peça de carne (acho que era uma costela, sei lá). Aí vi o motivo: ele estava usando uma luva de metal na mão que segurava a carne...

Que isso tem a ver com programação? Que a faca tem que ser a mais afiada possível para você fazer um bom trabalho. E se não quiser cortar os dedos use a porcaria da luva! Imagino que nossas "luvas" sejam testes de unidade, mas não sei ao certo. Só garanto que se a linguagem é realmente afiada, use alguma proteção ao invés de querer fazer a linguagem "perder o fio".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-113681606675079232?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/113681606675079232/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2006/01/o-que-me-imcomoda-em-linguagens-e-apis.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113681606675079232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113681606675079232'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2006/01/o-que-me-imcomoda-em-linguagens-e-apis.html' title='O que me imcomoda em Linguagens e APIs'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-113027250771054527</id><published>2005-10-25T18:16:00.000-02:00</published><updated>2005-10-25T18:35:10.093-02:00</updated><title type='text'>De volta aos posts</title><content type='html'>Caçarola, aconteceu tanta coisa nesse último mês que nem deu tempo de escrever :p

Trabalho de mestrado + trabalhos em ruby, fora o trampo normal.... Não dava tempo nem pra respirar. Agora as coisas estão entrando no eixo novamente, então vai dar pra escrever mais.

De novidade, descobri o &lt;a href="http://railspodcast.dreamhosters.com"&gt;podcast do Rails&lt;/a&gt;. Bem fraquinhas as primeiras edições, mas parece melhorou, não ouvi as últimas ainda.

Outra novidade é foi o lançamento to &lt;a href="http://weblog.rubyonrails.com/archives/2005/10/19/rails-1-0-the-release-candidate-2"&gt;Rail Release Candidate 2&lt;/a&gt;. Tem umas melhorias muito legais, principalmente que agora fizeram um esquema interessante para plugins. Aliás, cedo ou tarde vou ter que comentar as capacidade do Ruby nesse ponto (plugins).

Mais uma é que finalmente estamos implantando XP aqui no trampo. Apesar de já ter implantando em outros grupos e empresas, o pessoal daqui estava muito resistente. Agora houveram mudanças estruturais aqui que deram um pouco mais de maleabilidade. Agora vai!!! (Finalmente, ô dureza)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-113027250771054527?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/113027250771054527/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/10/de-volta-aos-posts.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113027250771054527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/113027250771054527'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/10/de-volta-aos-posts.html' title='De volta aos posts'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112748105121456846</id><published>2005-09-23T10:10:00.000-03:00</published><updated>2005-09-23T10:10:51.246-03:00</updated><title type='text'>Quando um software morre? E por quê?</title><content type='html'>Esse mestrado est&amp;aacute; excelente! Estou aprendendo muito, tanto com os professores quanto com os colegas. Verdadeira overdose de conhecimento, basta ficar de orelhas abertas.

Ontem a discuss&amp;atilde;o foi sobre o ciclo de vida de um software, e principalmente, quando um software morre. De todas as id&amp;eacute;ias apresentadas (incluindo a "oficial" do Roger Pressman), a melhor foi a que eu vi de dois colegas (Clayton e Orlando, excelente conceito, pessoal!!!). 

Segundo essa id&amp;eacute;ia, um software morre quando manter a &lt;i&gt;ader&amp;ecirc;ncia&lt;/i&gt; do software ao neg&amp;oacute;cio fica muito cara. &lt;b&gt;Ader&amp;ecirc;ncia&lt;/b&gt; aqui significa o quanto das suas funcionalidades atendem &amp;agrave;s necessidades do neg&amp;oacute;cio.

E quando e por que isso acontece? Quando &amp;eacute; dif&amp;iacute;cil de responder, mas o porqu&amp;ecirc; d&amp;aacute; algumas pistas. Discutindo depois, descobrimos que basicamente existem tr&amp;ecirc;s fatores: os profissionais de uma tecnologia antigas come&amp;ccedil;am a  ficar escassos e caros (vide Cobol); e as tecnologias novas geram necessidades que as tecnologias antigas n&amp;atilde;o conseguem atender a um custo razo&amp;aacute;vel. Por exemplo, internet. E finalmente, um software que vem sendo remendado h&amp;aacute; anos fica muito fr&amp;aacute;gil, o que aumenta o custo das altera&amp;ccedil;&amp;otilde;es em si.

Parece &amp;oacute;bvio e simples quando voc&amp;ecirc; diz isso, mas quando voc&amp;ecirc; est&amp;aacute; na lida do dia &amp;agrave; dia, ralando e cheio de problemas, isso n&amp;atilde;o fica t&amp;atilde;o aparente.

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112748105121456846?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112748105121456846/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/09/quando-um-software-morre-e-por-qu.html#comment-form' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112748105121456846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112748105121456846'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/09/quando-um-software-morre-e-por-qu.html' title='Quando um software morre? E por qu&amp;ecirc;?'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112687325174566574</id><published>2005-09-16T09:20:00.000-03:00</published><updated>2005-09-16T09:20:51.783-03:00</updated><title type='text'>Novos pensamentos</title><content type='html'>Ontem tive aula de Engenharia de Software no Mestrado. Deu pra ter umas id&amp;eacute;ias interessantes:

 - Requisito implementado gera mais requisitos (Algo do tipo, desejo atendido faz com que a pessoa queira outras coisas)

 - Hoje em dia, todas as empresas grandes e de m&amp;eacute;dio porte j&amp;aacute; est&amp;atilde;o informatizadas. Apesar de ainda termos muitos sistemas novos aparecendo, surgiu uma imensa necessidade de _manuten&amp;ccedil;&amp;atilde;o_ nos que ainda existem. Essa manuten&amp;ccedil;&amp;atilde;o n&amp;atilde;o &amp;eacute; do tipo "corrigir problemas", mas sim do tipo "evoluir o sistema" para atender as novas necessidades da empresa. Sei n&amp;atilde;o, mas acho que isso pode se tornar um mercado.

Que tal? Uma empresa que vende como servi&amp;ccedil;o a "manuten&amp;ccedil;&amp;atilde;o evolutiva" do seu sistema?
Acho que tem umas complica&amp;ccedil;&amp;otilde;es... mas se puderem ser superadas... quem sabe?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112687325174566574?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112687325174566574/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/09/novos-pensamentos.html#comment-form' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112687325174566574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112687325174566574'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/09/novos-pensamentos.html' title='Novos pensamentos'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112506997924598229</id><published>2005-08-26T12:26:00.000-03:00</published><updated>2005-08-26T12:26:19.306-03:00</updated><title type='text'>Canos ao invés de Camadas</title><content type='html'>Isso &amp;eacute; o germe de uma id&amp;eacute;ia ainda. Mas j&amp;aacute; vou postar pra ver se a discuss&amp;atilde;o evolui a id&amp;eacute;ia.

Eu e o Marlus aqui est&amp;aacute;vamos discutindo sobre camadas (de software) e como &amp;eacute; dif&amp;iacute;cil voc&amp;ecirc; controlar isso porque camadas podem ter uma "superf&amp;iacute;cie de contato" muito grandes entre si. Sem falar que frequentemente voc&amp;ecirc; n&amp;atilde;o consegue isolar uma camada inteiramente do contato com outras duas.

A&amp;iacute;, pensando em algumas coisas que implementamos aqui, encontramos uma outra met&amp;aacute;fora que leva a um design ligeiramente diferente: CANOS.

Imagina que seu m&amp;oacute;dulo n&amp;atilde;o &amp;eacute; uma camada, mas um componente isolado que s&amp;oacute; se comunica com outros atrav&amp;eacute;s de uma &amp;uacute;nica classe, nosso "cano". M&amp;oacute;dulos (pacotes ou componentes) s&amp;oacute; se conecta a outro atrav&amp;eacute;s de &lt;b&gt;um &amp;uacute;nico&lt;/b&gt; cano. Dessa forma, se a comunica&amp;ccedil;&amp;atilde;o precisar de modifica&amp;ccedil;&amp;otilde;es, valida&amp;ccedil;&amp;otilde;es ou restri&amp;ccedil;&amp;otilde;es, voc&amp;ecirc; pode trabalhar somente na classe que faz a conex&amp;atilde;o ao inv&amp;eacute;s de ter toda uma superf&amp;iacute;cie de contato para ca&amp;ccedil;ar. &amp;Eacute; como se todo componente/pacote/m&amp;oacute;dulo tivesse obrigatoriamente um fa&amp;ccedil;ade. (hmmmm....)

Essa id&amp;eacute;ia levou a outra. Se eu tenho um cano e preciso transportar dados, como eu transporto? Minha sugest&amp;atilde;o &amp;eacute; "enlatar" os dados em uma estrutura que ambos os componentes/m&amp;oacute;dulos/pacotes entendam. Os dados s&amp;oacute; podem ser obtidos dali.

Essa id&amp;eacute;ia de lata de dados foi aplicada em um framework aqui e deu resultados muito bons. Toda a transforma&amp;ccedil;&amp;atilde;o de dados necess&amp;aacute;rio para comunicar os componentes p&amp;ocirc;de ser feito na lata ao inv&amp;eacute;s de ficar espalhado.

Canos e latas.... ser&amp;aacute; que d&amp;aacute; pra evoluir a id&amp;eacute;ia?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112506997924598229?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112506997924598229/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/canos-ao-invs-de-camadas.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112506997924598229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112506997924598229'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/canos-ao-invs-de-camadas.html' title='Canos ao inv&amp;eacute;s de Camadas'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112491532650444325</id><published>2005-08-24T17:28:00.000-03:00</published><updated>2005-08-24T18:36:27.920-03:00</updated><title type='text'>Duck Typing?</title><content type='html'>Pra mim, isso &amp;eacute; duck typing. Mas obviamente o cara t&amp;aacute; pensando em algo muuuuito mais avan&amp;ccedil;ado, baseado em reconhecimento de padr&amp;otilde;es.

&lt;blockquote&gt;
...Computer architectures as we know them were first designed around simulated wires. Source code is a simulation of pulses that can be sent sequentially down a wire, as are passed variables or messages.

Now, I think that's a notion that can be extended very, very, far. And if you really want to, you can even use it to describe all of nature, but it's not the only idea that could be extended that far. And it does get kind of awkward because this is not the way that natural systems work.

For example, if you want to describe the connection between a rock and the ground that the rock is resting on, as if it were information being sent on a wire, it's possible to do that, but it's not the best way. It's not an elegant way of doing it. If you look at nature at large, &lt;b&gt;probably a better way to describe how things connect together is that there's a surface between any two things that displays patterns&lt;/b&gt;.
&lt;/blockquote&gt;
-- &lt;a href="http://java.sun.com/features/2003/01/lanier_qa1.html" title="Entrevista com Jaron Lanier no site da Sun"&gt;Entrevista com Jaron Lanier no site da Sun&lt;/a&gt; (&amp;ecirc;nfase minha)

Por enquanto, eu fico com o b&amp;aacute;sico "Duck Typing". Pra mim (opini&amp;atilde;o bem pessoal) &amp;eacute; exatamente isso que o cara falou de ter padr&amp;otilde;es entre as partes que s&amp;atilde;o reconhec&amp;iacute;veis. Talvez d&amp;ecirc; pra estender a id&amp;eacute;ia um pouco, mas que sei eu?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112491532650444325?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112491532650444325/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/duck-typing.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112491532650444325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112491532650444325'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/duck-typing.html' title='Duck Typing?'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112489055068156437</id><published>2005-08-24T10:35:00.000-03:00</published><updated>2005-08-24T10:35:50.686-03:00</updated><title type='text'>Qualidade implícita e Fábrica de Software</title><content type='html'>Bom, n&amp;atilde;o &amp;eacute; novidade pros meus amigos que tenho minhas restri&amp;ccedil;&amp;otilde;es quanto ao termo "F&amp;aacute;brica de Software", porque ele implica em algumas coisas que eu n&amp;atilde;o concordo muito. Pra poder ser "F&amp;aacute;brica de Software" tem que ter uma estrutura que eu n&amp;atilde;o vi em &lt;i&gt;nenhuma&lt;/i&gt; empresa que se auto-intitula isso. Ent&amp;atilde;o, fico com a impress&amp;atilde;o que eles est&amp;atilde;o vendendo gato como lebre.

Outra reclama&amp;ccedil;&amp;atilde;o minha, a mais b&amp;aacute;sica, &amp;eacute; que "F&amp;aacute;brica" tenta seguir o modelo de produ&amp;ccedil;&amp;atilde;o em massa de montadoras: "Coloque o design na ponta da f&amp;aacute;brica, os programadores seguem as instru&amp;ccedil;&amp;otilde;es e o software fica pronto". Isso &amp;eacute; uma maravilha sob o ponto de vista gerencial j&amp;aacute; que &amp;eacute; um processo previs&amp;iacute;vel e vc s&amp;oacute; precisa de uns poucos analistas muito experientes e um tanto de programadores de baixo custo.

Por mais que eu tente, n&amp;atilde;o consigo me convencer que isso funcione (por motivos bastante &amp;oacute;bvios). 

Outro fator, que &amp;eacute; simplesmente cr&amp;iacute;tico, &amp;eacute; que em toda "F&amp;aacute;brica" seu comprador espera que voc&amp;ecirc; tenha um processo muito bem definido de qualidade. Ningu&amp;eacute;m paga 60K num carro pra ele vir parcialmente completo, entregue depois do prazo e com uns defeitos aqui e ali. Imagine ent&amp;atilde;o um produto que chega a custar v&amp;aacute;rias vezes um carro desses.

Agora eu pergunto pra quem trabalha e gerencia uma f&amp;aacute;brica: "Voc&amp;ecirc; tem m&amp;eacute;tricas e m&amp;eacute;todos para produzir um software com a qualidade implicitamente esperada?". Seja sincero pra voc&amp;ecirc; mesmo, sem essa de "estamos nos preparando" e "temos mas o prazo n&amp;atilde;o permite".

N&amp;atilde;o &amp;eacute; de se admirar que os clientes fiquem nervosos com nossa &amp;aacute;rea. Dou raz&amp;atilde;o &amp;agrave; eles.

PS: AH! E se vc acha que ter um CMMi garante essa qualidade, olhe o processo atentamente e pense de novo: onde no processo voc&amp;ecirc; detecta, corrige ou mesmo &lt;i&gt;previne&lt;/i&gt; (&amp;ecirc;nfase aqui) os defeitos? Preenchendo relat&amp;oacute;rios e gerando mais ordens de servi&amp;ccedil;o? E onde est&amp;aacute; o m&amp;eacute;todo de detec&amp;ccedil;&amp;atilde;o? &amp;Eacute; do tipo: "Q&amp;A vai l&amp;aacute;, senta e testa?", "Isso &amp;eacute; um processo a ser definido pelo Q&amp;A".

Ceeeeerto.....


&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112489055068156437?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112489055068156437/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/qualidade-implbrica-de-software.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112489055068156437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112489055068156437'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/qualidade-implbrica-de-software.html' title='Qualidade impl&amp;iacute;cita e F&amp;aacute;brica de Software'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112388334918749226</id><published>2005-08-12T18:49:00.000-03:00</published><updated>2005-08-12T18:49:09.186-03:00</updated><title type='text'>O programador padrão</title><content type='html'>Acabei de pensar quando finalizava o t&amp;oacute;pico anterior...

At&amp;eacute; onde ser&amp;aacute; que vai o conhecimento da maior parte dos programadores? UML? Padr&amp;otilde;es? Aspecto? Anota&amp;ccedil;&amp;otilde;es? Testes de Unidade? Gera&amp;ccedil;&amp;atilde;o de c&amp;oacute;digo? Parsers de linguagem? Express&amp;otilde;es regulares?

N&amp;atilde;o estou pensando em quest&amp;atilde;o de coisas ou programadores mais avan&amp;ccedil;ados ou menos avan&amp;ccedil;ados, acho que nem d&amp;aacute; pra classificar isso. Mas no que 80% dos programadores profissionais conhecem em comum.

Seria essa a nossa base m&amp;iacute;nima de conhecimento hoje? Daria pra fazer alguma aproxima&amp;ccedil;&amp;atilde;o &amp;uacute;til com isso?

Hmmmm... coisas a se pensar...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112388334918749226?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112388334918749226/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/o-programador-padro.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112388334918749226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112388334918749226'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/o-programador-padro.html' title='O programador padr&amp;atilde;o'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112388289595178966</id><published>2005-08-12T18:41:00.000-03:00</published><updated>2005-08-12T18:41:35.986-03:00</updated><title type='text'>Sobre Orientação a Objeto e Domain Specific Languages, sempre abstrações.</title><content type='html'>No princ&amp;iacute;pio era o macarr&amp;atilde;o!

Grandes blocos de c&amp;oacute;digo em sequ&amp;ecirc;ncia com saltos arbitr&amp;aacute;rios que faziam com que rastrear um programa fosse um exerc&amp;iacute;cio de desatar n&amp;oacute;s para escoteiros.

Ent&amp;atilde;o os gurus disseram - "Que se criem fun&amp;ccedil;&amp;otilde;es", e a programa&amp;ccedil;&amp;atilde;o estruturada surgiu.

Pequenos blocos de c&amp;oacute;digos espalhados por arquivos, &amp;agrave;s vezes nem t&amp;atilde;o pequenos, uns referenciando outros. As fun&amp;ccedil;&amp;otilde;es se tornaram comandos e algumas vezes era dif&amp;iacute;cil saber o que era um comando criado dado pela linguagem de outro criado por usu&amp;aacute;rios. As linguagens se expandiam naturalmente. Tempos de ouro das "Bibliotecas".

Ent&amp;atilde;o os gurus olharam, acharam bom, e criaram a orienta&amp;ccedil;&amp;atilde;o a objeto.

Blocos de c&amp;oacute;digo que continham seus pr&amp;oacute;prios dados, com a inten&amp;ccedil;&amp;atilde;o de serem modelos mais pr&amp;oacute;ximos das coisas reais. Ela se expandiu, tomou forma, agora, al&amp;eacute;m de comandos, pod&amp;iacute;amos ter nossos pr&amp;oacute;prios tipos de dados &lt;i&gt;inteligentes&lt;/i&gt; e que sabiam interagir uns com outros. As bibliotecas ganharam nome de API, come&amp;ccedil;ou a era de ouro dos Patterns e Frameworks.

Agora alguns gurus olham e apontam: Linguagens orientada a linguagens, aspectos, linguagens espec&amp;iacute;ficas de dom&amp;iacute;nio... precisamos de mais flexibilidade/velocidade!

As linguagens espec&amp;iacute;ficas de dom&amp;iacute;nio andam me interessando bastante. Usando um pouco delas comecei a perceber que o que fazemos na verdade n&amp;atilde;o passa de criar abstra&amp;ccedil;&amp;otilde;es espec&amp;iacute;ficas para nossos problemas. Isso fazemos o tempo todo, nenhuma novidade, a diferen&amp;ccedil;a &amp;eacute; que agora, al&amp;eacute;m de criarmos as abstra&amp;ccedil;&amp;otilde;es, queremos organiz&amp;aacute;-las em uma sintaxe que seja mais adequada para representar uma solu&amp;ccedil;&amp;atilde;o.

H&amp;aacute; um monte de implica&amp;ccedil;&amp;otilde;es nisso: n&amp;atilde;o-programadores podendo escrevendo defini&amp;ccedil;&amp;otilde;es na &amp;aacute;rea onde s&amp;atilde;o experts, mais solu&amp;ccedil;&amp;atilde;o por linha de c&amp;oacute;digo, etc, etc. Mas n&amp;atilde;o vou entrar nisso. 

O que me interessa &amp;eacute; que acho a evolu&amp;ccedil;&amp;atilde;o do software sempre nos guiou a criarmos nossa pr&amp;oacute;pria "linguagem" com as abstra&amp;ccedil;&amp;otilde;es para o neg&amp;oacute;cio para o qual estamos programando. Mas isso era impl&amp;iacute;cito, ou talvez n&amp;atilde;o completamente percebido. Agora, com DSL, linguagens de script e outras coisas tomando foco talvez a ficha caia de vez.

Talvez n&amp;atilde;o seja nada disso e eu esteja enganado, ou talvez isso s&amp;oacute; alcance o programador padr&amp;atilde;o daqui uns trocentos anos. Quem sabe? Enquanto isso, vou testando minha teoria e batendo a cabe&amp;ccedil;a por conta pr&amp;oacute;pria.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112388289595178966?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112388289595178966/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/sobre-orientaes.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112388289595178966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112388289595178966'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/sobre-orientaes.html' title='Sobre Orienta&amp;ccedil;&amp;atilde;o a Objeto e Domain Specific Languages, sempre abstra&amp;ccedil;&amp;otilde;es.'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112379779779685365</id><published>2005-08-11T19:03:00.000-03:00</published><updated>2005-08-11T19:03:17.840-03:00</updated><title type='text'>Padrão nada importante: "Result named variable"</title><content type='html'>Um padr&amp;atilde;o sobre nomenclatura que eu adoto faz uns anos, e j&amp;aacute; vi alguns outros birutas usando tamb&amp;eacute;m (&amp;eacute; bom saber que n&amp;atilde;o sou o &amp;uacute;nico retardado da &amp;aacute;rea).

Problema:
Voc&amp;ecirc; tem um m&amp;eacute;todo que retorna uma cole&amp;ccedil;&amp;atilde;o, uma das primeira linhas do m&amp;eacute;todo &amp;eacute; atribuir uma cole&amp;ccedil;&amp;atilde;o &amp;agrave; vari&amp;aacute;vel local que vai ser retornada. Voc&amp;ecirc; n&amp;atilde;o encontrou um bom nome para a vari&amp;aacute;vel.

Solu&amp;ccedil;&amp;atilde;o:
Chame a vari&amp;aacute;vel de "result".

Isso parece besta, mas sabe que torna o m&amp;eacute;todo muito leg&amp;iacute;vel? Ando usando essa nome de vari&amp;aacute;vel pra quase todo m&amp;eacute;todo onde eu acumulo coisas e retorno o resultado. N&amp;atilde;o sei se foi pq acostumei com o padr&amp;atilde;o, mas sempre bato o olho e j&amp;aacute; entendo o que acontece.

Isso estende pra outra id&amp;eacute;ia que ando experimentando: vari&amp;aacute;veis locais nomeadas segundo sua fun&amp;ccedil;&amp;atilde;o no m&amp;eacute;todo. Se &amp;eacute; um contador: counter, x ou i; se &amp;eacute; um peda&amp;ccedil;o da string de nome de cachorro:string_part e n&amp;atilde;o dog_name_part.

Ainda estou experimentando pra ver se isso &amp;eacute; bom. A gente s&amp;oacute; sabe se fica bom mesmo depois que tem que mexer no mesmo programa depois de seis meses. Ent&amp;atilde;o leva um tempo pra ver se &amp;eacute; &amp;uacute;til de fato.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112379779779685365?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112379779779685365/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/padro-nada-importante-result-named.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112379779779685365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112379779779685365'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/padro-nada-importante-result-named.html' title='Padr&amp;atilde;o nada importante: &quot;Result named variable&quot;'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112316190965371316</id><published>2005-08-04T10:25:00.000-03:00</published><updated>2005-08-04T11:12:51.966-03:00</updated><title type='text'>Limite de popularidade de uma linguagem</title><content type='html'>Agora cedo eu e o Alessandro conversamos rapidamente sobre linguagens como Ruby e Python estarem ficando cada vez mais populares.
&lt;pre&gt;
Ronie  x-arnie  .NET e Java s&amp;atilde;o mainstream, depois vem PHP,
                Python e l&amp;aacute; na rabeira, Ruby 
Ronie  x-arnie  Contudo, com o framework de web deles, o Rails,
                est&amp;atilde;o ganhando espa&amp;ccedil;o, s&amp;oacute; n&amp;atilde;o sei at&amp;eacute; onde. 
x-arnie  Ronie  hum.., complicado dizer 
x-arnie  Ronie  mas n&amp;atilde;o vai ficar muito al&amp;eacute;m do python ou php,
                eu diria que no m&amp;aacute;ximo igual ao php
x-arnie  Ronie  pelo que costumo ver nessas evolu&amp;ccedil;&amp;otilde;es 
Ronie  x-arnie  Por a&amp;iacute;. 
Ronie  x-arnie  Sem suporte de uma grande empresa,
                n&amp;atilde;o atinge a "diretoria" 
x-arnie  Ronie  that&amp;acute;s the point! ;) 
&lt;/pre&gt;

Ta&amp;iacute;, se d&amp;aacute; pra fazer uma aposta sobre at&amp;eacute; onde vai a popularidade de uma linguagem, ou o tamanho da sua comunidade, podemos chutar que n&amp;atilde;o vai al&amp;eacute;m do PHP se n&amp;atilde;o atingir a diretoria.

O Ruby e o Rails mudariam isso? Eu gostaria, mas duvido muito.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112316190965371316?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112316190965371316/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/limite-de-popularidade-de-uma.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112316190965371316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112316190965371316'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/limite-de-popularidade-de-uma.html' title='Limite de popularidade de uma linguagem'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112298894478939249</id><published>2005-08-02T10:22:00.000-03:00</published><updated>2005-08-02T10:22:24.826-03:00</updated><title type='text'>DSL (Domain Specific Languages)</title><content type='html'>Volta e meia eu pego algo sobre DSL para ler. Hoje achei um artigo do tio Fowler que &amp;eacute; muito bom. Ele explica DSL de cabo a rabo e d&amp;aacute; uns links muito legais.

&lt;a href="http://martinfowler.com/articles/languageWorkbench.html" title="Artigo do Martin Fowler sobre Domain Specific Languages"&gt;Language Workbench (DSLs)&lt;/a&gt;

Eu nessa hist&amp;oacute;ria prefiro as DSLs internas. Estou tendo um dose maci&amp;ccedil;a de exposi&amp;ccedil;&amp;atilde;o a Ruby (e Rails) recentemente e percebi que &amp;eacute; muito simples criar estruturas que se parecem muito com comandos de linguagem usando a forma funcional de chamada (sem "self", igual java sem "this") e closures. 

Exemplos simples s&amp;atilde;o o "transaction { blah blah }" e um que n&amp;oacute;s criamos (muito espec&amp;iacute;fico para nossas aplica&amp;ccedil;&amp;atilde;o) "show_if_relevant { blah blah }". Ambos com forma funcional, blocos e a sintaxe relaxada do Ruby.

&amp;Eacute;... sinto que os pr&amp;oacute;ximos anos ser&amp;atilde;o interessantes para linguagens de programa&amp;ccedil;&amp;atilde;o.

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112298894478939249?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112298894478939249/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/dsl-domain-specific-languages.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112298894478939249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112298894478939249'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/08/dsl-domain-specific-languages.html' title='DSL (Domain Specific Languages)'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112255919616431780</id><published>2005-07-28T10:59:00.000-03:00</published><updated>2005-07-28T10:59:56.200-03:00</updated><title type='text'>Ganhos de velocidade</title><content type='html'>Estava observando aqui no trampo que toda vez que n&amp;oacute;s melhoramos a arquitetura de alguma coisa ou automatizamos algumas tarefas o ganho de velocidade n&amp;atilde;o &amp;eacute; de 20% ou 30%, o ganho est&amp;aacute; ficando na casa dos 200% a 500%. &amp;Agrave;s vezes o ganho &amp;eacute; t&amp;atilde;o grande, principalmente quando automatizamos, que n&amp;atilde;o d&amp;aacute; nem pra medir.

Servi&amp;ccedil;os que demoravam uma semana passaram a demorar um dia.

Qdo automatizamos o deploy, ele passou de 4 horas a, no m&amp;aacute;ximo, 1 minuto (24.000% ?). A gera&amp;ccedil;&amp;atilde;o autom&amp;aacute;tica de c&amp;oacute;digo para a camada de persist&amp;ecirc;ncia fez com que o tempo para se criar um novo objeto de neg&amp;oacute;cio ca&amp;iacute;sse de 30 minutos por objeto para menos de 20 segundos (incluindo o tempo de eu abrir um shell e digitar, comando e conferir o resultado). 

Com outra pequena melhoria na camada de persist&amp;ecirc;ncia, inclus&amp;otilde;es e remo&amp;ccedil;&amp;otilde;es de campos no banco s&amp;oacute; me fazem adicionar os getters e setters nos objetos de neg&amp;oacute;cio equivalente, n&amp;atilde;o preciso mexer em nenhum SELECT/INSERT/UPDATE em lugar nenhum.

A li&amp;ccedil;&amp;atilde;o que eu tiro disso? Melhorias em estrutura n&amp;atilde;o seguem uma regra m&amp;eacute;dia de ganho de tempo tipo "sempre se ganha entre 20% e 80%"... ela pode facilmente passar dos 1000% em alguns casos. Ent&amp;atilde;o a vari&amp;acirc;ncia &amp;eacute; desde 20% mais r&amp;aacute;pido at&amp;eacute; 10 vezes ou mais. 

&amp;Oacute;bvio que eu estou analisando o ganho em uma atividade individual, o ganho de velocidade no projeto &amp;eacute; bem menor, mas no caso de camada de persist&amp;ecirc;ncia, por exemplo, o ganho ainda &amp;eacute; muito significativo no total do projeto.

Isso torna essas melhorias um pouco dif&amp;iacute;ceis de avaliar, mas muito interessantes quando vc consegue mostrar para os gerentes o ganho em n&amp;uacute;meros (coisa que a gente sempre esquece: n&amp;uacute;meros!).

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112255919616431780?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112255919616431780/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/ganhos-de-velocidade.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112255919616431780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112255919616431780'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/ganhos-de-velocidade.html' title='Ganhos de velocidade'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112240132183342272</id><published>2005-07-26T15:08:00.000-03:00</published><updated>2005-07-26T15:08:41.843-03:00</updated><title type='text'>Productized</title><content type='html'>Achei um termo novo. At&amp;eacute; onde pesquisei, parece uma daquelas palavras bem comerciais que o povo que vende software inventa para convencer os gerentes que o que eles precisam j&amp;aacute; est&amp;aacute; "praticamente pronto"!!!

Mas eu achei algo referente ao termo que vale a pena gastar uns minutos pra pensar:
&lt;quote&gt;
A &amp;#8220;productized&amp;#8221; application is a two-tiered application. The first tier is a single base application that encapsulates common functionality for your product. The second tier consists of several customized applications that inherit and extend functionality from that base. It is useful for web developers who want to create a base application with some sort of generic functionality (e.g. a shopping cart) and then extend or modify that functionality for specific clients only.
&lt;/quote&gt;
-- &lt;a href="http://wiki.rubyonrails.com/rails/show/RailsProductGenerator" title="Ruby wiki sobre o Product Generator"&gt;fonte&lt;/a&gt;

Talvez fosse interessante transformar esse tipo de customiza&amp;ccedil;&amp;atilde;o em um Pattern, se &amp;eacute; que j&amp;aacute; n&amp;atilde;o tem por a&amp;iacute; e eu n&amp;atilde;o achei.

PS: "Praticamente pronto" &amp;eacute; uma frase que sempre me arrepia, pois &amp;eacute; um sintoma muito frequente ouvir isso de um Vaporware....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112240132183342272?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112240132183342272/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/productized.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112240132183342272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112240132183342272'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/productized.html' title='Productized'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112240086446308923</id><published>2005-07-26T15:01:00.000-03:00</published><updated>2005-07-26T15:01:04.516-03:00</updated><title type='text'>Frases antológicas I</title><content type='html'>Primeiras frases da s&amp;eacute;rie: &lt;b&gt;&lt;i&gt;Sim, eu sou nerd&lt;/i&gt;&lt;/b&gt;

 - "T&amp;aacute; vendo?! N&amp;atilde;o estudou! Virou webmaster"

 - "Pedaaaaaaaaaaaaaala, Teste!!!!"

Tamb&amp;eacute;m! Com os amigos que eu tenho :p Era ou n&amp;atilde;o pra ouvir umas dessas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112240086446308923?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112240086446308923/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/frases-antolgicas-i.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112240086446308923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112240086446308923'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/frases-antolgicas-i.html' title='Frases antol&amp;oacute;gicas I'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112231337703935192</id><published>2005-07-25T14:42:00.000-03:00</published><updated>2005-07-25T14:42:57.060-03:00</updated><title type='text'>Influências Rubêscas (não, não é do Rubens... é do Ruby)</title><content type='html'>Ruby anda me fazendo mal. Volta e meia estou mexendo com Java e fico pensando: "Se isso fosse em Ruby, dava pra fazer assim e assado, duas linhas ao inv&amp;eacute;s de vinte!". Mais ou menos a mesma sensa&amp;ccedil;&amp;atilde;o que eu tinha sobre Smalltalk, mas, no momento, minha cabe&amp;ccedil;a t&amp;aacute; cheia de Ruby.

N&amp;atilde;o que Java seja ruim. &amp;Eacute; muito bom, na verdade! Contudo, acho que sempre vou sentir falta de Closures nela.

Outra coisa, nunca fui muito feliz com a tipagem est&amp;aacute;tica do Java. Mas pensando bem, ando percebendo que linguagem din&amp;acirc;micamente tipada s&amp;oacute; &amp;eacute; boa se vc trabalhar com Unit Tests. N&amp;atilde;o que isso me preocupe, mas t&amp;aacute; meio longe da realidade de 90% das empresas (se n&amp;atilde;o mais). E para quem acha que isso &amp;eacute; um argumento que mata as linguagens de tipo din&amp;acirc;mico: leiam Pragmatic Programmer, especialmente a parte sobre programar por coincid&amp;ecirc;ncia. Aquilo &amp;eacute; uma verdade que pega bem no meio das bolas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112231337703935192?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112231337703935192/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/influ-do-ruby.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112231337703935192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112231337703935192'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/influ-do-ruby.html' title='Influ&amp;ecirc;ncias Rub&amp;ecirc;scas (n&amp;atilde;o, n&amp;atilde;o &amp;eacute; do Rubens... &amp;eacute; do Ruby)'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112196669708317236</id><published>2005-07-21T14:24:00.000-03:00</published><updated>2005-07-21T14:24:57.783-03:00</updated><title type='text'>Uma longa noite</title><content type='html'>Estranho demais.

Hoje eu acordei e foi como se eu estivesse meio "anestesiado" pelos &amp;uacute;ltimos 2 meses. N&amp;atilde;o sei, algo como um "deixar rolar... rolar...". Hoje eu me senti mais vivo, minha cabe&amp;ccedil;a parece que saiu de nuvem cinza.

N&amp;atilde;o sei, acho q coisas aqui no trabalho me levaram a adotar uma atitude meio passiva sem de fato eu perceber isso. E hoje, por algum motivo, eu sacudi a poeira tamb&amp;eacute;m sem perceber e me senti bem de novo, como eu n&amp;atilde;o me sentia &amp;agrave; alguns meses.

Talvez eu tenha sacudido porque ontem foi o fundo do po&amp;ccedil;o anest&amp;eacute;sico, eu estava completamente sem motiva&amp;ccedil;&amp;atilde;o.

Fico pensando se tem gente que vive indefinidamente nessa "anestesia".
Fico pensando o que foi que me deu. E prometendo nunca mais repetir isso.

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112196669708317236?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112196669708317236/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/uma-longa-noite.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112196669708317236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112196669708317236'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/uma-longa-noite.html' title='Uma longa noite'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112188688600710975</id><published>2005-07-20T16:14:00.000-03:00</published><updated>2005-07-20T16:14:46.013-03:00</updated><title type='text'>Escalabilidade!!!</title><content type='html'>D&amp;aacute; o que pensar isso a&amp;iacute; embaixo:

"I think I should start posting on all those enterprise server forums with comments like "I'm concerned that this won't scale down very well.  Could a team of 3 provide 24/7 support while extending functionality?  We only have a couple of thousand users and at the rate the market will accept a bigger team would not be economical.  The thing is, we 3 really want to do this rather than ending up as corporate drones wasting our existance in a cubicle."" --  Ged Byrne
&lt;a href="http://discuss.joelonsoftware.com/default.asp?joel.3.159134" title="Discuss&amp;atilde;o sobre RubyOnRails no site do Joel (Joel On Software)"&gt;JoelOnSoftware&lt;/a&gt;

A id&amp;eacute;ia de software "escal&amp;aacute;vel" &amp;eacute; sempre um apelo muito forte. Mas o que pega &amp;eacute; exatamente isso: "&amp;agrave;s vezes n&amp;atilde;o preciso tanto". E frequentemente o problema &amp;eacute; custo.

Ta&amp;iacute; um pensamento que vou preservar sempre que ler novos frameworks. "T&amp;aacute;, pra cima escala... mas... e pra baixo? Vou precisar de 15 pessoas pra criar isso ou d&amp;aacute; pra fazer com 3?"

Interessante, interessante...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112188688600710975?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112188688600710975/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/escalabilidade.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112188688600710975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112188688600710975'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/escalabilidade.html' title='Escalabilidade!!!'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112188542188226041</id><published>2005-07-20T15:50:00.000-03:00</published><updated>2005-07-20T15:50:21.903-03:00</updated><title type='text'>Ruby</title><content type='html'>Ultimamente eu e o Dadario andamos muito envolvidos com &lt;a href="http://www.ruby-lang.org" title="Site da linguagem Ruby"&gt;Ruby&lt;/a&gt;.

O que posso dizer? Estou muito impressionado com a linguagem em si e com o framework do momento para desenvolver aplica&amp;ccedil;&amp;atilde;o Web: &lt;a href="http://www.rubyonrails.org" title="Site do framework Rails"&gt;Rails&lt;/a&gt;. Aquilo &amp;eacute; simplesmente impressionante. Chega a ser brochante quando voc&amp;ecirc; pensa em voltar a desenvolver com Java e coisa e tal.

Andei fu&amp;ccedil;ando blogs por a&amp;iacute; e n&amp;atilde;o me senti s&amp;oacute;. A opini&amp;atilde;o geral de quem come&amp;ccedil;a a mexer com Rails &amp;eacute; muito parecida com a minha.

Pena que isso n&amp;atilde;o fica no &lt;i&gt;main stream&lt;/i&gt; das linguagens. Mas como a gente costuma dizer de vez em quando (&amp;ocirc; frasezinha arrogante do baralho): &lt;i&gt;"Milh&amp;otilde;es de Lemmings n&amp;atilde;o podem estar errados."&lt;/i&gt;.

Sei l&amp;aacute;, ainda me sinto um Lemming.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112188542188226041?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112188542188226041/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/ruby.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112188542188226041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112188542188226041'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/ruby.html' title='Ruby'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112117271638086552</id><published>2005-07-12T09:51:00.000-03:00</published><updated>2005-07-12T11:49:59.196-03:00</updated><title type='text'>Date e Time, de novo!</title><content type='html'>J&amp;aacute; reclamei um milh&amp;atilde;o de vezes do java.util.Date e do java.util.Calendar.

Pelo visto n&amp;atilde;o sou o &amp;uacute;nico que acha que aquilo &amp;eacute; tosco (ainda bem!)

Acabei achando uma biblioteca que aparentemente &amp;eacute; muito boa, n&amp;atilde;o testei ainda, mas pela descri&amp;ccedil;&amp;atilde;o vale a pena dar uma olhada com calma.
 
Chama-se &lt;a title="Joda-Time" href="http://joda-time.sourceforge.net/"&gt;Joda-Time&lt;/a&gt; e possui os conceitos de per&amp;iacute;odo e intervalo, sem falar em um bom suporte para GMT e linguagens.

Vamos ver se d&amp;aacute; pra usar isso no pr&amp;oacute;ximo projeto.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112117271638086552?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112117271638086552/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/date-e-time-de-novo.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112117271638086552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112117271638086552'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/date-e-time-de-novo.html' title='Date e Time, de novo!'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112117212511739279</id><published>2005-07-12T09:42:00.000-03:00</published><updated>2005-07-12T09:42:05.143-03:00</updated><title type='text'></title><content type='html'>Minha wish list t&amp;aacute; andando.

Gabinete novo n&amp;atilde;o quero mais, vou me virar com o velho.
Placa de v&amp;iacute;deo j&amp;aacute; foi
Chuveiro j&amp;aacute; foi
Headset j&amp;aacute; foi
Joystick j&amp;aacute; foi

Falta a mesa, o globo de luz e o fog&amp;atilde;o.

Pena que o chuveiro queimou 4 minutos depois de instalado e funcionando, vai entender.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112117212511739279?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112117212511739279/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/minha-wish-list-to.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112117212511739279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112117212511739279'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/07/minha-wish-list-to.html' title=''/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-112015549832624817</id><published>2005-06-30T15:11:00.000-03:00</published><updated>2005-06-30T15:18:18.330-03:00</updated><title type='text'>Não tá pronto se não foi testado.</title><content type='html'>Essa é outra daquelas coisas que parecem óbvias, mas a gente sempre deixa de fazer.

Imagina a conversa:
Gerente: "Tá pronto aquilo?"
Desenvolvedor: "Tá, só falta testar"
Gerente: "Ah! Tá..."

Só falta testar????

Caro companheiro, se não tá testado, não tá pronto! E testar só o CaminhoFeliz não deixa a coisa pronta também. Tem que, no mínimo, testar o CaminhoFeliz e os caminhos com os problemas mais óbvios.

Até porque, depois de cada teste, sempre vem algo a ser corrigido ou modificado, e isso é desenvolvimento.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-112015549832624817?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/112015549832624817/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/06/no-t-pronto-se-no-foi-testado.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112015549832624817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/112015549832624817'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/06/no-t-pronto-se-no-foi-testado.html' title='Não tá pronto se não foi testado.'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-111990774731849803</id><published>2005-06-27T18:26:00.000-03:00</published><updated>2005-06-27T18:29:07.323-03:00</updated><title type='text'>Mantra</title><content type='html'>Não sei pq continuo fazendo isso....

Agora! Todo mundo comigo! Repitam!!!

"Nunca programe sem unit tests"
"Nunca programe sem unit tests"
"Nunca programe sem a porcaria dos unit tests"

Não aprendo, toda vez que deixo de fazer unit tests me arrependo profundamente.
E volta e meia eu deixo de lado. Santa Temeridade, Batman!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-111990774731849803?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/111990774731849803/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/06/mantra.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111990774731849803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111990774731849803'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/06/mantra.html' title='Mantra'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-111944557474616365</id><published>2005-06-22T10:06:00.000-03:00</published><updated>2005-06-22T10:06:14.776-03:00</updated><title type='text'>"Da próxima vez" -&gt; DPV</title><content type='html'>"Da próxima vez"

...manter os documentos de projeto em formato de texto puro. Assim o controle de versão e as ferramentas de diff vão funcionar pra eles também.

Adendo: Odeio essa porcaria do Star Team. A parte client é meia boca demais!
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-111944557474616365?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/111944557474616365/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/06/da-prxima-vez-dpv.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111944557474616365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111944557474616365'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/06/da-prxima-vez-dpv.html' title='&quot;Da próxima vez&quot; -&gt; DPV'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-111928940274162588</id><published>2005-06-20T14:43:00.000-03:00</published><updated>2005-06-20T14:43:22.776-03:00</updated><title type='text'>Tempo passa, tempo voa.</title><content type='html'>Caramba, essas duas última semanas foram tão corridas que eu nem bloguei nada.

Desperdício... perdi um monte de idéias.

Aliás, essas idéias que vou postar agora não são novas. É mais um reforço pra ver se minha cabeça oca não esquece.

Idéia 1 (Velha, velha, mas sempre vale lembrar)

"Sempre implemente sua própria classe &lt;i&gt;Date&lt;/i&gt; no Java. O Date e o Calendar são MUUUUUUITO toscos."


Idéia 2 (Essa eu me lasco sempre que não sigo)

"Se existe um padrão, mesmo que seja ruim. SIGA a porcaria do padrão!!!"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-111928940274162588?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/111928940274162588/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/06/tempo-passa-tempo-voa.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111928940274162588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111928940274162588'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/06/tempo-passa-tempo-voa.html' title='Tempo passa, tempo voa.'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-111660354572902198</id><published>2005-05-20T12:39:00.000-03:00</published><updated>2005-05-20T12:39:05.763-03:00</updated><title type='text'>A lista das coisas mais úteis quando trabalhando</title><content type='html'>Ajudem a escrever a lista:

1 - ANT e seus sabores (NANT??) (e o "make" tb)
2 - Express&amp;otilde;es Regulares ("regular expressions are write only ")

N&amp;atilde;o me venham com J2EE, Jota-o-caramba, nem Dot-Net-o-escambau... Tou falando de coisas &amp;uacute;teis ;D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-111660354572902198?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/111660354572902198/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/05/lista-das-coisas-mais-teis-quando.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111660354572902198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111660354572902198'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/05/lista-das-coisas-mais-teis-quando.html' title='A lista das coisas mais &amp;uacute;teis quando trabalhando'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-111653882388965553</id><published>2005-05-19T18:40:00.000-03:00</published><updated>2005-05-19T18:40:23.923-03:00</updated><title type='text'>[Off-topic] Wish list pessoal</title><content type='html'>Preciso anotar isso em algum lugar:
 - Um globo de luz pro meu banheiro
 - Uma mesa daquelas que aumenta pra colocar na sala de jantar
 - Um par de controles tipo v&amp;iacute;deo game para colocar no micro
 - Um headset bem legal e grande
 - Uma placa de v&amp;iacute;deo 3D decente
 - Um chuveiro mega-ultra-power
 - Um fog&amp;atilde;o BOM
 - Um gabinete de verdade pro meu micro

Putz... tem ch&amp;atilde;o. :)

Sem falar que ainda tenho que colocar o &lt;a href="www.mythtv.org"&gt;MythTv&lt;/a&gt; direito no meu micro, t&amp;aacute; com problema na resolu&amp;ccedil;&amp;atilde;o qdo eu coloco conectado na TV.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-111653882388965553?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/111653882388965553/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/05/off-topic-wish-list-pessoal.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111653882388965553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111653882388965553'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/05/off-topic-wish-list-pessoal.html' title='[Off-topic] Wish list pessoal'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-111529870444848848</id><published>2005-05-05T10:11:00.000-03:00</published><updated>2005-05-05T10:11:44.493-03:00</updated><title type='text'>Pingos e "Vida Digital"</title><content type='html'>Ando brincando com programinhas evolutivos. N&amp;atilde;o, n&amp;atilde;o... nada de algoritmos gen&amp;eacute;ticos ou programa&amp;ccedil;&amp;atilde;o gen&amp;eacute;tica. Coisa bem mais simples, mas muito divertida.

O objetivo inicial era fazer um objeto capaz de reconhecer algo "bom" e algo "mau" segundo sua pr&amp;oacute;pria perspectiva. Fazer ELE decidir o que &amp;eacute; bom e o que &amp;eacute; ruim pra ele.

Para isso criei uns objetos que sabem comer uns aos outros, chamei eles de "Pingos". Cada pingo tem um valor de energia e um n&amp;uacute;mero meio doido (chamado "intelig&amp;ecirc;ncia") para decidir se deve comer o outro pingo ou n&amp;atilde;o. Qdo um pingo acumula energia demais ele se divide e seu valor de intelig&amp;ecirc;ncia &amp;eacute; randomicamente alterado em at&amp;eacute; 10%. Se ele fica sem energia (morre), eu tiro ele do sistema.

Botei os bichinhos pra rodar, com poucas itera&amp;ccedil;&amp;otilde;es s&amp;oacute; sobraram os pingos que decidiam comer os pingos mais fracos e ignoravam os maiores.

Agora o objetivo &amp;eacute; fazer com que os pingos consigam se coligar permanentemente pra ver se eles chegam a montar alguma estrutura mais complexa. Vamos ver.

Bom, o objetivo original foi alcan&amp;ccedil;ado. Cada pingo sabe reconhecer o que &amp;eacute; "bom" e "mau" sob sua pr&amp;oacute;pria perspectiva. Como o sistema &amp;eacute; baseado em sobreviv&amp;ecirc;ncia, o conceito de "bom" e "mau" &amp;eacute; necessariamente orientada a isso. 

Items interessantes a se notar:
 
- Se eu "envelhe&amp;ccedil;o" os pingos, tirando um pouco de energia a cada a&amp;ccedil;&amp;atilde;o, o sistema no geral enfraquece e o n&amp;uacute;mero de pingos vai diminuindo. Interessant&amp;iacute;ssimo pq demonstra que a lei de conserva&amp;ccedil;&amp;atilde;o de energia tb pode funcionar digitalmente. A diferen&amp;ccedil;a &amp;eacute; que &amp;eacute; muito simples retirar e adicionar energia de sistema digital. Uma simples &lt;i&gt;c&amp;oacute;pia&lt;/i&gt; de pingos significa que eu &lt;i&gt;adicionei&lt;/i&gt; energia no sistema.

- No come&amp;ccedil;o, dividir-se era uma opera&amp;ccedil;&amp;atilde;o &lt;i&gt;opcional&lt;/i&gt; dos pingos. O que acontecia era que eles iam comendo, comendo e acabava sobrando apenas UM com toda energia do sistema nele. Esse pingo sempre era um dos pingos da primeira gera&amp;ccedil;&amp;atilde;o. Qdo eu obriguei a se dividirem, a quantidade de pingos no sistema se estabilizou e os pingos passaram a ter uma vida m&amp;eacute;dia. Detalhe, qdo eu divido o pingo, um deles continua com a idade de antes. A parte interessante aqui &amp;eacute; que colocar um n&amp;uacute;mero para "desestabilizar" o pingo (obrigando ele a se dividir se ficar muito grande) fez com o que &lt;i&gt;sistema&lt;/i&gt; como um todo estabilizasse. &amp;Eacute; meio &amp;oacute;bvio tb, mas &amp;eacute; muito interessante.

- N&amp;atilde;o importa muito os n&amp;uacute;meros que eu uso ou a conta que eu fa&amp;ccedil;o, os pingos sempre se adaptam pra as melhores escolhas. Mas acho q se eu fizer uma conta de decis&amp;atilde;o melhor, os pingos conseguem evoluir mais r&amp;aacute;pido.

- No fundo no fundo, o mais interessante est&amp;aacute; sendo observar que leis "naturais" tb valem digitalmente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-111529870444848848?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/111529870444848848/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/05/pingos-e-vida-digital.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111529870444848848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111529870444848848'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/05/pingos-e-vida-digital.html' title='Pingos e &quot;Vida Digital&quot;'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-111523216734933912</id><published>2005-05-04T15:42:00.000-03:00</published><updated>2005-05-04T15:42:47.406-03:00</updated><title type='text'>Linguagem "estupidamente" tipada.</title><content type='html'>Tem horas que eu fico doido com Java.

A linguagem &amp;eacute; razoavelmente boa, a quantidade de APIs &amp;eacute; formid&amp;aacute;vel. Mas sinceramente, tem horas que a tipagem est&amp;aacute;tica &amp;eacute; um porre.

Java n&amp;atilde;o &amp;eacute; "estaticamente tipada", ela &amp;eacute; "estupidamente tipada".

Vale aquela m&amp;aacute;xima maravilhosa: "Tipagem est&amp;aacute;tica &amp;eacute; um jeito de tornar o compilador t&amp;atilde;o burro que vc tem que ficar lembrando pra ele toda hora DO QUE vc est&amp;aacute; falando."

&lt;font face="Arial,Helvetica,sans-serif" color="#808080" size="-4"&gt;(Par&amp;ecirc;nteses)

ArrayList&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;String&amp;gt;(); // D&amp;aacute; pra ser mais redundante, por acaso?

(Fecha a porcaria do par&amp;ecirc;nteses)
&lt;/font&gt;

J&amp;aacute; disse: eu gostaria de opcionalmente tipada. Usa quem quer, quem n&amp;atilde;o quer, n&amp;atilde;o usa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-111523216734933912?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/111523216734933912/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/05/linguagem-estupidamente-tipada.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111523216734933912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111523216734933912'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/05/linguagem-estupidamente-tipada.html' title='Linguagem &quot;estupidamente&quot; tipada.'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-111521224666026505</id><published>2005-05-04T10:10:00.000-03:00</published><updated>2005-05-04T10:10:46.723-03:00</updated><title type='text'>Linguagens para criar linguagens</title><content type='html'>A id&amp;eacute;ia de DSL (Domain Specific Languages: &lt;a href="http://www.onboard.jetbrains.com/is1/articles/04/10/lop/" title="DSL"&gt;JetBrains&lt;/a&gt; e &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=27273" title="DSL"&gt;The Server Side&lt;/a&gt;) &amp;eacute; excelente.

Por&amp;eacute;m, me pergunto se programa&amp;ccedil;&amp;atilde;o estruturada e programa&amp;ccedil;&amp;atilde;o orientada a objetos no final de contas n&amp;atilde;o s&amp;atilde;o exatamente um meio de vc criar uma linguagem espec&amp;iacute;fica para o seu neg&amp;oacute;cio.

Se &amp;eacute; assim... modelagem de neg&amp;oacute;cio seria melhor se se transformasse em "modelagem de vocabul&amp;aacute;rio". Hmmmm.... D&amp;aacute; o que pensar.

Tb d&amp;aacute; o que pensar no pr&amp;oacute;ximo paradigma de desenvolvimento: vc programa uma "fun&amp;ccedil;&amp;atilde;o" que tem propriedades e aceita determinadas interfaces para operar. Ei! Ei! Padr&amp;atilde;o COMMAND!!!!

Ta&amp;iacute;: Programa&amp;ccedil;&amp;atilde;o orientada a COMMANDs :)... S&amp;oacute; precisava achar uma sintaxe interessante.

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-111521224666026505?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/111521224666026505/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/05/linguagens-para-criar-linguagens.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111521224666026505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111521224666026505'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/05/linguagens-para-criar-linguagens.html' title='Linguagens para criar linguagens'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-111443175647988442</id><published>2005-04-25T09:22:00.000-03:00</published><updated>2005-04-25T09:22:36.480-03:00</updated><title type='text'>Pattern: "Eu vi o disco-voador, acredita em mim!"</title><content type='html'>Acontece qdo vc tem um problema, n&amp;atilde;o consegue resolver ele de jeito nenhum em duas horas, desiste e chama um especialista. No momento em que o especialista chega, vc vai mostrar o problema e ele simplesmente n&amp;atilde;o acontece. Tudo funciona normalmente.

Nesse ponto o especialista olha pra vc com aquela cara de "E a&amp;iacute;? Cad&amp;ecirc;?" e vc tenta se justificar "Cara, juro tava com problema! Foi vc chegar come&amp;ccedil;ou a funcionar".

Chamamos esse pattern de "Eu vi um disco-voador" por motivos &amp;oacute;bvios :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-111443175647988442?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/111443175647988442/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/04/pattern-eu-vi-o-disco-voador-acredita.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111443175647988442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111443175647988442'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/04/pattern-eu-vi-o-disco-voador-acredita.html' title='Pattern: &quot;Eu vi o disco-voador, acredita em mim!&quot;'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-111421299392618371</id><published>2005-04-22T20:36:00.000-03:00</published><updated>2005-04-22T20:36:33.926-03:00</updated><title type='text'>Desenvolvimento em "Repasses"</title><content type='html'>Ta&amp;iacute;, algu&amp;eacute;m conhece desenvolvimento em espiral?

Basicamente &amp;eacute; uma id&amp;eacute;ia velhinha de Engenharia de Software: vc faz um "prot&amp;oacute;tipo" numa itera&amp;ccedil;&amp;atilde;o e a cada nova itera&amp;ccedil;&amp;atilde;o vai completando ele cada vez mais.

Pena que isso &amp;eacute; teoria dez e pr&amp;aacute;tica zero. Na pr&amp;aacute;tica o pessoal nunca planeja em espiral, &amp;eacute; sempre o maldito cascata. E se n&amp;atilde;o acredita em mim, olha para o seu cronograma, se ele tem "repasses" da mesma funcionalidade, vc &amp;eacute; um sortudo. O outro problema &amp;eacute; que ningu&amp;eacute;m nunca diz o que um prot&amp;oacute;tipo deve ter ou n&amp;atilde;o em cada vers&amp;atilde;o... Sempre fica um "cada projeto &amp;eacute; de um jeito" no ar e ningu&amp;eacute;m faz nada na pr&amp;aacute;tica.

Depois de cozinhar um tanto a id&amp;eacute;ia na cabe&amp;ccedil;a e rever minhas experi&amp;ecirc;ncias (&lt;i&gt;"Minha vida inteira passou pelos meus olhos... foi muito chato!" - Babs, A Fuga das Galinhas&lt;/i&gt;) cheguei ao seguinte esbo&amp;ccedil;o:

&lt;h3&gt;Tiro inicial (ou Primeira Itera&amp;ccedil;&amp;atilde;o): "Esquelet&amp;atilde;o"&lt;/h3&gt;
O esquelet&amp;atilde;o &amp;eacute; mais para criar algumas partes essencias do sistema, frequentemente elas nem est&amp;atilde;o conectadas entre si.
&lt;h4&gt;Deixe de fora:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Tratamento de exce&amp;ccedil;&amp;otilde;es&lt;/li&gt;
&lt;li&gt;Objetos de neg&amp;oacute;cios detalhados. Crie um Objeto de Neg&amp;oacute;cio Gen&amp;eacute;rico, provavelmente encapsulando um Dicion&amp;aacute;rio (Map, Hash, Hashtable, vc entendeu!) e use ele para testar o esquelet&amp;atilde;o. Alguns campos mais essenciais ao neg&amp;oacute;cio e algumas estruturas b&amp;aacute;sicas j&amp;aacute; aparecem aqui.&lt;/li&gt;
&lt;li&gt;Preocupa&amp;ccedil;&amp;otilde;es com desempenho e consumo de mem&amp;oacute;ria.&lt;/li&gt;
&lt;li&gt;Interface de usu&amp;aacute;rio.&lt;/li&gt;
&lt;li&gt;Se puder, descarte Banco de Dados por enquanto.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Inclua:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Testes de Unidade&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Primeiro Repasse (ou Segunda Itera&amp;ccedil;&amp;atilde;o): "Carne entre os ossos"&lt;/h3&gt;
Aqui vc come&amp;ccedil;a a ligar as coisas.
&lt;h4&gt;Deixe de fora:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Tratamento de exce&amp;ccedil;&amp;otilde;es. Apenas fa&amp;ccedil;a uma distin&amp;ccedil;&amp;atilde;o entre erros de neg&amp;oacute;cio (coisas que o usu&amp;aacute;rio fez errado) e erro de sistema (aqueles que o pobre usu&amp;aacute;rio n&amp;atilde;o tem culpa, como erro de conex&amp;atilde;o com banco). Siga essa distin&amp;ccedil;&amp;atilde;o durante todos os outros passos, mas n&amp;atilde;o tente tratar os erros (exceto os mais recuper&amp;aacute;veis). O resto, s&amp;oacute; mande pra cima.&lt;/li&gt;
&lt;li&gt;Preocupa&amp;ccedil;&amp;otilde;es com desempelho e consumo de mem&amp;oacute;ria&lt;/li&gt;
&lt;li&gt;Interface de usu&amp;aacute;rio&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Inclua:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Banco de dados.&lt;/li&gt;
&lt;li&gt;Objetos de neg&amp;oacute;cio mais detalhados. Mas n&amp;atilde;o se preocupe muito aqui, sempre antes do final do projeto aparecem mais dados (campos)  ou somem outros. A id&amp;eacute;ia aqui n&amp;atilde;o &amp;eacute; ter todos os campos e valores, mas sim ter a ESTRUTURA (&amp;ecirc;nfase dupla na palavra, vou at&amp;eacute; repetir: "ESTRUTURA") dos objetos de neg&amp;oacute;cio. Por estrutura eu digo: quem conhece quem, e quem cont&amp;eacute;m quem.&lt;/li&gt;
&lt;li&gt;Testes de aceita&amp;ccedil;&amp;atilde;o. S&amp;oacute; uns rascunhos usando banco de dados.&lt;/li&gt;
&lt;li&gt;Mais testes de unidade.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Segundo Repasse (ou Terceira Itera&amp;ccedil;&amp;atilde;o): "Vejo algo se mover"&lt;/h3&gt;
Nesse o sistema j&amp;aacute; funciona de cabo a rabo, meio tosc&amp;atilde;o, mas funciona.
&lt;h4&gt;Deixe de fora:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Tratamento de exce&amp;ccedil;&amp;otilde;es&lt;/li&gt;
&lt;li&gt;Preocupa&amp;ccedil;&amp;otilde;es com desempenho e consumo de mem&amp;oacute;ria.&lt;/li&gt;
&lt;li&gt;Testes de aceita&amp;ccedil;&amp;atilde;o. Cuidado aqui. Vc s&amp;oacute; est&amp;aacute; adicionando o visual, o teste de aceita&amp;ccedil;&amp;atilde;o roda "por baixo" dele, n&amp;atilde;o devem aparecer muitos testes novos aqui. A menos que seus testes de aceita&amp;ccedil;&amp;atilde;o rodem "por cima" da interface (exercitando ela).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Inclua:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Interface com usu&amp;aacute;rio.&lt;/li&gt;
&lt;li&gt;Um man&amp;eacute; testando as telas, ou um designer gente boa.&lt;/li&gt;
&lt;li&gt;Testes de unidade, principalmente de "validadores",  que n&amp;atilde;o s&amp;atilde;o exatamente parte da interface do usu&amp;aacute;rio, mas tem o mal h&amp;aacute;bito de aparecerem quando vc contr&amp;oacute;i elas.&lt;/li&gt;
&lt;/ul&gt;

Okay, pare aqui. Esses passos de 1 a 3 devem ser feitos POR FUNCIONALIDADE. 

Como assim?

Explico. Vc tem um sistema com Cadastro de Usu&amp;aacute;rio, Cadastro de Filme e Loca&amp;ccedil;&amp;atilde;o de Filmes. Isso s&amp;atilde;o FUNCIONALIDADES. Vc primeiro faz os 3 passos para Loca&amp;ccedil;&amp;atilde;o de Filmes, depois faz os mesmos 3 para Cadastro de Usu&amp;aacute;rio e finalmente os mesmos 3 para Cadastro de Filme e assim vai.

Por que isso?

Por 2 motivos:
&amp;nbsp;&amp;nbsp;&amp;nbsp;Vc vai conseguir mostrar coisas para o seu cliente mais cedo, ele vai ficar feliz
&amp;nbsp;&amp;nbsp;&amp;nbsp;Se a funcionalidade estiver errada, vc vai descobrir logo (pq ou cliente vai ver) e n&amp;atilde;o daqui 6 meses.

No jarg&amp;atilde;o de "Engenharia de Software" isso significa:
&amp;nbsp;&amp;nbsp;&amp;nbsp;"Early Delivery"
&amp;nbsp;&amp;nbsp;&amp;nbsp;Diminui&amp;ccedil;&amp;atilde;o de risco

Depois disso vc passa para as pr&amp;oacute;ximas etapas, novamente elas s&amp;atilde;o divididas POR FUNCIONALIDADE.

&lt;h3&gt;Terceiro Repasse (ou Quarta Itera&amp;ccedil;&amp;atilde;o): "Minha vis&amp;atilde;o est&amp;aacute; clareando"&lt;/h3&gt;
&lt;h4&gt;Deixe de fora:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Tratamento de exce&amp;ccedil;&amp;otilde;es.&lt;/li&gt;
&lt;li&gt;Preocupa&amp;ccedil;&amp;otilde;es com desempenho e consumo de mem&amp;oacute;ria.&lt;/li&gt;
&lt;li&gt;Testes de unidade. S&amp;oacute; atualize os que vc precisar. N&amp;atilde;o devem aparecer muitas funcionalidades novas aqui, se aparecerem, &amp;oacute;bvio, inclua testes.&lt;/li&gt;
&lt;li&gt;Testes de aceita&amp;ccedil;&amp;atilde;o. Idem acima.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Inclua:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Banco e Interface. Nesse ponto, os campos que vc precisa j&amp;aacute; devem estar bem defininidos, incluindo aqueles mais obscuros e usados somente por quest&amp;otilde;es informativas (tradu&amp;ccedil;&amp;atilde;o: relat&amp;oacute;rios, cartas de cobran&amp;ccedil;a).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Quarto Repasse (ou Quinta Itera&amp;ccedil;&amp;atilde;o): "Toques finais"&lt;/h3&gt;
&lt;h4&gt;Deixe de fora:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Banco e Interface.&lt;/li&gt;
&lt;li&gt;Preocupa&amp;ccedil;&amp;otilde;es com desempenho e consumo de mem&amp;oacute;ria.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Inclua:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Tratamento de Exce&amp;ccedil;&amp;otilde;es. Finalmente! Antes vc s&amp;oacute; arremessava as exce&amp;ccedil;&amp;otilde;es, agora vc pega elas, apresenta telinhas bonitinhas, manda email pro suporte se explodir erro que n&amp;atilde;o &amp;eacute; coisa de usu&amp;aacute;rio, etc e tal.&lt;/li&gt;
&lt;li&gt;Testes de Unidade.&lt;/li&gt;
&lt;li&gt;Testes de Aceita&amp;ccedil;&amp;atilde;o.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Quinto Repasse (ou Sexta Itera&amp;ccedil;&amp;atilde;o): "Sorriso da Mona Lisa"&lt;/h3&gt;
&lt;h4&gt;Deixe de fora:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Banco e Interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Inclua:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;PREOCUPA&amp;Ccedil;&amp;Otilde;ES COM DESEMPENHO E MEM&amp;Oacute;RIA. Primeiro, fa&amp;ccedil;a "profiling" para ver ONDE est&amp;atilde;o os gargalos. Crie testes de unidade e aceita&amp;ccedil;&amp;atilde;o para demonstrar os gargalos e finalmente corrija-os. Muitas vezes esse repasse nem &amp;eacute; necess&amp;aacute;rio.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

Bom, &amp;eacute; isso.
L&amp;oacute;gico que isso s&amp;atilde;o mais sugest&amp;otilde;es do que leis. Nem todo desenvolvimento &amp;eacute; igual, mas essas s&amp;atilde;o boas "thumb rules" pra se usar.

Mas eu vou refinando essa estrutura com o tempo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-111421299392618371?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/111421299392618371/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/04/desenvolvimento-em-repasses.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111421299392618371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111421299392618371'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/04/desenvolvimento-em-repasses.html' title='Desenvolvimento em &quot;Repasses&quot;'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-111298279469779791</id><published>2005-04-08T14:53:00.000-03:00</published><updated>2005-04-08T14:53:14.696-03:00</updated><title type='text'>Mais livros pra comprar</title><content type='html'>O t&amp;iacute;tulo agora &amp;eacute;:"&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0201433044/qid=1112982178/sr=1-1/ref=sr_1_1/102-1731810-9074566?v=glance&amp;s=books" title="Pattern Languages of Program Design 4"&gt;Pattern Languages of Program Design 4&lt;/a&gt;".

Tem uma s&amp;eacute;rie desses livros...

Outro, melhor ainda, parece ser: &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0471958697/ref=pd_sim_b_4/102-1731810-9074566?%5Fencoding=UTF8&amp;v=glance" title="Pattern-Oriented Software Architecture, Volume 1: A System of Patterns"&gt;Pattern-Oriented Software Architecture, Volume 1: A System of Patterns&lt;/a&gt; US$ 60,00

Decididamente, preciso voltar a comprar livros, estou ficando desatualizado.


&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-111298279469779791?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/111298279469779791/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/04/mais-livros-pra-comprar.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111298279469779791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111298279469779791'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/04/mais-livros-pra-comprar.html' title='Mais livros pra comprar'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-111098312051739640</id><published>2005-03-16T11:25:00.000-03:00</published><updated>2005-03-16T11:25:20.516-03:00</updated><title type='text'>O padrão "Idiota Útil"</title><content type='html'>Ontem eu estava em casa mexendo em um projeto pra fazer um Wiki. A&amp;iacute; tive um problema qdo estava tentando renderizar uns links.

Fiquei ontem o tempo todo olhando para o c&amp;oacute;digo e imaginando solu&amp;ccedil;&amp;otilde;es, fui dormir pensando no problema, acordei e vim trabalhar caminhando e pensando no problema. Foi ent&amp;atilde;o que me veio o estalo e a solu&amp;ccedil;&amp;atilde;o apareceu, de maneira &amp;oacute;bvia e elegante.

Qdo cheguei no trabalho, todo feliz, expliquei pra um colega o problema em linhas gerais. Qdo terminei a explica&amp;ccedil;&amp;atilde;o ele me veio exatamente com a mesma solu&amp;ccedil;&amp;atilde;o que eu passei horas e horas pensando... :p Frustrante!

A&amp;iacute; fiquei imaginando:
1 - Ou eu sou muito est&amp;uacute;pido e o cara &amp;eacute; muito inteligente (ele &amp;eacute;, de fato, por consequ&amp;ecirc;ncia, devo ser um est&amp;uacute;pido :p )
2 - Ou qdo eu expliquei o problema j&amp;aacute; induzi a solu&amp;ccedil;&amp;atilde;o que eu tinha pensado (prov&amp;aacute;vel)
3 - Ou qdo o problema &amp;eacute; visto de fora, fica mais simples.

A op&amp;ccedil;&amp;atilde;o 3 ficou martelando na minha cabe&amp;ccedil;a, pq eu lembro que ontem passei boa parte do tempo s&amp;oacute; pra decidir em qual parte do c&amp;oacute;digo deveria modificar. Acho que qdo expliquei o problema sem entrar em detalhes de c&amp;oacute;digo, a solu&amp;ccedil;&amp;atilde;o ficou mais &amp;oacute;bvia.

Ent&amp;atilde;o eu senti, na pr&amp;aacute;tica e na pele, porque o padr&amp;atilde;o "Idiota &amp;Uacute;til"* &amp;eacute; t&amp;atilde;o bom pra resolver problemas. Vou fazer mais uns testes, mas acho que vou adotar o "Idiota &amp;Uacute;til"* sistematicamente daqui pra frente.

&lt;hr&gt;

* "Idiota &amp;Uacute;til" (batizado pelo grande desenvolvedor e "cara de curti&amp;ccedil;&amp;atilde;o" Cl&amp;aacute;udio Teixeira) - pra quem n&amp;atilde;o sabe, &amp;eacute; quando vc est&amp;aacute; com um problema e explica pra algu&amp;eacute;m, a&amp;iacute; o cara pra quem vc est&amp;aacute; explicando nem sequer abre a boca e vc p&amp;aacute;ra: "Pode deixar, valeu! J&amp;aacute; achei a resposta".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-111098312051739640?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/111098312051739640/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/03/o-padrtil.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111098312051739640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111098312051739640'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/03/o-padrtil.html' title='O padr&amp;atilde;o &quot;Idiota &amp;Uacute;til&quot;'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-111037548495857606</id><published>2005-03-09T10:38:00.000-03:00</published><updated>2005-03-09T10:38:04.960-03:00</updated><title type='text'>Wish List para a linguagem ideal (revisada)</title><content type='html'>Wish List atualizada, novos itens em &lt;b&gt;negrito&lt;/b&gt;

Ser&amp;aacute; que Python atende tudo isso?
&lt;ol&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Closures.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;OPCIONALMENTE tipada. Isso mesmo, nem din&amp;acirc;micamente tipada nem estaticamente tipada, quero usar tipo qdo eu quiser. E mais, por conta disso tem que aceitar &lt;i&gt;polimorfismo local&lt;/i&gt;.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Biblioteca decente para Cole&amp;ccedil;&amp;otilde;es com suporte a Closures e uniformidade de m&amp;eacute;todos entre as cole&amp;ccedil;&amp;otilde;es.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;&lt;b&gt;Suporte a slice nas cole&amp;ccedil;&amp;otilde;es (subcole&amp;ccedil;&amp;otilde;es) e em arrays e similares.&lt;/b&gt;&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Reflex&amp;atilde;o simples e funcional.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Puramente Orientada a Objeto. Classes tb tem que ser objetos.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Suporte a Express&amp;otilde;es Regulares no padr&amp;atilde;o PERL, de prefer&amp;ecirc;ncia com muito a&amp;ccedil;&amp;uacute;car sint&amp;aacute;tico.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;&lt;b&gt;Suporte a slice em Strings, ali&amp;aacute;s, melhor, Strings com mesma interface que Array.&lt;/b&gt;&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Biblioteca para Arquivos simples e funcional, PRINCIPALMENTE com facilidades para trabalhar arquivos texto. Nada de open - close, deve trabalhar com closures (padr&amp;atilde;o "during" do Smalltalk). Serializa&amp;ccedil;&amp;atilde;o opcional em CSV e XML tb ia ser legal.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Biblioteca para Banco de Dados simples e funcional. Tamb&amp;eacute;m que ser capaz de trabalhar com closures naturalmente. Nada de open - close tosco, usar novamente o padr&amp;atilde;o "during" do Smalltalk.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Biblioteca para Rede simples e funcional. Suporte a closure, serializa&amp;ccedil;&amp;atilde;o e desserializa&amp;ccedil;&amp;atilde;o autom&amp;aacute;tica de qualquer objeto. Sockets do Java s&amp;atilde;o um bom come&amp;ccedil;o.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Suporte descente a Threads. A nova biblioteca do Java 1.5 parece boa, mas, adicionalmente, deveria ter uma estrutura especial de linguagem para indicar instru&amp;ccedil;&amp;otilde;es que eu posso executar em paralelo daquelas que eu sou obrigado a executar sequencialmente. O trecho em paralelo tem que terminar todo antes de prosseguir para a pr&amp;oacute;xima instru&amp;ccedil;&amp;atilde;o sequencial. A JVM ou equivalente deveria aceitar um par&amp;acirc;metro de quantas paraleliza&amp;ccedil;&amp;otilde;es no m&amp;aacute;ximo ela aceita e qdo esse limite chegar, executar sequencialmente as instru&amp;ccedil;&amp;otilde;es que est&amp;atilde;o marcadas como "execut&amp;aacute;veis em paralelo". Se quiser ter uma boa id&amp;eacute;ia do que estou falando, veja as tags "sequential" e "parallel" do ANT.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Suporte MUITO simples e funcional a XML e processamento XSLT.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-111037548495857606?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/111037548495857606/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/03/wish-list-para-linguagem-ideal.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111037548495857606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111037548495857606'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/03/wish-list-para-linguagem-ideal.html' title='Wish List para a linguagem ideal (revisada)'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-111031240145444623</id><published>2005-03-08T17:06:00.000-03:00</published><updated>2005-03-08T17:06:41.453-03:00</updated><title type='text'>Wish List - A Linguagem Ideal</title><content type='html'>Aqui vai minha lista de caracter&amp;iacute;sticas para uma linguagem de programa&amp;ccedil;&amp;atilde;o ideal, por ordem de import&amp;acirc;ncia.
&lt;ol&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Closures.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;OPCIONALMENTE tipada. Isso mesmo, nem din&amp;acirc;micamente tipada nem estaticamente tipada, quero usar tipo qdo eu quiser. E mais, por conta disso tem que aceitar &lt;i&gt;polimorfismo local&lt;/i&gt;.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Biblioteca decente para Cole&amp;ccedil;&amp;otilde;es com suporte a Closures e uniformidade de m&amp;eacute;todos entre as cole&amp;ccedil;&amp;otilde;es.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Reflex&amp;atilde;o simples e funcional.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Puramente Orientada a Objeto. Classes tb tem que ser objetos.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Suporte a Express&amp;otilde;es Regulares no padr&amp;atilde;o PERL, de prefer&amp;ecirc;ncia com muito a&amp;ccedil;&amp;uacute;car sint&amp;aacute;tico.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Biblioteca para Arquivos simples e funcional, PRINCIPALMENTE com facilidades para trabalhar arquivos texto. Nada de open - close, deve trabalhar com closures (padr&amp;atilde;o "during" do Smalltalk). Serializa&amp;ccedil;&amp;atilde;o opcional em CSV e XML tb ia ser legal.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Biblioteca para Banco de Dados simples e funcional. Tamb&amp;eacute;m que ser capaz de trabalhar com closures naturalmente. Nada de open - close tosco, usar novamente o padr&amp;atilde;o "during" do Smalltalk.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Biblioteca para Rede simples e funcional. Suporte a closure, serializa&amp;ccedil;&amp;atilde;o e desserializa&amp;ccedil;&amp;atilde;o autom&amp;aacute;tica de qualquer objeto. Sockets do Java s&amp;atilde;o um bom come&amp;ccedil;o.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Suporte descente a Threads. A nova biblioteca do Java 1.5 parece boa, mas, adicionalmente, deveria ter uma estrutura especial de linguagem para indicar instru&amp;ccedil;&amp;otilde;es que eu posso executar em paralelo daquelas que eu sou obrigado a executar sequencialmente. O trecho em paralelo tem que terminar todo antes de prosseguir para a pr&amp;oacute;xima instru&amp;ccedil;&amp;atilde;o sequencial. A JVM ou equivalente deveria aceitar um par&amp;acirc;metro de quantas paraleliza&amp;ccedil;&amp;otilde;es no m&amp;aacute;ximo ela aceita e qdo esse limite chegar, executar sequencialmente as instru&amp;ccedil;&amp;otilde;es que est&amp;atilde;o marcadas como "execut&amp;aacute;veis em paralelo". Se quiser ter uma boa id&amp;eacute;ia do que estou falando, veja as tags "sequential" e "parallel" do ANT.&lt;/li&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;li&gt;Suporte MUITO simples e funcional a XML e processamento XSLT.&lt;/li&gt;
&lt;/ol&gt;

Obs: Qdo digo SIMPLES, quero dizer SIMPLES DE USAR, n&amp;atilde;o que o suporte seja limitado. SIMPLES DE USAR &amp;eacute; conseguir executar 80% das opera&amp;ccedil;&amp;otilde;es mais comum em apenas uma linha.

&amp;Eacute; isso a&amp;iacute;, aparentemente as linguagens de script que est&amp;atilde;o crescendo por a&amp;iacute; atendem boa parte da minha lista de desejos. Preciso ver em especial Python e Ruby. O Groovy j&amp;aacute; atende muitos dos requisitos, mas ainda tem uns bugs. Smalltalk atende a maior parte da lista, mas peca um pouco por falta de bibliotecas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-111031240145444623?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/111031240145444623/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/03/wish-list-linguagem-ideal.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111031240145444623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111031240145444623'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/03/wish-list-linguagem-ideal.html' title='Wish List - A Linguagem Ideal'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-111028646161524332</id><published>2005-03-08T09:54:00.000-03:00</published><updated>2005-03-08T09:54:21.616-03:00</updated><title type='text'>RUP e outros bichos</title><content type='html'>Estava lendo uns artigos e comecei a pensar novamente sobre RUP (ou UP pra quem gosta, mas pra mim sempre vai ser coisa da Rational). Sabe, depois de um tempo, comecei a achar que RUP n&amp;atilde;o estava ajudando muito, mas n&amp;atilde;o sabia exatamento o porqu&amp;ecirc;. Hoje eu tive uma boa id&amp;eacute;ia do motivo.

Acredito que RUP erra o alvo duas vezes:
1 - Ele &lt;b&gt;n&amp;atilde;o&lt;/b&gt; trata absolutamente nada sobre c&amp;oacute;digo, mas &amp;eacute; o c&amp;oacute;digo que, &lt;b&gt;de fato&lt;/b&gt;, constr&amp;oacute;i o programa.
2 - Ele &lt;b&gt;n&amp;atilde;o&lt;/b&gt; trata nada sobre estimativas e prazos, delegando isso para outros. E prazo &amp;eacute; &lt;b&gt;essencial&lt;/b&gt; para qualquer projeto de qualquer coisa, n&amp;atilde;o somente software.

Caricaturando: &lt;b&gt;&lt;i&gt;"RUP &amp;eacute; tudo sobre nada que importa"&lt;/i&gt;&lt;/b&gt;. 

&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-111028646161524332?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/111028646161524332/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/03/rup-e-outros-bichos.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111028646161524332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/111028646161524332'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/03/rup-e-outros-bichos.html' title='RUP e outros bichos'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-110935109700098305</id><published>2005-02-25T14:04:00.000-03:00</published><updated>2005-02-25T14:04:57.000-03:00</updated><title type='text'>Regra 5 - Dados críticos</title><content type='html'>"Nunca apague dados cr&amp;iacute;ticos &lt;b&gt;sem fazer backup&lt;/b&gt; e sem que &lt;b&gt;outra pessoa cheque suas cl&amp;aacute;usulas de dele&amp;ccedil;&amp;atilde;o&lt;/b&gt;. Nunca fa&amp;ccedil;a disso um processo autom&amp;aacute;tico."

Dados de produ&amp;ccedil;&amp;atilde;o s&amp;atilde;o SEMPRE cr&amp;iacute;ticos. ;)

E n&amp;atilde;o me venha com essa de "nunca apague dados, s&amp;oacute; desabilite". Tem horas que &amp;eacute; inevit&amp;aacute;vel, se &amp;eacute; evit&amp;aacute;vel, &amp;Oacute;BVIO que vc n&amp;atilde;o estaria apagando os dados :p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-110935109700098305?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/110935109700098305/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/02/regra-5-dados-crticos.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/110935109700098305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/110935109700098305'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/02/regra-5-dados-crticos.html' title='Regra 5 - Dados cr&amp;iacute;ticos'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900086.post-110916297394593872</id><published>2005-02-23T09:49:00.000-03:00</published><updated>2005-02-23T09:49:33.946-03:00</updated><title type='text'>4 Máximas para se manter em mente</title><content type='html'>&lt;ol&gt;
&lt;li&gt;&lt;b&gt;K.I.S.S. - Significa: "Keep It Simple, Stupid" = Mantenha isso simples, est&amp;uacute;pido&lt;/b&gt;. Simplicidade &amp;eacute; a chave para conseguir entender e modificar o sistema rapidamente.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Duplica&amp;ccedil;&amp;atilde;o &amp;eacute; a raiz de todo o Mal.&lt;/b&gt; Duplica&amp;ccedil;&amp;atilde;o leva a designs ruins e sistemas dif&amp;iacute;ceis de se alterar. Considere a duplica&amp;ccedil;&amp;atilde;o como um pecado mortal, vc vai pro inferno se duplicar seu c&amp;oacute;digo.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;N&amp;atilde;o empilhe tarefas.&lt;/b&gt; Normalmente, vc est&amp;aacute; programando alguma coisa e acha algo que deve ser feito ou corrigido para continuar. &lt;b&gt;Evite&lt;/b&gt; fazer isso no momento em que vc encontra a coisa, anote ela em um papel e termine o que est&amp;aacute; fazendo. Se for inevit&amp;aacute;vel empilhar, anote onde vc estava, pra poder voltar com seguran&amp;ccedil;a.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Mantenha a Equipe sincronizada &lt;i&gt;(principalmente seu gerente)&lt;/i&gt;.&lt;/b&gt; Se as pessoas n&amp;atilde;o sabem o que as outras est&amp;atilde;o fazendo, podem tomar decis&amp;otilde;es erradas simplesmente por falta de informa&amp;ccedil;&amp;atilde;o. Mantenha seus colegas e principalemente seu gerente (que toma decis&amp;otilde;es que afetam todo o grupo) a par do que vc est&amp;aacute; fazendo.&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900086-110916297394593872?l=mecanicamente.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mecanicamente.blogspot.com/feeds/110916297394593872/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://mecanicamente.blogspot.com/2005/02/4-mximas-para-se-manter-em-mente.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/110916297394593872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900086/posts/default/110916297394593872'/><link rel='alternate' type='text/html' href='http://mecanicamente.blogspot.com/2005/02/4-mximas-para-se-manter-em-mente.html' title='4 M&amp;aacute;ximas para se manter em mente'/><author><name>Ronie Uliana</name><uri>https://profiles.google.com/113967994659251721057</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-pkzYeJPV6-I/AAAAAAAAAAI/AAAAAAAAAAA/g-tPfAL9MIQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
