A frase “nunca reinventar a roda” é adequada para os alunos?

115

Encontro-me constantemente encontrando essa expressão "não reinvente a roda" ou "nunca reinvente a roda" quando faço algumas perguntas sobre SO. Eles dizem para você usar algumas estruturas ou pacotes existentes. Sei de onde vem essa atitude, pois não é prudente perder tempo com algo que outros já resolveram. Ou é assim?

Quando estudante, descobri que, usando alguns códigos que outros escreveram para resolver meu problema, não consigo aprender o quanto gostaria e ganho menos conhecimento. E às vezes acho que essa frase é principalmente para programadores que trabalham com prazos e não para estudantes como eu.

É tão ruim "reinventar a roda"? Talvez eu esteja pensando errado? Talvez exista uma maneira de evitar reinventar a roda e, ao mesmo tempo, aprender muito?

Gnijuohz
fonte
51
Você não terá muitos benefícios em ingressar em uma academia se conseguir que outras pessoas levantem os pesos para você (a menos que esteja aprendendo a ser gerente).
Charles E. Grant
82
Não há problema em reinventar a roda quando você estiver construindo rodas. Quando você está construindo casas, é uma boa idéia supor que os fabricantes de rodas sabem o que estão fazendo melhor do que você.
ZzzzBov 11/04/12
22
Você pelo menos precisa tentar fazer uma roda! Caso contrário, você não sabe por que deve usar um pré-fabricado.
59
Nunca é apropriado declarar um absoluto. :)
um CVn
2
Pode ser bom reinventar rodas quando você estiver criando um código extremamente otimizado. Bibliotecas padrão são muito úteis, mas geralmente é possível criar algo menos geral, mas mais rápido.
Leo

Respostas:

126

Eu acho que você faz um bom argumento. A maioria dos programadores neste site é provavelmente um profissional que trabalha com o objetivo de criar software de qualidade o mais rápido possível. Reinventar a roda falha nesse objetivo por duas razões.

  1. Reescrever o código existente é um esforço desperdiçado que pode ser usado nas partes exclusivas do seu sistema e faz com que o projeto demore mais do que o necessário.
  2. É provável que a primeira versão de qualquer código tenha bugs / problemas imprevistos. A maioria das bibliotecas e componentes reutilizáveis ​​foram testados em batalha e corrigidos várias vezes. Se você reinventar um algoritmo de hash ou tentar criar seu próprio RDBMS (a menos que seja esse o projeto) com mais frequência, você terá resultados inferiores.

Dito isto, em um ambiente acadêmico, o objetivo é aprender , não entregar software dentro do orçamento. Reinventar uma roda para entender como os raios ou eixos funcionam é uma ótima maneira de atingir esse objetivo. É por isso que muitos currículos de programação incluem uma aula sobre a construção de compiladores, quando muito poucos programadores em trabalho têm motivos para fazer isso.

JohnFx
fonte
37
Concordo com a ideia de entender como as coisas funcionam, embora também deseje que as escolas de programação tenham demorado algum tempo em seu currículo para aprender como usar bibliotecas de terceiros e por que você deveria. Eu sempre encontro programadores e desenvolvedores de capacidade profissional que não conseguem fazer isso e acabam reinventando a roda.
Spoike
3
grande ponto sobre compiladores
Chani
1
Eu acho que aprender a não reinventar a roda é mais importante. Você pode fazer muitas coisas que não envolvem a criação de algo que já foi criado.
Thomas Bonini
@Krelp Enquanto alguém é aluno, os conceitos são a parte mais importante. Muitos professores usam amostras de código para permitir uma teoria e aplicação de pontes. Esses são os tipos de programas que vão reinventar a biblioteca, mas é para garantir que os alunos entendam o material.
Jetti
2
Como aluno, você precisa reinventar a roda para ver por que ela é tão rápida quanto possível, mas como profissional, você precisa usar rodas comerciais para poder ir o mais rápido possível. Infelizmente, como se vê, assim é principalmente um site para profissionais, não para os alunos (que eles não proibir [casa] por um tempo?)
Tacroy
19

A resposta depende muito do contexto. Se você deseja obter um entendimento mais aprofundado das estruturas de dados, tentando implementar uma tabela de hash, "reinventar a roda" é a melhor coisa que você pode fazer. Se você está aprendendo a escrever compiladores e precisa de uma tabela de símbolos, implementar seu próprio mapa de hash em vez de reutilizá-lo da biblioteca padrão é um desperdício completo de seu tempo.

dasblinkenlight
fonte
17

Como estudante, eu esperaria que você iniciasse sua educação em programação primeiro copiando uma roda ou duas para começar, depois aprendendo a modificar as rodas para ver como elas funcionam e entender quaisquer limitações. Mais tarde, você pode até criar uma roda nova para ver se pode melhorar o design ou mostrar ao supervisor do curso sua compreensão dos conceitos envolvidos.

No entanto, como profissional que trabalha, espero que você tenha aprendido qual roda usar para resolver qualquer problema específico e quando pode ser apropriado modificar uma roda existente se ela resolver parcialmente o seu problema. Se você não encontrar uma roda em nenhum lugar, talvez tenha identificado um nicho de mercado ou não tenha explorado o suficiente e precisará ter experiência suficiente para saber quando seria apropriado criar uma nova roda de sua próprio.

A questão de quando é apropriado reinventar uma solução é complexa e exige tempo e experiência para aprender quando é melhor criar uma nova versão de algo que já foi feito antes. Quando você está desenvolvendo apenas há pouco tempo, é melhor simplesmente usar uma solução existente e pedir aos seus mentores que sugiram opções. Quando você tem prazos apertados e muita incerteza em um projeto, o uso de algo existente pode economizar muito tempo e é sempre a sua primeira escolha. Você sempre pode refatorar o uso de outras soluções posteriormente, se for apropriado, mesmo que isso signifique voltar a reinventar sua roda .

S.Robins
fonte
12

Como professor ou programador, luto constantemente com o lado oposto do problema: quando peço aos alunos que reinventem a roda?

Tome estas situações simples: estamos estudando o algoritmo de classificação e defino tarefas para escrever um programa que classifica alguns dados; ou trabalhando na funcionalidade de data, e solicito um calendário.

Para ambos, existem inúmeras bibliotecas prontas e funcionalidades disponíveis; mas quero que os alunos os evitem e desenvolvam sua própria versão de um algoritmo de classificação ou de um calendário.

Agora pegue esta outra: eu defino uma tarefa para escrever um aplicativo simples para, por exemplo, agendar compromissos. É provável que precise de classificação, calendário e muito mais. Desta vez, "não reinvente a roda" se aplica: não quero que os alunos lutem com os problemas resolvidos, mas montem a funcionalidade existente para obter um resultado.

Minha dificuldade é: quanto pedir para você recriar o existente, o que leva você a aprender e tem a vantagem de problemas bem trilhados com dificuldades conhecidas que eu posso usar para fazer você praticar o ofício e quanto devo colocar você em um cenário do mundo real, onde as rodas não são reinventadas?

Para responder sua pergunta mais diretamente, duas sugestões:

  • se um professor diz para você "não reinventar a roda", provavelmente diz isso porque criou o problema dessa maneira. Talvez eles queiram que você tente uma biblioteca, lute com a implementação de um algoritmo de outra pessoa, em vez de escrever sua própria - há aprendizado nisso também, e recriar é interessante, mas erra o ponto.
  • se você tiver muitos exercícios para montar chamadas de biblioteca, em vez de desenvolver algoritmos, poderá levantar com seus professores a questão do equilíbrio entre essas atividades - destaque para você nunca ter sido solicitado a escrever seus próprios algoritmos, por exemplo, classificação e mesclagem. A comunicação nunca vai mal.
boisvert
fonte
6

Prática Duvido que as primeiras 1000 linhas de código que alguém escreve sejam muito únicas.

Expanda seu conjunto de ferramentas O uso de uma estrutura traz mais benefícios quando você entende o que está fazendo (quase ao ponto de fazer isso você mesmo.) Para saber como aplicá-la.

Entenda as "rodas" Usar uma roda mal construída e desgastada ou que não se encaixa, não é desculpa para aderir cegamente a essa regra de ouro. Você pode ter pouco tempo, financiamento, experiência, então basta consertá-lo e terminar a viagem.

Existem poucos absolutos .

JeffO
fonte
1
+ Especialmente para o último ponto.
precisa saber é o seguinte
As primeiras 1000 linhas de código que alguém escreve tendem a ser muito únicas em termos de erros criativos.
usar o seguinte código
@leftaroundabout - Acho que devo limitar essa declaração a linhas de código que podem ser compiladas.
Jeffo
3

Os alunos não têm orçamentos para concluir as tarefas, mas há datas a serem consideradas.

Como alguém que era aluno até recentemente, acho que a quantidade de reinventar as rodas apropriada depende de para qual classe você está realizando a tarefa. Você não deseja escrever sua própria biblioteca de soquetes para uma classe de desenvolvimento e design da Web (se você puder fazer isso e entregar a tarefa no prazo, o que você está fazendo para ter uma aula tão fácil?), Mas estaria faltando muito se fosse uma tarefa para uma classe de redes. É claro que os professores geralmente levam essas coisas em consideração quando estão criando tarefas, então você trabalha principalmente relacionado à classe, mas às vezes é importante saber o que não deve escrever.

Dito isto, depois de sair da escola, é difícil encontrar tempo para construir coisas que já existem. Aproveite todas as oportunidades que puder quando puder, enquanto ainda estiver na escola.

Se você receber o pincel "Usar biblioteca X / framework Y" no SO, anteceda sua pergunta com "Estou escrevendo X sozinho para aprender mais sobre isso"

Jay
fonte
anteceda sua pergunta com "Estou escrevendo X sozinho para aprender mais sobre isso". Este. +1.
Boisvert
2

Se você não tem um prazo definido para o seu projeto, IMO, é melhor reinventar a roda. Se você não tem um emprego, ou está apenas procurando aprender a programar, não para ganhar dinheiro com programação, qual é o sentido de usar atalhos que não farão de você um programador melhor, aqueles que apenas farão seu projeto mais rápido? Embora isso seja verdade, é definitivamente uma boa habilidade saber como usar bibliotecas, estruturas e código de outras pessoas.

Billjk
fonte
Essa é a idéia por trás do conceito de Code Katas, reescrevendo o código repetidamente para melhorar e aprender com ele. Eu diria que mesmo no trabalho, reescrever seu código repetidamente é bom, e poder implementar muitos padrões, se necessário, é ainda melhor.
Bill K
2

Na vida real, a roda é reinventada repetidamente. Se procurarmos os motivos, poderemos encontrar algumas dicas, como quando precisamos reinventar a roda na programação.

Desde os tempos sumérios, muitas coisas mudaram:

  • O material usado para construir as rodas: de pedra, madeira, metal, carbono, ...
  • o tamanho de objetos que precisam de rodas - do tamanho de nanômetros para instrumentos médicos e rodas para obter carvão marrom, 100 m de tamanho
  • o ambiente de produção - feito à mão ou produção industrial
  • a precisão das rodas necessárias
  • A situação certa ao seu volante. Pode haver uma roda perfeita para o seu trabalho, mas pode ser patenteada.
  • O brilho e o polimento da sua roda. Um Cadillac pode merecer outra roda que um VW Golf.
  • A roda ideal para um carrinho de bebê depende de muitos parâmetros: tamanho e peso do carrinho (mais bebês), circunstâncias climáticas, preços de recursos para óleo ou borracha natural, máquinas para fabricar rodas e artesãos, disponíveis para produção. Em poucas palavras: economia mundial.

Como isso se traduz no mundo do software? Bem,

  • pode haver um servidor web, mas infelizmente ele está escrito em PHP. Você prefere tê-lo em um idioma em que seja fluente
  • um algoritmo de classificação pode ser superdimensionado para 10 elementos, mas não aumenta em escala de 1T
  • você pode precisar de uma solução que é gerada pelo segundo programa
  • a precisão costuma ser uma questão digital no campo do software, se um algoritmo classifica uma lista, ele é classificado - e não principalmente. Mas além do desempenho, o tamanho do código, o uso da memória ou outras restrições podem acontecer
  • Patentes não precisam de mais explicações, eu acho.
  • A aparência é uma razão constante para reinventar algo - pense em dropDownList (ComboBox).
  • A situação econômica global pode influenciar sua roda de software: será uma roda de nuvens, uma roda de código aberto, uma roda de navegador ou uma roda de aplicativos?
  • E, claro, a razão mais famosa para montar sua própria roda: você gosta de aprender.
Usuário desconhecido
fonte
2

Sou uma aluna recém-formada. Na escola estávamos aprendendo asp.net e C #, naqueles 2 anos que a educação levou, nunca tentamos criar nosso próprio sistema de email, sistema de login ou CMS. Tudo estava apenas arrastando e soltando o controle na visualização do design. .

Começamos 102 alunos, 23 concluíram. 4 pessoas tem um trabalho. O motivo ?: Essas 4 pessoas (inclusive eu) sabiam programar antes de começarmos a educação.

O resto das pessoas está perdido. Porque nunca 'reinventamos a roda'. Nunca chegamos a saber como o código realmente funciona. É bastante simples criar um sistema de login completo, com gerenciamento de usuários - mas os alunos da minha formação não sabem como fazê-lo. Porque eles não sabem como um sistema de login realmente funciona.

Sinto-me triste que, em algum momento, realmente desperdicei 2 anos, sem aprender nada. - Desejo que professores de todo o mundo digam: Sim, sabemos que existem estruturas, onde o código existe. Você pode usá-las na vida real. Mas nesta educação, você aprenderá como programar.

Muitas educações em programação são muito curtas, portanto, as educações precisam cobrir muitas coisas nesse período. Eu acho que seria melhor que a lista de coisas fosse cortada pela metade e gastasse mais tempo em programação. As pessoas podem "inventar um novo tipo de roda" se souberem construir uma "roda" normal. As pessoas não são estúpidas se tiverem um pouco de conhecimento, mas você não pode pedir a um homem que não sabe nada sobre carros, para montar um carro. Mas perguntar a um homem que sabe montar uma bicicleta seria muito mais fácil. com a construção do carro.

Zerpex
fonte
1

Realmente depende do que você está fazendo. Se você está tentando entender as rodas, é uma boa ideia reinventá-las. Se, no entanto, você está tentando entender carros, reinventar a roda a roda ou os motores de combustão interna é geralmente um desperdício e uma distração.

Por exemplo, quando você estiver interessado em entender como um índice de pesquisa de texto completo pode funcionar, é uma boa ideia tentar criar o seu próprio. Se você estiver tentando criar um aplicativo para gerenciamento de documentos, é melhor reutilizar uma biblioteca existente, porque a maior parte do seu trabalho está obtendo a arquitetura do aplicativo e a experiência do usuário, tudo ao mesmo tempo.

back2dos
fonte
1

Sim, é apropriado dizer aos alunos para não reinventar a roda. Mas é preciso haver uma compreensão clara do que isso significa para um aluno: escreva o que é pertinente à tarefa. Isso não significa que, se a tarefa for escrever uma fonte de bolhas, você a copia da Wikipedia, nem significa usar array.sort ou equivalentes, se sua estrutura ou idioma fornecer. Mas, depois de cobrir os vários algoritmos de classificação, escrever sua própria classificação e classificação rápida, não se preocupe em reescrevê-la para cada nova tarefa, use a classificação integrada ou o que você escreveu, não faça a mesma coisa de novo. .

Reinventar a roda significa não perder tempo, o que é tão aplicável aos estudantes quanto aos profissionais - a diferença está no que existem objetivos. Os alunos devem aprender, para que algo que não melhore sua compreensão, seja um desperdício de tempo - depois de escrever uma bolha para saber o que faz, você sabe por que não deseja usá-la em um conjunto grande, e reescrevê-lo repetidamente é uma perda de tempo. Você não vai aprender nada de novo na 25ª reescrita.

Para os alunos, isso não significa não escrever o que os outros escreveram, significa não refazer o que você já domina - aquele tempo que poderia ser melhor gasto com o que você não domina.

jmoreno
fonte
Exceto se a 25ª reescrita for uma prática para alguma linguagem de programação que você está aprendendo recentemente.
usar o seguinte código
1

Muitos pensamentos e esforços foram gastos na criação de uma roda. O conselho é "não reinventar a roda", mas você pode fazer a engenharia reversa da roda e entender por que certas coisas são feitas da maneira que são feitas. Depois disso, você pode tentar implementar a roda do seu jeito, o que pode resultar em um dos três fins lógicos.

  1. Ou você entende por que as coisas são do jeito que são.
  2. Você pode otimizá-lo e torná-lo melhor
  3. Você pode estragar tudo e aprender como não fazer isso.

Para mim, o aluno não deve reinventar a roda, mas tente fazer engenharia reversa e entender as implicações.

Ramesh
fonte
1

Eu diria que depende se você está reinventando para ver como a roda funciona ou reinventando a roda no processo de realizar alguma outra tarefa. Certamente existem rodas que todo aluno precisa implementar pelo menos uma vez por conta própria. Você precisa saber como algumas estruturas de dados e algoritmos elementares funcionam para entender como eles afetarão o desempenho do seu código ou escolher quais usar em várias circunstâncias.

Pilhas, pilhas, listas vinculadas, árvores etc. definitivamente valem o investimento na hora de implementar uma vez; depois, use os fornecidos pela estrutura. Todo mundo que usa um plugin jQuery deve escrever pelo menos um, mas você não precisa escrever todos os tipos diferentes de um que você jamais usará. Eu diria que é útil, mas não necessário, escrever um pequeno agendador de processos ou um mini-OS para que você possa entender o que acontece nos bastidores de um computador. Você precisa entender como processos, threads, etc. funcionam.

Depois de ter um bom conhecimento de trabalho, também pode ser importante (e divertido) voltar e implementar novas estruturas / algoritmos para ter uma ideia deles. A menos que seja seu trabalho ou você seja realmente bom nisso, eu continuaria usando os existentes no seu código.

tvanfosson
fonte
1

A resposta depende se você deseja aprender ou criar.

Se o objetivo é o aprendizado, "reinventar a roda" pode proporcionar uma maior percepção e melhor compreensão do que o uso das rodas existentes (funções da biblioteca).

Mas se criar um produto complicado é o objetivo, "reinventar a roda" pode ser uma prática demorada e pouco ajudará na criação do produto.

No entanto, se o objetivo da alma é aprender com tempo e resistência suficientes, "reinventar a roda" é a melhor opção, pois ajuda a personalizar todos os recursos.

CoolEulerProject
fonte
1

Bem, existem dois aspectos para isso.

Primeiro, se você está tentando aprender, pode ser útil fazer algumas coisas do zero ou usar interfaces de nível inferior ao necessário. No entanto, ainda é necessário identificar o que você está aprendendo: se você quiser aprender sobre o protocolo HTTP, não precisará programar sozinho o soquete. Apenas reinvente o que você está aprendendo e faça isso apenas para realmente explorá-lo e compreendê-lo.

Mas - uma das habilidades mais importantes de um programador profissional é selecionar, aprender e usar software pré-existente. Isso é algo que você também precisa aprender. Uma grande proporção das perguntas sobre SO parece vir de pessoas incapazes de ler a documentação.

Finalmente, a programação baseia-se em uma base teórica substancial. Você precisará usar os dois exercícios práticos, juntamente com a leitura, para aprender a teoria.

Marcin
fonte
Concordo. É por isso que há tantas novas estruturas de software pré-existentes e bibliotecas que está sendo criado o tempo todo :)
gbjbaanb
0

Eu enfrentei a mesma situação. É por causa da diferença de percepção na indústria e nos acadêmicos.

Se você não "reinventar a roda", absolutamente não poderá estudar nada na escola ou entender como algo funciona.

Enquanto em uma indústria o objetivo é apresentar um produto em menos tempo e esforço.

Pessoalmente, gosto de ir à toca do coelho e detesto a filosofia da indústria, mas é assim que os negócios são feitos e você não pode reclamar.

John
fonte
0

O Hacker Jargon Lexikon tem um comentário muito bom sobre a reinvenção da roda :

Projetar ou implementar uma ferramenta equivalente a uma existente ou parte de uma, com a implicação de que isso é bobagem ou perda de tempo. Isso geralmente é uma crítica válida. Por outro lado, os automóveis não usam rolos de madeira, e alguns tipos de rodas precisam ser reinventados muitas vezes antes de você acertar. Por outro lado, as pessoas que reinventam a roda tendem a criar o equivalente moral de um trapézio com um eixo deslocado.

Portanto, pode ser bom reinventar a roda, mas verifique as soluções de outras pessoas antes ou depois de fazê-lo.

Hans-Peter Störr
fonte
0

Resposta A: Reinvente a roda. Isso aprofunda a compreensão de estruturas e algoritmos de dados e aumenta a probabilidade de você escrever coisas boas. Tenho certeza de que quando Guido van Rossum estava iniciando no Python, as pessoas diziam para ele não reinventar a roda. Já havia muitos idiomas. Por que escrever no google quando já havia o Yahoo! Que tal clang? Aprenda tudo. Seja um gigante. Não deixe que as pessoas pequenas o limitem. Resposta B: Se um instrutor lhe disser o que fazer, dê a ele o que ele quer, ou um pouco mais, mesmo que pareça bobo. Se você também quer enlouquecer, faça uma solução surpreendente e dê a ele um link para isso, vá em frente. Primeiro, porém, cumpra os requisitos estabelecidos, de acordo com o que está satisfeito.

phorgan1
fonte
-1

Se você é um estudante e, portanto, não tem um prazo definido para o seu projeto, é melhor "reinventar a roda". Se você está programando agora apenas para aprender a programar, e não para ganhar dinheiro, por que usar atalhos que não o ajudarão a aprender? Por que não fazer da maneira mais difícil? Mas, quando você se tornar um programador ativo, as pessoas ficarão céticas se você não souber usar estruturas ou bibliotecas ...

Billjk
fonte
10
Não sei em qual escola você frequentou, mas para onde eu fui, os prazos para as tarefas eram comuns.
um CVn
-2

Faça o que a tarefa / pergunta / exame pede que você faça.

Anos atrás, eu era um TA para uma aula de programação C. Uma pergunta do exame era 'Escreva um programa para copiar um arquivo'. Vários alunos fizeram o mesmo tipo de pergunta - eles podem gerar um processo e executar o comando OS cp?

O que pedimos a eles de volta foi 'Seu programa copiará o arquivo?'

A pergunta do exame pediu que eles escrevessem um código para copiar um arquivo. Se a resposta não tiver o código C que copiou o arquivo (por exemplo, entrada aberta, saída aberta, um loop para ler / escrever bytes, entrada fechada, saída fechada), não foi possível copiar o arquivo.

Se o professor disser que usa uma estrutura ou biblioteca (por exemplo, uma aula de gráficos pode pedir para você usar uma biblioteca 3D), use o que ele pede. Não invente o seu próprio ou use outro. Qualquer coisa diferente tornará mais difícil para o professor avaliar seu trabalho.

Em uma entrevista de emprego, o conhecimento de estruturas populares o ajudará a responder perguntas. Crie seus próprios projetos para aprender. Boa sorte com seus estudos.

jqa
fonte
Sim, mas se eles gerassem cpseu programa, de fato, copiariam o arquivo.
Marcin