Reinvente a Roda - Reinvent the Wheel
(endler.dev)- "Não reinvente a roda" é um conselho que pode ter um efeito negativo ao sufocar a criatividade e o espírito de exploração
- No processo de criar uma nova roda, ou seja, recriar ferramentas ou tecnologias existentes, obtém-se compreensão profunda e aprendizado
- Até componentes básicos que parecem simples ou familiares, na prática, incluem complexidade e diversos trade-offs
- Ao tentar inventar sua própria roda, fortalece-se a capacidade de crescimento, resolução de problemas e experimentação
- Destaca-se a necessidade de escolher com equilíbrio entre aproveitar resultados existentes e recriar, conforme o objetivo
Reinvent the Wheel
- A frase "não reinvente a roda" tem boa intenção, mas é um conselho que vem de dois tipos de pessoas
- pessoas que já tentaram fazer uma roda com as próprias mãos e vivenciaram a dificuldade
- pessoas que nunca tentaram e apenas seguem cegamente um conselho já existente
- Quando esse conselho se repete, cria-se um ambiente em que a curiosidade e o espírito investigativo se enfraquecem
- Ressalta-se que, se todos tivessem seguido esse conselho, muitas conveniências e avanços modernos não teriam sido alcançados
- Na prática, a roda continuou sendo reinventada várias vezes e evoluiu repetidamente desde sua invenção inicial
Nota: aqui, "roda" pode ser entendida como qualquer ferramenta, protocolo, serviço, tecnologia ou outra criação
Inventar a roda você mesmo é aprendizado
"O que eu não consigo criar, não posso dizer que entendo."
— Richard Feynman
- Para entender algo de forma realmente profunda, é preciso ter a experiência de implementar você mesmo, mesmo que seja uma versão pequena
- Mesmo que o resultado não seja perfeito, e até que nunca venha a ser usado, o próprio processo de implementação é importante
- Vários conceitos da ciência da computação — protocolos, criptografia, servidores web etc. — podem parecer difíceis, mas na prática qualquer pessoa pode tentar
- Mais pessoas passam a ter a oportunidade de entender a estrutura e a essência das tecnologias existentes por meio da experiência de criar algo com as próprias mãos
Tudo é um processo interminável de exploração (Rabbit Hole)
- Os blocos fundamentais que tomamos como garantidos — por exemplo, strings e caminhos de arquivo — na realidade também são muito complexos
- Tentar implementar sua própria biblioteca de strings ou de caminhos pode se tornar uma grande fonte de aprendizado
- Nesse processo, percebe-se fatos como os seguintes
- mesmo nas coisas do dia a dia existe uma complexidade quase infinita
- criar algo útil para outras pessoas é uma oportunidade de aprender humildade
- toda abstração foi criada por seres humanos, não é perfeita e também pode ter outros trade-offs próprios
- Durante a implementação, surgem inúmeras escolhas e problemas relacionados a correção, simplicidade, desempenho, escalabilidade e portabilidade
- A solução que você criou pode se destacar em algumas áreas, mas não servirá para todos os usuários ou situações
- Soluções existentes também têm limitações e podem não se adequar ao meu problema
- A experiência de se aprofundar até o fim em um único problema faz parte do processo de crescimento como engenheiro
- Se você apenas ficar trocando de projeto o tempo todo, não obterá um aprendizado significativo
Por que reinventar a roda
- porque se quer criar uma roda melhor do que a existente (e a definição de "melhor" pode variar)
- porque o objetivo é aprender como a roda é feita
- por um objetivo educacional de ensinar a outras pessoas o princípio da roda
- ao explorar o processo de invenção da roda, surgem novas percepções
- desenvolve-se a capacidade de consertar ou melhorar por conta própria quando ela quebra
- acabam sendo adquiridas várias ferramentas e técnicas necessárias para fabricar a roda
- entende-se o papel da roda como parte de um sistema composto (por exemplo, um carro)
- como tentativa de criar uma roda muito específica para uma necessidade particular (por exemplo, cadeira de rodas, skate ou roda de oleiro)
- a roda criada por você pode acabar sendo mais útil para um uso completamente diferente daquele que era o objetivo original
- no mundo, ideias novas fora do padrão podem cumprir um papel importante
Reuse vs Reinvent
- Não se deve ignorar o resultado do trabalho de outras pessoas; é necessário estudar esse trabalho e aproveitá-lo de forma adequada
- Também é preciso tomar cuidado para não descartar o que já existe e criar tudo de novo apenas por desconfiança ou ignorância
- No entanto, sem implementar ou experimentar por conta própria, é difícil alcançar compreensão essencial e avanço naquele campo
- Em engenharia de software, pequenos experimentos e protótipos são fáceis e rápidos de fazer, o que é eficaz para resolver problemas pessoais
- Recomenda-se começar pequeno, implementar de forma simples e iterar
- Portanto, meu conselho final é
- se você quer insight, desafie-se a reinventar diretamente
- se você quer impacto, reutilize soluções já comprovadas
"Reinvent for insight. Reuse for impact."
"Reinvente para obter insight. Reutilize para gerar impacto."
8 comentários
Quando tentei transformar uma roda quadrada em redonda, lembrei da fala do chefe dizendo para não reinventar a roda. Ainda tem muita gente por aí assombrada por esse mantra de não reinventar a roda.
Assim como “depois que a vaca foge é que se conserta o curral” não quer dizer que você não deva se preparar para o futuro,
acredito que “não reinvente a roda” também não quer dizer que você não deva investir tempo para obter insight.
Quando se corta o contexto em que esse tipo de frase surgiu, seu verdadeiro sentido fica distorcido.
Experiência recente: criei minha própria roda bem especial.
Ao fazer o build de um app Nuxt com 1000 páginas, levava 7 minutos,
mas depois de abrir mão de algumas automações e reescrever tudo, consegui reduzir o build para 20 segundos.
É difícil tomar a decisão sobre até onde reinventar e até onde depender de dependências externas.
Seja qual for o caso, escolher essa dependência para economizar tempo porque eu mesmo poderia fazer isso, e ficar preso a uma dependência porque sem ela não é possível criar o serviço, são histórias completamente diferentes.
Talvez isso não seja possível para todo tipo de código (como um sistema operacional), mas fazer o esforço para ir o máximo possível na direção da primeira opção vai ajudar a entender o sistema.
Provérbios têm um significado embutido, mas tem aumentado o número de pessoas que interpretam só pelas palavras
Se esse tipo de argumento virar moda, a sala de reunião vai acabar em caos de novo como se fosse a coisa mais normal do mundo
O pessoal do paperwork fica eufórico e sai aprontando, e os mesmos fracassos se repetem todo ano
Comentários do Hacker News
Já tive a experiência de reinventar a roda por conta própria em uma área específica. Não foi algo que planejei desde o começo; aconteceu porque eu achava que a tecnologia existente estava errada. Abordei um problema geralmente considerado impossível usando divisão e conquista. Tive sorte e fui teimoso, então no fim deu certo. A minha roda mostrou um desempenho esmagadoramente superior naquela área. Ao experimentar, passou a ser muito fácil fazer coisas que antes eram consideradas impossíveis. Com o tempo, outras pessoas da área também começaram a usar a minha roda. No começo, todo mundo fica meio sem entender, mas depois que aprende, nunca mais quer voltar ao jeito antigo. Recebo relatórios de bugs e pedidos de funcionalidades do mundo inteiro, com casos de uso e fluxos de trabalho estranhos. Tenho conversas técnicas profundas com pessoas brilhantes que eu provavelmente nunca encontraria pessoalmente. Vejo outras pessoas alcançando resultados com a minha roda que ninguém imaginava. Faço novas descobertas que me tiram o sono. E também é divertido ver a cabeça dos meus colegas travar quando explicam os recursos da minha roda. Não há por que ter medo de reinventar a roda. Ninguém sabe por quais caminhos malucos ela pode acabar rolando
Acho que falta um motivo realmente importante além de simplesmente melhorar uma roda existente: você pode fazer uma roda que se encaixa perfeitamente em você e continuar usando exatamente desse jeito. Vejo com frequência pessoas dizendo “não reinvente a mesma roda” enquanto tentam enfiar à força uma roda de carro numa bicicleta. Se você fizer tudo do seu sistema para encaixar bem entre si, pode obter ganhos maiores do que parece
Um dos motivos importantes para reinventar a roda é evitar a complexidade adicionada desnecessariamente por dependências inúteis
Concordo totalmente com isso. Bibliotecas famosas resolvem problemas em muitos contextos diferentes e, por isso, frequentemente vêm cheias de código desnecessário. O importante é que, se eu consigo criar a funcionalidade de que preciso em pouco tempo, fazer eu mesmo tende a ser melhor em usabilidade e ainda minimiza dependências. Só não recomendo, de jeito nenhum, criar sua própria biblioteca de criptografia
Esse é o principal motivo pelo qual eu reinvento a roda. Dependências vêm acompanhadas de vários recursos que eu não quero. Eu só preciso de funcionalidade suficiente para ir até a esquina e voltar. E, pessoalmente, não confio em código opaco. Mesmo quando uso uma dependência, ela tem que ser algo que eu conseguiria fazer investindo um dia do meu tempo e que eu também consiga revisar. Não uso binários cujo código-fonte eu não possa ver, a menos que esteja pagando por eles. Se for gratuito, o código-fonte tem que ser aberto
Eu criei minha própria biblioteca de task runner baseada em DAG (grafo acíclico direcionado). As tarefas podem pertencer a filas. Quis executar a demo no navegador web, então implementei um backend com IndexedDB; para um app Electron, implementei SQLite; e, para um ambiente de servidor multiusuário, implementei Postgres. Também adicionei um limiter para controle de taxa. Além disso, tive que criar várias outras rodas por conta própria, como processamento de grafos e processamento de tarefas. Dá muito trabalho fazer tudo sem dependências. Mas tenho um branch separado em que uso TypeBox para criar e validar schemas de entrada e saída das tarefas. No fim, parece que talvez outra dependência acabe entrando no núcleo mesmo assim
Outro motivo é que a capacidade de inventar ou pesquisar coisas novas pode ser treinada com prática. Dá para praticar bastante mesmo com problemas já resolvidos
Às vezes reinvento a roda para evitar complexidades como abstrações ou modularizações desnecessárias
Foi um bom ensaio para refletir. Também tive uma experiência parecida: criei do zero uma biblioteca de machine learning no estilo PyTorch usando apenas Python e NumPy (ml-by-hand). Comecei com um pequeno motor de autograd e fui implementando, passo a passo, camadas, otimizadores, data loaders e outras partes. Comecei puramente para aprender os princípios básicos. Com essa biblioteca que eu mesmo fiz, reproduzi desde uma rede neural convolucional clássica (cnn example) até um GPT-2 simples (gpt2 example). Sem as abstrações do PyTorch ou TensorFlow, passei a entender muito melhor como o machine learning funciona por dentro. Foi como reinventar a roda e depois construir um carro inteiro com ela
Complementando a ideia de que quem mais diz “não reinvente a roda” costuma se dividir em dois grupos, acho que existe um terceiro grupo, bem mais comum: as pessoas que realmente conhecem as dificuldades de reinventar a roda, já passaram pelo processo e mesmo assim concluíram que simplesmente não vale a pena fazer isso por conta própria, nem por motivos educacionais nem por qualquer outro
Reinventar a roda é a melhor forma de aprender. Mas acho que isso só vale no contexto de aprendizado. Eu também gosto de me aprofundar nas coisas, mas no trabalho muitas vezes não posso explorar à vontade por causa de prazos e outras restrições. Se a roda criada for realmente usada em produção, então ela precisa ser de fato muito melhor do que a já existente
99% das pessoas que reinventam a roda no trabalho nem sequer entendem direito como a roda existente é feita ou por que ela tem esse conjunto de trade-offs
Fazer por conta própria não é necessariamente a melhor forma de aprender. Exige muito tempo e custo. Com documentação bem organizada e um ambiente experimental, já dá para aprender bastante. A clareza na transmissão do conhecimento já é um desafio por si só. Não é obrigatório reconstruir tudo do zero
Estou fazendo um experimento de reimplementar globalmente sistemas de governo. Não é um governo real. Por exemplo, há ua.gov-ai.co, ua.ai-gov.co, ng.gov-ai.co, ng.ai-gov.co e outros. Até agora, CBER e DDP são os que estão mais avançados. Já cheguei a 422 órgãos. Quero terminar até o Juneteenth. Recriar as bases dessa forma está me ajudando a entender melhor os princípios fundamentais. Sei que isso provavelmente não vai gerar nenhum resultado concreto, mas tem sido útil para reorganizar meu pensamento sempre que a essência da coisa muda. Acho que o experimento de reinventar a roda sempre tem valor
Se você trabalha numa startup, acho melhor ignorar esse tipo de conselho sempre que possível. (Exceto se a roda que você está recriando for o desempenho central do seu serviço.) Caso contrário, é grande a chance de você só desperdiçar recursos limitados e o negócio morrer antes mesmo de começar
Ainda assim, acho importante que startups trabalhem com pessoas que já tenham experiência em criar a própria roda, ou seja, que realmente saibam construir uma roda direito. Nem que seja por meio de open source ou projetos pessoais
Acho que esse conselho não é para o âmbito profissional, e sim para experimentos pessoais de reinventar a roda com fins de aprendizado
Lembrei de uma frase marcante que um amigo me disse: “A razão para reinventar a roda não é que precisamos de mais rodas, mas de mais inventores.” Em muitos momentos, ao construir algo eu mesmo para aprender um novo conceito, senti minha mente e meu coração se aquietarem. Quando conheci a frase do Feynman, “O que eu não consigo criar, eu não entendo”, essa experiência e essa convicção ficaram ainda mais fortes. Cada vez que reinvento a roda, minha intuição sobre o conceito original fica mais forte e também aprendo coisas totalmente novas que eu antes desconhecia
Acho que essa aversão excessiva à duplicação é um problema do nosso tempo. Todo mundo está ficando igual, comendo a mesma comida, trabalhando em profissões parecidas e se movendo conforme necessidades semelhantes. Se levarmos mensagens como “não reinvente a roda” ao extremo, o objetivo final pode acabar sendo virar alguém que não sabe fazer nada, apenas atender às demandas especializadas de alguns poucos ricos. Uma vida em que já não se aprende a cozinhar, cultivar ou até amar
A empresa é um lugar para aprender? Ou é um lugar para recriar valor com a roda que outra pessoa fez?
Criar é só o começo, e depois de operar um serviço por uns 10 anos, todo tipo de coisa vai acontecer no meio do caminho; para aguentar firme nessa hora, é preciso ter uma base... é preciso aprender.