Reinvente a roda. Quantas vezes forem necessárias.
Quem nunca ouviu a frase “Não reinvente a roda”? Pra quem diz, isso faz sentido e parece bem inteligente… em partes. Explico:
Ao contrário do que se possa pensar, “reinventar a roda” nem sempre é algo ruim. Se levarmos em consideração que nem todo mundo sabe tudo sobre todas as coisas do universo, reinventar a roda pode ser um processo criativo extremamente valioso para quem executa, além de abrir a mente para problemas comuns, problemas novos, e, obviamente, suas soluções. Um exemplo:
Digamos que uma pessoa não saiba absolutamente nada sobre manuseamento de imagens com PHP, então ela estuda um pouco aqui, um pouco ali, e resolve postar no StackOverflow sobre um problema qualquer que teve durante seu aprendizado. Até este momento, ela está aprendendo sobre funções nativas de uma linguagem da qual não tem tanta experiência, ou seja: está adquirindo muito, mas muito conhecimento. Até que começam a chegar respostas à sua pergunta:
“Pra quê se matar com esse monte de função só pra mudar uma imagenzinha, quando você pode baixar uma biblioteca que faz isso pra você? Não reinvente a roda, cara! Se preocupe em entregar o software!”“Besteira. Baixa o <<nome da biblioteca aqui>> que ele já faz isso tudo pra você.”“Usa o Super-hiper-mega-ultra Framework 2000, ele tem 98136278 módulos, incluindo um de gerenciamento de imagem”.
As três respostas acima são baseadas em situações reais, que eu já vi no próprio StackOverflow. A partir desse momento, as chances do desenvolvedor desistir do código que ele estava escrevendo e optar por baixar um script pronto são altas. E qual o problema nisso? Se estamos falando de um desenvolvedor mais experiente, que já tem uma certa noção de como a coisa funciona e ficou com uma dúvida extremamente específica, não tem problema nenhum. Talvez realmente seja melhor ele não reinventar a roda e apostar num código de terceiros. Mas e se, por acaso, estivermos falando de um total iniciante que, como mencionei acima, não tem noção nenhuma de como funcionam as ferramentas da linguagem para fazer o que ele quer (no caso do exemplo, manusear imagens)?
Aí sim, temos um problema: ele pode até conseguir fazer o que quer, mas vai deixar de adquirir um conhecimento importantíssimo para qualquer iniciante, coisa que mais pra frente pode causar problemas na sua carreira de desenvolvedor.
Imagine que esse foi o primeiro caso, e que isso vai acontecer mais algumas vezes. O desenvolvedor em questão vai se tornar mais um adepto do “Não reinvente a roda”, e vai passar a depender 100% de códigos de terceiros. Isso sim é péssimo, horrível, uma das piores coisas em qualquer desenvolvedor. É neste momento que diferenciamos um “programador” de um “digitador de código”, ou pior, de um cara que não consegue fazer nada que já não exista, um cara que teve toda a sua capacidade de inovação podada.
Obviamente, isso é uma escolha do desenvolvedor, e não seria justo culpar as pessoas que o ajudaram no StackOverflow, por exemplo. Mas o fato é que quando nos dedicamos a ajudar pessoas que estão iniciando em algo que já temos experiência, é importante destacar todas (ou algumas das melhores e piores) formas de se fazer algo. Assim esse desenvolvedor vai ter muito mais chances de crescer, além de aprender muito mais e até se tornar apto a contribuir com alguma biblioteca mais rapidamente, algum dia. Veja bem:
Se esse desenvolvedor aprendeu do jeito certo, isto é, aprendeu, inicialmente, sem precisar recorrer a bibliotecas de terceiros, ele vai ter a mesma experiência que profissionais que contribuem com algum projeto open source, logo, ele vai poder contribuir de forma ativa nesse projeto, já que sabe como tudo funciona.
“Mas um iniciante pode muito bem baixar o código de um projeto pronto e ler para entender como funciona!”
É um argumento válido, admito. Mas… se estamos falando de um iniciante, que não faz ideia de como as coisas funcionam, talvez seja “um pouco” complicado para ele, de repente, ler um projeto inteiro para entender como funciona o manuseamento de imagens no PHP. Ele pode aprender com isso, com certeza. Mas nada vai ser mais efetivo que o bom e velho php.net para ele conhecer de verdade o que cada função faz, e como faz.
O que eu quero dizer é que, se soubermos detalhar melhor as respostas quando estivermos contribuindo com o aprendizado de qualquer pessoa, estaremos ajudando de forma direta na carreira dessa pessoa. Induzir um iniciante a algum vício de quem “é de casa”, por assim dizer, é o contrário de ajudar, por mais que pareça brilhante na hora que o iniciante responde “nossa, não sabia que era tão fácil! Fiz em 1 linha o que estava tentando fazer com 15!”.
O que eu sempre faço quando vou ajudar alguém em qualquer coisa que eu tenha um certo conhecimento é:
1. Explicar, resumidamente, como foi minha curva de aprendizado para determinada coisa;
2. Dar alguns exemplos de como funciona essa determinada coisa;
3. Detalhar que existem “N” formas de se fazer, mas deixar claro que é importante aprender do começo.
Pode parecer muito mais chato do que dizer “É só baixar a <<nome da biblioteca aqui>>!”, e é. Mas no final, me sinto muito melhor em ver que a pessoa está aprendendo de verdade, e que vai levar esse aprendizado para outros projetos, repassar para outras pessoas e etc. e tal.
Por fim, minha dica para quem está aprendendo qualquer coisa está no título deste artigo: Reinvente a roda quantas vezes forem necessárias. Crie um projeto particular, escreva códigos de exemplo, pesquise, corra atrás. Só deixe de “reinventar a roda” quando você tiver pelo menos 80% de certeza de como essa roda funciona. Os outros 20% só o tempo vai ensinar.
E você? O que acha sobre esse negócio de reinventar a roda? Concorda? Discorda? Opiniões, críticas, textões, desabafos, reclamações e o que mais der na telha são bem-vindos. Tudo será lido e respondido com a mesma consideração. ;)