Terça-feira, Janeiro 26, 2010

Aprendendo a aprender, estudando o estudo

Pra não ficar pra atrás no mundo da computação é preciso estudar sempre. Não existe este negócio de terminar a faculdade e parar de estudar. Parece que você é um hamster, que corre sem sair do lugar.  Para muitos é assustador.

Já para mim, isto é o que mais gosto. Sempre há coisas novas para aprender e conhecer. Maneiras melhores de trabalhar. E se você está condenado a fazer isto toda sua vida, por que não aprender como se aprender e estudar como se estuda?

A mais legal introdução sobre o assunto é o artigo Curso rápido em Teoria da Aprendizem da Kathy Sierra, cujo ponto de vista é mais para quem ensina. Para me aprofundar mais, acabo de ler dois livros sobre o assunto: Pragmatic Thinking and Learning: Refactor Your Wetware, de Andy Hunt, e How to Become a Straight-A Student, de Cal Newport.


Pragmatic Thinking and Learning: Refactor Your Wetware (Pragmatic Programmers)
Andy Hunt é co-autor do The Pragmatic Programmer, um dos melhores livros sobre desenvolvimento de software. Seu novo livro Pragmatic Thinking and Learning é inteiramente dedicado a como aprender de forma mais eficiente.

Discute desde modelos de aprendizagem à importância da concentração. Pelo caminho a gente encontra várias dicas e técnicas para aperfeiçoar a aprendizagem. Vão desde o resultado de pesquisas científicas a duvidosas auto-ajudas. Como o próprio autor diz, é pra testar e passar a usar o que funcionar para você.

O livro apresenta assuntos como o Modelo Dreyfus de aprendizagem, que é ótimo para conter a ansiedade quando se está aprendendo um assunto novo; hemisférios direito e esquerdo do cérebro, mostrando a importância de alternar entre visões holísticas e específicas sobre o que se está estudando; objetivos de estudo SMART (Specific, Measurable, Achievalbe, Relevant e Timeboxed); da necessidade de estudar constantemente e de forma deliberada; da eficiência de grupos de estudo; técnicas de leitura ativa de livros como a SQ3R; do uso de Mind Maps; e de documentar e ensinar para aprender melhor; e até da importância da concentração e como a meditação pode ajudar a aprimorá-la.

Ao contrário do Pragmatic Programmers, o estilo de escrita é meio seco e pouco fluente. Comparando a divertida palestra do Dave Thomas e o monocórdio tom do vídeo de apresentação do autor na Amazon, dá ver quem é o extrovertido da dupla. Outra coisa que atrapalha é o uso excessivo de metáforas relacionadas a computador. Tá certo que o livro é voltado a desenvolvedores, mas falar coisas como que "O cérebro tem uma CPU dual" acaba emprobecendo alguns conceitos. Quando entra na parte de preconceitos culturais, o livro fica americano-cêntrico demais. Vale até pular o capítulo.

How to Become a Straight-A Student: The Unconventional Strategies Real College Students Use to Score High While Studying LessO outro livro similar é o How to Become a Straight-A Student: The Unconventional Strategies Real College Students Use to Score High While Studying Less. Se no livro do Programador Pragmático a preocupação é aprender, este aqui é ainda mais pragmático: o objetivo é tirar notas altas na faculdade. As dicas vão desde organização de tempo a como puxar o saco do professor de forma eficiente. Gostaria de tê-lo lido há 20 anos atrás:-).

Seu ponto forte é que se baseia em entrevistas que o autor fez com alguns dos melhores estudantes de universidades americanas. São dicas que funcionam para alguém no mundo real. Técnicas de como, onde e quando estudar, como preparar um trabalho, como tomar notas em aula, quando pedir orientação ao professor. Eu nem tinha idéia que existiam diversas técnicas para tomar notas. Deve ser por isto que para mim nunca funcionou fazer anotações em sala de aula. Descobri até que existem cursos para se tornar um bom aluno além de vários livros sobre study skills. De um modo geral as dicas são puro bom senso, mas sempre é bom ver outros pontos de vista.

No final das contas, gostei especialmente do Refactoring your Wetware. Ajudou a pensar a respeito de várias técnicas que já usei, como — o que estou fazendo agora — escrever um post de blog para assimilar um assunto. Me ajudou a entender por que aprendi muito bem algum assunto que dei uma aula a respeito. Porque fico namorando um livro, lendo o índice e folheando, antes de começar a ler de verdade. No fundo, muita coisa é só bom senso. O bom é ver alguém dizendo que o que você achava que era superstição é importante, ou mostrando formas sistemáticas de fazer o que você aprendeu por tentativa e erro.

Gostaria de tê-los lido há anos atrás. Teria aprendido mais estudando menos.

Quarta-feira, Novembro 18, 2009

Registrando seu próprio sítio virtual em uma hora por R$30,00


Hourglass
Uploaded by darque9
Em apenas uma hora criei e coloquei no ar um domínio próprio para este sítio. Custou só R$30,00, o preço do domínio. Foi mais rápido do que eu pensava, mas isto porque eu já sabia tudo que tinha que fazer.

São tantos pequenos detalhes, tanta coisa que tem saber a priori, que eu teria demorado dias se tivesse que aprender como fazer. É o tipo de conhecimento legal de compartilhar. Para fazê-lo, é só seguir os passos abaixo.

Crie um blogue no Blogger.com

Visite Blogger.com e crie um blogue para você. Escolha nome, template, configurações etc. Cheguei a pensar em hospedar meu próprio blogue com o excelente WordPress, mas seria mais uma encheção de saco para configurar, manter, atualizar etc. O pouco tempo que tenho para o blogue quero gastar produzindo conteúdo, mas, nerd que sou, é difícil me conter para não ficar um tempão futucando a tecnologia.

Escolha seu domínio

Considerando que você quer um domínio .br, vá no Registro.BR e na caixa de busca que tem lá, vá entrando os domínios que deseja.

várias terminações possíveis, cada uma significa uma coisa que ninguém sabe o que é. A dica é: se o nome que deseja estiver disponível, escolha a .COM.BR pois é a mais usada. Este meu .PRO.BR, escolhi porque parece de profissional, mas oficialmente é de professor.

Neste ponto em que estamos, você ainda não registrou o domínio, apenas verificou que ele está disponível.

Configure o DNS para seu domínio

O Domain Name Server (DNS) é um tipo de servidor na internet que mapeia um nome, como mosquito.pro.br, para o computador específico onde ficam as páginas. Você não precisará colocar um servidor no ar. Como tudo na Internet, há uma opção 0800.

O EveryDNS é um servidor DNS gratuito, onde você pode registrar qualquer domínio. Crie uma conta lá e registre seu domínio. O que você tem que fazer mesmo é criar um campo CNAME associando o endereço www.seudominio.xxx.br ao ghs.google.com. É importante iniciar com www. Opcional é criar um campo do tipo A apontando para um endereço IP qualquer. Ficaria assim:

Registre seu domínio

Volte ao Registro.BR e compre de verdade seu nome de domínio. Caso ainda não tenha uma conta lá, precisará criar uma. Ao registrar, entre no campo de "name server" com os endereços ns1.everydns.com, ns2.everydns.com, ... Depois eles vão te mandar a cobrança por email. Será seu único custo.

Associe seu domínio ao blogue

Este é mole. Volte no Blogger.com, entre em Settings -> Publishing e selecione "Hospedar no meu próprio domínio". Preencha lá com www.seudominio.xxx.br.

Aí que fiquei impressionado com a rapidez de tudo. Cerca de meia hora depois de fazer isto, meu domínio novo já estava valendo. Tá certo que eu já tinha o blogue criado e contas em todos os serviços, teria demorado mais caso fosse tudo do zero. O fato é que mais tempo demorei para escrever este texto do que para colocar um domínio novo no ar:-).

Extras

O principal acabou, agora é um adendo avançado. Acho que já passa do ponto de coisas que pessoas não técnicas, mas inteligentes e motivadas, conseguem fazer.

Brinco que uma maneira boa de saber se uma empresa é tecnicamente competente é ver se é possível acessar o site dela sem colocar www. no endereço. Isto indicará pelo menos que eles têm alguém que entende das coisas cuidando da infra-estrutura.

Com esta configuração, eu não sei como configurar direto o mosquito.pro.br para o blogue. O EveryDNS não deixa o domínio principal ser um CNAME, o que tem sentido. Minha solução foi apontar para um endereço IP onde tenho um servidor, e lá configurar um host virtual do Apache para fazer um redirect permanente para o endereço com o www. De qualquer forma, eis como ficou minha configuração do Apache:
<VirtualHost *:80>
ServerName mosquito.pro.br

RewriteEngine on
RewriteRule ^/(arquivos/.*)$ /mosquito/$1 [last]

RewriteRule ^(.*)$ http://www.mosquito.pro.br$1 [R=permanent,last]
</VirtualHost>
A última linha é uma expressão regular boba que faz o redirect permanente de todas as chamadas para o mesmo endereço com www. O macete fica por conta da outra regra de rewrite que me dá algo muito útil que o Blogger não deixa. Agora posso publicar meus próprios arquivos, basta colocá-los em uma pasta específica e acessar em uma URL com /arquivos/.

Quinta-feira, Novembro 12, 2009

Desenvolvimento de software: O que sabemos que funciona?

O que não falta em desenvolvimento de software é achismo. Fulano acha isso. A nova moda de desenvolvimento diz aquilo. É um alívio ver destacado o que sabemos de verdade. Achei duas ótimas referências sobre fatos em Engenharia de Software.

Uma é esta apresentação abaixo, onde o autor começa discutindo o método científico, e depois lista vários fatos realmente conhecidos sobre desenvolvimento de software:


Outro artigo excelente é esta reportagem sobre pesquisas de engenharia de software feitas na Microsoft. O pesquisador Nachi Nagappan tem acesso livre a todos os grupos de desenvolvimento dentro da Microsoft. Cada um tem um jeito diferente de trabalhar: alguns usam asserções, outros testes unitários, outros trabalham distribuídos pelo mundo. Como a Microsoft registra cada modificação em seu sistema de controle de versões a cada bug aberto e a cada módulo modificado, Nagappan tem dados maravilhosos a seu dispor. E ele tira conclusões surpreendentes. Tá certo que talvez nem todo lugar tenha programadores da qualidade dos da Microsoft, mas acredito que dá para generalizar suas descobertas.

Como brinde, vale lembrar que outra fonte de fatos sobre experimentos é a coluna "Voz da Evidência" publicada na revista IEEE Software.

Terça-feira, Novembro 10, 2009

Agora em novo endereço!

Seja bem-vindo a nosso novo endereço:

www.mosquito.pro.br

Agora que resolvi dar um gás neste blogue, nada melhor que um domínio de verdade. Todos os links antigos continuarão a funcionar, assim como o RSS com as atualizações.

Selenium, a melhor ferramenta para testes de aplicações web


Avançando no Terceiro Milênio, não dá mais para conceber a construção de uma aplicação Web sem ter testes automatizados. Não fazendo testes automáticos, você estará jogando na mão de seu cliente a responsabilidade de testar a aplicação. Este é um trabalho que deveria ser seu. Não fazê-lo é um desrespeito com quem te paga. Estará também jogando dinheiro fora, pois quanto mais tempo você demora para descobrir um erro, mais custoso é consertá-lo.

E pra fazer testes funcionais de aplicações web, a ferramenta é uma só: Selenium. É tudo de bom: grátis, open source e bem feito. Um dos melhores projetos de código aberto que existem por aí.

O Selenium te permite testar um sítio virtual em vários browsers e sistemas operacionais. Testa Javascript e ajax. Nada melhor para achar problemas de incompatibilidade.

O Selenium na verdade não é um único projeto, mas um ecossistema de diferentes softwares que interagem entre si. Os principais projetos são:
Selenium Core
O núcleo do Selenium é uma biblioteca Javascript que te dá basicamente dois tipos de comandos. Um para comandar um browser: clicar em links, preencher formulários, fazer uma ação depois de aparecer algo na tela etc. Outro tipo é para fazer asserções, como se há um texto presente, se tal elemento está sendo exibido, se a página foi corretamente carregada etc. É a pedra fundadora do Selenium. Inspirado nos Testes Fit, você define os seus passos de testes em uma tabela – no caso em HTML – que é interpretada, executada e um relatório final com sucessos e erros é gerado.

Selenium IDE
Fazer as tabelas de teste do Selenium IDE é muito trabalhoso. Inventaram então este sensacional plugin para o Firefox. Com ele você pode gravar toda uma sessão de navegação e dar playback nela depois. Durante a gravação vários comandos extras são adicionados ao menu de contexto (botão direito) do Firefox. Estes comandos lhe permitem fazer asserções sobre o que está sendo gravado, como, por exemplo, selecionar um texto na tela e incluir uma asserção para verificar se o texto selecionado está presente.

É um barato ver seu navegador funcionando sozinho, como se fosse controlado por um fantasma. Chefes e clientes adoram. Apesar de serem gravados no Firefox, os testes podem ser executados em qualquer navegador e sistema operacional.

Selenium Remote Control
Aqui o negócio começa a ficar sério. O Selenium Remote Control te permite controlar um browser e fazer asserções de dentro de uma linguagem de programação. Você passa a ter acesso a loops, funções (para não repetir código de testes) e, o melhor, às bibliotecas da linguagem. Dá para rodar um teste e depois conectar direto à base de dados para verificar se os dados foram corretamente modificados.

Um workflow comum é você gravar um teste inicial no Selenium IDE, dar um "Save As" para ser gerada uma versão para a sua linguagem de programação favorita (Python, Ruby, Java ...) e então criar testes mais sofisticados. Seus testes podem ser executados dentro de um framework de testes, como os da família xUnit, e rodar dentro de seu processo de Integração Contínua.

Selenium Grid
Uma coisa temos que assumir: fazer testes comandando um browser é lento. Muito lento. Especialmente depois que se começa a ter mais de uma centena de testes. Tá certo que são testes funcionais, ninguém está esperando que obedeça às regras de velocidade de testes unitários, mas pegar um erro dias depois, é demais. O Selenium Grid vem resolver isto, ele distribui os testes para executarem em paralelo em vários computadores diferentes. É chato de configurar, mas a recompensa é grande quando os testes começam a demorar muito.

Já usei o Grid até mesmo para realizar testes de stress em uma aplicação. Tá certo que não é a ferramenta mas apropriada, mas dependendo de aplicação web é (mal) feita, pode ser a única alternativa.

E a boa notícia é que uma das melhores referências sobre o Selenium é em Português! É o excelente Blogue do Seu Enium. Lá você aprende do beabá a usar o Selenium Grid, passando pela divertida explicação do porquê do nome Selenium.

Outra coisa muito legal que se pode fazer com o Selenium é automatizar sua vida. Sabe as aplicações Web com uma terrível interface e que você é obrigado a usar? Aquelas que você tem que clicar em um milhão de lugares e preencher um monte de campos para chegar onde quer? Basta gravar um script no Selenium IDE que faz tudo pra você. O macete é nos momentos que preencher um dado específico (como uma senha), colocar um comando para o Selenium esperar um texto da tela seguinte para continuar a executar. Nada melhor para evitar uma tendinite.

Por fim, vale deixar o aviso de que o Selenium não é nenhuma bala de prata. É uma ferramenta fundamental para se entregar aplicações web de qualidade, mas não é trivial usá-lo bem. É preciso bons testers para pegar os casos que podem dar problemas e não testar apenas o caminho de execução principal. Colocar os comandos certos para que erros intermitentes não aconteçam é mais uma arte do que uma ciência. Se sua empresa tiver a mentalidade de que testers são imbecis (sim, isto existe), não vai funcionar. É preciso que os desenvolvedores trabalhem junto com os testers para que as aplicações sejam fáceis de testar. Testar widgets de algumas bibliotecas Javascript pode ser bem enrolado.

Não é por estar fazendo testes com uma super-ferramenta é que você poderá prescindir de seu cérebro.

Segunda-feira, Novembro 09, 2009

Navegação e SEO, ajude o Google a encontrar suas páginas


Caravel
Originally uploaded by Lajoso
Nesta SEOgunda aprenderemos sobre o terceiro aspecto mais importante para seu sítio virtual ficar bem na fita com o Google: a navegação.

Navegar pelos sítios virtuais pode ser assustador. Serpentes marinhas gigantescas podem devorar seu browsers. O mar ferverá quando se atravessar a linha do Equador. Do ponto de vista de SEO, a função da navegação é guiar seguramente o Google pelo seu sítio, permitindo que ele não só encontre todas suas páginas, como descubra quais são as mais importantes.

Primeira coisa é entender como os mecanismos de busca descobrem as páginas que irão catalogar. Cada buscador tem um software que funciona como se fosse um browser, chamado de robô. Ao visitar uma página, ele automaticamente grava a página e clica em todos os links presentes. Para cada nova página visitada, ele clica nos links e visita todas as novas páginas. Vai assim até visitar todas as páginas de seu site.

A principal característica deste robô é que ele é burro. Ele não preenche nenhum formulário, não entende Javascript e (quase) não entende Flash. A única coisa que ele faz é ver o texto de suas páginas e clicar em links.

O que nos leva à Primeira regra SEO de navegação: toda página de seu sítio virtual tem que poder ser acessada apenas clicando em links a partir da página principal.

Se o robô do Google não puder chegar na sua página apenas clicando, ela não será indexada e nunca poderá ser o resultado de nenhuma busca (tá bom, tá bom, falaremos de sitemaps no futuro). O robô não preencherá um simples campo de busca para poder achar suas páginas antigas. Se você, por exemplo, publica notícias que expiram, mantenha um link para toda notícia expirada. Uma delas pode ter exatamente aquela palavra usada em um busca e ser responsável por lhe trazer um novo usuário.

Cada vez mais os sites criam esquemas de navegação mais espertos, cheios de animações e guéri-gueris. Apesar de divertidas, estas navegações podem destruir o ranking de seu site nos mecanismos de busca. O robô não entende Javascript nem Flash, as principais tecnologias destas animações. Se não entende, ele não conseguirá navegar nem catalogar suas páginas.

Segunda regra SEO de navegação: seu sítio virtual tem que ter uma barra de navegação para suas principais seções feita em HTML simples, usando apenas a tag <A HREF>. Se você tiver uma navegação para seções em Javascript, é preciso que ela degrade graciosamente e continue a funcionar mesmo ao desligar o Javascript do browser. Se tiver uma navegação em Flash, faça uma outra em HTML puro no pé de cada página.

Tome cuidado se você usa um Content Management System (CMS) que lhe gera automaticamente uma navegação. Ainda outro dia fiz uma consultoria SEO e me deparei com um CMS cuja navegação de seções padrão era toda em Javascript. O CMS tentava ser esperto, tinha um código para identificar se era o robô do Google que estava visitando. Se fosse, era mostrada uma navegação em HTML simples em vez da em Javascript. Só que mostrar uma página diferente para o robô e para o ser humano é uma das práticas mais abominadas pelos mecanismos de busca. É chamada de Cloaking e é muito fácil de ser descoberta. Nunca faça isto. Mesmo que os desenvolvedores do CMS estejam fazendo o cloaking de boa fé, não tem como o Google saber disto. Uma bobagem assim pode remover todo seu site das buscas do Google!!!

Estas barras com links também permitem que o mecanismo de busca identifique as principais seções de seu site. Estas seções serão links a mais que você terá direito na página de resultados de busca. Veja por exemplo o excelente trabalho que o Google faz para achar as seções do jornal New York Times:


Claro que nem sempre o Google acerta. Por isto você precisa ajudá-lo com uma boa navegação e arquitetura de informação. Ou você acha mesmo que Naruto é uma das seções mais importantes da Wikipédia? :-)


Você não pode dizer explicitamente pro Google as seções de seu site, apenas sugerí-las através dos links de navegação. Se acontecer contigo alguma tragédia como esta das seções da Wikipédia, não precisa ficar desesperado. Crie uma conta gratuita no serviço de Webmaster Tools do Google e remova as seções que você não quer que apareça.


Aguarde agora nossa próxima emocionante e informativa SEOgunda. Semana passada aprendemos sobre o mais importante elemento HTML para SEO, hoje foi terceiro aspecto mais importante. O que falta?

E se você for ansioso demais para esperar o desenrolar da série para otimizar seu site, lembro que já fiz e estou fazendo consultorias SEO/SEM. Entre em contato no email PauloNeves(arroba)gmail.com

Segunda-feira, Novembro 02, 2009

SEOgunda, pois segunda é dia de SEO e SEM

Gastar uns trocados em Search Engine Optimization (SEO) e Search Engine Marketing (SEM) é um dos dinheiros mais bem gastos para o dono de um website. Todo sítio virtual é no fundo um investimento em marketing. De que vale este investimento se seus clientes não te acham?

Para que seus clientes te achem na Internet, é preciso que antes agradar a outro visitante: Mr. Google. Suas páginas têm que ser feitas para que o mecanismo de busca as entenda e tire o máximo de informações delas. Não é difícil, nem tem mágica. É só não deixar o cara que desenvolveu seu site fazer muita bobagem.

O problema é que tem muito enganador por aí. O sujeito que promete colocar seu site no primeiro lugar do Google está te enrolando. Resolvi então iniciar uma série de posts para contar os "segredos" de SEO e SEM. Como publicarei um artigo toda segunda-feira, intitularei a série: "Segunda é dia de SEO". Serão nossas SEOgundas!(Ai!)

Vou começar com a mais importante dica de SEO. É uma coisa simples, mas que pode fazer a grande diferença para acharem seu sítio pelos mecanismos de busca.

É a tag <title> do HTML. Nela você coloca o – supresa! &ndash título de sua página. O problema dela é que ninguém presta atenção neste título. Quando vê a página, ele só aparece na barrinha da janela do navegador. É fácil passar desapercebido que não foi corretamente preenchido. Veja por exemplo como aparece o título desta página:


A tag <title> é importante porque:
  • As palavras que estão ali têm um peso maior para o mecanismo de busca. Se o usuário buscar por uma palavra presente no <title>, sua página tem mais chances de ser retornada.

  • O texto do <title> aparecerá na página de resultados do Google. Coloque ali termos que convencerão ao usuário a clicar na sua página. Nada adianta sua página estar em primeiro lugar se o usuário clica na segunda.

  • O <title> é importante para usabilidade. Ele que permite diferenciar sua página entre as várias que estão abertas no seu desktop. O <title> também especifica como a página ficará guardada nos seus Favoritos.

Isto quer dizer que você vai colocar todo seu texto no <title> e sua página aparecerá no resultado de todas as buscas, certo? Errado. Somente os 65 primeiros caracteres são considerados pelo Google. Qualquer coisa depois será ignorada.

Uma boa regra para construir seu <title> é dividí-lo em 3 partes:

Título do conteúdo da página | Seção do site | Nome do site

Na primeira, vem o título da página mesmo. Por exemplo, se for uma notícia de um evento, você coloca aí a manchete. Se for um produto em um sítio de compras, coloque o nome do produto. Se for uma página sobre um pessoa, coloque o nome dela. A melhor maneira é fazer isto automaticamente no próprio sistema que gera as páginas. Algumas páginas mais importantes valem o esforço de fazer isto manualmente. Preencha o <title> com as palavras que o usuário pode usar para buscar pelo assunto da página. Lembre-se de colocar as palavras mais importantes sempre no início, pois estas são levadas mais em conta pelo Google.

Feche o <title> com o nome da seção de seu sítio onde está a página, isto pode dar um pista do assunto para o Google. Por fim coloque o nome do seu site no final, especialmente se ele tiver palavras que as pessoas usam para buscar.

Vamos fazer isto com um exemplo. Digamos que você está vendendo uma TV Sony Bravia. Você deve colocar o nome Sony Bravia, o nome do modelo, a seção e por fim o nome da loja:
Sony Bravia KDL-52V5100 - 52" LCD - 1080p (FullHD) | TV | Casas Maria
E aí tem um dos detalhes mais importantes. Na hora de preencher as palavras chave, é preciso se colocar no ponto de vista do usuário. Talvez Eletrodomésticos seja o nome do seu departamento que vende o produto. Só que ninguém busca por "Eletrodoméstico" no Google. O sujeito está querendo é uma TV. O nome de sua seção deve ser "TV" no singular.

Tentar pensar como seu usuário é um dos aspectos mais importantes para otimização SEO. Só que isto daí já é assunto para um outro post...

E se você for ansioso demais para esperar o desenrolar da série, aviso que já fiz e estou fazendo consultorias SEO/SEM. Entre em contato no email PauloNeves(arroba)gmail.com

Sexta-feira, Outubro 30, 2009

Dicas para seu SQL não feder

No shit
Pra mim, a melhor tradução de code smells é fedentina de código.

A idéia de fedentina em código foi popularizada pelo ótimo livro Refactoring, do Martin Fowler. É uma indicação de que algo no código não está bem e merece ser analisado mais de perto. É como você andando na rua, sente um cheiro desagradável e olha a sola de seu sapato para checar se está tudo certo.

Tive que rever milhares de linhas de código SQL. Depois de um tempo, você deixa de tentar entender cada detalhe de comando e começa a funcionar por reconhecimento de padrões. Basta passar os olhos pelo código e logo vem aquele cheiro que tem algo mal feito por ali. Ao contrário do exemplo da sola de sapato, na maior parte das vezes há uma grande imundície.

Compartilho então com você, minha coleção de fedentinas em SQL:
DISTINCT
Uma vez, estava eu no departamento de TI de uma grande empresa e ouvi comentarem: "Já fiz o select, o único problema é que está vindo com alguns dados duplicados.", logo alguém respondeu: "É fácil resolver, basta usar o DISTINCT.". Argh! São raro os casos em que um DISTINCT é necessário. E normalmente o são por alguma falta de normalização no modelo de dados.

Ao usar o DISTINCT sem entender a query, você pode estar escondendo um lentíssimo produto cartesiano, ou mesmo um erro no seu código. Já vi códigos como este: SELECT DISTINCT P.Nome FROM pessoas P, equipe e WHERE e.id=123.

Parece estar tudo muito bom na sua base de testes quando você tem apenas uma única equipe e uma dúzia de pessoas. Quando entrar em produção: CABOOOM!!! Tudo vai estourar.

O mais provável é que o DISTINCT esteja acobertando a inexistência de um join na sua query. É preciso analisar a query com cuidado e checar não precisa acrescentar um join a mais entre as tabelas. Talvez seja o caso até de remodelar o projeto do banco de dados.

LIMIT 1, TOP 1, ou RowNum <=1
Esta é outra forma de esconder uma falta de join. O LIMIT é do MySql, o TOP 1 do SqlServer, e o RowNum do Oracle.

De vez em quando, sua consulta vai retornar mais de um elemento e você não entende o porquê. Qual a solução mais fácil? Ora, pegar só o primeiro e continuar correndo para entregar as coisas no prazo. Só terá é um bug sinistro pra pegar em produção. Afinal de contas, parar, pensar e olhar qual join poderia fazer a mais, ou que tabela está faltando incluir é muito difícil.

E tem o caso em que isto está 100% errado: é quando você usa um TOP 1 e não usa um ORDER BY. Como o SQL só trabalha com conjuntos, pegar o primeiro elemento sem ordenar antes, quer dizer que você está pegando um elemento aleatório. Pode até ser que seu SGBD seja sempre retornado o que você deseja, mas pequenas modificações no banco, como a criação de um novo índice, podem fazer com que um valor errado seja retornado de uma hora pra outra.

GROUP BY sem funções de agregação
Este é outro truque para evitar resultados repetidos e garantir um código desnecessariamente lento. Se nos resultados da query não tem nenhuma função COUNT, MAX, MIN ou similares, tem um erro aí. Certamente é mais um caso de join faltando que precisa ser investigado.

O caso mais inócuo é quando é usado no lugar de um DISTINCT. Tem gente que acha que o GROUP BY seria mais eficiente. Isto não é verdade. Qualquer que seja seu SGBD, ele será esperto o bastante para fazer o mesmo plano para as duas consultas. O GROUP BY apenas deixará seu código mais difícil de entender e manter, pois todas colunas do resultado precisarão ser repetidas no final.

Subselects
Neste caso, uma das colunas de retorno da query é uma outra query, isto é, um subselect. Ou pior, várias colunas são subselects parecidos, talvez retornando apenas um COUNT. Isto pode ser a coisa mais lerda do mundo.

Tem que pensar que cada subselect será executado para cada registro retornado. Se você retorna 100 registros, estará fazendo 101 consultas! A solução costuma ser mais complicada, normalmente usando condicionais e GROUP BY. Só que vale o preço. O tempo da consulta pode diminuir ordens de grandeza.

O fato de SQL ser uma linguagem declarativa às vezes disfarça processamentos custosos. Somente incluir um comando ali não parece que sua consulta está ficando duas ordens de grandeza mais lenta. Pode até ser que seu BD seja esperto o bastante para otimizar estas queries. Acredito até que isto já tenha salvo muitos sistema sem produção. Mas pra que confiar?

Outer joins
Esta fedentina aqui acontece mais em código procedural. O sujeito faz um loop nos resultados de um select. Para cada elemento retornado, processa alguma coisa e faz um outro select para checar se existe algo em outra tabela. Se existir faz um processamento a mais. Se você tiver 10 elementos, serão 11 selects. 11 idas à base para pegar dados.

Um Outer join resolveria isto com uma única consulta! Caso não existisse relação entre as tabelas, os elementos da tabela secundária viriam como NULL. Somente isto pode fazer a diferença entre um banco de dados stressado e um tranquilo.

Por outro lado, Outer joins são mais caros que os inner joins tradicionais. Já vi gente fazendo um left join "só pra garantir". Confira sempre se é mesmo necessário fazê-lo em vez de um inner join normal.

texto LIKE '%:nome%'
Se a string com o que o LIKE compara começa com %, significa que o texto pode casar em qualquer ponto. O SBGD ê terá não só que varrer não só toda sua tabela, como todo o texto do atributo analisado. É um algoritmo de complexidade quadrática! Sim, isto é lento praca.

Este é mais um caso em que na base de testes, que tem pouco dados, tudo ficará uma beleza. Alguns meses (ou anos) depois que o sistema entrar em produção, tudo emperrará.

A solução para este problema é usar um índice textual. Mas aí é assunto para outro post.

Ver estas e outras em códigos de produção me leva a divagar sobre dois grandes sucessos da informática, o MySql e os frameworks de mapeamento Objeto-Relacional.

Até outro dia o MySql não tinha subselects. Isto era chato, pois tornava necessário codificar coisas que uma única consulta mais sofisticada resolve. Só que por outro lado, ficava claro pra todo mundo que você estava fazendo loop dentro de loop. Nenhum problema ficava "escondido" no código. A falta de features mais avançadas, deixava claro tudo que estava sendo feito.

Os frameworks Objeto-Relacional por outro lado fazem tudo pra você. Eles não esquecem dos joins, nem inventam gambiarras pra retornar o que desejam. Alguns até criam todos os índices pra você, um outro problema que nem mencionei. No mundo da produção de código industrial, isto é um aumento de produtividade tremendo. Vai ser chato quando quiser fazer um relatório mais complicado, mas aí basta ter alguém que entenda como o mapeamento é feito e faça a consulta "na unha", com SQL de verdade.

As limitações destas tecnologias, acabam sendo uma grande vantagem. Elas resolvem a maior parte dos problemas. Sem elas, fica muito fácil dar um tiro pé. Putz! O tiro ainda foi no pé que tava todo sujo!