quinta-feira, 25 de abril de 2013

O bom programador

Recebi por e-mail hoje esse texto de um colega. Como ele autorizou, vou compartilhar.


Esse texto é específico para programadores. Coisas que vale lembrar de vez em quando.

Outro dia um colega me chamou num canto e fez um comentário mais ou menos nessas linhas: “olha, eu adoro trabalhar aqui, mas estou tendo um problema sério. O Fulano, da minha equipe, é um excelente programador, o cara é muito bom mesmo, mas eu sinto dificuldade para entender o código que ele escreve. Na hora que preciso alterar alguma coisa, o bicho pega.”

Conheço as duas pessoas e posso garantir que não se trata de incompetência de ninguém, pelo contrário, são ótimos profissionais. Ainda assim, o problema existe e merece atenção.

Para mim um bom programador é aquele capaz de fazer programas fáceis de entender, fáceis de alterar. Se meus colegas não entendem meu código, então não sou um profissional tão bom quanto pensava que era! Talvez seja hora de reavaliar os meus hábitos como programador.

É bom ter em mente que quando a gente escreve um programa, o fonte tem duas finalidades bem distintas: uma é fazer o computador produzir o resultado esperado. A outra é comunicar de modo claro o que você entende sobre o problema, facilitando ao máximo a vida do próximo programador, que vai manter o software depois, quando você estiver fazendo outra coisa.

Como nós trabalhamos com máquinas o tempo todo, a gente acaba se confundindo, achando que se o computador entende, então o ser humano tem que entender. Não é bem assim.

Para um compilador não faz muita diferença se você colocar vinte ifs, um dentro do outro. Do mesmo modo ele também não se importa quando acha uma classe com duzentos membros, ou um método com duas mil linhas. O computador não vai soltar nenhum “ai”. Já o ser humano, o pobre coitado que dará manutenção na sua obra prima, esse sim vai se arrepender de ter nascido.

Ocorre que, diferente do computador, nossa mente é eficiente apenas para pequenas quantidades*. Por isso quanto mais a gente divide, mais fácil fica lidar com o mundo. Dividimos livros em capítulos, dividimos o tempo em anos, meses, a semana em dias, dividimos os animais em mamíferos, répteis, etc. Na verdade nós gostamos de dividir tudo. Dentre tantas coisas no universo, porque você acha que o seu programa pode ser diferente, se é o mesmo cérebro que tem que entender isso tudo? Você não pode quebrar as regras e ficar impune.

Veja, não é suficiente que seja “possível” compreender o que você produz. Isso é só a sua obrigação. O que estou sugerindo é dar um passo além. Na nossa profissão o passo além é ser capaz de tornar fáceis coisas que normalmente se espera que sejam difíceis. Para um programador, isso equivale a dominar a complexidade inerente a um problema ir encontrando suas propriedades fundamentais, percebendo as características comuns, dividindo em pedaços simples e deixando tudo explicadinho, levando essa abordagem até as partes mais básicas.

Fora o tamanho, outra origem de dificuldade é o uso de construções muito complexas.

Eu reconheço o valor de um profissional capaz de se manter antenado nas novas tecnologias, sempre se aprimorando profissionalmente, sempre afiando o machado. Com certeza isso é importante. Porém, se eu tiver que escolher, eu não tenho dúvida: prefiro um programador que saiba produzir um software simples e funcional do que um gênio que produz peças de alto grau de complexidade técnica e que teremos que jogar fora no ano que vem. Se você usa técnicas incompreensíveis para seus colegas, seu trabalho é inútil numa empresa séria. Sinto muito.

Talvez dominar técnicas sofisticadas lhe confira um grau de satisfação pessoal. Só que você não deveria exigir habilidades incomuns das outras pessoas, porque provavelmente quem vai dar manutenção no seu sistema será um profissional menos experiente que você. Isso é a coisa mais natural do mundo. Tudo correndo bem, no futuro você estará desenvolvendo outros sistemas. E quem vai manter o atual? O “sangue novo”, claro. Se o sangue novo não for capaz de continuar com o produto, isso indica que ele é um incompetente? Talvez seja. Porém o mais provável, independente do mérito do colega, é que você tenha criado um problema para a empresa. Eu te pergunto: é interessante ter um programador que cria este tipo de situação?

Você pode pensar “ah, qualquer coisa, se não entenderem meu código, eu sento e explico”. Enquanto é muito bacana compartilhar conhecimentos e poder explicar pessoalmente para um colega como se usa a técnica que os gurus inventaram na semana passada, a verdade é que provavelmente o pobre infeliz do seu colega não vai ter a mesma facilidade que você teve para digerir e empregar esse conhecimento. Estou falando desse cara, que está sentado ali do seu lado hoje. Agora imagine a pouca sorte do outro sujeito, aquele que terá que lidar com o seu software daqui a dez, quinze anos, quando você já estiver navegando em mares distantes.

Se me permite sugerir, meu nobre colega, não escreva código para pessoas tão inteligentes e capacitadas como você. Compreenda e seja compreendido. Lembre-se que um comunicador eficiente não exige vasto conhecimento da sua audiência, procurando manter as coisas simples.

Dizem que certa vez Charles Chaplin e Albert Einstein foram a um evento público e num dado momento, quando eram aclamados pela multidão, Chaplin comentou com Einstein “eles te aplaudem porque NINGUÉM te entende, e me aplaudem porque TODOS me entendem”.

Um abraço.
O JuciÊ

Nenhum comentário:

A importância de buscar autoconhecimento

  Imagine que você está cavalgando por uma estrada. Você é um cavaleiro e está montando um cavalo sem cela e sem rédeas. O cavalo vai para o...