27 de julho de 2012

Programador precisa ser bom em redação


Tenho visto que a característica que mais diferencia bons e maus programadores, no dia-a-dia, não é ser bom em lógica, nem aprender rápido. É ter a capacidade de transformar um raciocínio abstrato em código que funcione e seja entendido por outras pessoas.

Em outras palavras, é ter clareza de propósito, uma linha de raciocínio. É saber se expressar.

Programadores assim, normalmente, são bons palestrantes e escrevem em blogs. Quem os assiste ou os lê, entende o que eles querem dizer.

Mas existe o outro lado da moeda. Recentemente me envolvi num projeto já iniciado em Django e me deparei com a seguinte engrenagem, ao entrar numa URL p/ listar e filtrar uma relação de clientes:
  1. Uma função da view é chamada.
  2. Ela retorna um template HTML, que vamos chamar de HTML-A.
  3. Ele extende o template HTML-B e insere um outro template, o HTML-C.
  4. O HTML-A tem código javascript, bem como o HTML-B e o HTML-C também.
  5. No javascript do HTML-C, existe uma chamada Ajax para uma função de um controller de uma outra aplicação.
  6. Essa função do controller faz um certo trabalho, inclui dados que serão retornados ao HTML-C e passa o bastão para uma outra função.
  7. Essa nova, por sua vez, também trabalha, adiciona dados de retorno e encadeia uma chamada a uma outra.
  8. Essa última formata os dados e retorna, desfazendo a pilha, até voltar e popular o grid do HTML-C do item 2.
Complexo? Um pouco. Mas a confusão mesmo começou quando tentei juntar os pedaços e fazer uma manutenção na rotina. Acompanhe comigo:
  • Os títulos das colunas que aparecem no grid, bem como todas as configurações dele (altura, largura, etc.) estão no item 1 da lista acima. Ou seja, na view!
  • Os filtros são montados no item 6.
  • Os dados são efetivamente lidos no item 7.
  • Os mesmos dados são formatados, conforme o chamador, no item 8.
  • Nesses dados retornados, existem trechos de HTML hardcoded no item 8!
  • Esse HTML hardcoded é uma tag (um link) que aponta para uma URL definida na view do item 1.
  • A função do item 7 é importada de outra aplicação.
  • A do item 8 também.
Entendeu?

Bem, algumas pessoas podem dizer que isso é reutilização de código. É... é como se você estivesse reutilizando um trecho de bula de remédio, juntando com parte da Divina Comédia e do Hino à Bandeira e finalizando com o texto de uma questão da prova de matemática!

Ou seja, não faz o menor sentido. Tem muita coisa fora do lugar.

Eu disse que os nomes das funções e dos id's nem sempre retratam o que eles fazem? Isso pode parecer normal, mas quando não se tem nem uma letra dizendo aonde as coisas se encaixam, vê-se o caos.

Daí, eu fico pensando em como seria uma redação escrita por quem desenvolveu uma coisa assim. Alguém entenderia?

O Zen do Python define algumas diretrizes interessantes para programadores. Duas delas fazem o maior sentido nesse contexto:
  • "Complexo é melhor do que complicado".
  • "Se a implementação é difícil de explicar, é uma má ideia".
Com isso, reforço a minha tese que a melhor técnica para programar bem é redação e a primeira linguagem a se aprender é Português. A segunda, Inglês.

O resto, vem com o tempo e com a prática.