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?
fonte
Respostas:
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.
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.
fonte
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.
fonte
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 .
fonte
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:
fonte
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 .
fonte
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"
fonte
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.
fonte
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:
Como isso se traduz no mundo do software? Bem,
fonte
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.
fonte
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.
fonte
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.
fonte
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.
Para mim, o aluno não deve reinventar a roda, mas tente fazer engenharia reversa e entender as implicações.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
O Hacker Jargon Lexikon tem um comentário muito bom sobre a reinvenção da roda :
Portanto, pode ser bom reinventar a roda, mas verifique as soluções de outras pessoas antes ou depois de fazê-lo.
fonte
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.
fonte
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 ...
fonte
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.
fonte
cp
seu programa, de fato, copiariam o arquivo.