A programação de copiar e colar é ruim? [duplicado]

14

Com o Google simples, assim como as ferramentas de pesquisa do Google Code, é fácil descobrir como programar usando algum recurso ou resolver certos problemas (como criar uma classe Java ou um bloco FTP em Perl, etc.). Assim, os desenvolvedores são tentados a copiar apenas & cole o código (de maneira reutilizável). Isso é uma incompetência? Eu mesmo fiz isso, embora eu ache que sou um programador melhor do que muitos outros que já vi. Quem tem tempo para RTFM ? Nesta era da abundância de informação, não creio que copy & colar programação é ruim.

Não é assim que sites como o Stack Overflow fazem? As pessoas perguntam - OK, aqui está o meu problema - como resolvê-lo? Agora, alguém postará o código completo e a pessoa que fez a pergunta simplesmente copiará & cole a resposta mais votada. Não importa quão pequeno seja o problema.

Estou trabalhando com um grupo de jovens codificadores que dependem muito da Internet para realizar seu trabalho. Eu vejo conveniência em copiar / colar e modificar código para fazer o trabalho. Por exemplo, você pode ser muito bom com algoritmos e coisas do tipo, mas você pode não saber como usar um BufferedReader em Java - você leria o completo Javadoc para BufferedReader ou procurar algum exemplo de usá-lo em algum lugar?

Quais são os perigos reais da cópia & colar codificação que pode afetar sua competência?

    
por Peter Mortensen 18.12.2016 / 11:36
fonte

15 respostas

50

Isso é ruim? Talvez ... para aprender pequenos exemplos, para testar um conceito, não é tão ruim assim.

MAS ... você tem que entender o que você está copiando / colando. Caso contrário, como você sabe que o código está realmente fazendo? Claro, ele pega o um resultado que você quer na tela mas talvez ele tenha um desempenho horrível, talvez tenha falhas de segurança, talvez cause vazamentos de memória, talvez convoque Cthulhu, talvez isso cause o cartão de crédito do cliente números a serem vazados, talvez ele contenha um backdoor ...

E mais provavelmente, talvez seja necessário algum ajuste para atender aos requisitos de negócios e, se você não entender o código, não será possível ajustá-lo (ou melhor ainda: escreva uma versão mais "correta" ...

Quanto ao "RTFM", sim, eu faço quando está disponível. Eu leria o BufferedReader javadocs e, se não conseguir informações suficientes para que meu código funcione, eu acessaria o Google e procuraria "Exemplo do Java BufferedReader". Eu não esperaria que o código que eu encontrasse funcionasse imediatamente com o meu código, mas eu esperaria encontrar um exemplo independente de trabalho simples que eu possa usar como exemplo para corrigir meu próprio código.

E quando é o seu código próprio que você está copiando / colando, isso geralmente é um sinal para iniciar a refatoração.

    
por 28.06.2011 / 18:15
fonte
15

É talvez a pior maneira possível de programar.

is this an incompetency?

Sim. Se alguém não consegue entender bem o suficiente para escrever por si mesmo, eles realmente precisam encontrar um novo emprego onde não é esperado que eles codifiquem.

Mais importante, se alguém puder escrever o caso de teste de unidade, ele deverá ser capaz de escrever o código. Ou prove que o problema não pode ser resolvido em um período de tempo razoável. Se houver problemas de tecnologia, o treinamento é essencial. Se houver problemas de algoritmo, o treinamento também é essencial.

Who has the time to RTFM?

Todos.

Isn't that what sites like stack overflow do anyway?

Não.

the person who asked the question would simple copy paste the most voted answer.

O código mais votado pode não funcionar como esperado. Pode não ser ideal. Pode não lidar corretamente com condições de contorno ou casos especiais. Na verdade, talvez nem funcione para a arquitetura do questionador, mesmo que tenha funcionado para a pessoa que está respondendo.

would you read complete Javadoc for BufferedReader or look up some example of using it somewhere??)

Leia o javadoc inteiro. Sempre.

What are the real dangers of copy paste coding that can impact their competency?

Regra 1: O software é apenas conhecimento codificado.

Se não há conhecimento por trás do software, é um lixo aleatório que parece funcionar para alguns exemplos. Não há valor nisso.

    
por 28.06.2011 / 19:25
fonte
14

Na verdade, é uma boa ideia saber o que seu código está fazendo. Eu recomendaria a leitura de Código Completo

Widely considered one of the best practical guides to programming, Steve McConnell’s original CODE COMPLETE has been helping developers write better software for more than a decade. Now this classic book has been fully updated and revised with leading-edge practices—and hundreds of new code samples—illustrating the art and science of software construction. Capturing the body of knowledge available from research, academia, and everyday commercial practice, McConnell synthesizes the most effective techniques and must-know principles into clear, pragmatic guidance. No matter what your experience level, development environment, or project size, this book will inform and stimulate your thinking—and help you build the highest quality code.

Discover the timeless techniques and strategies that help you:

  • Design for minimum complexity and maximum creativity
  • Reap the benefits of collaborative development
  • Apply defensive programming techniques to reduce and flush out errors
  • Exploit opportunities to refactor—or evolve—code, and do it safely
  • Use construction practices that are right-weight for your project
  • Debug problems quickly and effectively
  • Resolve critical construction issues early and correctly
  • Build quality into the beginning, middle, and end of your project...
    
por 09.06.2013 / 13:48
fonte
6

Quando estamos falando de copy paste programming como uma prática ruim, queremos dizer que a programação de copiar e colar é feita com preguiça. Em vez de programar uma classe base adequada para eliminar o cheiro do código, alguns apenas violam DRY devido à preguiça. Além disso, ele apresenta muitos bugs, porque você tende a ignorar as diferenças sutis do caso de uso e não aplica as alterações necessárias. Isso é principalmente porque é considerado uma prática ruim.

Eu não acho que geralmente é uma prática ruim pegar um pedaço de código aqui e ali da Internet. Mas eu acho que é uma prática ruim quando você pega um pedaço de código que você não entende, quando você introduz um código em seu software que ninguém consegue manter.

Além disso, basta olhar para sites como The Code Project . Todo artigo fornece uma solução para um problema. A maioria das soluções é muito boa. Mas quando eu reviso a implementação, cada segundo ou terceiro deles me faz querer vomitar, e eu não permitiria que tal pedaço de código aparecesse em meu software.

    
por 10.05.2014 / 22:58
fonte
6
  • Todo bom profissional em qualquer campo copia o que foi criado por outras pessoas nesse campo.
  • Por que eu deveria reinventar a roda eu mesmo se houver uma que já atenda às minhas necessidades?
  • Reutilização de código é o Santo Graal, usamos bibliotecas, componentes, projetos de código aberto extensivamente; por que devemos rejeitar esta forma particular, se funciona bem?
  • A programação de retalhos é um padrão muito produtivo, especialmente se o código copiado vier de uma fonte autoritativa ou tiver sido examinado por uma comunidade.
  • Se você não é bom em programação, então não é bom em copiar o código dos outros, isso é um fato.
  • Não se trata de copiar código dentro de um aplicativo, o que deve ser evitado o máximo possível.
por 10.05.2014 / 23:09
fonte
4

Isn't that what sites like Stack Overflow do anyway? People ask - OK, here is my problem - how to solve it? Now someone will post complete code and the person who asked the question would simply copy & paste the most voted answer.

Não é assim que vejo o site. Eu vejo isso como um lugar para obter ajuda, não para fazer seu trabalho por você.

Além disso, você sabe com que frequência as pessoas votam em respostas erradas? Muito.

Tudo o que posso dizer é: "Uau!"

    
por 10.05.2014 / 23:00
fonte
3

Você pode resolver alguns problemas fazendo assim. Mas nem todos os problemas; não vale muito a pena.

Além disso, é plágio.

Não há problema em reutilizar o código até certo ponto , mas certifique-se de que compreenda o código e que não viole os direitos autorais . Para a maioria das tarefas de programação comuns, bibliotecas, frameworks e kits de ferramentas existem, use-os quando disponíveis.

    
por 10.05.2014 / 22:54
fonte
2

A programação de copiar e colar apresenta dois problemas.

  1. há alguma preocupação sobre violação de direitos autorais, se você também muito disso.
  2. eventualmente um problema virá que você não pode resolver com programação copy-paste, quando isso acontece você não terá ganhou as habilidades necessárias para resolver por conta própria.

Além disso, para resolver pequenos problemas, a programação de copiar e colar pode ajudar a resolvê-los de maneira rápida e eficiente.

Uma nota final, obviamente, todos nós confiamos em outras pessoas para ajudar de tempos em tempos resolvendo problemas, se você dedicar um tempo para entender o código dado e implementá-lo, você terá aprendido algo e resolvido seu problema.

    
por 28.06.2011 / 17:35
fonte
2

Copiar e Colar significa duas coisas diferentes para mim. Uma é que você une outros exemplos de código para obter um programa. A outra coisa é que você está cortando / colando um monte de código repetitivo e modificando-o ligeiramente. Eu acho que até certo ponto estamos todos juntando exemplos de código, se não cortando / colando explicitamente então por memória. Na coisa de código repetitivo cortado e colado, é um custo versus recompensa. Para uma pequena quantidade de corte / pasta ou mesmo uma grande quantidade, se você não tem tempo para fazer isso direito, pode valer a pena fazer o corte e colar ... mas em geral, em algum momento com uma grande quantidade isso virá de volta para morder.

Nós todos copiamos / colamos programas. Um monte de código é placa de caldeira e assim são os algoritmos. Se você está escrevendo algo rápido, você não inventou. O mais provável é que você tenha memorizado uma implementação típica de algum lugar, seja uma palestra ou um livro. Você é uma espécie de copiar e colar programação. Às vezes você pode ler um artigo onde um algoritmo é apresentado e implementar o algoritmo no papel. Para mim, isso é copiar e colar programação também. Além disso, a maioria das bibliotecas é repleta de exemplos. Aka abre um leitor de buffer no java BufferedReader br = new BufferedReader (System.out); Tenho certeza que vi esse código em algum lugar, e se não o código exatamente .... a estrutura básica / padrão com meus próprios nomes substituídos ....... NET é muito bom para ter exemplos de código em toda a biblioteca. Se eu quiser abrir uma página da Web, procurarei a classe para fazer solicitações da Web e, em seguida, imitarei o exemplo de código. Às vezes você volta e ajusta mais tarde (por exemplo, você precisa configurar tempos limite), mas, em geral, você está basicamente indo pelo exemplo.

No geral, eu diria que a maioria dos programas é uma espécie de copiar / colar programas. Você começa com exemplos principais / algoritmos / etc. retirados da memória, livros, etc. e, em seguida, você modifica para atender às suas necessidades. Contanto que você entenda o que está costurando, acho que está tudo bem. Você não precisa entender tudo o que você está cortando e colando, exatamente, apenas em geral o que faz e quaisquer funções. É realmente como usar uma biblioteca, exceto que você também tem o código-fonte subjacente. Definitivamente vale a pena ir para as fontes certas e, em geral, se você pode obter um recurso de recortar / colar de exemplos de código ou uma biblioteca ... é melhor ir com a biblioteca, pois isso pode ser atualizado mais tarde.

A segunda coisa é apenas recortar / colar seu próprio código. Você tem um monte de código repetitivo, então você corta / cola e modifica. Grandes quantidades desta fazem uma bagunça para mudar, e também é muito entediante e entorpecente ... Às vezes a alternativa certa é usar outra abordagem, mas outras vezes cortar e colar é a melhor maneira de fazer o que você quer, em que Caso você deva criar um gerador de código para manipular o código repetitivo. Mas se é apenas algumas linhas ou uma coisa, pode não valer a pena. Recortar / colar código semelhante é geralmente mais rápido do que criar uma abstração complexa ou criar um gerador de código. No final do dia, se cortar e colar economizar horas e você está sob a arma para obter um produto antes de seu arranque vai de barriga para cima, então faça isso. Afinal, se você não enviar o código, você não terá um futuro. Mas basicamente tudo isso se torna dívida técnica que deve ser limpa mais tarde. É tudo sobre como entender a troca que você está tomando e administrar quando ela te morde. Por exemplo. Apresse-se que ele projete hoje para que você não saia do mercado, e acabe consertando-o na próxima semana, quando a duplicação tornar a adição desse novo recurso muito difícil ...

No geral, todos cortamos / colamos mentalmente para exemplos / algoritmos. E no segundo tipo é tudo sobre saber quando é apropriado e quando não é ...... Como qualquer ferramenta que você precisa para entender as compensações do que você está fazendo ....

    
por 29.06.2011 / 05:10
fonte
2

Por copiar e colar código, eu diria que é um trecho de código que é copiado / colado. Os snippets de código são principalmente para demonstração da ideia ou do algoritmo, não para produção real, pois podem não se alinhar ao seu contexto. Pior que isso, pode conter bug porque o autor do snippet de código pode nunca ter testado o código em si.

Exemplo da vida real? Sim, há muito e eu corri para um como no ano passado. Meu colega estava tentando fazer codificação / decodificação Base64 no iOS, e ele recebeu essa resposta

link

que mais tarde descobri que tem um erro desagradável aqui:

char *outputBuffer = malloc(outLength);
outputBuffer[outLength] = 0;

Bem, se você conhece bem o C, talvez consiga identificar o erro. O autor apenas malloc o buffer curto por 1 (mas ele ainda conseguiu obter 8 votos ..). Meu colega apenas ingenuamente usou este código para Base64 e funcionou bem mais do tempo. Isso causou tremenda dor de cabeça para toda a equipe, já que éramos muito iniciantes no desenvolvimento do iOS e o aplicativo acabou de cair do nada. Todo mundo verifica seu código de novo e de novo, inclusive eu, mas nunca descobrimos o que estava dando errado. Até que um dia, eu acho que o bug decide que deve aparecer. O aplicativo trava no simulador e eu recebo uma sugestão do rastreamento de pilha que está lá. Vi o bug, consertei e case fechado. Isso foi depois de muitas reclamações dos usuários finais que nosso aplicativo sempre falhava sem razão. O dano foi feito.

Então, onde está o mérito da história, você pergunta? O mérito é que o codificador é responsável por qualquer código enviado para a base de código, e um codificador ruim pode causar horas desperdiçadas para toda a equipe. Copiar e colar o código não é uma má ideia em si, mas muitos programadores simplesmente acreditam cegamente no que a internet diz e colocam o código lá sem validá-lo e sem entender o que ele realmente faz. Quando os bugs aparecem, a última coisa que eles pensam é que o bug está em seu código colado porque eles sempre pensam que os códigos da internet são melhores do que ele. Se você tem muitos colegas programadores fazendo código de massa na maioria das vezes, então seja avisado.

    
por 23.05.2017 / 14:40
fonte
1

O problema de trabalhar diretamente (e unicamente) a partir de uma referência da API, como o Javadoc, é que ele geralmente não fornece contexto suficiente para executar um fluxo de trabalho completo. Certamente é útil entender o que a API pode fazer e quais argumentos e métodos individuais estão disponíveis, mas colocar isso em um aplicativo não-trivial do mundo real é algo diferente.

Para o Javadoc especificamente, acho que apenas alguns javadocs do Sun / Oracle têm texto de visão geral suficiente para fornecer contexto (mas os próprios fornecem o mesmo código de copiar / colar). Na maior parte, mesmo a Sun / Oracle não fornece um contexto completo e é raro encontrar um Javadoc de terceiros completo e totalmente escrito.

Não acho que isso seja culpa dos criadores de Javadoc, e sim de que há uma incompatibilidade de impedância entre os métodos da API e os blocos de tarefas de nível superior.

    
por 28.06.2011 / 18:58
fonte
1

Você mencionou que todos os jovens programadores fazem isso; Isso deveria te dizer algo. Se estou construindo um protótipo, provavelmente farei isso algumas vezes porque estou aprendendo / tentando ver se algo vai funcionar. O problema é quando você acaba construindo tudo usando estratégias de nível júnior. Você acaba com um "Eu sempre fiz assim e funcionou". mentalidade e risco nunca crescendo com isso.

Se você quiser se tornar um programador melhor, precisará desenvolver alguma fluência. Até você aplicar e usar repetidamente o que aprendeu, isso é difícil de desenvolver. A quantidade de coisas que você precisa para o Google deve diminuir. Criar sua própria área de referência deve evitar procurar a mesma coisa repetidas vezes. Se você está fazendo isso, então você está criando uma grande cópia & colar violação. Provavelmente é pior copiar e colar seu próprio código.

    
por 28.06.2011 / 20:19
fonte
1

Minha opinião é que copiar e colar exemplos / soluções da web é uma abordagem válida ... como qualquer outra coisa, pode ser abusada.

Se você trabalha em qualquer idioma moderno, existe um tonelada de código que você copiou e que você não entende completamente (pelo menos, para 99% de nós). Eu não vejo rotineiramente o código fonte das bibliotecas de classes que eu uso. Eu não sei os detalhes de como o Array.Sort () é implementado. Eu tenho zero entendimento do que foi usado nos controles Infragistics que eu uso em meus aplicativos winForms.

Muitas pessoas têm uma objeção emocional ao copiar e colar código da Internet; mas não vejo porque é diferente. Por que adicionar uma função e lógica de encapsulamento que não me preocupei em escrever ou entender pior do que incluir uma referência a uma biblioteca e encapsular lógica que não me preocupei em escrever ou entender?

As pessoas dirão: 'Mas, mas pode ser um código ruim !' mas isso é verdade de qualquer biblioteca que você usa. Claro, com as bibliotecas padrão você pode esperar que elas tenham sido bem implementadas, mas nem sempre é o caso. Tudo o resto é apenas 'coisas' na internet. Qualquer um pode postar 'coisas'. Você pode 'meio' confiar em avaliações e classificações; mas sites como o SO permitem que as pessoas classifiquem snippets de código postados da mesma forma que o CodePlex e outros fazem.

Como desenvolvedores, podemos reconhecer uma diferença entre chamar uma biblioteca e o código que você colou. Seus usuários não irão. Eles não se importarão. Passei horas pulando por todos os tipos de aros porque um componente de terceiros que construímos nosso aplicativo tinha um vazamento de memória e acabaria por travar o aplicativo. O fato de que era a biblioteca de outra pessoa não tornou mais fácil de consertar (na verdade, sem dúvida, foi mais difícil porque eu não tinha a fonte).

Colar código não substitui saber como codificar. Mas saber codificar não significa que você não possa usar o código existente.

    
por 29.06.2011 / 01:29
fonte
0

Copiar e colar tem duas implicações, e ambas podem ser ruins.

Ao copiar o código de uma parte de sua própria base de código para outra parte, você está violando o princípio de responsabilidade única de < href="https://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29"> design de código SOLID ; Agora você tem a mesma linha de código que reside em dois lugares em sua base de código, e se uma dessas linhas de código mudar, você provavelmente terá que encontrar e alterar a outra (SE você ainda se lembrar que está lá). Você precisa se perguntar por que precisa do código em dois lugares e se há algo que possa fazer para manter o código em um único lugar enquanto o utiliza de dois outros locais.

Copiar e colar uma linha de código é quase sempre um sinal de que o código deve ser extraído em um método, ou colocado em um loop, permitindo que seja acessado remotamente e / ou iterado.

Copiar e colar de um site ou blog não é, em si, inerentemente ruim; é o código de trabalho que você está adotando para seu uso sem reinventar a roda. No entanto, é essencial que você entenda o código que está copiando, porque, se você não entender como e por que, será difícil manter esse código. Além disso, por melhor que funcionem, existem alguns trechos de código realmente mal desenhados, que se copiados e colados se tornarão um pesadelo apenas em virtude de seu layout e arquitetura.

    
por 10.05.2014 / 23:05
fonte
0

Esse tipo de codificação é chamado de programação de cultos de carga . Como desenvolvedor de Ruby on Rails em uma empresa muito profissional, tivemos que lidar com vários projetos que os clientes nos pediram para refatorar, depois de outro empresa tinha conseguido estragar-se desta forma.

Na programação Ruby on Rails (ou programação web em geral) este é um mau hábito, talvez causado e auxiliado pelo uso geral de muitas ferramentas e plugins e pela grande quantidade de exemplos de código e tutoriais disponíveis. Você acabará com um código que não tem significado no contexto de seu projeto específico e com código que depende de funcionalidades que você não entende, não pode alterar nem depurar.

Mesmo os plugins que devem ser incluídos dessa maneira podem falhar. (Lembre-se de que uma versão inicial de acts_as_taggable é executada em um loop infinito quando você tenta excluir uma tag). O código publicado na Web raramente é testado, mesmo dentro do contexto em que foi escrito, menos para as suas necessidades especiais.

Isso é claramente o lado negro da força. Você não quer isso em seu projeto.

    
por 10.05.2014 / 23:07
fonte