Mostrando postagens com marcador Java. Mostrar todas as postagens
Mostrando postagens com marcador Java. Mostrar todas as postagens

terça-feira, 2 de agosto de 2011

Levomi - Busca de Imóveis na Web

Há pouco tempo atrás, o Rio de Janeiro ganhou o direito de sediar a Copa do Mundo de 2014 e o direito de sediar os Jogos Olímpicos de 2016, com isso a maioria das pessoas que alugavam imóveis no Rio de Janeiro perdeu o direito de continuar alugando o mesmo imóvel. Mas Por quê?
Os Jogos com certeza trarão Bilhões de Reais em investimentos ao Estado; unindo isso à nova Política de Segurança, pacificando os morros da cidade, temos essa bolha se formando no mercado imobiliário do Rio de Janeiro. Em alguns bairros os preços dos aluguéis subiram até 146%. Algumas administradoras de imóveis simplesmente preferem não renovar os contratos de alugueis vigentes (mesmo que com um índice fora de contrato), para alugar para outro locatário (inquilino) por 2x o valor anterior.
Bem, isso aconteceu comigo, meu contrato de aluguel findou-se em Nov/2010 e, por mais que eu fosse um zeloso inquilino, sempre tenha pagado os alugueres em dia e tenha ofertado pagar um novo valor mensal de aluguel 1.4x maior que o anterior, a administradora se recusou a renová-lo. [Tomara que o próximo inquilino atrase e quebre todo o imóvel]
Assim, tive que dar início a tortuosa Busca por um imóvel no RJ. Oôh coisinha difícil! Mas eu sabia o que eu queria: Um imóvel (casa ou apartamento) de 2 ou 3 quartos na região da Tijuca, Vila Isabel, Grajaú, Maracanã, Usina ou Praça da Bandeira. Eu achava que como meu desejo era bem flexível, iria encontrar rapidamente um imóvel que atendesse minha necessidade. Enganei-me!
Comecei buscando na internet. Vários sites, alguns de classificados, outros agregadores e os diretos das imobiliárias. Em TODOS eu encontrei problemas: em uns eu só podia buscar por CASAS ou por APARTAMENTOS, ou pior, quando buscava por casas, fazia diferença se a casa fosse de rua ou casa de vila. Poxa, eu só queira um IMÓVEL para morar. Ou eu buscava por 2 quartos ou buscava por 3 quartos. Ou buscava na Tijuca, ou no Grajaú. Confesso, estava ficando maluco, refazendo buscas infindáveis nos mesmos sites para encontrar imóveis elegíveis ao meu gosto.
Quando encontrava, ligava e sempre já estava alugado ou já tinha “ficha” na frente. Quando eu dava a sorte de encontrar algum que ainda não tivesse ficha, já tinha ido alguém ver antes de mim, e já iria para a imobiliária no dia seguinte levar a documentação.
Cheguei a ligar para várias imobiliárias e administradoras para falar que sou bom pagador, com renda fixa e estava procurando um imóvel (passava a configuração que desejava) e pedia para que me informassem quando um imóvel do gênero ficasse disponível. TODAS respondem que não praticam esse serviço e que a demanda é muito grande para administrar o desejo de todos.
Dado esse cenário, eu resolvi fazer um programa super específico para realizar todas essas buscas para mim. Feito, eu o agendava para rodar todos os dias durante a madrugada e pela manhã conferia o resultado. Consegui alugar o apartamento em aproximadamente uma semana.
O Site levomi.com.br é o resultado deste programa. Peguei o core do programa que tinha feito, retirei as restrições a outros imóveis e tentei colocar em uma interface simples, em que o usuário possa realizar a busca que desejar (combinada ou simples) nos grandes sites de imóveis, e o que é melhor, como minha ideia era ajudar aos outros afim de acelerar o processo de busca por um novo imóvel, é tudo 100% grátis para o usuário. A ideia é você perguntar ao levomi.com.br e ele te apontar o caminho. O site é apenas um agregador.
Confira!

quinta-feira, 5 de agosto de 2010

Entenda a Certificação SCJD

Pessoal;

Vejam o que a Wiki fala sobre Certificação:

Certificação é a declaração formal de "ser verdade", emitida por quem tenha credibilidade e tenha autoridade legal (...). Ela deve ser formal, (...) ser corporificada em um documento. A certificação deve declarar (...), explicitamente, que determinada coisa, status ou evento é verdadeiro. Deve também ser emitida por alguém, ou alguma instituição, que tenha fé pública, isto é, que tenha credibilidade perante a sociedade. Essa credibilidade pode ser instituida por lei ou decorrente de aceitação social.

Mais um artigo interessante do iMaster sobre Java. Certificações são super importantes na carreira de um programador, elas comprovam - para qualquer um ver - o quanto você conhece da linguagem.

A certificação Sun Certified Java Developer - SCJD oferece uma oportunidade única para os desenvolvedores Java colocarem toda a sua bagagem de conhecimento realmente em prática. Ela é destinada para aqueles já certificados na SCJP que desejam demonstrar proficiência avançadas utilizando os leques de tecnologias existentes no pacote JSE. Por isso, seu pré-requisito é possuir no mínimo a certificação oficial de programador.

O objetivo geral desta certificação é validar conhecimentos arquiteturais, combinados com importantes conceitos de engenharia de software, juntamente com uma grande porção das tecnologias encontradas no JSE: OOP, Exceptions, Logging, Collections, Threading, Socket, Serialization, File I/O, RMI e Swing.

O conteúdo da prova oferece um ótimo ambiente de aprendizado, no qual diferentes tecnologias podem ser combinadas com uma variedade de opções de soluções. A prova foi elaborada com o intuito de simular as circunstâncias do mundo real que um profissional pode encontrar no mercado de trabalho, por isso ela apresenta determinadas situações incompletas e duvidosas, fazendo com que cada candidato apresente atitude e dinâmica para encarar e resolver os problemas envolvidos na análise, no projeto e na implementação de um verdadeiro sistema.

A prova está divida em duas diferentes fases chamadas de Assignment e Essay, nas quais vale ressaltar a necessidade de efetuar dois pagamentos diferentes, uma para cada parte.

1. Assignment
Consiste em o candidato receber a documentação que descreve os requisitos e as situações de um sistema real, fazendo com que ele, então, tome as devidas decisões arquiteturais que resolvam, de forma coerente, o determinado contexto. Com isso, ele deve escrever um sistema relativamente pequeno, mas que seja suficiente para atender a todos os itens descritos no documento de especificação. Juntamente com o sistema, o candidato deve entregar três tipos de documentação:

Infra-estrutura - documentação de todo o código-fonte Java implementado, utilizando a tecnologia JavaDoc.
Usuário Final - documentação destinada para os usuários finais da aplicação, descrevendo: instalação, configurações, interfaces gráficas e funcionalidades.
Decisões - documentação das decisões significativas que o candidato teve que tomar relacionadas com dúvidas, incertezas e julgamentos envolvidos no projeto.
2. Essay
Consiste em o candidato prestar uma prova escrita de 90 minutos, na qual ele terá que responder algumas questões relacionadas com o desenvolvimento de seu projeto. Esta segunda fase tem dois objetivos. Um é questionar o candidato sobre a coerência do seu entendimento nas questões que o levaram a tomar as decisões descritas no documento de decisão. O segundo é provar sua autoria no código-fonte submetido na primeira parte do projeto.

Dicas Gerais
A filosofia desta certificação consiste no candidato entrar na prova já recebendo o numero máximo de pontos, que é 400. Cada tópico cobrado tem um peso de pontos pré-determinado:

Considerações Gerais [80 Pontos] - avalia os critérios relacionados com a facilidade de manutenção do código.
Documentação [50 Pontos] - avalia os critérios relacionados com a qualidade dos documentos requisitados.
Projeto OOP [50 Pontos] - avalia os critérios relacionados com a qualidade da estrutura do projeto de classes, métodos e variáveis.
GUI [70 Pontos] - avalia os critérios relacionados com a qualidade e com a facilidade apresentada nas interfaces gráficas do usuário.
Bloqueio [80 Pontos] - avalia os critérios relacionados com a qualidade do controle de bloqueios.
Fluência da Linguagem [70 Pontos] - avalia os critérios relacionados com a língua inglesa.
Durante as duas fases da certificação, os avaliadores descontarão pontos proporcionais naqueles tópicos nos quais o candidato não conseguiu cumprir os critérios adequadamente. O numero mínimo para ser aprovado é de 320 pontos. Seguem, então, algumas dicas que eu acho importantes relacionadas com o conteúdo básico que um provável candidato deve possuir:

Inglês
Diferentemente de outras certificações, nesta o candidato deverá entregar vários documentos na primeira fase e prestar uma prova contendo somente perguntas dissertativas, nas quais ele deverá possuir o básico do inglês. Qualquer erro pode colocar o entendimento do avaliador em dúvida, fazendo com que ele facilmente desconte pontos. A minha indicação é para os candidatos sem o inglês básico adiarem essa prova, deixando-a para quando estiverem melhor na língua. Aqueles com inglês regular podem até tentar, sabendo que as coisas podem não dar certo. De qualquer forma, seguem duas dicas:

Na primeira, fase peça ajuda a outras pessoas mais experientes para revisarem e corrigirem os erros em todos os documentos submetidos.
Na segunda fase, elabore e estude algumas frases "chavões" para que possa chegar bem preparado com o objetivo de encaixar as repostas nos contextos das questões. Alguns exemplos seriam:
I decided to create?
I decided to implement?
I decided to use (X) because?
I decided to use the following?
I decided not to use?
I decided to use (X) instead of (Y) because?
In my opinion, there was no need to?
I implemented a class called (p1.p2.Nome) that?
Arquitetura de Sistemas
O candidato necessitará definir e projetar uma arquitetura para a implementação do suposto sistema. A questão complicadora é que ele deverá justificar consistentemente no documento de decisões todas as motivações que o impulsionaram para isso. Qualquer discrepância que coloque em dúvida a integridade ou a autenticidade da solução poderá fazer o avaliador descontar pontos. A minha dica aqui é para que o candidato invista em estudar livros e materiais específicos no assunto. Leitura obrigatória do livro do Martin Fowler:

Princípios de OOP
Dentro do contexto da arquitetura, o candidato também estará sendo avaliado na qualidade da infra-estrutura de classes elaborada na solução entregue. Com isso, todo candidato tem que, obrigatoriamente, saber o mínimo dos velhos e já conhecidos princípios de OOP, denominados SOLID. A minha dica de livro aqui é o de análise e projeto OOP da Head First:

Padrões de Projeto
Continuando a pontuação na qualidade da infra-estrutura de classes, gostaria de acrescentar um ponto importante: um bom projeto de classes sempre está recheado de padrões de projetos em sua estrutura. Além da leitura do livro do Martin Fowler já indicado, seguem outras indicações de livros consagrados:

Java Code Convention
O projeto deve ser implementado usando os padrões formais de escrita da indústria Java, e o candidato deve estar totalmente familiarizado com eles. A dica aqui é o candidato estudar e aprender a escrever código Java 100% compatível com a convenção oficial.

Java Doc
O projeto de classes deve ser completamente documentado usando a tecnologia Java Doc. A dica aqui é o candidato aprender a escrever e a utilizar adequadamente os recursos do Java Doc.

Tecnologias JSE
O projeto precisará do domínio razoável de algumas tecnologias existentes dentro do JSE, como Logging, Threading, Socket, Serialization, File I/O, RMI e Swing. A minha dica aqui é para que cada candidato faça uma auto-análise realmente verdadeira e procure, assim, livros e tutoriais específicos sobre cada tópico. Um ótimo livro que faz um resumo razoável do conteúdo é o único existente específico para a prova SCJD:

Engenharia de Software
Durante a implementação do projeto, o candidato deve saber lidar com alguns conceitos básicos de engenharia de software para tomar determinadas decisões relacionadas com o contexto da solução requisitada. Alguns deles seriam: Bloqueio, Concorrência, Paginação, Ordenação, Classificação, Cacheamento etc. A dica aqui é: fica a cargo de cada candidato correr atrás de artigos, tutoriais e materiais de embasamento conceitual relacionados com eles, uma vez que não existe uma única literatura reunindo todos. Um bom começa seria o livro:

POJO In Action - Chris Richardson que não tem o foco da prova, mas que aborda com sucesso a maioria dos tópicos.
Algo que eu gostaria de deixar claro é que algumas certificações de TI possuem literaturas específicas que cobrem todo o conteúdo da prova, fazendo o candidato ficar bem cômodo no momento de estudar. A prova SCJD não é assim! Nela, o candidato inevitavelmente terá que investir bastante tempo de estudo em vários conteúdos diferentes com o objetivo de acumular uma série de informações correlacionadas.

Receita de Bolo
Para organizar as idéias, eu gostaria de ajudar os candidatos interessados passando uma receita de bolo. Aqui está ela:

1. Levante o que precisa ser aprendido - junte todas as dicas e faça uma listagem bem real daquilo que você acha que precisa aprender ou melhorar.

2. Plano de estudo - com base na listagem, faça um plano de estudo para cada tópico, investindo de acordo com seu tempo útil. Invista tempo estudando livros, tutoriais e fazendo exercícios isolados de cada tópico.

3. Livro SJCD Monkhouse - depois estudar cada tópico individualmente, agora é hora de linkar todo o conteúdo. Este é o momento ideal e propício para o candidato investir tempo estudando o livro específico da SCJD, que reúne e compila todo o material envolvido na prova.

4. Projetos exemplos - após entender o conteúdo no geral, é de grande ajuda o candidato brincar com algum projeto real da prova. O objetivo deste passo é fazer o candidato ter em mãos algum projeto no qual ele possa executar, depurar, visualizar e ter um entendimento da mecânica da coisa. Seguem algumas dicas:

No livro da SCJD indicado, há um projeto chamado de DennyDVD, que foi elaborado pelo autor justamente para ser usado para estudo. Ele contém os recursos necessários que contemplam o conteúdo da prova. Qualquer um pode fazer download do código-fonte no site oficial. Para todas as informações, consulte o próprio livro.
No revista Mundo Java edição 40 (agora conhecida como MundoJ), existe um ótimo artigo escrito pelo meu brow Roberto Perillo que aborda todos os detalhes da certificação. No artigo, é implementado um exemplo que também cobre aspectos da prova que também pode ser usado como material de estudo. Veja a revista para todas as informações.
Eu posso disponibilizar o código-fonte do projeto que eu fiz quando fui aprovado nesta certificação. Para todas as informações, entre em contato comigo.
5. Projeto Oficial - depois de todos os passos acima, o candidato pode respirar fundo, tomar coragem para pagar a primeira fase, baixar a especificação e começar o seu projeto.

Mesmo depois de tudo isso, muitas dúvidas podem aparecer durante a elaboração do projeto. Um ótimo lugar para resolver isso é o fórum do JavaRanch, que é ponto de encontro de todas as pessoas que já prestaram a prova com sucesso e daqueles candidatos que atualmente estão prestando. Minha dica é, antes de perguntar algo, procure se a questão já não foi discutida anteriormente. Faça boas amizades no fórum que várias pessoas te ajudarão nas mais diversas dificuldades.

Eu também me coloco à disposição para ajudar qualquer interessado em investir na prova. Quero te adiantar que não será fácil, mas você só saberá o quanto aprendeu depois que passar pelo processo. Este é o artigo 1 de vários que eu escreverei sobre outras dicas relacionadas com esta prova. Um grande abraço e nos vemos no próximo!

quarta-feira, 7 de abril de 2010

Google abre inscrições para seu campeonato mundial de programação

Primeira prova do Google Code Jam 2010 está marcada para 7 de maio.
Final do desafio internacional reunirá 25 melhores em julho, na Irlanda.

O Google abriu nesta quarta-feira (7) as inscrições para o Code Jam, campeonato mundial de programação promovido pela companhia. Realizado desde 2003, o Google Code Jam é uma competição na qual programadores devem resolver desafios de algoritmos complexos, em um período de tempo predeterminado.

As primeiras etapas serão disputadas on-line e a primeira prova acontece em um mês, no dia 7 de maio. Os 25 programadores mais bem colocados participarão da final, prevista para ser realizada no dia 30 de julho, em Dublin, na Irlanda.

O vencedor ganhará um prêmio de US$ 5 mil, o segundo colocado embolsará US$ 2 mil, e o terceiro lugar, US$ 1 mil, enquanto os outros 22 finalistas levarão US$ 100 cada.



Key dates for 2010.

Wednesday, April 7, 201019:00 UTCRegistration Begins
Friday, May 7, 201023:00 UTC24 hr Qualification Round Begins
Saturday, May 8, 201023:00 UTCRegistration and Qualification Round End
Saturday, May 22, 201001:00 UTCOnline Round 1: Sub-Round A
Saturday, May 22, 201016:00 UTCOnline Round 1: Sub-Round B
Sunday, May 23, 201009:00 UTCOnline Round 1: Sub-Round C
Saturday, June 05, 201014:00 UTCOnline Round 2
Saturday, June 12, 201014:00 UTCOnline Round 3
Friday, July 30, 2010TBDOnsite Finals

quinta-feira, 17 de dezembro de 2009

Práticas de aplicativos web com Java

Amigos,
Achei um artigo sobre desenvolvimento Java muito legal, escrito pelo
Fernando Franzini.

No mundo conceitual da engenharia de software vemos inúmeras teorias, diretrizes, abordagens, idéias, teoremas etc... tudo isso relacionado com todas as partes envolvidas na produção de um sistema. Entretanto, na realidade nua e crua, vemos que a prática pode se distanciar um pouco desta almejada "Realidade Conceitual Ideal". Neste artigo, quero falar um pouco sobre práticas reais relacionadas a situações que eu tenho vivido na construção, teste e homologação de sistemas web usando java. Então vamos lá =).

Independente de qual filosofia, metodologia, abordagens ou frameworks que se possa usar no desenvolvimento do aplicativo web em java, nos últimos anos tenho sentido que não consigo fugir de dois problemas: consumo de memória e performance.

Consumo de Memória
Não é novidade para ninguém que, em java, a memória é automaticamente gerenciada através de um recurso chamado Garbage Collection, que a cada versão da JVM tem sido melhorado e incrementado. Este fato traz, para qualquer desenvolvedor, a falsa idéia de que ele pode deitar e rolar na implementação do sistema que o "Sr. pancudão coletor de lixo" vai limpar toda a sujeira que ele deixar para traz.

Na prática, percebo que os responsáveis pelos sistemas em geral - gerentes, projetistas, programadores etc., não tem colocado isso como um fator de preocupação nos ciclos de desenvolvimento, deixando "o pau torar" na programação. O resultado é que em ambiente de testes e homologação o sistema funciona lindo e maravilhoso, mas depois que entra em produção, mesmo após apenas alguns dias em que o serviço está no ar, começam as runtime exceptions apontando a falta de memória. E agora? O que fazer se o sistema está gastando mais memória do que a suportada pela configuração da JVM?

"O aumento de memória das máquinas e JVM,
ou mesmo o aumento de máquinas nos clusters,
não é a solução, e sim uma prorrogação do problema!"

Qualquer pessoa poderia facilmente sugerir que aumentássemos a memória da máquina e JVM. Entretanto, vemos que isso não é uma solução, e sim uma prorrogação do problema, porque quanto mais pessoas usando, ou quando novos processos forem acrescentados no sistema, maior será o gasto. Solucionar o problema seria perguntar para o sistema se ele não está gastando memória mais do que o necessário!!! Depois dessa certeza é que se delega mais memória para JVM, sendo que a aplicação realmente está precisando. Não quero entrar em detalhes sobre regiões de memória da JVM e nem sobre escalabilidade vertical e horizontal, pois fogem do escopo do artigo. A questão é que vejo muita gente tentando escalar a aplicação sem nem ao menos avaliar o seu consumo real.

Performance
A velocidade da aplicação em executar os processos e apresentar algum resultado está intimamente ligada com a experiência do usuário final, que vai passar horas e horas do seu dia ali na frente do sistema que foi maravilhosamente escrito para ele. Na prática, vejo que, novamente, os responsáveis pelos sistemas em geral - gerentes, projetistas e programadores, também não têm colocado isso como um fator de preocupação nos ciclos de desenvolvimento. O resultado é o mesmo de sempre, em ambiente de testes, homologação e durante algum tempo inicial de produção, o sistema funciona lindo e maravilhoso, mas depois de algum tempo começam as reclamações relacionadas com a lentidão crescente.

Seguem abaixo algumas das práticas que venho utilizando como se fosse uma "receita de bolo", mais ou menos um "pente fino" que é passado nas aplicações para corrigir as duas situações problemáticas acima citadas.

1. Acesso ao banco de dados - reduzir ao máximo o número de vezes que a aplicação faz acesso ao banco de dados.
Problema: Muitos programadores têm a mania de ir desenvolvendo classes, componentes e módulos sem antes e/ou durante fazer uma análise organizada de como estas partes do sistema estão fazendo estes acessos. Com isso, vemos como resultado aplicações com baixa performance devido aos vários e desnecessários acessos à base que se multiplicam na aplicação a medida do número de usuários simultaneamente conectados.

Solução: Analisar quantas vezes a aplicação está acesssndo o banco, o porquê do acesso, e assim tentar uma forma de evitar este acesso. Neste momento, muitos profissionais pecam por não conhecerem recursos básicos de banco de dados e de SQL-ANSI, principalmente pelas propagações de frameworks ORM. Qualquer meio é válido, alguns recursos usados para alcançar isso são o uso de VIEWS, JOIN e SUBQUERYS. Todos os programadores têm que possuir um lema em mente: "O acesso remoto é que mais degrada a performance de uma aplicação e o acesso ao banco de dados é um deles, então eu tenho que fazer de tudo para evitar ou minimizar ao máximo."

2. Índices adequados - Criar índices para as todas as tabelas que sofrem consultas na aplicação.
Problema: Muitos programadores não têm o mínimo de fundamentos de banco de dados, criando bases sem nenhum índice de busca para as tabelas que sofrem alto número de SELECT WHERE CAMPO. A questão problemática é que quando uma tabela sem índice sofre um SELECT WHERE CAMPO, o registro é buscado, na maioria das vezes, da pior e mais demorada forma possível, que é o "seqüencialmente". A pior notícia é que isso é um problema cumulativo, ou seja, quanto mais registro existente, mais demorada fica a consulta. Já tive experiências de diminuir o tempo de um procedimento de fechamento mensal em 50% do tempo, pelo simples ato de criar os índices nas tabelas usados pelo processo.

Solução: Para cada SELECT que o programa faz, em cada tabela, verifique os campos de busca colocados no WHERE e, assim, crie um índice para cada um deles.

3. Consultas Gigantescas - Sistemas que permitem o usuário consultar e trazer do banco de dados um alto número de registros.
Problema: Algumas situações comumente ocorrentes em sistemas no modelo desktop, ou mais conhecido como "FAT CLIENT", não se encaixam em aplicativos web. Um destes casos é quando sistemas permitem aos usuários filtrar e trazer do banco de dados consultas com um alto número de registros complemente desnecessário. Em casos em que o modelo era desktop, isso não acarretava problemas devido à própria natureza da solução. Entretanto em sistemas web, onde recursos de execução são limitados e o numero de acesso simultâneos é ilimitado, o sistema estará gastando um alto e precioso numero relevante de memória.
Explicando de forma prática, eu já peguei sistemas nas redondezas onde os programadores juniores estavam replicando a arquitetura que continha uma camada de persistência CRUD. A questão problemática era que o framework replicava um método que sempre retornava todos os registros existente. Isto estava sendo propagado para todo o sistema e seus processos relacionados. Se paramos para analisar, mecanismos de busca são disponibilizados ao usuário para que ele tenha autonomia de buscar registros individuais ou grupos lógicos deles. Qual seria o motivo, ou o que poderia fazer um usuário com 500 linhas de resultados de uma consulta? Que ser humano na face da terra gostaria de visualizar 500 registros em uma olhada? Mesmo que a regra de negócio ainda apoiasse o caso, o usuário final, sendo um humano comum, não teria tamanha visibilidade para isso.

Solução: Os processos do sistema em questão devem ser analisados e devem ser implementadas validações lógicas corretas, que não permitam executar consultas que retornem uma alto número de registros no banco de dados. Duas práticas neste tópico são bem comuns - o uso sistemático de paginação, e a implementação de filtros inteligentes, baseados em regra do próprio negócio, que não deixassem a ocorrência de grandes intervalos. Como tudo na vida, existem exceções, e podemos, sim, encontrar situações em sistemas que teriam a necessidade de consultar grandes volumes de registros, mas isso já está mais que comprovado que é uma porcentagem pequena e restrita do total da automação.

4. Ordenação de Tabelas - Ordenar as tabelas em memória usando java ao invés de usar ORDER BY.
Problema: Uma funcionalidade muito comum é disponibilizar a ordenação das tabelas apresentadas na aplicação pelas suas próprias colunas. A questão problemática é quando a aplicação efetua um acesso ao banco a cada ordenação requisitada. Ou seja, o programador usa o recurso de SELECT ORDER BY para fazer a ordenação.

Solução: Transformar as linhas da tabela em objetos java e, assim, ordená-los usando recursos do JSE, evitando gasto com tempo, acesso ao banco e recursos de memória. Esta solução pode ser facilmente implementando com a interface Comparable.

5. Usar Pool de conexões - usar a abordagem de Pool como paradigma de acesso ao banco de dados.
Problema: Eu realmente não sei o motivo, mas já peguei alguns aplicativos web por aí que abrem e fecham objetos de conexão com o banco de dados a cada requisição. Ou seja, a cada pedido enviado ao web container, no mínimo 2 chamadas remotas são efetuadas, uma autenticar o usuário/senha e outra para efetuar a comando SQL desejado. Esta opção é uma das piores gafes que um programador web pode fazer para deixar o sistema com a pior performance possível, sem falar que o sistema pode "baleiar" o banco quando o número de acesso simultâneos exceder a capacidade de resposta do determinado banco de dados.

Solução: Na web existe uma única solução comprovada que é o uso efetivo da abordagem de Pool de conexões. No momento da disponibilização - deploy da aplicação, o sistema deve abrir um numero X de conexões com o banco de dados que sera posteriormente usado em toda a aplicação. Esta abordagem mistura o conceito de compartilhamento e concorrência, sendo que pedidos em tempos diferentes reutilização a mesma conexão e pedidos simultâneos usarão diferentes conexões. Este numero X deve ser levantando e configurada de forma parametrizada de acordo com o perfil da aplicação e do modo/quantidades que os usuários estarão gastando conexões durante utilização do sistema.

6. Usar Cache - Cachear informações que sofrem alto índice de acesso e baixa ocorrência de alteração.

Problema: Sistemas em geral implementam administração de informações na qual poderíamos classificar em 2 tipos: dados de manutenção/parâmetros e de processos:

a. Manutenção/Parâmetros - informações que os sistemas têm que guardar, usadas como parte do processo, que não possuem um fim nelas mesmas. Estes tipo de formação frequentemente sofre um baixo índice de manutenção e um alto número de acesso. Ou seja, no escopo da aplicação, estes dados raramente são alterados e muitos usados.

b. Processos - informações resultantes de processos com regras de negócio do escopo da aplicação. Estes podem ou não sofrer alterações e podem ou não ser altamente acessados. Tudo depende da natureza do negócio da aplicação. A situação complicada seria o sistema fazer um acesso ao banco de dados a cada momento que diferentes usuários (concorrentes ou não) necessitam usar informações de manutenção, que na grande maioria dos casos são iguais. Ou seja, teríamos vários usuários acessando o banco de dados repetidas vezes para pegar as mesmas informações, gastando assim tempo e memória de forma desnecessária.

Solução: Analisar cuidadosamente e cachear as determinadas informações que se encaixam de alguma maneria no perfil de dados de "Manutenção/Parâmetros". Conceitualmente, é fácil visualizar o mecanismos de cache: o primeiro usuário que necessitar da determinada informação efetuará um acesso ao banco e cacheará os dados em algum lugar na memória, fazendo com que os próximos usuários não precisem gastar tempo e memória repetindo o ciclo. O cache é atualizado quando estes dados forem atualizados de alguma maneira no sistema, bem como o perfil deles já mostrou que seria um caso difícil de acontecer.
A prática do cache, entretanto, não é algo simples ou trivial, demandando tempo e esforço para ser implementado. Eu poderia sugerir implementações prontas como o EhCache, ou serviços de cache disponibilizados pelos frameworks ORM. Veja que a utilização só vale a pena se os dados realmente possuírem um alto índice de acesso. Com esta abordagem, a aplicação consegue reduzir em média até 40% o acesso ao banco de dados. Uma sugestão bem simples e que deu bastante resultado é simplesmente implementar um mini cache usando o "application context" da aplicação que, com algumas classes estáticas, se consegue cachear/alterar estes dados, reduzindo em um porcentagem considerável o acesso ao banco de dados.

7. Controlar a criação de objetos: controle efetivo da criação de objetos durante a execução do programa.
Problema: Algo que precisamos sempre lembrar durante a programação é que o operador new aloca fisicamente o objeto da memória, gastando espaço no HEAP da aplicação. A primeira questão problemática é que percebo que os programadores usam o new de forma displicente, sem nem ao menos parar para pensar em que contexto da aplicação está usando. Tudo é motivo para fazer um new, eu já vi casos em que para reiniciar o estado do objeto, o programador dava um new na referência.

Solução: O programador tem que sair desse comodismo e começar a analisar todos os seus new! Duas perguntas resolvem o problema: 1. Por que estou alocando esse objeto? 2. Quantas vezes esse código vai ser executado? Estas duas perguntas vão consciencializar o programador daquela situação, levando-o no mínimo a tomar uma das duas decisões abaixo:

- Reutilizar Objetos - ao invés de ficar sempre fazendo new, ele pode aumentar a visibilidade do escopo daquele objeto e assim reusá-lo, restartando seu estado.

- Reduzir o Escopo - reduzir o escopo dos objetos vai deixá-los disponíveis mais rápido para o coletor de lixo. Se for preciso, use escopos lógicos menores com { }. Esta solução é uma das mais difíceis a serem implementadas, porque invadem a "cultura" do programador de se autocriticar. Mas quero animá-los dizendo que a batalha da economia de memória e performance se ganha na somatória de detalhes!

8. Controlar objetos String - controlar o gasto com os objetos Strings.
Problema: Outra coisa que sempre precisamos lembrar é que os objetos String chamados de "wrappers" são imutáveis, ou seja, uma vez instanciados eles nunca mudam. Qualquer operação com a String gerará uma terceira String. O problema aqui é o uso abusivo, desnecessário e inconsciente das String durante a execução do programa.

Solução: Segue a mesma idéia do tópico 5. O programador deve analisar a questão da necessidade e entender o porquê daquele uso. Duas opções surgem para contornar a situação:

- usar final static para as Strings que se encaixam no contexto de estáticas (SQLs, mensagens). Ou seja, somente será gasto um objeto para todas as execuções do programa.

- usar StringBuffer/StringBuilder para as String que sofrem alterações constantes ou para situações de manipulação de arquivos.

9. Aumentar as configurações de memória da JVM
Problema: Mesmo depois de todas as precauções tomadas, a aplicação ainda pode gastar mais memória do valor default previamente configurado na JVM.

Solução: Neste casos, é preciso fazer um estudo, apurando a média de memória gasta pela aplicação, usando alguma ferramenta de profile e, assim, configurar um adequado número razoável de memoria.

Fonte:
IMaster

quarta-feira, 6 de maio de 2009

NetBeans ou Eclipse? Qual IDE devo usar?

Amigos;

Fiquei muito tempo sem postar nada, mas andei muito ocupado nos últimos dias. Encontrei um artigo, no iMasters, super interessante e bem escrito e separei para vocês. 
Eu sempre preguei que para desenver Java com JSF o NetBeans dá de mil no Eclipse, porém utilizei o Eclipse no desenvolvimento do Comprafácil.com, Ipirangashop.com e no GloboMarcas.com e ele me atendeu bem.
Segue abaixo o artigo escrito pelo Alantiel Freire Marins, na última Quarta-feira (06/05/2009)

Uso de IDEs para o desenvolvimento Web

Falar de IDEs (Ambientes integrados de desenvolvimento) é muitas vezes mais polêmico que falar sobre as próprias linguagens de programação. E como não quero aumentar isso ainda mais, não vou escrever sobre qual é melhor ou pior, vou apenas descrever um pouco do que acho sobre duas que considero as principais delas. Apesar de ajudar - e muito - quando já se sabe programar, pode atrapalhar bastante usá-las quando se está aprendendo, mas isso vai de cada pessoa e também não é esse o objetivo do artigo.

O uso de IDEs para desenvolvimento é muito praticado hoje em dia, principalmente para se trabalhar em agências ou software houses, com produção em grande escala, diversas pessoas no projeto etc. Vou falar especificamente das IDEs Eclipse e NetBeans por serem gratuitas e também por serem as mais utilizadas nos dias de hoje, principalmente com Java.

NetBeans

Foi desenvolvida pela Sun e é mantida pela comunidade open source. Ela foi feita de Java para Java. É muito utilizada para desenvolvimento de Java para Web, apesar de também ser muito útil para desenvolvimento enterprise e aplicações java para desktop. Possui os principais recursos de uma boa IDE, tais como depuração avançada em tempo de desenvolvimento, deixando os pontos com falhas de digitação, ou variáveis não declaradas, falta de chaves ou colchetes, importações de bibliotecas necessárias automaticamente etc.

A NetBeans é considerada relativamente fácil de usar e que acelera bastante o desenvolvimento e testes, já que possui um servidor de aplicação embutido, o contêiner Tomcat, ou seja, não precisamos nos preocupar com o ambiente local para desenvolvimento e testes, basta uma tecla e a sua aplicação estará rodando. Com todos esses recursos vindo por padrão na sua instalação, não poderia deixar de ser, o NetBeans é relativamente pesado (lembrando que 'pesado' pode ser leve em muitas máquinas hoje em dia. A maioria dos jogos de hoje são mais pesados que a IDE, isso para se ter uma comparação). Mas, como disse, para quem não gosta de configurar muitas coisas, gosta de praticidade e necessita de um ambiente completo para desenvolver, principalmente para web, o NetBeans é uma ótima escolha.

Para baixar a IDE basta entrar no site: http://www.netbeans.org

Eclipse

É uma boa opção para aqueles que gostam de ter seus aplicativos configurados à sua maneira, como faz muito bem o navegador Firefox, que vem crescendo a cada dia por ser bem adaptável ao estilo de seu usuário.

O Eclipse foi feito em Java, mas é largamente usado por programadores de outras linguagens, tanto server-side como client-side, tais como PHP, XML, XHTML e Javascript. Foi inicialmente desenvolvida pela IBM e depois liberada para a comunidade do software livre.

A característica principal do Eclipse é que é baseada em plugins, ou seja, numa mesma empresa podem ter pessoas usando um determinado plugin enquanto outra pessoa pode estar utilizando outro totalmente diferente para a mesma coisa, mas ambos usando Eclipse. Para programar Java para a Web, por exemplo existe o WTP (Web Tools Plataform).

No site do Eclipse existem algumas versões completas com kits que já são opções completas para determinados projetos. São versões da IDE mais alguns plugins mais indicados.

O site do projeto pode ser visto em http://www.eclipse.org

Uma coisa bem legal das duas é que podem ser baixadas tanto para Linux como para Mac ou Windows.

Já que essas duas IDE's são gratuitas, vale a pena dar uma testada nas duas para avaliar qual é melhor para o seu gosto.

sexta-feira, 24 de abril de 2009

Garbage First Collector da Sun Elimina Amplamente a Baixa Latência/Alto Consumo

Postado por Charles Humble, traduzido por Ricardo Almeida em 24 Abr 2009 02:59 PM no InfoQ

O Garbage Collector da Sun chamado Garbage First (referenciado de G1) é o novo garbage collector de baixa latência planejado para substituir CMS no Hotspot da JVM.  É um coletor estilo servidor, dirigido a máquinas multi-processamento com muita memória. Existem duas grandes diferenças entre CMS e G1. Primeiro que o G1 é um coletor com compactação. Compactação, um processo o qual a vida de objetos são movidas para espaços de memória livre no fim da pilha (heap) de modo que outros espaços tornam-se uma área contínua de memória livre, é importante em aplicações de execução longa porque é inevitável que a pilha irá se fragmentar no decorrer do tempo. G1 compacta suficientemente para evitar completamente o uso de listas livres de granularidade fina para alocação, o que simplifica consideravelmente partes do coletor e sobretudo elimina questões de potenciais fragmentações. Bem como a compactação, G1 oferece pausas de coleta mais previsíveis do que pode obter com o coletor CMS e permite usuários configurar as pausas do coletor. Essa determinística forte dá ao G1 algumas características de um coletor de Tempo Real (Real-Time) verdadeiro, porém não é fortemente Tempo Real, uma vez que fatores como agendamento do Sistema Operacional ainda significam que pausas não podem ser garantidas. Para o desenvolvedor entretanto consideravelmente mais fácil de usar do que produtos Java de Tempo Real desde que o código existente é capaz de ter performance melhorada sem necessitar de qualquer alteração em código. G1 usa algumas técnicas interessantes, baseadas na marcação global de informação e outras métricas, para priorizar regiões para coleta de acordo com a eficiência da Garbage Collector. Um artigo InfoQ anterior fornece mais detalhes técnicos.

Em um podcast recente,, James Gosling destacou a importância do G1 para certos tipos de aplicações Java de larga escala, semelhante a intercâmbios financeiros, que são caracterizados por grandes quantidades de dados vivos na pilha e considerável paralelismo no nível de thread, e são executados frequentemente em processadores multi-core:

"...o segredo profundo sobre muito dessas aplicações Java é que eles não usam banco de dados realmente. Ao invés de banco de dados eles usam muita RAM e empurram o garbage collector igual maluco porque eles não podem se dar ao luxo de tocar o disco sempre. Quando você está fazendo muitos, muitos milhares de transações por segundo, é bom manter tudo na RAM, usando tabelas hash, obtendo muitos núcleos focados nas transações na medida do possível, e geralmente ter grande questões sobre latência de operação.""

Gosling fala da diferênça entre consumo e determinismo. Tipicamente um garbage collector é otimizado para um ou outro. Um garbage collector otimizado para consumo é ideal para executar tarefas de segundo plano muito longas, onde pausas para garbage collector não são um problema para terminar a tarefa de segundo plano o mais rapidamente possível. Inversamente, se você está trabalhando em um sistema iterativo semelhante a uma aplicação web, então uma baixa latência do garbage collector é geralmente a melhor escolha. Gosling mostra o ponto que essas diferenças também existem em outras partes da JVM e que geralmente a JVM é otimizada para consumo. Realmente:

""Isso acontece todo lugar onde existe algoritmos que reorganizam algo. Então ter uma tabela hash - todos pensam que uma tabela hash tem tempo constante de inserção e tempo constante de remoção, o que é falso. O tempo de inserção é constante até ter que recolocá-lo no hash e depois uma insersão vai levar um bom tempo.""

Permitindo usuários especificar que o garbage collection não consuma mais que x ms de tempo, o G1 pode tentar manter pausas de collection como pequenos e não frequentes como for necessário para a aplicação, mas não tão lento como to diminuir consumo ou aumentar desnecessariamente a pegada. Dado que o garbage collector tem uma das áreas onde o ganho lento de latência é mais visível, o G1 deve oferecer benefícios significantes para desenvolvedores Java Enterprise. Está disponível no release do Java 6 update 14 e o time do Hotspot da Sun está extremamente vivo para ter feedback e bug reports dos que adotam cedo.