terça-feira, agosto 01, 2006

Mas Que Diabos?

Nos últimos meses passei a acessar diariamente o site The Daily WTF (que traduzo candidamente como "O Mas Que Diabos Diário"). Este site traz relatos (supostamente todos reais) de coisas absurdas feitas por desenvolvedores.

Já vi uma razoável quantidade destas coisas (em situações absolutamente reais); não é incomum eu ficar resmungando quando estou dando manutenção ou tentando reaproveitar um pedaço de código. Por outro lado, não penso em enviar uma contribuição para o site. Acontece que quase todas as vezes eu conheci e convivi com o desenvolvedor responsável pelo WFT. Pessoas muito legais, esforçadas e que certamente não são idiotas.

Da mesma forma como relatado no site, os trechos ofensivos já tinham chegado nas mãos de clientes e muitas vezes já estavam em produção. O que traz a questão: porque estas coisas são feitas e porque demoram a ser detectadas?

Percebe-se sempre nos WTFs a falta do domínio de um conceito básico pelo desenvolvedor. Isto vem de diversas situações:
  • O desenvolvedor está usando uma tecnologia que ele nunca estudou. O principal motivo é um otimismo tanto do desenvolvedor quanto do seu chefe de que a tecnologia será aprendida rapidamente, sem esforço e pelo simples uso. Muitas vezes o próprio desconhecimento da tecnologia impede de perceber que algo está sendo feito de errado (vide voodoo cargo cult).
  • O desenvolvedor estudou a tecnologia mas não aprendeu. Fazendo um pegunta politicamente incorreta: será que qualquer um pode aprender a programar? É claro que é mais bonito pensar que todos podem fazer tudo, bastando estudo, prática e afinco. Entretanto, todos nós admitimos excessões em coisas como artes e esportes (ou alguém acha que qualquer um pode aprender a jogar como o Ronaldinho ou tocar guitarra como o Jimmy Page?). Será que aprender a programar exige alguma pré-disposição genética, com os neurônios interligados de uma certa forma? Eu certamente não sei a resposta. O fato é que existem muitas pessoas que estudaram programação, inclusive formalmente, atuam na área há anos e ainda tem falhas básicas de formação.
  • O desenvolvedor abusou da abstração. Com freqüência se menciona a idéia de que rotinas, módulos e componentes devem ser usados como "caixas pretas", sem conhecimento do seu interior. Isto não significa que as suas características e limites não precisem ser bem conhecidos.
  • Abuso do cut-and-paste (a rigor é a mesma coisa do item anterior). Cada vez mais, o desenvolvedor que não sabe algo faz uma busca na internet, à procura de código pronto (e não de uma explicação que permite ele mesmo escrever o código). É claro que a internet está cheia de besteiras. Mesmo que se ache algo correto, basta tirá-lo do contexto para causar desastres.
O passo seguinte é uma combinação perversa de garra, iniciativa e imaginação, que resulta nas mais absurdas soluções para o problema. Os WTFs são normalmente trechos longos e trabalhosos de código. Não se trata de pregiça mental ou braçal.

A questão seguinte é como esta pessoa foi alocada para um projeto para o qual não está preparada? A resposta é um excesso de otimismo generalizado, somado à dificuldade das pessoas em admitir suas limitações.

E como os WTFs não são detectados durante os desenvolvimentos?

Examinando apenas externamente, os softwares WTF funcionam pelo menos nas situações mais simples. Grande parte do esforço na geração dos WTFs vem justamente de martelar uma idéia errada até que o software consiga passar pelos testes. Frequentemente os testes são fracos e não existe muito rigor no processo de verificação. Muitas vezes o testador se concentra em um único aspecto e não tem nenhuma postura crítica com relação aos demais. Se os testes forem feitos pelo próprio desenvolvedor, estão contaminados desde o começo. Se os testes são feitos por outra pessoa, frequentemente ela se sente constrangida em relatar defeitos.

Uma forma mais efetiva seria a revisão de código. A maioria dos desenvolvedores se sente meio ultrajada em passar o código para outro verificar ("não confiam em mim"). Quem verifica pode não dar importância para tarefa ou se sentir constrangido em apontar defeitos.

A tudo isto soma-se uma falta de paciência (ou capacidade) do supervisor técnico para acompanhar os detalhes do desenvolvimento.

Uma vez chegando ao usuário, é comum uma certa complacência, baseada em padrões muito baixos ou mesmo a ausência deles. É comum ouvir coisas de usuários expressões como "é, isto nunca funcionou" ou "é lento mesmo" ou ainda "de vez enquando trava, mas fazendo de novo normalmente vai".

Em posts futuros vou tentar dar alguns conselhos para desenvolvedores sobre como evitar cirar WTFs.

Um comentário:

Wanderley Caloni Jr disse...

É a velha questão: os programas são bem menos testados do que os gerentes acreditam que são. Se o programador não tem tempo suficiente para os testes básicos, o que dirá o carinha do suporte, que já recebe o software com atraso.

Ultimamente tenho dedicado muito mais tempo para análise e implementação de unit tests. Isso quebra um galho imensurável.