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

113

Eu me encontro constantemente correndo para esta expressão "não reinventar a roda" ou "nunca reinventar a roda" quando faço algumas perguntas sobre SO. Eles dizem para você usar alguns frameworks ou pacotes existentes. Eu sei de onde esta atitude está vindo, já que é imprudente perder tempo com algo que outras pessoas já resolveram. Ou assim?

Como estudante, eu acho que, usando algum código que outros escreveram para resolver meu problema, não consigo aprender tanto quanto gostaria, e ganho menos conhecimento. E às vezes eu acho que essa frase é principalmente para programadores trabalhando com prazos e não para estudantes como eu.

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

    
por Gnijuohz 11.04.2012 / 05:43
fonte

20 respostas

125

Eu acho que você faz um bom ponto. A maioria dos programadores deste site provavelmente trabalha com profissionais cujo objetivo é criar software de qualidade o mais rápido possível. Reinventar a roda falha este objetivo em duas contagens.

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

Dito isso, em um ambiente acadêmico, o objetivo é aprender , não entregar software com orçamento. Re-inventar uma roda para entender como os raios ou o eixo funcionam é uma ótima maneira de atingir esse objetivo. É por isso que muitos currículos de programação incluem uma classe na construção de compiladores, quando muito poucos programadores que trabalham já tiveram que fazer isso.

    
por 11.04.2012 / 05:25
fonte
19

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

    
por 11.04.2012 / 05:02
fonte
17

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

Como profissional de trabalho, no entanto, espero que você tenha aprendido qual roda usar para resolver qualquer problema, e quando pode ser apropriado modificar uma roda existente se resolver apenas parcialmente o seu problema. Se você não encontrar uma roda em qualquer lugar, talvez tenha identificado o nicho de mercado ou não tenha explorado o suficiente, e precisaria ter experiência suficiente para saber quando roda por conta própria.

A questão de quando é apropriado reinventar uma solução é complexa e requer tempo e experiência para saber quando seria melhor criar uma nova versão de algo que já tenha sido feito antes. Quando você estiver desenvolvendo apenas por um curto período de tempo, é melhor simplesmente usar uma solução existente e pedir a seus mentores que sugiram opções. Quando você tem prazos apertados e muita incerteza em um projeto, usar algo existente pode economizar bastante tempo e é sempre sua primeira escolha. Você pode sempre refatorar o uso de outras soluções posteriormente, se for apropriado fazê-lo, mesmo que isso signifique, eventualmente, retornar para reinventar sua roda .

    
por 11.04.2012 / 05:56
fonte
11

Sendo professor ou programador, eu constantemente luto com o lado oposto do problema: quando pergunto aos alunos para reinventarem a roda?

Considere estas situações simples: estamos estudando o algoritmo de classificação e configuro tarefas para escrever um programa que classifica alguns dados; ou trabalhando na funcionalidade de data, e peço por 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 este outro: eu configurei uma tarefa para escrever um aplicativo simples para, digamos, agendar compromissos. É provável que isso precise de classificação, calendário e muito mais. Desta vez, "não reinventar a roda" aplica-se: não quero que os alunos tenham dificuldades com problemas resolvidos, mas sim montar a funcionalidade existente para obter um resultado.

A minha dificuldade é, quanto pedir para você recriar o existente, o que o leva a aprender, e tem a vantagem de problemas bem conhecidos com dificuldades conhecidas que eu posso usar para fazer você praticar o ofício, e quanto Eu deveria colocá-lo 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 disser a você para "não reinventar a roda", eles provavelmente dirão isso porque projetaram o problema dessa maneira. Talvez eles queiram que você experimente uma biblioteca, lute com a implementação de um algoritmo de outra pessoa, em vez de escrever a sua própria - há aprendizado nisso também, e recriar é interessante, mas não entende.
  • Se você tem muitos exercícios para montar as chamadas da biblioteca, em vez de desenvolver algoritmos, pode levantar com seus professores a questão do equilíbrio entre essas atividades - destacar que nunca foi solicitado que você escrevesse seus próprios algoritmos, por exemplo classificar e mesclar. A comunicação nunca será errada.
por 11.04.2012 / 13:42
fonte
6

Pratique Eu duvido que as primeiras 1000 linhas de código que alguém escreve sejam muito exclusivas.

Expanda seu conjunto de ferramentas O uso de um framework tem mais benefícios quando você entende o que está fazendo (até o ponto em que você pode fazê-lo sozinho) para saber como aplicá-lo.

Entenda as "Rodas" Usar uma roda mal construída e desgastada ou uma que não sirva, não é desculpa para se agarrar cegamente a esta regra geral. Você pode ter pouco tempo, dinheiro, experiência, então é só consertar e terminar a viagem.

Existem alguns absolutos .

    
por 11.04.2012 / 13:59
fonte
3

Os alunos não têm orçamentos para concluir tarefas, mas existem datas para considerar.

Como alguém que foi aluno até recentemente, acho que a quantidade de reinvenção da roda que é apropriada depende de qual classe você está fazendo a tarefa. Você não quer escrever sua própria biblioteca de sockets para uma classe de desenvolvimento e design web (se você puder fazer isso e transformar a tarefa em tempo, o que você está fazendo tendo uma aula tão fácil?) , mas você estaria perdendo muita coisa se fosse uma tarefa para uma aula de redes. É claro que os professores geralmente levam isso em conta quando estão criando tarefas, então você fará principalmente trabalhos relacionados à aula, mas às vezes, saber o que você não deve escrever é importante também.

Dito isso, quando você sai da escola, é difícil encontrar tempo para construir coisas que já existem. Aproveite todas as oportunidades que conseguir quando puder, enquanto ainda estiver na escola.

Se você obtiver a opção "Usar biblioteca X / framework Y" no SO, prefaça sua pergunta com "Estou escrevendo X sozinho para saber mais sobre isso"

    
por 11.04.2012 / 07:57
fonte
2

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

    
por 11.04.2012 / 17:21
fonte
2

Na vida real, a roda é reinventada repetidas vezes. Se procurarmos as razões, poderemos encontrar algumas dicas quando precisarmos reinventar a roda na programação.

Desde os tempos da Suméria, muitas coisas mudaram:

  • O material usado para construir rodas: de pedra, madeira, metal, carbono, ...
  • o tamanho dos objetos que precisam de rodas - no tamanho de nanômetros para instrumentos médicos e rodas para ganhar carvão marrom, 100m de tamanho
  • o ambiente de produção - feito à mão ou produção industrial
  • a precisão das rodas que são necessárias
  • A situação certa ao redor do 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 do 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 construir rodas e artesãos, disponíveis para produção. Pouco falado: economia mundial.

Como isso se traduz no mundo do software? Bem,

  • pode haver um servidor da Web, mas infelizmente está escrito em PHP. Você preferiria tê-lo em um idioma no qual você é fluente
  • um algoritmo de classificação pode ser superdimensionado para 10 elementos, mas não dimensiona até 1T de elementos
  • você pode precisar de uma solução que seja gerada pelo segundo programa
  • precisão é, na maioria das vezes, uma questão digital em terra de software, se um algoritmo classifica uma lista é classificada - não na maior parte classificada. Mas além do desempenho, o tamanho do código, o uso da memória ou outras restrições podem acontecer
  • As 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 nuvem, uma roda de código aberto, uma roda de navegador ou uma roda de aplicativo?
  • E, claro, a razão mais famosa para construir sua própria roda: você gosta de aprender.
por 12.04.2012 / 03:25
fonte
2

Sou um aluno recém-formado. Na escola nós estávamos aprendendo asp.net e C #, aqueles 2 anos que a educação levou, nós nunca tentamos fazer nosso próprio sistema de e-mail, sistema de login ou CMS. Tudo estava apenas arrastando e soltando o controle na visão de design .

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

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

Eu me sinto triste, que em algum momento, realmente perdi dois anos, aprendendo nada. - Eu desejo que os professores de todo o mundo digam: Sim, nós sabemos que existem frameworks, onde o código existe, Você pode usá-los na vida real .. Mas nessa educação você aprenderá como fazer programação ..

Muitas educações de programação são muito curtas, então as educações precisam cobrir muitas coisas dentro desse tempo. Acho que seria melhor que a lista de coisas fosse cortada pela metade e passar mais tempo na 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 construir um carro .. Mas pedir a um homem que sabe montar uma bicicleta, teria muito mais facilidade com a construção do carro.

    
por 13.04.2012 / 08:59
fonte
1

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

Por exemplo, quando 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ê está tentando criar um aplicativo para gerenciamento de documentos, é melhor reutilizar uma biblioteca existente, porque a maior parte do seu trabalho está garantindo a arquitetura do aplicativo e a experiência do usuário, tudo ao mesmo tempo.

    
por 11.04.2012 / 09:19
fonte
1

Sim, é apropriado dizer aos alunos para não reinventarem a roda. Mas é preciso que haja 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 um bubblesort, você o copia da Wikipedia, nem significa usar array.sort ou equivalentes se o seu framework ou idioma o fornecer. Mas depois de ter coberto os vários algoritmos de ordenação, tenha escrito seu próprio bubblesort e quicksort, não se incomode em reescrevê-lo para cada nova atribuição, use a ordenação embutida ou o que você escreveu, não faça a mesma coisa novamente .

Reinventar a roda é não perder tempo, o que é tão aplicável aos estudantes quanto aos profissionais - a diferença está no que são os objetivos. Os estudantes devem estar aprendendo, então algo que não aprofunda a compreensão deles, é uma perda de tempo - depois de ter escrito uma bolha, você sabe o que ela faz, você sabe por que não quer usá-la em um grande conjunto, e reescrevê-lo novamente é uma perda de tempo. Você não vai aprender nada de novo na 25ª reescrita.

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

    
por 11.04.2012 / 09:29
fonte
1

Muitos pensamentos e esforços foram aplicados na criação de uma roda. O conselho é "não reinventar a roda", mas você pode ir adiante e fazer engenharia reversa na roda e entender por que certas coisas são feitas da maneira como são feitas. Depois disso, você pode tentar implementar a roda em seu próprio caminho, o que pode resultar em uma das três finalidades lógicas.

  1. Você entende por que as coisas são como 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 & entender as implicações.

    
por 11.04.2012 / 10:58
fonte
1

Eu diria que isso 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 estudante precisa implementar pelo menos uma vez por conta própria. Você precisa saber como algumas estruturas e algoritmos de dados elementares funcionam para entender como eles afetarão o desempenho de seu código ou escolherão quais usar em várias circunstâncias.

Pilhas, pilhas, listas encadeadas, árvores, etc. definitivamente valem o investimento na hora de implementar uma vez; depois, sempre depois de usar os fornecidos pela estrutura. Todo mundo que usa um plugin jQuery deve escrever pelo menos um, mas você não precisa escrever cada tipo diferente de um que você irá usar. Eu diria que é útil, mas não necessário, escrever um pequeno agendador de processo ou mini-sistema operacional para que você possa entender o que acontece sob o capô em um computador. Você precisa entender como processos, threads etc. funcionam.

Uma vez que você tenha 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 o seu trabalho ou você seja realmente bom nisso, eu continuaria usando os existentes em seu código.

    
por 11.04.2012 / 14:16
fonte
1

A resposta depende se você deseja aprender ou criar.

Se a aprendizagem é o objetivo, "reinventar a roda" pode dar uma visão melhor e melhor compreensão do que usar as rodas existentes (funções de biblioteca).

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

No entanto, se o objetivo da alma é aprender com tempo e energia suficientes, "reinventar a roda" é a melhor opção, já que ajuda a personalizar todos os recursos.

    
por 11.04.2012 / 18:34
fonte
1

Bem, existem dois aspectos para isso.

Primeiramente, se você está tentando aprender, pode ser útil fazer algumas coisas do zero, ou usar interfaces de baixo nível do que o necessário. No entanto, ainda é necessário identificar o que você está aprendendo: se quiser aprender sobre o protocolo HTTP, você não precisa fazer a programação de soquete sozinho. Apenas reinvente as coisas sobre as quais você está aprendendo , e só faça isso para realmente explorá-las e compreendê-las.

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 parte das perguntas sobre o 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 ambos os exercícios práticos, juntamente com a leitura, para aprender a teoria.

    
por 13.04.2012 / 15:25
fonte
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", então você absolutamente não pode estudar nada na escola ou entender como algo funciona.

Considerando que, em uma indústria, o objetivo é lançar um produto em menos tempo e esforço.

Pessoalmente, eu gosto de ir à toca do coelho e detesto a filosofia da indústria, mas é assim que as empresas são feitas e você não pode reclamar.

    
por 11.04.2012 / 08:20
fonte
0

O Hacker Jargon Lexikon tem um comentário muito bom sobre reinventando a roda :

To design or implement a tool equivalent to an existing one or part of one, with the implication that doing so is silly or a waste of time. This is often a valid criticism. On the other hand, automobiles don't use wooden rollers, and some kinds of wheel have to be reinvented many times before you get them right. On the third hand, people reinventing the wheel do tend to come up with the moral equivalent of a trapezoid with an offset axle.

Por isso, pode ser bom reinventar a roda, mas certifique-se de olhar para as soluções dos outros antes ou depois de fazê-lo.

    
por 16.04.2012 / 21:16
fonte
0

Resposta A: Reinvente a roda. Aprofunda sua compreensão de estruturas de dados e algoritmos e torna muito mais provável que você escreva coisas boas. Tenho certeza de que quando Guido van Rossum estava começando em Python, as pessoas disseram a ele para não reinventar a roda. Já havia muitos idiomas. Por que escrever no google quando já existia 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 apenas um pouco mais, mesmo que pareça bobo. Se você quiser também ficar louco fazendo uma solução surpreendente e dar-lhe um link para ele, vá em frente. Primeiro, no entanto, cumpra os requisitos estabelecidos como dados para que ele seja feliz.

    
por 17.04.2012 / 15:26
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 ajudem você a aprender? Por que não fazê-lo da maneira mais difícil? Mas, quando você se torna um programador que trabalha, as pessoas ficarão céticas se você não souber como usar frameworks ou bibliotecas ...

    
por 11.04.2012 / 05:36
fonte
-2

Faça o que a tarefa / pergunta / exame lhe pede para fazer.

Anos atrás, eu era um professor da turma de programação em C. Uma questão do exame foi '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 cp do sistema operacional?

O que pedimos de volta foi: "Seu programa copiará o arquivo?"

A pergunta do exame pediu-lhes para escrever o código para copiar um arquivo. Se a resposta não tiver código em C que copiou o arquivo (por exemplo, abrir entrada, abrir saída, um loop para ler / gravar bytes, fechar entrada, fechar saída), então não copiou o arquivo.

Se o professor disser que usa uma estrutura ou biblioteca (por exemplo, uma classe gráfica pode dizer para você usar uma biblioteca 3D), use o que eles dizem para você usar. Não invente o seu próprio ou use um diferente. Qualquer coisa diferente tornará mais difícil para o professor avaliar seu trabalho.

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

    
por 12.04.2012 / 04:13
fonte