A maioria dos programadores copia e cola código? [fechadas]

48

Aprendi muito cedo que cortar e colar o código de outra pessoa leva mais tempo a longo prazo do que você mesmo escrever. Na minha opinião, a menos que você realmente entenda, o código de recortar e colar provavelmente terá problemas que serão um pesadelo para resolver.

Não me entenda mal, quero dizer, é essencial encontrar o código de outras pessoas e aprender com ele é essencial, mas não o colamos apenas em nosso aplicativo. Nós reescrever os conceitos em nosso aplicativo.

Mas eu estou constantemente ouvindo sobre as pessoas que recortam e colam, e elas falam sobre isso como se fosse uma prática comum. Também vejo comentários de outras pessoas que indicam que é prática comum.

Então, a maioria dos programadores recorta e cola código?

John MacIntyre
fonte
10
Mesmo se eu souber fazer algo, muitas vezes procurarei exemplos de código para as práticas recomendadas. Depois de ler o código, você pode dizer rapidamente se o que você encontrou é melhor do que o seu plano.
Nicole
Houve uma pergunta sobre cortar e colar recentemente. Por que você não confere ?
Naurgul
Se eu entendi.
johnny

Respostas:

46

Dois casos gerais:

De um projeto para outro:

A maioria dos programadores recorta e cola código nessa capacidade. Eles podem encontrar um projeto anterior ou algo online e copiar / colar exatamente ou copiar / colar e fazer alterações nele. Eu acho que essa prática normalmente é boa. Isso é especialmente bom quando é um código comprovado. (Exemplos: algum tipo de objeto utilitário de um projeto passado que funcionou bem ou possivelmente de um blog com poucas alterações necessárias). Onde isso pode ser ruim, é quando você está copiando um código que não entende, ou onde o código é ruim, ou onde existe uma solução alternativa muito melhor do que o código que você está colando.

Dentro do mesmo projeto: copiar e colar no mesmo projeto normalmente não é uma boa ideia. É um mau cheiro que o código que está sendo copiado deve estar apenas em um método / classe em algum lugar e chamado repetidamente. Existem algumas exceções, mas geralmente o programador deve estar pensando: " Existe uma maneira de parametrizar esse código que estou copiando? ".

jzd
fonte
5
Geralmente isso é verdade, a menos que você esteja escrevendo um código que exija padrões antipadrões, como pode ser o caso do código antitampering, como no licenciamento de software.
Rob Perkins
+1 Sim, eu fiz as duas coisas. Eu não colo e colo código de dentro do mesmo projeto há muito tempo (embora eu confesse que raramente o faço sob extrema pressão com o bug registrado para retornar a ele). Quanto às classes de utilitário, meu projeto para projetar cópia agora está isolado para copiar arquivos completos.
precisa saber é o seguinte
2
Ao escrever o código do banco de dados, costumo recortar e colar parte dele em uma nova função e modifico o próprio sql para obter o resultado desejado e não preciso me preocupar em digitar novamente alguns dos pré-requisitos para fazer as chamadas de banco de dados. Embora, em geral, concorde com as duas observações.
Chris
11
@ Chris: Copie e modifique o coração dele é muito diferente do que simplesmente colá-lo como está.
Loren Pechtel
11
@ Loren Pechtel: No entanto, ainda envolve o ato de copiar e colar código.
Chris
37

A maioria dos programadores faz isso, mas isso não significa que você deva

Um dos meus mantras de programação é: "Se estou copiando e colando código, estou fazendo algo errado" . Essencialmente, SECO .

Eu acho que deveria ser óbvio que a reutilização de código significa usar o código como um recurso, não repetir o código. Às vezes, copiei e colei o código com meu próprio código; na maioria dos casos, termino com código de placa da caldeira ou coisas que parecem realmente semelhantes.

Depois de investir mais tempo com esse código, acabo com o seguinte:

  • Um componente (consulte também: separação de preocupações )
  • Posso recorrer à reflexão para tornar as coisas mais simples, mais limpas e mais fáceis de repetir no futuro.
  • Um design melhor , porque, mesmo que funcione, por que não fazer tudo de novo depois de aprender as lições?
  • Um padrão que posso abstrair, transformar em um componente de biblioteca e remover código duplicado.

Pode ser discutível se devemos ou não copiar e colar código, já que o cliente / chefe não se importa (pelo menos diretamente e a curto prazo) e você pode terminar com os mesmos resultados, mas o problema realmente ocorre leva a erros, perda de modularidade e, finalmente, um inferno de manutenção.

O que você deve fazer: refatorar o mais rápido possível

Ninguém escreve código perfeito, mesmo que funcione, mesmo quando você não está copiando e colando e é o seu próprio código, se você não estiver satisfeito com isso, basta colocar uma nota nos comentários (por exemplo, um docblock "@todo") para lembrar você mesmo o que refatorar e por que ... mesmo que você não refatore você mesmo, isso pode se tornar a diferença entre felicidade e frustração total para o mantenedor.

Eventualmente, você terminará com um bom código no final, mesmo se você copiar e colar.

Good Code

via XKCD

dukeofgaming
fonte
15
Eu já vi muitas vezes "refatorar mais tarde" se transformar em "refatorar nunca", ou pior ainda: "Eu sou tão excitante que outro SUGADOR pode refatorar e consertar meu código quase, mas não tão bem assim". Acredito em fazê-lo logo no início, porque senão é como amanhã - nunca chega.
precisa saber é o seguinte
11
@quickly_now - re: "Eu sou tão excitante que outro SUGADOR pode refatorar e corrigir meu código quase-mas-não-muito-ok" ... Não posso expressar para você o quanto odeio esses idiotas.
precisa saber é o seguinte
Hey John. Eu te escuto. Passei anos da minha vida sendo tão idiota ... paguei metade e suei até meia-noite, entendendo muito bem o que estava acontecendo (e reescrevendo grandes pedaços de código porcaria) - enquanto a cena quente estragava tudo algo mais. Suspiro.
precisa saber é o seguinte
11
Quanto mais pessoas na equipe, mais "refatorar mais tarde" se torna "nunca refatorar" tanto quanto eu podia ver: /
wildpeaks
8

Quando estou parado e procuro coisas para resolver meu problema e deparei com algum trecho útil de código que faz o que eu quero, copio-o naturalmente. Às vezes é apenas a essência disso. Depois, mudo para atender às minhas necessidades. Isso acontece com mais frequência quando me aprofundo em coisas nas quais não sou especialista (atualmente, Objective-C).

Eu sempre dedico um tempo para aprender algo com o código, portanto, para mim, é uma ótima maneira de aprender e evitar reinventar a roda.

Martin Wickman
fonte
4
Eu sempre disse 'um bom desenvolvedor é um desenvolvedor preguiçoso'. Não reinvento a roda se alguém já o fez. Mas eu o mantenho pequeno ... nunca copio mais do que algumas linhas de código e nunca nada que não entenda completamente.
morganpdx
Sou a favor de aprender com os outros, mas você não acha que, a menos que esteja procurando por um problema específico, apenas compreender o que a outra pessoa fez consome mais tempo do que apenas fazê-lo do zero? (aviso que estou falando 'código', e não unidades completas de funcionalidade como classes, etc ...)
John MacIntyre
@ John MacIntyre Poderia ser, mas geralmente quando eu coloco um pequeno trecho de código, eu o moldo até ficar satisfeito. Muitas vezes, ele precisa ser adaptado (em uma função, mais genérica, aprimorada, otimizada etc.) de qualquer maneira.
Martin Wickman
@ John: trechos de código fornecem as peças que mostram como fazer as coisas. Claro, corte e cole. Mas, como Martin aponta - aprenda o que esse código está fazendo. Você passará muito mais tempo pesquisando um método específico do qual não saiba o nome. Quando você não sabe o que significa uma palavra; você procura no dicionário. As definições são 100% claras; mas com que frequência você olha as amostras de uso? Exemplos de código são como exemplos de uso de dicionário. O MSDN nem sempre inclui exemplos de uso ou geralmente é incompleto.
iAbstract
6

Vou falar sobre copiar / colar o código de outras pessoas aqui. Pegar partes do meu próprio trabalho da minha biblioteca pessoal é um jogo justo. Eu os conheço e os entendo por definição.

Acho que a situação mais frequente em que "corro e colo" o código é quando tenho um problema específico e encontro uma postagem de blog que o resolve. Na maioria das vezes, redigito a solução no meu projeto (afinal, provavelmente está escrito no estilo do autor do blog, se nada mais). Não é realmente o meu código, mas não me sinto mal por usá-lo nesse cenário.

Sair e pegar métodos ou sistemas inteiros para colá-los no meu projeto como está e concluí-lo é algo que não entendo. Havia uma pergunta no StackOverflow outro dia que ilustrava perfeitamente o problema de se fazer algo assim.

Juntar um monstro Frankenstein de diferentes partes do código não pode ser tão eficiente assim. Quero dizer, se você é bom nisso, significa que você está replicando a mesma solução repetidas vezes ou obteve uma compreensão suficiente do código de outras pessoas para que o mesmo nível de cópia / colagem não seja mais necessário e seu a produtividade melhoraria se não fosse necessário resolver problemas entre amostras de código incompatíveis.

Eu pessoalmente não conheci muitos programadores que copiam / colam em larga escala. Já vi muitos que se codificam nos cantos mais profundos e escuros, mas essa é uma história diferente. Com base em meus dados pessoais, eu diria que a maioria dos programadores não copia / cola aplicativos inteiros juntos, mas é realmente difícil dizer com certeza.

Adam Lear
fonte
11
Talvez muitos programadores não copiar / colar código real em grande escala, mas eles serão felizes para alavancar uma biblioteca de ready-made (livre ou não) sem olhar uma única linha de código ...
hplbsh
11
@ Stuart True, mas acho que a distinção é que essa biblioteca não seria reivindicada como obra do programador. E honestamente, desde que a biblioteca funcione e faça o que eu preciso fazer, também não me importo em debruçar-me sobre sua fonte. (Supondo que seja feita a devida diligência sobre a reputação / confiabilidade da biblioteca, em primeiro lugar.)
Adam Lear
De certa forma, é uma questão de intenção, tanto da parte do editor e o consumidor :)
hplbsh
@ stuart - Eu não incluiria uma biblioteca nesta discussão, pois é uma unidade coesa ... não realmente 'perdemos' o código, se você entende o que quero dizer.
precisa saber é o seguinte
Na verdade, pensando nos seus comentários, sinceramente tenho que me perguntar se é possível para um programador cortar e colar um sistema completo juntos. Acho que o peso de sua arrogância rapidamente avalanche, esmagando seu progresso a uma paralisação.
precisa
4

Ruim: copiar e colar o mesmo bloco de código repetidamente

Se você se encontra fazendo isso, provavelmente deve levar um segundo para pensar sobre o que pode ser extraído do código que está sendo copiado e criar uma função / método para lidar com isso. É aqui que o princípio DRY (não se repita) conta.

Bom: copiar um bloco de código conhecido por funcionar

DRY (Não se repita) também se aplica aqui, apenas em um sentido diferente. IE, não repita o trabalho que você já fez no passado. Se você reservou um tempo para escrever uma seção do código, depure-a, teste-a e comprovadamente funcione em uma base de código de produção; você seria burro para não reutilizá-lo.

A maioria das pessoas dá uma má reputação ao copiar e colar, porque muitos programadores iniciantes passam seu tempo vasculhando a rede e copiando / colando uma mistura do código de outras pessoas sem entender o que realmente faz.

Escrever tudo do zero sempre não é melhor. Eu sei que existem muitos programadores puristas da velha escola que sabem que tudo deve ser escrito do zero e espero não ficar preso trabalhando com eles. Se você tem 5 anos de experiência em programação, deve ter uma biblioteca de códigos bastante substancial, ideal para reutilização. É um dos melhores ativos que um programador experiente pode trazer para a mesa, pois potencialmente economizará muito tempo de desenvolvimento.

Se você não entender com o seu código antigo, a princípio, reserve um momento para ler os comentários e se familiarizar novamente. Se seus comentários forem ruins ... bem, isso é outra questão.

Evan Solha
fonte
Em vez de copiar e colar código, é perfeitamente possível escrevê-lo de maneira reutilizável. Em seguida, use isso em vez de copiar e colar.
Bjorn
11
@BjornTipling Sim, é geralmente preferível a quebrar o código para baixo em funções reutilizáveis, a menos que esse processo aumenta a complexidade eo código nunca será reutilizado
Evan Solha
Se você está copiando e colando, está reutilizando. Concordo que as pessoas devam usar a cabeça e que as condições o justifiquem. Eu me vi copiando e colando ao escrever testes, mas mesmo lá eu tento criar funções reutilizáveis, mas existem duas ou três linhas quase iguais, mas não posso generalizá-lo o suficiente para se transformar em um função reutilizável.
Bjorn
3

Após 25 anos escrevendo código, houve momentos em que (sem acesso ao código que escrevi para um empregador anterior) desejei poder recortar e colar. No entanto, isso tem sido muito raro (e continue lendo).

Talvez o melhor exemplo seja um analisador de linha de comando realmente simples que me deparei anos atrás para sistemas operacionais unix. Um loop simples percorrendo os argumentos e processando as opções. Era incrivelmente simples e elegante, e eu usei isso (mais como um padrão do que como um recorte e colar literal) muitas vezes desde então. Esta é a exceção e não a regra.

Normalmente, um simples recorte e colar é completamente inapropriado - é mais recortado e colado o conceito, ou algoritmo, que tem sido importante.

Não estou muito orgulhoso - vou procurar com facilidade um algoritmo de verificação de código de paridade ou impedimento muito rápido ou algo exótico assim. Depois, passe algumas horas entendendo para ver se realmente é a coisa super rápida que eu estava procurando, ou uma pilha ingênua de lixo.

Preocupo-me sempre que alguém simplesmente copia o código sem fazer uma pausa para entendê-lo. Eles são um gênio (entenda tudo e todas as suas sutilezas de relance) ou um tolo. Não há muito espaço para nada no meio. Ah, e também não existem muitos gênios verdadeiros.

Sem entender, você realmente não tem idéia do que acabou de lançar REALMENTE, sob não apenas as circunstâncias felizes, mas também as infelizes ou condições de entrada. Às vezes isso não importa, porque você tem sorte. E às vezes isso causa muita dor a longo prazo.

rapid_now
fonte
4
Por outro lado, existem programadores que escrevem o código de si e ainda não entendê-lo ...
hplbsh
3

Há uma situação comum em que você basicamente precisa fazer isso para ser produtivo.

É difícil aprender qualquer tecnologia desconhecida para você, a menos que você tenha um exemplo de trabalho para começar. Portanto, você copia e cola isso para ter algo que realmente seja executado e depois começa a mexer nele.

user1249
fonte
Correção: Existe uma crença real em que você basicamente pensa que PRECISA fazê-lo para ser produtivo. Portanto, você copia e cola seu caminho para liberar algo que de alguma forma funciona e gasta enternidade sofrendo seu caminho para reparar os danos.
Newtopian
3

Como novo programador (quatro meses após o meu primeiro emprego), conto com bastante ajuda (seja em SO ou em outros lugares). Faço questão de NÃO copiar e colar cegamente o código de outros. Mesmo que o código fornecido seja o que eu usarei, digitá-lo-ei no meu programa e, em seguida, dedicar um pouco de tempo para garantir que eu entenda completamente o que ele faz e os motivos.

Quero garantir que estou aprendendo constantemente e não apenas um especialista em recortar e colar

Darren Young
fonte
1

Eu tenho muitos sentimentos sobre esse tópico, e não posso dizer honestamente que algum deles seja inteiramente objetivo.

Existem muitos argumentos para cortar e colar o código de outras pessoas no seu aplicativo. Alguns deles podem fazer sentido, outros não. Por exemplo, se você tem um método no blog de alguém que recebe uma entrada e executa algum algoritmo matemático complicado que está muito além de suas habilidades matemáticas e cospe um resultado - esse é um argumento para cortar e colar - obtenha a permissão do autor para usar seu código e credite-os onde for devido - é a coisa honrosa a se fazer.

Existem argumentos para não reinventar a roda - novamente, isso faz sentido, em teoria. Mas se você não reservar um tempo para se familiarizar intimamente com o código que está cortando e colando, não saberá se há uma maneira melhor de resolver esse problema, não saberá se há bugs no código . E se a roda que você está colando estiver quebrada?

Existem argumentos para velocidade e eficiência - você cria uma biblioteca de códigos de outras pessoas que você roubou, roubou, plagiou ou não, pensou nisso; talvez você nem precise saber como programar além de Frankensteining. juntos a partir de peças recuperadas.

Há momentos e lugares em que considero esse comportamento completamente aceitável. Para hackear ferramentas rápidas e descartáveis ​​que não são projetadas para a longevidade, mas para realizar uma tarefa, agora por gancho ou por bandido. Com o objetivo de criar protótipos e estudar as novidades, aprender e avançar em um contexto teórico, acho que este é um jogo completamente justo.

Cortar e colar o código de outras pessoas é plágio - se você tem a bênção deles e entende o código que está colando e ele se encaixa na construção dos padrões de codificação para seu aplicativo, tudo bem, admito que é um jogo justo.

Como engenheiro de software profissional, estou sendo pago para manter um padrão e um código de ética. Não estou sendo pago para roubar, plagiar ou infringir os direitos autorais de outras pessoas, colocando meu cliente em risco de ser processado. Além disso, existe um risco muito real de que, quando você executa o código cortado / colado, ele tenha efeitos colaterais catastróficos.

Não visando essa resposta para você, John, eu sei que você é muito eticamente inclinado quando se trata de tópicos como esse, então isso é realmente apenas um discurso geral na direção da pergunta em si.

Adendo : Dito isso, acho que cortar e colar seu próprio código entre projetos é bastante aceitável - a menos que tenha sido escrito como trabalho contratado por outra pessoa; nesse caso, você não possui os direitos autorais e deve obter a permissão da pessoa para a qual você o codificou. Descobri que, a menos que o código seja pertinente aos conceitos funcionais proprietários, a maioria dos empregadores concorda com você reutilizar suas próprias idéias para outros clientes.

BenAlabaster
fonte
Qual é sua opinião sobre o uso de código de postagens de blog que resolvem um problema específico que você está tendo? É copiar / colar fisicamente o código que você considera uma violação da ética ou redigitar a solução em seu projeto se enquadra na mesma categoria? O tamanho do código "emprestado" (ou seja, um programa / função completo versus um pequeno trecho) afeta sua opinião?
Adam Lear
2
Eu sinto que, se estiver em um post do blog, o autor pretendeu que fosse público; portanto, se for útil para você, é um jogo justo. No entanto, dificilmente encontrei trechos de código que pudessem ser copiados literalmente. Eles geralmente exigem um pouco de pagamento.
pemdas
Não tenho problema com o código de tutoriais ou postagens de blog sendo usado - apenas entenda o que ele faz. Presumivelmente, se foi publicado, está disponível.
precisa saber é o seguinte
"Não estou direcionando esta resposta para você, John" ... Na verdade, eu não pensei que você estivesse ... bem, pelo menos não até ler isso de qualquer maneira. LOL
John MacIntyre
Gosto dos seus comentários sobre plágio e da compreensão completa do código, mas você realmente acha que é mais eficiente copiar / colar o código de outra pessoa do que simplesmente escrever você mesmo? Acho que você não o entenderá totalmente e terá problemas mais tarde, OU suas tentativas de entender completamente levarão mais tempo do que apenas escrever você mesmo. KWIM?
John MacIntyre
0

Se o código estiver bom, em vez de copiar e colar, ele deve ser transformado em uma biblioteca comum. Mas as pessoas não podem se incomodar com a refatoração e preferem ter a mesma funcionalidade distribuída por cópia e método.

Em vez de ter uma lei absoluta universal de copiar e colar é bom ou ruim, deve-se ver quando usá-lo.

Os profissionais para copiar e colar são: Acelera rapidamente Os contras são: O mesmo código está espalhado em vários locais e qualquer problema encontrado / resolvido precisa ser resolvido em todos os lugares, se em vez de copiar e colar um o usou como biblioteca comum, a atualização será propagar em todos os lugares. Para um pequeno investimento inicial de usar uma biblioteca em vez de espalhar o mesmo código em todos os lugares.

A escolha é economizar um pouco de tempo inicialmente comparado a muito mais tarde; copiar e colar é o caminho a seguir; caso contrário, refatorar e colocá-lo em uma biblioteca comum.

Arjang
fonte
Definitivamente, concordo com a biblioteca comum, mas você deve recortar e colar esse código ou criá-lo do zero?
precisa
A maneira mais rápida de importar código é copiar e colar, mas é preciso revisar e, se necessário, modificar o código antes de inseri-lo em um projeto e esquecê-lo.
Arjang
0

Na maioria dos casos, o código que você encontrará na rede não se ajusta exatamente aos seus propósitos.

O que me vejo fazendo muito é copiar código de alguém, reduzi-lo até a essência e, em seguida, adicionar código até que ele atenda aos meus requisitos. Eu sempre refatorá-lo para corresponder às minhas convenções de nomenclatura e estilo de codificação.

Eu pessoalmente odeio quando leio um tutorial e eles começam mostrando o código para um caso complicado. Comece com a essência e mostre os blocos de construção para estender o código. Se eu começar um blog próprio, fornecerei às pessoas um exemplo de código comentado que mostra a essência do que eu quero fazer, como você pode adicionar funcionalidades / casos especiais e um exemplo completo do recurso básico.

J. Maes
fonte
-1

Por que reinventar a roda se você entende o que o código está fazendo, tem permissão para reutilizá-lo (ou está aberto) e você não precisa necessariamente de todo o código que a outra pessoa escreveu. Geralmente copio uma implementação de algoritmo e a modifico de acordo com minhas próprias necessidades. Normalmente, quando apenas recordo e colo, é porque não preciso de tudo o que estava no exemplo, portanto, adicionar outro arquivo seria apenas um desperdício (ou é algo dentro de uma função). Concordo com o jzd se você está cortando e colando seu próprio código no mesmo projeto, então há algo errado e você provavelmente deve descobrir uma maneira econômica de liberá-lo ou compartilhar a função.

scrappedcola
fonte
-1

Acho que os membros da equipe de " integração " ou aqueles que não têm tanta experiência com código ou em programação tendem a copiar e colar com mais frequência e não entendem o que fizeram (entrando nos problemas mencionados em sua pergunta).

Também acho que os programadores geralmente ficam longe do cut & paste para seu próprio desgosto, porque amam o código e muitas vezes reinventam a roda, apenas porque desejam melhorá-lo ou aprender mais.

John K
fonte
+1 para a reinvenção. Também me encontro muito tempo reescrevendo código da Internet, em vez de copiar e colar. Acho que faço isso porque não estou restrito a prazos. Eu posso aprender livremente sozinho e posso aprender o que e quando quiser.