terça-feira, 29 de julho de 2008

Conhecimento vale mais que experiência

Estava lendo um post que veio pela newsletter do javalobby, que achei muito interessante e me fez pensar em algumas coisas.
Resumindo, a conclusão principal do post é: "Não adianta ter anos de experiência em [coloque-aqui-o-que-quiser] da forma errada.", ou seja, muitas vezes os anos de experiência são substituidos pela teoria (sem a prática), esta qual pode ser adquirida de várias maneiras.

Meio confuso não?! Vou tentar explicar um pouco melhor. Nos post do Jurgen Appelo, ele cita a questão da Lobotomia, e cita as seguintes frases, que tentei achar no wikipedia em português, porém as descrições não eram tão boas quanto as em inglês, então traduzo abaixo:

A Lobotomia, ou Leucotomia, que envolve o corte das conexões do Cortex Frontal, foi usado em alguns milhares de pacientes por todo o mundo durante o século 20, o que ocasionava uma mudança de comportamento, com o intuito de "curar" pessoas com esquizofrenia, e depressão profunda. Hoje este procedimento é considerado como "um dos maiores e mais bárbaros erros praticados pela medicina"
Jurgen faz uma pergunta após isso: "Você ainda ficaria impressionado com médico com mais de 20 anos de experiência em Lobotomia?"

O que me chamou atencão neste post foi justamente nunca ter parado para pensar sobre isso, e nunca ter feito uma comparação deste tipo. Realmente, 20 anos fazendo a coisa da maneira errada, vale mais que 1 mês fazendo da maneira certa? Isso nos remete também aquele outro post sobre A Fábula dos Porcos Assados.

O que ele ressalta ainda no post, é que a sua experiência como desenvolvedor não importa muito quanto aplicar a técnica ou tecnologia certa para resolver o problema, agora faz mais sentido aquela analogia de "Para quem só tem um martelo, tudo parece prego."

Outra frase de grande impacto citada por Jurgen, é a seguinte:
"Professionals don't match problems with their experiences. They match them with their knowledge."
tradução livre:
"Profissionais não usam a experiência para resolver os problemas. Eles usam o conhecimento para resolver os problemas."

Isso não quer dizer que você deva ficar em casa lendo livros sobre tudo que você saberá fazer tudo, mas diz que a experiência não diz muita coisa, se junto com ela não vier o conhecimento, e principalmente o conhecimento do correto.

Sem dúvida uma opinião um pouco radical, mas sem dúvida cheia de verdades. O que acha você? Pronto para uma lobotomia? Conheço uma pessoa cheia de experiência! =)

Cuil - Fim do Google?

Calma... o google não vai acabar! Depois do susto, agora você pode voltar a respirar. =)

Eu estou falando de uma empresa que está tentando se levantar contra o google na hegemonia de Search Engines, uma empresa cheia de promessas chamada Cuil (lê-se cool).

Esta nova Engine promete ser melhor, e indexar mais páginas que o Google e que a engine da Microsoft, e com um diferencial, que uma engine de ranking de consultas, além de procurar o que vc digitou, ela tenta descobrir o que é mais relevante com context, etc etc... enfim, não há como saber exatamente o que tem de tão revolucionário nisso, porque também isso deve ser segredo de negócio.
Algumas notícias:
IOL
MindTree

Com alguns simples testes que fiz aqui, não fiquei nem um pouco contente com a search engine deles. Primeiro procurei por PortalJava e não achou o site do portal. Depois procurei por meu nome, e não achou as coisas que normalmente aparecem, como é o caso do portaljava deste blog e outras coisas. Enfim, se eles querem mesmo entrar nesta briga, estão deixando muito a desejar, ou melhor, precisam mostrar alguma coisa =)

Mas enfim, fico no mínimo contente de ver alguém se levantando contra uma gigante sem ser outra gigante como é o caso da Microsoft com sua engine de buscas que, temos que concordar, já nasceu morta.

Outra coisa importante é ver o quão dependente do Google estamos hoje, seja com o buscador, seja com email, google maps, google docs, chat, etc. Até por isso que derrubar o google não é uma tarefa tão fácil, sem contar nossos aplicativos (no caso dos desenvolvedores) que estão cada vez mais integrando serviços do google, o que realmente é o negócio deles hoje.

Será que estamos vendo mais uma vez um ciclo sendo completado? Hegemonia Microsoft, deu lugar ao Google, que deu lugar... (mais no próximo capítulo =] )

sexta-feira, 25 de julho de 2008

JVM Tuning

Buenas!

Devido ao longo tempo sem postar algo realmente decente e técnico, este post vai ser sobre o que estou fazendo atualmente, que é instalando e configurando os servidores de produção aqui da empresa juntamente com uma outra pessoa.

O nosso ambiente compreende um cluster de Tomcats fazendo Session Replication. Nossos servidores são de arquitetura Intel e do modelo QuadCore (apesar de uma plataforma Sun ser bem mais performática ainda mais com Java), então algumas configurações são específicas para isso e para o nosso modelo de aplicação e talvez não sejam as melhores para o seu caso, mas de qualquer forma gostaria de compartilhar um pouco das coisas que aprendi e que estamos utilizando.

JDK - Porque a versão 6?

Além de ser a última versão, ela é superior a versão 5 em questões de performance, as configurações default da vm já vem otimizadas para uma melhor performance de runtime e um garbage colector mais eficiente.

Esta versão, por ser mais recente, usa de uma maneira mais elevada o poder de multi-processadores ou multi-cores e da grande quantidade de memória existente. Exemplos disso são, o uso do GC em threads paralelas, podendo utilizar até 32 Threads (veja mais na tópico sobre Tuning), usa também do paralelismo para a promoção de objetos do Young para o Old (Permanent) conforme figura abaixo (caso queira aprender mais sobre como funciona o Heap Space do java leia este documento e este documento)JVM Tuning

Como muitos sabem, é possível mudar o comportamento da VM e parametrizar muitas coisas através das VM Options que são passadas na inicialização de um processo.
No nosso caso aqui, utilizamos alguns parâmetros, que vou listar abaixo com uma breve descrição:

[JVM Parameters]
-server - Para simplificar, este parâmetro te da uma melhor performance final do que inicial. Caso sua arquitetura seja 64bits, o server é o default, e para arquiteturas 32bits, o client é o default.
-XX:+UseLargePages - Se o seu SO permite Large Memory Pages habilite esta função e sete também outros parâmetros relacionados a isso. Para saber mais sobre LMP leia este documento.
-XX:+AggressiveOpts - Habilita algumas otimizações de código, que segundo a documentação, é pra estar habilitada como padrão nas versões futuras.
-XX:+UseFastAccessorMethods - Usa versões otimizadas para métodos get de tipos primitivos.
-XX:+UseParallelGC - Habilita o GC para abrir várias thread e atuar paralelamente.
-XX:ParallelGCThreads=6 - Número de thread que serão abertas para GC. Por default é aberto uma Thread para cada processador existente.
-XX:+UseParNewGC - Igual ao parâmetro UseParallelGC, porém para a área Young do Heap.
-XX:+UseTLAB - Usa Thread-Local para alocação de objetos

[MEMORY]
-Xms 512M - Parâmetro de memória que define o mínimo de memória para a aplicação.
-Xmx 8G - Parâmetro de memória que define o máximo de memória para a aplicação

[YOUNG]
-XX:NewSize=256M - Tamanho mínimo para a área Young do Heap.
-XX:MaxNewSize=1G - Tamanho máximo para a área Young do Heap.

[OLD]
-XX:PermSize=512M - Tamanho mínimo da área de objetos permanentes em memória.
-XX:MaxPermSize=2G - Tamanho máximo da área de objetos permanentes em memória.

Obs: não sete os valores máximos maiores que o -Xmx.

Para ver oturos parâmetros para VM veja esta página.
Para ver alguns exemplos de tuning de aplicações veja este link.
Leia também a FAQ sobre GC.

Ferramentas para Monitoramento de Aplicações

Segue abaixo algumas ferramentas que podem te ajudar a entender melhor sua aplicação e te ajudar a chegar a valores para os parâmetros. Existem muitas outras, outra hora comento sobre algumas mais específicas, mas comentei sobre essas apenas porque já vem com o próprio JDK, e vc as encontra em $JAVA_HOME/bin.

  • jps - Mostra os processos Java que estão rodando na máquina.
  • jinfo - Mostra informações sobre o processo java que está rodando, como bibliotecas que ele está usando, parametros de inicialização, parâmetros gerais da VM como aquelas que aparecem em System.getEnv().
  • jmap - Mostra informações sobre o uso de memória por uma aplicação, uso de cada divisão da Heap como a Young, Old, Tenure, Perm, etc.
  • jsadebugd - Este processo se junta ao processo passado como parâmetro e adiciona propriedades de debug ao processo em questão.
  • jconsole - JConsole é uma ferramenta visual que monitora e mostra várias informações sobre um processo, como uso de memória, número de threads, processamento, etc.
  • jstat - Coleta e loga informações estatísticas sobre performance.

Considerações

Conforme dito acima essas configurações são específicas para cada caso, então se precisar de ajuda sobre algumas configurações para um caso específico comente aqui, que responderei assim qeu possível.
Como tuning é um trabalho constante, a monitoração e o profiling são coisas extremamente importantes para que você consiga entender sua aplicação e definir o que usar e o que não usar.
Conforme for otimizando a nossa aplicação estarei fazendo update neste post, ou escrevendo novos posts se for o caso.
Enfim, espero que isso possa ajudar algumas pessoas, e com certeza vai me ajudar futuramente como documentação.

segunda-feira, 21 de julho de 2008

Eleições nos Estados Unidos [fun]

Pensando nas eleições dos estados unidos, eu achei um candidato impressionante, que vale muito a pena acompanharmos e até apoiarmos. Provavelmente você não ouviu falar muito dele, nem deve ter o visto, mas é um azarão que correndo por fora vem brigando pela preferência dos americanos nas eleições. Não se chama Barak Obama, muito menos Hillary Clinton, muito menos ainda John McCain, ele é simplesmente conhecido como Walter, e sempre acompanhado de seu "segurança" e fiel amigo Jeff Dunham.

Veja o lançamento de sua candidatura.
Veja seu último discurso.
Veja outros vídeos sobre Walter.

pbs: para meu amigo pepe este vídeo.

quarta-feira, 16 de julho de 2008

Nerd Test v2

Só para constar o que já havia feito num outro post, mas este aqui é um pouco abrangente e o resultado é mais detalhado.
Confira meu resultado, e faça o seu também poste aqui depois um comment para eu ver o seu também.

NerdTests.com says I'm a Dorky Nerd King.  What are you?  Click here!

sexta-feira, 4 de julho de 2008

Eclipse Ganymede - Server Start Timeout (Hint)

Just a Hint, para pessoas que como eu, precisam alterar o Start timeout do servidor dentro do Eclipse, e estava acostumado a fazer isso no Preferences, noGanymede mudou.
Agora esta configuração fica nas propriedades do Server. Então, abra o Server (clique duplo no servidor), e na parte superior direita existe um dropdown chamado Timeout, e ali você consegue alterar o timeout do seu Server. Conforme figura abaixo:

Eclipse Ganymede - First Impressions

Para quem ainda não sabe o Eclipse Ganymede, ou Eclipse 3.4 foi lançado há umas 2 ou 3 semanas atrás, com muitos bugfixes e novas features bem legais.
Para quem não sabe o porque do nome Ganymede, este nome vem de uma Lua (satélite) de Júpter, a maior delas. Para quem não sabia o porque dos nomes anteriores, Callisto e Europa, estas também são luas de júpter.

Depois desta histórinha, quero elogiar o pessoal do Eclipse por uma feature principal, um download específico para Linux AMD 64. Ieiii!
Outra coisinha bem legal e simples foi a alteração do arquivo eclipse.ini, coisinha simples e prática. A alteração dos parâmetros de memória, uma das coisas que sempre qeu baixava uma versão do eclipse tinha que alterar, agora não preciso mais =) ieeeiii².

Bom, esta é mais uma versão sem muita alteração na plataforma em sí, mas em correção de bugs e novas funcionalidades, e "embelezamento".

Bom, falando de coisas um pouco mais práticas e técnicas, o esquema de Install/Update do eclipse ficou um pouco diferente mas ficou melhor. Agora você consegue saber exatamente o que tem instalado no seu eclipse as versões e consegue fazer revert de instalações. Tá eu sei que isso já existia, mas era bem ruinzinho de se achar naquilo, hoje está bem melhor esta parte.

Você também consegue pesquisar dentro dos "update sites" configurados por plugins, apenas digitando uma palavra chave. Ficou bem bacana. Porém, eles bem que podiam integrar o Plugin do Subclipse nativamente já. SVN já deve ser o controlador de versão mais usado, mas o eclipse só vem nativamente com CVS, e acredito eu, que o Subclipse deva ser o plugin mais usado para isso, porém eles tem um projeto incubado que é um plugin para SVN, mas pelo jeito ainda não está pronto.

Bom, pelo que vi no site do eclipse, houve grandes melhorias em Regex dentro da IDE, em todas as opções de busca, Import/Export de Launch Configurations. Se você possuia aquelas configurações bizarras para algumas aplicações, agora vc não precisa mais abrir os dois eclipses (o velho e o novo) e ficar copiando uma para a outra, basta exportar e importar =)

Outra feature bem bacaninha é o esquema de mostrar o caminho e pacote do arquivo que você está editando. Isso evita muitas merdas, principalmente se você é acostumado como eu a abrir arquivos através dos atalhos CTRL+SHIFT+R e CTRL+SHIFT+T. Bom, para abilitar esta feature use o atalho ALT+SHIFT+B.

Outra feature bem bacana, é a Format Edited Lines on Save, que se encontra nas preferences no menu Java > Editor > Save Actions. Bem útil isso ai. Sem contar as diversas melhorias no editor de código, code assists, etc. Tem features novas pra caramba, quem quiser saber mais de uma olhada no revision notes.

Infelizmente, apesar de existir já um download específico para Linux AMD 64bits, o velho problema conhecido desta plataforma com Java6 ainda existe, não sei bem de quem é a culpa, mas espero que isso se resolva no update 10 do JDK6 (que ainda está em Beta). Bom, não sei quantos sabem mas existe uma solução paleativa para isso que é adicionar um paramentro no arquivo eclipse.ini, logo abaixo do parâmetro -vmargs que é:
-XX:CompileCommand=exclude,org/eclipse/core/internal/dtree/DataTreeNode,forwardDeltaWith

Contudo, o que pude perceber mais uma vez, é que todo o processo de importação do antigo workspace continua bem clean. Bem bacana mesmo.

Gostaria também de parabenizar o desenvolvedores do Eclipse, os quais mais uma vez entregaram o projeto dentro do prazo e com alta qualidade. E isso como todos sabemos é difícil hein...