Reinventar a roda é realmente tão ruim assim?


101

Seu conhecimento comum em programação que reinventa a roda é ruim ou mau .

Mas porque é isso?

Não estou sugerindo que seja bom. Eu acredito que está errado. No entanto, li uma vez um artigo que dizia: se alguém está fazendo algo errado (em termos de programação), explique a eles por que está errado, se você não pode, então talvez você deva se perguntar se está realmente errado.

Isso me leva a esta pergunta:

Se eu vejo que alguém está claramente reinventando a roda, construindo seu próprio método de algo que já está incorporado na linguagem / estrutura. Primeiro, por uma questão de argumentos, vamos supor que o método deles seja tão eficiente quanto o método incorporado. Além disso, o desenvolvedor, ciente do método interno, prefere seu próprio método.

Por que ele deveria usar o construído em um sobre o seu?


16
Esta é uma grande pergunta. Não acho que as pessoas devam reinventar a roda, mas é importante desafiar essas idéias para garantir que elas se sustentem.
Jon Hopkins

4
@ Demian - Essa é realmente uma boa ideia. Se você pode explicar, provavelmente está justificado em fazê-lo.
Jon Hopkins

2
Em todas as decisões, é bom perguntar qual é o seu objetivo principal e fazer com que os outros subelementos apoiem o objetivo principal. Se seu objetivo principal é oferecer um produto de qualidade em tempo hábil, a duplicação do código já existente provavelmente será um prejuízo para essa meta. Se o seu objetivo principal é criar uma biblioteca mais bem pensada, talvez isso contribua para esse objetivo. Se você trabalha para outra pessoa, precisa fazer a pergunta da perspectiva deles , não tanto da sua.
gahooa

5
Reinvente se as rodas existentes realmente não atendem às suas necessidades específicas, ou ... se você quiser saber como as rodas funcionam! Um artigo interessante sobre esse tópico: codinghorror.com/blog/2009/02/…
lindes

4
Atribuído a Douglas Crockford:The good thing about reinventing the wheel is that you can get a round one.
Joel Etherton

Respostas:


71

Como publiquei no StackOverflow, reinventar a roda geralmente é uma escolha muito boa , contrariamente à crença popular. A principal vantagem é que você tem total controle sobre o software, o que geralmente é essencial. Para uma discussão completa, veja meu post original .


14
+1 O ponto mais importante é que ele está totalmente sob seu controle e você o conhece de dentro para fora. Depurar outras bibliotecas pode causar grandes dores de cabeça, se possível, e dizer que todas as bibliotecas maduras estão livres de erros é otimista para dizer o mínimo.
Orbling 23/12/10

6
A equipe do Excel chegou ao ponto de escrever seu próprio compilador porque não queria dependências externas que pudessem impactar o projeto. Este é um ponto válido, mas quão crítico é esse controle é a questão principal.
Jon Hopkins

6
+1. Uma vez na minha vida anterior como programador MFC / VC ++, usamos uma biblioteca de terceiros para vários componentes da GUI, que acabou sendo um pesadelo total para manter. Essas coisas ficaram profundamente viciadas no software e não puderam ser removidas (sem gastar meses irreais de homem que não tivemos esforço). Estou absolutamente certo de que qualquer economia de tempo inicial por não ter que rolar nossas próprias grades e gerenciadores de layout foi destruída por ordens de magnitude ao longo dos anos por ter que manter essa monstruosidade.
Bobby Tables

4
@ Guzica, uma escolha infeliz não é necessariamente suficiente para generalizar, e existem outras bibliotecas que são bem mantidas e uma boa escolha. A questão é se a decisão original foi pesquisada suficientemente bem?

5
Por outro lado, se você usa uma roda pré-existente, geralmente recebe MUITA ajuda, geralmente bem indexada pelo Google, para ajudá-lo na depuração.
Dan Ray

81

Depende ..

Como em tudo, é sobre o contexto:

É bom quando:

  • A estrutura ou a biblioteca é muito pesada e você precisa apenas de funcionalidade limitada. Lançar sua própria versão extremamente leve que atenda às suas necessidades é uma abordagem melhor.
  • Quando você quer entender e aprender algo complexo, fazer sentido é algo que você faz.
  • Você tem algo diferente a oferecer, algo que as implementações de outras pessoas não têm. Pode ser uma nova reviravolta, novo recurso etc.

É ruim quando:

  • A funcionalidade já existe e é conhecida por ser estável e bem conhecida (popular).
  • Sua versão não adiciona nada de novo.
  • Sua versão apresenta bugs ou restrições (por exemplo, sua versão não é segura para threads).
  • Faltam recursos na sua versão.
  • Sua versão tem uma documentação pior.
  • Sua versão está sem testes de unidade em comparação com o que está substituindo.

2
Ao lado do seu primeiro ponto (e inverso ao seu quarto), se for difícil lidar com a roda ou - pior ainda - inflexível, você poderá realmente melhorá-la. Isso acontece frequentemente com componentes de interface do usuário em algumas áreas, onde a roda acaba sendo uma roda de trem e funciona apenas em uma pista.
Magus

1
Difícil de entender soa verdadeiro para mim. Eu simplesmente não estava recebendo análise de gráfico direcionada, então fiz uma, e agora eu sei. Agora me sinto confiante para usar um quadro
JasTonAChair

1
Eu adicionaria um quarto para a coluna "Bom" (embora raramente se aplique): se você entender melhor o espaço do problema do que a biblioteca existente. A biblioteca de tempo padrão de fato Java de Java foi escrita porque era difícil trabalhar com o built-in e foi reescrita como biblioteca de tempo padrão de jure do Java 8 porque agora eles entendiam o problema muito melhor do que quando escreveram o tempo de joda original.
Morgen

55

Eu acho que o caso de um desenvolvedor conscientemente reinventando a roda "porque ele prefere seu próprio método" é bastante raro. Principalmente, é por ignorância e, às vezes, por teimosia.

Isso é tão ruim assim? Sim. Por quê? Porque a roda existente provavelmente foi criada ao longo do tempo e já foi testada em várias circunstâncias e contra diversos tipos de dados. Os desenvolvedores da roda existente já encontraram os casos extremos e as dificuldades que o reinventor ainda não pode imaginar.


3
Ou preguiça - que não se pode incomodar em procurar alternativas ou achar menos interessante ir e fazer para escrever o código.
Jon Hopkins

9
Eu já vi muitos casos em que a reinvenção da roda foi feita por arrogância, com uma atitude de que a biblioteca / framework xyz é apenas para programadores ruins que não sabiam como fazê-lo da "maneira certa". Caramba, eu já vi esse argumento (de uma maneira ou de outra) em sites de SO.
Bill

2
... O que cria uma carga de manutenção recorrente (do pior tipo) para os desenvolvedores atuais ou subseqüentes.
gahooa

2
Era isso que eu fazia anos. Eu lançaria meu próprio recurso em um idioma porque não fazia ideia de que essa funcionalidade já estava embutida.
Matchu

1
Desde que escrevi este post (geez), quase três anos atrás, contratei e demiti um desenvolvedor que descrevi na primeira frase como "bastante raro". Ele durou um mês. Eu dizia a ele como fazemos as coisas aqui e ele dizia "eu ouvi o que você está dizendo". Levei um mês para ouvir o não dito "... mas está errado e eu farei secretamente tudo, menos isso" no final da frase.
Dan Ray

22

Rodas quadradas precisam ser reinventadas. Os esforços que sugam têm que ser duplicados. Talvez haja uma falta de documentação para o método, e o outro programador sente que é mais fácil apenas escrever a sua própria, em vez de tentar descobrir. Talvez a maneira como o método está sendo chamado seja estranha e não se encaixe no idioma da linguagem de programação.

Basta perguntar a ele qual é a deficiência.


9
+1 Boa metáfora "rodas quadradas precisam ser reinventadas" .
Orbling

+1 para "Rodas quadradas precisam ser reinventadas"
Tintu C Raju 25/02

17

Em geral, evito reinventar a roda se a funcionalidade que desejo, ou algo parecido com ela, existir na biblioteca padrão da linguagem que uso.

No entanto, se eu tiver que incorporar bibliotecas de terceiros, é uma decisão judicial, dependendo de quão amplamente utilizada e estimada a biblioteca seja. Quero dizer, estamos falando do Boost ou das Ferramentas de Análise de Cordas Kick-ass 1.0 de Bob?

Mesmo que a biblioteca seja geralmente bem conhecida e altamente estimada em todo o setor, ainda é uma dependência de terceiros . Os programadores geralmente colocam ênfase significativa nas virtudes da reutilização de código, enquanto frequentemente ignoram o perigo de dependências. Um projeto com muitas dependências de terceiros provavelmente desmoronará a longo prazo, pois lentamente se transforma em um pesadelo de manutenção.

Portanto, aproveitar o código existente é bom - mas as dependências são ruins . Infelizmente, essas duas afirmações estão em desacordo, portanto o truque é tentar encontrar o equilíbrio certo. É por isso que você precisa identificar dependências aceitáveis . Como eu disse, qualquer coisa na Biblioteca Padrão da linguagem provavelmente é uma dependência aceitável. Movendo-se a partir daí, as bibliotecas que são altamente considerados em toda a indústria também são geralmente aceitáveis (como impulso para C ++, ou jQuery para JavaScript) -, mas eles são ainda menos desejável do que a biblioteca padrão porque eles não tendem a ser menos estáveis do que as bibliotecas normalizadas .

Quanto às bibliotecas que são relativamente desconhecidas (por exemplo, o upload mais recente no SourceForge), essas são dependências extremamente arriscadas, e eu geralmente recomendo evitá-las no código de produção, a menos que você esteja familiarizado o suficiente com o código-fonte para mantê-las.

Então é realmente tudo um ato de equilíbrio. Mas o ponto é que apenas cegamente dizendo "Código reutiliza bem! Reinventando a roda ruim!" é uma atitude perigosa. Os benefícios de aproveitar o código de terceiros devem ser ponderados contra as desvantagens da introdução de dependências.


3
+1. Eu costumo me sentir da mesma maneira. Estou muito mais inclinado a reinventar rodas pequenas se o uso de uma roda existente criar um problema de dependência do que se a roda existente já estiver lá, configurada e aguardando para ser usada em qualquer ambiente em que eu possa precisar.
dsimcha

14

Se as pessoas não reinventassem as rodas, o mundo ficaria cheio delas. insira a descrição da imagem aqui

Aqui está um diálogo do meu local de trabalho:

- I would like to add some colors to the output of this program.
- Oh, there is this library called Colorama ..

Existem duas opções: reinventar a roda OU usar o Colorama. Aqui está o que cada opção resultaria em:

Usando o Colorama

  • Talvez um pouco mais rápido para começar a correr
  • Adicionando uma dependência de terceiros para algo trivial
  • Você continua sendo tão estúpido como antes de usar o Colorama

Reinventando a roda

  • Você entende como alguns programas conseguem mostrar cores
  • Você aprende que caracteres especiais podem ser usados ​​para colorir em qualquer terminal
  • Você pode colorir qualquer linguagem de programação que possa usar no futuro
  • É menos provável que seu projeto seja interrompido

Como você vê, tudo depende do contexto. Reinventar a roda é algo que faço muitas vezes porque quero ser capaz de pensar por mim mesmo e não confiar nas outras pessoas que pensam em mim. Se, no entanto, você estiver executando em um prazo ou o que você tentar implementar for enorme e já existir, será melhor usar o que está lá.


2
O +1 não concorda 100% com você, mas gostou da imagem usada para transmitir a ideia.
Tulains Córdova

Essa resposta contorna um pouco o fato de seu empregador estar pagando pelo seu luxo de reinventar essa roda para seu próprio benefício educacional. Talvez você deva fazer isso em seu próprio tempo; se solicitado, seu empregador provavelmente dirá que ele / ela só quer que o trabalho seja feito o mais rápido possível e, se Colorama fizer isso, continue com ele.
Neil Haughton 27/01

2
@NeilHaughton, na minha opinião, meu "próprio" benefício educacional também é o benefício do meu empregador.
Pithikos 27/01

Hmmm ... é claro que seu empregador não vê dessa maneira e está colocando o pão na sua mesa.
Neil Haughton

A biblioteca Colorama, por si só, era uma reinvenção de uma roda. Já havia uma interface para exibir cores no terminal (através de caracteres especiais) e antes de sair as pessoas já estavam fazendo isso. A biblioteca Colorama reinventa a interface como atingir a meta. Então a pergunta aqui é mais sobre se você usará uma roda supostamente aprimorada ou usará uma roda antiga em seu projeto? Reinventar a roda nesse caso estaria construindo o Colorama2 que "melhora" ainda mais o que o Colorama tinha a oferecer.
Ski

13

Um motivo útil para reinventar a roda é para fins de aprendizado - mas eu recomendo fazê-lo no seu próprio tempo. À medida que mais soluções pré-enlatadas se tornam disponíveis e mais níveis de abstração são fornecidos, nos tornamos muito mais produtivos. Podemos nos concentrar no problema comercial, e não nas coisas genéricas que foram aprimoradas uma e outra vez. MAS, por esse motivo, você pode aprimorar suas habilidades e aprender muito tentando reimplementar uma solução por conta própria. Apenas não necessariamente para uso em produção.

Uma outra coisa: se uma preocupação é a dependência de uma empresa de uma empresa que pode desaparecer, verifique se há uma opção para obter o código-fonte ou pelo menos algumas outras opções por aí para recorrer.

A propósito, se você optar por implementar o seu próprio, evite fazer isso para criptografia ou outras funcionalidades relacionadas à segurança. Ferramentas estabelecidas (e totalmente testadas) estão disponíveis para isso e, nos dias de hoje, é muito arriscado demais para você mesmo. Isso nunca vale a pena, e é assustador que eu ainda ouça sobre equipes fazendo isso.


+1 Um ponto muito bom na perspectiva de aprendizado: para usar uma biblioteca de maneira eficaz, você deve realmente saber intimamente como ela funciona. Eu não gosto de usar ferramentas de caixa preta. Também é um ponto excelente nas bibliotecas de criptografia, muito arriscado para se destacar nessa questão.
Orbling

Eu acrescentaria que, se houver uma preocupação de que uma biblioteca de terceiros possa desaparecer, essa é uma boa justificativa para escrever uma interface programática que permita que uma biblioteca seja facilmente trocada por outra.
user8865

Bom ponto - usamos o padrão do adaptador apenas para esse fim, e recentemente nos salvou quando tivemos que trocar uma biblioteca FTP de terceiros.
Mark Freedman

9

Existem dois tipos de eficiência - processamento / velocidade (que é a rapidez com que é executada) que podem corresponder e velocidade de desenvolvimento que quase certamente não será. Essa é a primeira razão - para qualquer problema de complexidade razoável em que as soluções existentes estejam disponíveis, certamente será mais rápido pesquisar e implementar uma biblioteca existente do que codificar a sua .

A segunda razão é que a biblioteca existente (assumindo que está madura) é testada e está comprovada que funciona - provavelmente em uma variedade de cenários muito mais ampla do que um desenvolvedor e uma equipe de teste será capaz de executar uma rotina recém-escrita e isso ocorre em esforço zero.

Em terceiro lugar, é muito mais fácil apoiar. Não apenas alguém o suporta e aprimora (quem escreveu a biblioteca / componente), mas é muito mais provável que outros desenvolvedores estejam familiarizados com ela e sejam capazes de entender e manter o código daqui para frente , o que minimiza a continuidade custos.

E tudo isso assume equivalência funcional, o que normalmente não é o caso. Freqüentemente, as bibliotecas oferecem funcionalidades que você consideraria úteis, mas que nunca poderiam justificar a construção, e que de repente estão disponíveis gratuitamente.

Há razões para você se destacar - principalmente onde você deseja fazer algo que a função integrada não pode fazer e onde há uma vantagem genuína a ser obtida com isso, ou onde as opções prontamente disponíveis não são maduras - mas elas é menos comum do que muitos desenvolvedores acreditariam.

Além disso, por que você gostaria de gastar seu tempo resolvendo problemas que já foram resolvidos? Sim, é uma ótima maneira de aprender, mas você não deve fazer isso à custa da solução certa para o código de produção, e é disso que estou assumindo que estamos falando.


2
Na sua última linha: para saber como eles são resolvidos. Afinal, a programação depende da experiência.
Orbling

@ Orbling - é justo o suficiente, mas você não deveria fazer isso no código de produção e estou assumindo que é a isso que a pergunta se refere. Deve alterar.
Jon Hopkins

@ Jon Hopkins: Bem, o código de produção geralmente segue o aprendizado, a menos que seja feito no seu próprio tempo.
Orbling 23/12/10

@ Orbling - eu diria que você nunca deve aprender algo para aprender e depois colocá-lo em produção. Ou algo é código de produção e, nesse caso, deve ser a melhor solução ou é para aprender. Há momentos em que eles se sobrepõem, mas isso não seria um deles, a menos que rolar o seu próprio fosse realmente a melhor solução.
Jon Hopkins

@ Jon Hopkins: Idealmente, sim, mas frequentemente não há ninguém na equipe que saiba como fazer o que é, a ponto de as bibliotecas disponíveis não poderem ser executadas com segurança. Aprendizagem, ou "pesquisa", como a maioria das pessoas chama, é então uma necessidade. Sim, isso não é exatamente aprender para aprender, mas é aprender a evitar riscos futuros.
Orbling

9

É claro que reinventar a roda por um capricho, por ignorância e arrogância, pode ser uma coisa ruim, mas IMHO o pêndulo balançou demais. Há uma tremenda vantagem em ter uma roda que faz exatamente o que você deseja e nada mais .

Freqüentemente, quando olho para uma roda existente, ela faz muito mais do que eu preciso, sofre com o efeito da plataforma interna e , portanto , é desnecessariamente complexa, ou está faltando algum recurso essencial de que preciso e que seria difícil de executar. implementar em cima do que já está lá.

Além disso, o uso de rodas existentes geralmente adiciona restrições ao meu projeto que eu não quero. Por exemplo:

  • A roda existente requer uma linguagem e / ou estilo de programação diferente do que eu preferiria usar.
  • A roda existente funciona apenas com a versão herdada de uma linguagem (por exemplo, Python 2 em vez de Python 3).
  • Onde existem vantagens e desvantagens entre eficiência, flexibilidade e simplicidade, a roda existente faz escolhas abaixo do ideal para o meu caso de uso. (Sou conhecido por reinventar até a funcionalidade de bibliotecas que eu mesmo escrevi nesses casos. Geralmente é porque eu escrevi a versão da biblioteca da função para ser genérica e razoavelmente eficiente, quando atualmente preciso de algo que seja muito rápido no meu específico caso.)
  • A roda existente possui toneladas de lixo herdado que é totalmente inútil no caso de um novo código, mas dificulta a vida (por exemplo, uma biblioteca Java que eu uso que me obriga a usar suas classes de contêineres ruins porque foram escritas antes dos genéricos, etc.) .
  • A maneira como a roda existente modela o problema é completamente diferente do que é conveniente para o meu caso de uso. (Por exemplo, talvez seja conveniente para mim ter um gráfico direcionado representado por objetos e referências de nós, mas a roda existente usa uma matriz de adjacência ou vice-versa. Talvez seja conveniente que eu coloque meus dados na ordem principal da coluna, mas o roda existente insiste na linha principal ou vice-versa.)
  • A biblioteca adiciona uma dependência massiva e quebradiça que seria um grande aborrecimento para ser instalado e executado em qualquer lugar que eu queira implantar meu código, quando tudo o que preciso é de um pequeno subconjunto de seus recursos. Por outro lado, nesse caso, às vezes, apenas extraio o recurso que desejo para uma nova biblioteca menor ou apenas copio / colo se a biblioteca for de código aberto e a base de código simplificar o processo. (Até fiz isso com bibliotecas relativamente grandes que escrevi para mim, não apenas para outras pessoas.)
  • A roda existente tenta ser pedanticamente compatível com algum padrão que é inconveniente e irrelevante para o meu caso de uso.

Acho que tudo se resume a: se a roda se adequa ao seu objetivo, use-a; se não, crie uma nova roda que se adapte. Só não seja dogmático sobre isso de uma maneira ou de outra.
Neil Haughton 27/01

5

Geralmente uso o meu próprio porque o construí antes de descobrir o já existente e tenho preguiça de encontrar e substituir todas as instâncias. Além disso, eu entendo completamente meu próprio método, embora possa não entender um método pré-existente. E, finalmente, como não compreendo completamente o pré-existente, não posso verificar se ele faz absolutamente tudo o que o meu atual faz.

Há muito para codificar, e não tenho muito tempo para voltar e codificar novamente algo, a menos que isso afete a produção.

De fato, um aplicativo da web asp ainda usado hoje possui um gráfico totalmente funcional que exibe dados em um formato tabular e permite a classificação / edição, no entanto, não é um datagrid. Ele foi construído alguns anos atrás quando eu estava aprendendo o asp.net e não sabia de datagrids. Estou com medo do código, pois não tenho idéia do que estava fazendo naquela época, mas funciona, é preciso, é fácil de modificar, não trava e os usuários adoram


2
Essa é uma razão para não substituí-lo, não fazê-lo em primeiro lugar. Presumo que você não faria o mesmo agora sabendo que a alternativa existe?
Jon Hopkins

@ Jon lol definitivamente não! E eu li originalmente a pergunta por que um desenvolvedor prefere seu próprio método a um método pré-existente. Foi perguntado Re-lendo a pergunta agora me faz perceber o inverso do que pergunta, mas eu estou deixando a resposta aqui, uma vez que parece estar relacionada e tem alguns up-votos
Rachel

4

Reinventar a roda é uma ótima maneira de aprender como uma roda funciona, mas não é uma boa maneira de construir um carro.


4

Atualmente, trabalho para um monte de baratinhos.

Quando a decisão é tomada entre "construir ou comprar", em vez de tomar uma decisão racional baseada na economia, os gerentes optam por "construir". Isso significa que, em vez de pagar alguns milhares de dólares por um componente ou ferramenta, gastamos homens-mês construindo os nossos. Comprar uma roda de outra empresa custa dinheiro que sai do orçamento - o que conta contra os bônus de final de ano não administrativos. O tempo dos programadores é gratuito e, portanto, não conta com os bônus de final de ano (com o benefício adicional de enganar os programadores por não fazer tudo "pontualmente"), portanto, uma roda reinventada é uma roda livre .

Em uma empresa racional, o custo x benefícios de comprar rodas fabricadas por outros versus reinventar as próprias rodas seria baseado em custos de curto e longo prazo, bem como nos custos de oportunidade perdidos, porque não se pode criar novos widgets enquanto está reinventar rodas. Todo dia que você gasta reinventando a roda é outro dia em que você não pode escrever algo novo.

Apresentação sobre build vs buy .
Artigo sobre build vs buy .

Se eu vejo que alguém está claramente reinventando a roda, construindo seu próprio método de algo que já está incorporado na linguagem / estrutura. Primeiro, por uma questão de argumentos, vamos supor que o método deles seja tão eficiente quanto o método incorporado. Além disso, o desenvolvedor, ciente do método interno, prefere seu próprio método.

Por que ele deveria usar o construído em um sobre o seu?

A versão incorporada terá muito mais pessoas trabalhando nela - encontrando e corrigindo mais bugs do que o seu código de homebrew jamais poderia ter.

Finalmente, quando o desenvolvedor local sair, e alguém tiver que manter o código que ele escreveu, ele será totalmente refatorado e substituído pelo que está na estrutura. Eu sei que isso acontecerá porque meu empregador atual possui um código que foi migrado para versões mais recentes do VB ao longo dos anos (o produto mais antigo está no mercado há cerca de 20 anos) e foi isso que aconteceu. O desenvolvedor com o emprego mais longo em meu escritório está aqui há 17 anos.


Para ser justo, às vezes a versão "padrão" era colocada lá como uma reinvenção do que a maioria das pessoas acabava fazendo antes da versão padrão ser desenvolvida. IOW, o padrão deve ser a "grande reinvenção final". Mas mudar para uma versão padrão, bem testada, muito mais robusta e com correção de erros pode levar a erros, porque o código do seu aplicativo faz suposições verdadeiras para a sua versão antiga não padronizada, mas falsas para a nova versão padrão.
Steve314

1
Em uma empresa racional, se for decidido que o aprisionamento do fornecedor é aceitável, a empresa (sendo o comprador e dependente da oferta do fornecedor) precisará estabelecer um bom relacionamento comercial com o fornecedor, além de proteger-se contra vários contratempos comerciais. Exemplos: recusa em fornecer suporte / correção de bugs, aumento de preços, alteração dos termos do contrato, processos frívolos ou saída do negócio. Essa cobertura também faz parte do custo e é frequentemente ignorada. (Assim como o custo de desenvolvimento interno sendo ignorado.) Nota: Esse custo não existe nas ofertas
rwong

Você não está esquecendo que seus empregadores desonestos e baratos estão efetivamente fornecendo a você mais trabalho remunerado do que você poderia ter? Você deveria encorajá-los em vez de reclamar!
Neil Haughton 27/01

4

O importante em reinventar a roda é que, às vezes, não existe uma roda padrão e pronta para uso que faça o que você precisa. Existem muitas rodas boas por aí, em muitos tamanhos, cores, materiais e modos de construção. Mas alguns dias você só precisa ter uma roda realmente leve que é de alumínio anodizado verde, e ninguém faz uma. Nesse caso, você tem que fazer o seu próprio.

Agora, isso não significa que você deve fazer suas próprias rodas para cada projeto - a maioria das coisas pode usar peças padrão e ser melhor para isso. Mas, de vez em quando, você descobre que as peças padrão simplesmente não funcionam, então você cria as suas.

O mais importante é saber QUANDO fazer o seu próprio. Você precisa ter uma boa idéia do que as peças padrão podem fazer e o que elas não podem, antes de começar a projetar suas próprias peças.


4

A reinvenção ou não da roda é uma questão de custo / benefício. Os custos são bastante óbvios ...

  • Demora muito tempo para reinventar.
  • Leva ainda mais tempo para documentar o que você inventou.
  • Você não pode contratar pessoas que já entendem o que você inventou.
  • É muito fácil reinventar algo mal, causando custos contínuos para os problemas causados ​​pelo mau design.
  • Novo código significa novos bugs. O código antigo geralmente já removeu a maioria dos erros e pode ter soluções sutis para problemas que você não conhece e, portanto, não pode solucionar o novo design.

O último é importante - há um post em algum lugar alertando sobre a tendência de "jogar fora o código antigo e começar do zero", com base no fato de que grande parte do lixo antigo que você não entende é realmente uma correção essencial. Há uma história de advertência sobre o Netscape, IIRC.

As vantagens podem ser ...

  • A capacidade de adicionar recursos que as bibliotecas existentes não possuem. Por exemplo, eu tenho contêineres que "mantêm" suas instâncias de iterador / cursor. Inserções e exclusões não invalidam os iteradores. Um iterador apontando para um vetor continuará apontando para o mesmo item (não o mesmo índice), independentemente de inserções e exclusões anteriores no vetor. Você simplesmente não pode fazer isso com contêineres C ++ padrão.
  • Um design mais especializado, visando seus requisitos específicos e respeitando suas prioridades (mas cuidado com a tendência ao efeito da plataforma interna).
  • Controle completo - alguns terceiros não podem decidir reformular a API de uma maneira que signifique que você precise reescrever metade do seu aplicativo.
  • Compreensão completa - você a projetou dessa maneira, e esperançosamente entenderá como e por que fez isso.
  • EDIT Você pode aprender as lições de outras bibliotecas sem ser pego nas mesmas armadilhas sendo seletivo sobre como imitá-las.

Uma coisa - usar uma biblioteca de terceiros pode contar como reinventar a roda. Se você já possui sua própria biblioteca antiga, bem usada e bem testada, pense com cuidado antes de descartá-la para usar uma biblioteca de terceiros. Pode ser uma boa idéia a longo prazo - mas pode haver uma enorme quantidade de trabalho e muitas surpresas desagradáveis ​​(devido a sutis diferenças semânticas entre as bibliotecas) antes de você chegar lá. Por exemplo, considere o efeito de eu mudar de meus próprios contêineres para os de biblioteca padrão. Uma tradução ingênua do código de chamada não permitiria o fato de que os contêineres da biblioteca padrão não mantêm seus iteradores. Os casos em que eu salvei um iterador para mais tarde como um "marcador" não puderam ser implementados usando uma tradução simples.


3

Se houver um componente funcional que faça o que você precisa , por que gastar tempo escrevendo e depurando sua própria versão? Da mesma forma, se você já escreveu um código para desempenhar uma função semelhante anteriormente, por que reescrevê-lo?

Joel escreveu um artigo sobre Não inventado aqui, que fala muito sobre quando reescrever código e software não é e não é útil.


3

Reinventar a roda pode ser uma ótima maneira de aprender como algo funciona - e eu recomendo reinventar para esse fim em seu próprio tempo - mas ao escrever um aplicativo, por que reinventar se existem soluções bem estabelecidas que já fazem a mesma coisa?

Por exemplo, eu nunca escreveria código JavaScript do zero; em vez disso, começaria com o jQuery e construiria meus aplicativos sobre essa estrutura.


3

Minha regra pessoal:

Reinventar a roda é bom quando você está apenas aprendendo. Se você tiver um prazo, poderá usar as rodas existentes.


3

Ser "mau" ou mesmo "mau" é uma palavra bastante forte.

Como sempre, existem razões para escolher uma implementação pessoal em vez de uma embutida. Antigamente, um programa C podia encontrar erros na biblioteca de tempo de execução e, portanto, simplesmente precisava fornecer sua própria implementação.

Isso não se aplica a programas Java, pois a JVM é muito rigorosamente definida, mas alguns algoritmos ainda são muito difíceis de corrigir. Por exemplo, Joshua Bloch descreve como o algoritmo de pesquisa binária enganosamente simples na biblioteca de tempo de execução Java continha um bug, que levou nove anos para aparecer:

http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html

Foi encontrado, corrigido e distribuído em futuras distribuições Java.

Se você usar a pesquisa binária incorporada, economizou tempo e dinheiro fazendo com que a Sun fizesse o trabalho duro de encontrar, corrigir e distribuir esse bugfix. Você pode aproveitar o trabalho deles apenas dizendo "você precisa pelo menos do Java 6, atualização 10".

Se você usar sua própria implementação - que provavelmente conteria esse erro também - primeiro será necessário que o bug se manifeste. Dado que esse em particular é exibido apenas em conjuntos de dados GRANDES, é provável que aconteça em produção em algum lugar, o que significa que pelo menos um de seus clientes será afetado e provavelmente perderá dinheiro real enquanto você encontra, corrige e distribui a correção.

Portanto, é perfeitamente válido preferir sua própria implementação, mas é melhor que o motivo seja realmente bom, pois é mais caro do que alavancar o trabalho de outras pessoas.


+1 por confiar na plataforma para implantar correções. Por outro lado, cabe ao fornecedor da plataforma decidir se deve distribuir a correção. Um fornecedor diferente pode escolher: (1) distribuir o bugfix gratuitamente; (2) reter a correção até uma atualização principal da versão; (3) distribuir a correção para os usuários da versão mais recente, mas negar que as versões anteriores (4) se recusem a corrigir completamente, alegando que pode "causar incompatibilidade generalizada" e "afetar apenas usuários limitados".
rwong

@rwong, se você encontrar um bug na rotina interna, sua melhor opção é fornecer sua própria versão fixa. Isso está sob "uma boa razão para fazê-lo".

ørn: O que quero dizer é que, além dos fornecedores benevolentes que você mencionou, também existem outros tipos de fornecedores.
rwong

@rwong, nesse caso, qualifica-se por "uma boa razão para escolher uma implementação pessoal".

3

Eu escrevi recentemente meus pensamentos sobre este tópico. Para resumir:

  1. É quase sempre ruim criar o seu próprio, especialmente verdadeiro se for uma função incorporada à linguagem. Mas se você estiver avaliando uma estrutura imatura / mantida de maneira questionável / mal documentada que encontrou na Internet contra a possibilidade de criar sua própria, isso pode ser um acéfalo.

  2. Eu acho que reinventar a roda é uma analogia bastante terrível para um anti-padrão de software. Isso implica que a solução original nunca pode ser aprimorada. Isso é um absurdo. A chamada roda pode se tornar obsoleta da noite para o dia, ou seus proprietários podem parar de mantê-la. A roda tem um valor diferente em cada sistema em que é usada. Portanto, muitas vezes é inteiramente possível inventar uma roda melhor.

  3. Um grande benefício de criar sua própria estrutura é que você não terá que se responsabilizar pelos erros de outra pessoa. (Essa é a filosofia da Amazon .) Pense da seguinte maneira: qual dessas é melhor informar ao cliente? -

    "Nosso site quebrou. Foi culpa de outra pessoa, e registramos um bug com seu criador. Não podemos fazer nada além de esperar. Vamos mantê-lo atualizado."

    "Nosso site quebrou e pudemos corrigi-lo imediatamente".


0

Talvez seja tão eficiente quanto, mas é tão robusto? Eu acho que a razão mais convincente para usar uma biblioteca em vez de criar a sua é que a estrutura tem tantas pessoas que a utilizam que podem encontrar e corrigir bugs rapidamente. A biblioteca desenvolvida internamente, embora possa fornecer a mesma funcionalidade (ou mais), não pode competir com uma biblioteca com milhões de usuários para fornecer testes em praticamente todos os casos de uso. Você simplesmente não consegue vencer esse tipo de teste internamente.


0

Bem, seu próprio método, sendo tão eficiente quanto a estrutura, seria muito raro, porque a maioria das estruturas ainda possui bugs e nenhuma estrutura pode fornecer uma solução pronta para uso. A maioria dos programadores que não conseguem pensar nunca tentará escrever nada no nível da estrutura; eles apenas pesquisam no Google por uma solução pronta. Qualquer programador sábio primeiro verá se existe uma estrutura livre com a funcionalidade necessária e, em seguida, escreverá a solução se não houver. Às vezes, é muito difícil explicar a situação atual do projeto e o desenvolvedor é o melhor juiz.

Reinventar a roda não é ruim, é uma afirmação feita por pessoas preguiçosas para evitar trabalhar duro. Até os escritores de frameworks reinventam; toda a estrutura .Net foi reinventada para fazer o que a COM estava oferecendo.


0

Por mais ofensivo que possa ser para alguns, sempre achei esse termo impróprio quando usado por qualquer forma de engenheiro ou em referência a um tópico para criar ou projetar coisas. Na verdade, não posso deixar de vê-lo como falso quando consideramos as pressões para inovar no mundo acelerado de hoje. Repetir a si mesmo (ou ignorar soluções adequadas e pré-existentes) nunca é sábio, mas, na verdade, há uma razão pela qual ainda não estamos todos olhando para telas pretas cheias de letras verdes.

Entendo "Se não está quebrado, não conserte", embora eu ache que essa frase possa parecer ignorante para alguns. No entanto, com o esforço atual de reinventar a roda para as necessidades de viagens espaciais, corridas, remessas, etc., "não reinvente a roda" também é bastante ignorante e não é nem de longe tão inteligente quanto parece.

Minha formação consiste em liderar muitos projetos e tive que trabalhar com muitos estagiários e outras formas de desenvolvedores verdes, e tive que lidar com muitas perguntas ingênuas que alguns chamariam de 'estúpidas', e também tive que desviar as pessoas de perseguir coelhos todos fora do escopo de suas tarefas. No entanto, nunca desencorajaria a inovação ou a criatividade e vi grandes coisas advindo da "reinvenção da roda".

Minha resposta real à pergunta: há apenas duas situações que tornam a reinvenção da roda uma coisa ruim:

  1. Se não é realmente necessário
  2. Se é o outro cara fazendo isso quando você poderia ter

Edit: Eu posso ver pelos votos drive-by down que devo ter ofendido alguns. A única coisa que eu gostaria de acrescentar é que essa frase sempre foi uma das minhas maiores irritações. Entendo que meus dois centavos podem parecer um tanto traiçoeiros, mas não tenho intenção de trollar, causar incêndios ou ofender.


0

Argumentos sobre "reinventar uma roda" são frequentemente usados ​​no contexto errado da escolha de usar uma biblioteca, mas não é algo parecido.

Digamos que estou avaliando uma biblioteca 'forms-plus', que ficou popular recentemente e ajuda a lidar com formulários. Ele tem uma página de destino bacana, gráficos modernos e legais e um -cult- (oops, eu quero dizer comunidade) ao redor dela, que jura como torna as formas excelentes novamente. Mas "forms-plus" é uma abstração em cima de "forms". "formas" era possível, mas difícil de lidar, então a abstração que torna mais fácil está se tornando popular.

Novas abstrações estão acontecendo o tempo todo. É difícil compará-los com rodas. É mais como um novo dispositivo de controle e um novo manual para qualquer dispositivo já muito complicado que você precise executar.

A avaliação deste novo dispositivo "forms-plus" será diferente dependendo da experiência pessoal. Se eu nunca criei formulários antes, o "forms-plus" será muito atraente, porque é mais fácil começar. A desvantagem é que, se o "forms-plus" for uma abstração com vazamento, ainda assim preciso aprender "forms". Se eu estava criando formulários sem "forms-plus", precisarei levar em consideração o tempo necessário para aprender uma nova ferramenta. O lado bom é que eu já conheço "formas", então não tenho medo de abstrações. Os benefícios de curto prazo geralmente serão maiores para os novos iniciantes, porque provavelmente não haveria nova biblioteca se ela não melhorasse alguma coisa. Os benefícios a longo prazo variarão amplamente na qualidade da abstração, taxa de adoção,

Depois de avaliar cuidadosamente os benefícios e negativos do uso de uma nova abstração "forms-plus" vs usando bare bone "forms", tomo uma decisão. A decisão é altamente baseada em minhas experiências pessoais e pessoas diferentes tomarão decisões diferentes. Eu poderia ter escolhido usar "formas" simples. Talvez, mais tarde, as formas-plus tivessem ganhado mais movimento por trás disso e se tornado um padrão defacto. E talvez minha própria implementação ao longo do tempo tenha ficado complicada e comecei a cobrir muito o que o forms-plus agora está fazendo. As pessoas que vierem neste momento serão atraídas a criticar que estou interessado em reinventar a roda e que eu deveria ter usado a biblioteca existente. Mas também é possível que, no momento em que eu tive que tomar uma decisão sobre "forms-plus", houvesse várias outras alternativas para "forms-plus",

No final, escolher as ferramentas certas é uma decisão complicada a ser tomada e a "reinvenção da roda" não é uma perspectiva muito útil.


-1

Eu escrevi um pequeno artigo sobre isso - http://samueldelesque.tumblr.com/post/77811984752/what-re-inventing-the-wheel-can-teach-you

Na minha experiência, reinventar foi realmente ótimo - embora muito longo e tedioso. Eu diria que, se você não conhece exatamente os modelos de programação que irá usar, escreva-os você mesmo (se tiver tempo e energia). Isso ensinará o que exatamente esses modelos de programação significam e você se tornará um programador melhor. Obviamente, se você estiver trabalhando para um cliente e precisar obter algo rapidamente, provavelmente desejará fazer alguma pesquisa e encontrar o software certo para você.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.