Qual é uma maneira boa e concisa de explicar os perigos da programação copiar e colar para não programadores? [fechadas]

27

Estou procurando uma boa analogia ou metáfora que possa ilustrar os problemas da programação copiar e colar para não programadores. Ocasionalmente, faço revisões de código / sistema para clientes em potencial e um dos problemas comuns que vejo são grandes quantidades de código de copiar e colar em todas as suas bases de código. É algo que eu costumo mencionar nas revisões e sempre que preciso explicar por que isso é um problema (isso é especialmente difícil com clientes que sabem o suficiente sobre programação para entender que a reutilização é uma coisa boa, mas não o suficiente para entender por que copiar e colar não é uma boa forma de reutilização). Obviamente, eu posso (e faço) explicar o problema em termos de manutenção de código, mas seria bom ter uma analogia boa e concisa para esse problema que chegaria em casa com os não programadores. Bônus se a analogia ilustrar por que a pesquisa e substituição não é uma solução eficaz para esse problema. Alguma sugestão?

Apenas para esclarecer (com base na resposta de Jaroslav abaixo) - não estou falando sobre o uso de trechos de código aqui; o que vejo (com frequência perturbadora) é copiar e colar vastas faixas de código ou um pedaço de código de dez linhas para obter alguns dados do usuário (completos com consulta SQL embutida) colados em dezenas de páginas PHP ou ASP.NET. Portanto, duplique o código de outras partes do mesmo projeto.

Atualização: Existem várias respostas realmente boas aqui; Expliquei nos comentários por que escolhi a resposta de Scott Whitlock, mas também recomendo vivamente a resposta de whatsisname se você estiver lidando com clientes familiarizados com a fabricação.

EZ Hart
fonte
Hummm, isso é difícil. Ele não traduz bem a analogias clássicas carro / construção / fábrica .....
Whatsisname
3
Imagine ter referências ao partido republicano e democrata no direito comum dos EUA e renomear um dos partidos enquanto adiciona um terceiro ... muitas das leis terão que ser reescritas.
Job
Que tal a analogia de: código de copiar-colar (inseguro, mal estruturado etc.) que você não entende dos wikis, fóruns etc. é como abrir anexos de e-mail (vírus, spywares, spams etc.) de terceiros?
sakisk 29/03
@faif: O código copiado e colado não é necessariamente um código de lixo. Poderia ser um bom código o cara no escritório ao lado de você escreveu. O problema com o código copiado e colado é que ele rapidamente se torna um pesadelo incontrolável de manutenção / depuração.
Whatsisname
1
@faif: então zap seção entre parênteses
Whatsisname

Respostas:

36

É assim ... você tem um relógio em sua casa. Ótimo! Você sabe que horas são, mas você sempre precisa ir àquele quarto para olhar.

Mas é claro que você quer saber que horas são sem ir a essa sala o tempo todo, para comprar mais alguns relógios e distribuí-los pela casa. Cada um desses relógios é independente. Todos eles mantêm seu próprio tempo. Isso significa:

  • Quando o horário muda devido ao horário de verão, é necessário alterar todos eles
  • Mesmo quando estão prontos, são todos um pouco diferentes e raramente concordam perfeitamente. Com o tempo, eles flutuam.

Agora imagine o mesmo problema em uma grande instalação com dezenas ou centenas de relógios. É por isso que você precisa de algo como esse relógio em rede que se mantém sincronizado com uma base de tempo central. Dessa forma, o tempo é definido uma vez e apenas uma vez .

A programação copiar e colar é como comprar relógios mais independentes. Não escala.

Scott Whitlock
fonte
1
Eu escolhi essa resposta porque acho que funciona melhor para as situações em que geralmente estou - a maior parte do software que eu olho é para pessoas do setor de serviços, e as analogias de fabricação costumam ser difíceis de entender. Mas praticamente todo mundo tem vários relógios em casa. Também gosto porque posso usar o fato de que cada um dos relógios de sua casa provavelmente possui um processo diferente para alterar o tempo (e é rápido / lento em uma quantidade diferente) como uma maneira de explicar por que a busca e substituição não é possível. é uma opção para manutenção do código de copiar e colar.
EZ Hart
38

Imagine que você está projetando uma aeronave. Você tem um jato de motor único. Vende bem. Agora você vai projetar uma aeronave de 4 motores para longas viagens pelo oceano.

Agora, você não cria um conjunto completo de especificações e desenhos de engenharia para cada mecanismo individual, cria? Não, você usa o mesmo mecanismo nos quatro lugares. Agora imagine se você tivesse 4 conjuntos de desenhos e tivesse que mudar alguma coisa. Agora você deve alterá-lo nos quatro desenhos do motor. O que acontece se você esquecer acidentalmente de mudar algo no quarto mecanismo, porque estava se afastando?

Digamos que você esteja alterando o comprimento de um parafuso ou rosca de um tubo. Agora você não pode simplesmente "pesquisar e substituir" em seu banco de dados de desenhos de engenharia; pode acidentalmente alterar os parafusos de montagem nas bombas de combustível, porque elas têm o mesmo tamanho. Ou a linha hidráulica que alimenta o leme da cauda usou a mesma rosca, mas agora é diferente e você não pode mais acionar a cauda.

Agora imagine que você é incomodado pelo NTSB porque seus motores lançam pás de turbinas aleatoriamente e explodem enquanto voam para o sul da Flórida. Agora, para quais desenhos de motores você olha? Todos eles, um deles? Como você sabe que todos os quatro são iguais? Talvez as correções sejam feitas, mas são aplicadas apenas ao motor um, porque o cara que projetou os motores deixou um ano para tocar em uma banda de reggae e foi o único que lembrou que os quatro motores estão em arquivos separados. o cara que consertou a turbina explodiu foi o seu substituto.

Copiar e colar código é análogo a desenhos duplicados de peças componentes, sejam parafusos ou motores. Você deseja abstrair os componentes em partes fundamentais que são reutilizadas o máximo possível.

Não duplique os motores, basta escrever o código que monta os motores na asa.

whatsisname
fonte
11
Agora, imagine que você acha que o mecanismo número 4 é diferente dos outros três. Essa diferença foi intencional? Foi projetado para combater um determinado problema de torque causado pela viragem para a esquerda imediatamente após a decolagem? Ou foi um erro ao copiar?
David Thornley 29/03
5
Grande analogia ... mas se alguém tem dificuldade cópia compreensão / colar motores a jato código ... pode ser tão difícil :)
Steven Evers
Você deve falar sobre foguetes de combustível sólido em vez de motores a jato para essa analogia. Dessa forma, você pode terminar com "Viu? Assim como na ciência dos foguetes".
detly
Isto não é uma analogia. As plantas são literalmente código para artefatos mecânicos.
intuited
7

Você precisa explicá-lo em termos de compartilhamento do mesmo recurso versus duplicação do mesmo recurso.

Por exemplo, faria sentido para cada casa em uma cidade grande ter uma estação de energia dedicada fornecendo eletricidade para a casa ou faria mais sentido que cada casa compartilhe a mesma estação? Se algo der errado com um componente específico usado na (s) usina (s) e for necessário fazer reparos, seria mais fácil fazer os reparos em um só lugar e todos se beneficiarão com esses reparos, em vez de fazer os reparos em cada usina dedicada e somente em cada casa beneficia individualmente.

Bernard
fonte
7

"Ei, olhe, toda cirurgia é um pouco semelhante, certo ?, então você não se importaria se eu copiasse aleatoriamente instruções cirúrgicas para procedimentos diferentes de diferentes cirurgiões para sua operação?"

Noite escura
fonte
1
Ótimo!!! A cirurgia é feita com facas, certo? Deixe-me usar uma faca de açougueiro para fazer uma cirurgia no cérebro.
Aditya P
1
@AdityaGameProgrammer: Quando a única ferramenta que você tem é uma faca de açougueiro, tudo parece um presunto.
Joey Adams
6

Copiar e colar é como tentar fabricar peças sem molde. É lento, e você poderá usar uma única vez cada peça, uma vez que, quando estiver com defeito ou quebrado, não será possível consertar o molde para criar um substituto adequado.

Na busca por uma analogia, primeiro temos que considerar os perigos da programação de copiar e colar :

  • Erros introduzidos porque a cópia não é adequada (variáveis ​​e caminhos de código desnecessários não limpos)
  • Aumento dos requisitos de teste - a abstração ajuda a remover a necessidade de testes de regressão, pois você testa apenas o que mudou e apenas as folhas, não as ramificações.
  • A duplicação duplica tudo, incluindo os erros. Toda correção de bug ou recurso que se aplica a ambas as seções do código agora custa o dobro da implementação e há uma alta probabilidade de esquecê-la completamente.
  • A pesquisa e substituição agrava o problema acima, pois você não consegue encontrar facilmente o código duplicado.

A principal arma na luta contra a programação de copiar e colar é a abstração . Portanto, para encontrar uma boa analogia, procure exemplos de abstração no mundo ao nosso redor.

A abstração baseia-se na idéia de definir definições e, em seguida, continuar usando essas definições em execução. Como seria o mundo sem definições?

  • As definições são uma parte essencial da linguagem jurídica. Imagine um contrato que não tivesse definições básicas, mas que fosse totalmente definido a cada termo toda vez que fosse usado.
  • Definições e modelos são usados ​​na construção. Um problema comum na construção é fazer cada novo corte com base no último, em vez de em uma única medição feita no início. Isso pode resultar em comprimentos muito variados ao longo do tempo.
  • A organização da empresa é baseada em resumos e definições. E se toda vez que sua empresa tivesse que expandir, eles precisassem definir a nova função do zero? Isso não funcionaria. E se eles decidirem escolher apenas uma função semelhante e modificá-la levemente para se adequar. Todos estariam presos no lugar porque seria impossível movimentar recursos.

A cópia só tem um lugar quando a peça que está sendo copiada é permanente. Caso contrário, cada cópia cria uma ramificação totalmente nova para ser tratada - testada, mantida e atualizada separadamente.

A abstração combate isso amarrando todos os galhos em um tronco e isolando modificações em galhos menores ou até folhas.

Nicole
fonte
2
Gosto da analogia do molde, receio que o resto não ajude muito com usuários não-técnicos.
Matthieu M. 29/03
@ Matthieu - Não sei se você está se referindo aos primeiros pontos, mas não estava dizendo que eram analogias, estava descrevendo o que considero o processo de pensamento para um desenvolvedor pensar em boas analogias.
Nicole
4

Eu acho que você está falando de código duplicado, não de copiar e colar (usando trechos e similares).

Aqui está uma analogia de um livro de história, que ilustra muito bem. Antes da imprensa de Gutenberg, os monges estavam sentados, escrevendo os livros à mão e reescrevendo o mesmo livro vezes sem conta. Os livros que os monges escreviam costumavam ter bugs e, graças a Gutenberg, esse problema foi eliminado.

Outra analogia: caixas eletrônicos. Você tem um caixa eletrônico que pode servir vários cartões e sempre os serve bem. A duplicação de código cria caixas eletrônicos diferentes, para que todos precisem ir para um diferente e, às vezes, a máquina pode fornecer um BSOD.

Há um artigo impressionante sobre copiar e colar de Jeff http://www.codinghorror.com/blog/2009/04/a-modest-proposal-for-the-copy-and-paste-school-of-code-reuse. html

PS: Sei que havia impressoras antes de Gutenberg.

Marcus Maxwell
fonte
2

Para não programadores, suponho que estamos falando de pessoas de negócios, então eu seria breve e envolveria a realidade do dinheiro.

  1. Cada linha de código custa dinheiro (por escrito ou copiado)
  2. Todo bug custa muito mais que toda linha.
  3. Cada linha de código adiciona possíveis erros
  4. Código duplicado = bugs duplicados
  5. Erros duplicados quase nunca são encontrados no mesmo ciclo de teste.

Recortar e colar = Queima de dinheiro.

Stephen Bailey
fonte
1

Não posso responder à pergunta, mas dizer que você realmente não precisa de uma analogia aqui, e tentar encontrar a analogia certa para cada idioma ou padrão de desenvolvimento parece perverso e muitas vezes é contraproducente. É como tentar fazer ioga com os pés chatos ...

Existem algumas razões pelas quais copiar / colar leva a problemas, ele propaga bugs existentes em áreas recém-coladas, em alguns ambientes onde costumava ser considerado um aprimoramento de desempenho, na verdade agora é mais lento (posso fornecer exemplos se alguém estiver interessado, mas tudo se resume ao JIT e você realmente acha que é mais inteligente que um compilador moderno?).

Isso mostra que o desenvolvedor é preguiçoso, egoísta ou ambos. Se esta é uma batalha que você está enfrentando em uma equipe no momento, dependendo da sua posição nessa equipe (líder da equipe / jnr dev, snr dev, o que for), você precisa corrigi-la, possivelmente por arbitragem na sua organização.

EDIT: À luz do comentário abaixo, que este é o código que revisa o código de terceiros em nome de terceiros (ou talvez até de uma quarta parte :)). Há algumas coisas úteis que posso acrescentar.

Primeiro, quando o código foi produzido para terceiros, eles tinham alguma métrica em vigor? Linhas de código (LoC), por exemplo.

Eu ainda acho que parte do que eu disse acima ainda conta. Eu provavelmente também deveria ter perguntado qual era o objetivo da revisão. Se você deseja obter uma cotação para mantê-lo ou substituí-lo, é necessário fazer várias perguntas diferentes.

De qualquer forma, você está avaliando a qualidade do código. Bem, copie qualquer pasta que se enquadre na categoria "O desenvolvedor mostrou um entendimento adequado da abstração e / ou design de controle de fluxo do programa":

Comentário: o desenvolvedor falhou em mostrar qualquer entendimento sobre abstração, e sua abordagem ao controle de fluxo do programa estava sujeita a erros. Você pode introduzir a "complexidade ciclomática" aqui. Na verdade, é bastante fácil de entender e, de uma maneira geral, acho que encontrei uma resposta: D Sim, para mim.

Ok A complexidade ciclomática é assim. Você tem um mapa. Tem a sua posição inicial e todos os destinos possíveis. Não precisa ser muito. Pense, estacionamento, café, banheiro. A complexidade ciclomática é uma medida do número de rotas diferentes para chegar à sua posição inicial em qualquer um dos destinos.

O código copiado e colado provavelmente aumentará a complexidade ciclomática porque incluirá lógica repetida que poderia ter sido abstraída para seu próprio bloco (ou método) nomeado.

Parece razoável?

Ian
fonte
Para deixar claro, esse é o código que outras organizações escreveram e está sendo levado à nossa organização para revisão. Portanto, não é uma batalha dentro da minha organização, mas algo que eu preciso para fazer as pessoas (não programadores) de outra organização entenderem.
EZ Hart
É útil saber e facilita muito a minha vida: espero adicionar uma edição.
31311 Ian
Desculpe, edição longa, mas acho que o tldr é um código copiado e colado é um cheiro de código que indica um aumento na complexidade ciclomática (entre outras coisas) e a complexidade ciclomática é muito fácil de descrever usando uma metáfora de faceta única.
31411 Ian
1

Pegue uma palavra em inglês para alguma coisa. Agora imagine que toda vez que você quis descrever essa coisa, você usou a definição completa do dicionário em vez de apenas a palavra. Quão fácil seria para os outros entenderem você?

I formar uma imagem mental de algo que não está presente ou que não é o caso (imaginar) que Indicando uma ação ou estado que está condicionada à outra; Passado simples da vontade. Indicando o futuro em relação a um tempo passado. Indicar uma ação no passado que aconteceu repetidamente ou comummente (não seria) fácil; requerendo grande esforço físico ou mental para realizar, compreender ou suportar (difícil).

Também não faria mal mostrar um exemplo real de antes e depois do código real que foi refatorado para remover a duplicação.

Karl Bielefeldt
fonte
Eu recomendo ensaiando o segundo parágrafo para entregar estilo Leslie Nielsen :-)
Karl Bielefeldt
1

Também existem preocupações de segurança e integridade de código.

Conforme demonstrado aqui , é possível incorporar dados maliciosos em caracteres unicode que são transferidos para a área de transferência.

Dependendo de como o editor responder a caracteres unicode, isso pode resultar em alterações inesperadas do código fonte, saídas inesperadas do compilador ou algumas coisas em que ainda não pensei.

LamonteCristo
fonte
0

Existem algumas rotas diferentes que eu pude ver tomando aqui:

  1. Plágio - Alguns podem se lembrar disso na escola, onde o roubo de propriedade intelectual é um grande não-não. A programação de copiar e colar pode ser assim, pois alguém pode não entender a fonte ou que truques podem advir do uso de uma solução específica que foi copiada e colada cegamente, sem analisar quão bem isso funciona e entender por que isso pode ou não ser uma solução eficaz para o problema.

  2. Seguir cegamente as instruções - A maioria das pessoas provavelmente teria tido experiências em chegar a algum lugar em que não estava anteriormente. Alguns podem ter usado o MapQuest ou o Google Maps para encontrar um lugar e seguir as instruções fornecidas. Há histórias de pessoas se perdendo ou simplesmente não descobrindo onde deveriam estar, embora o software tenha fornecido instruções específicas sobre como chegar lá. Esse é o outro grande perigo de copiar e colar: é como se alguém tivesse lhe dado as instruções para ir de A a B sem permitir que você visse qualquer mapa da área que pudesse tornar a viagem um pouco mais difícil. Se isso não parecer difícil, você pode aumentar a aposta pedindo à pessoa que vá de A a B usando uma venda nos olhos, para que ela tenha que confiar em outros sentidos para determinar em que direção está voltada e chegar a um alvo.

Dados, informações, conhecimento e sabedoria podem ser um bom modelo que pode ser referenciado para mostrar por que a pesquisa e a substituição não são eficazes como solução, porque copiar e colar é muito mecânico e sem muito pensamento para que os dados transferidos possam ser sem o conhecimento e a sabedoria de usá-lo corretamente. Pode-se olhar para a energia nuclear para exemplos de como a compreensão da diferença pode ser bastante poderosa. Compare um reator nuclear com uma bomba nuclear em termos de segurança e use-o para ver como saber exatamente o que acontece aonde não é suficiente para aproveitar com segurança a energia do átomo.

JB King
fonte
0

Imagine que você tem alunos de um grupo e um conjunto de regras para a escola. Em vez de publicar as regras em um local comum, todos os alunos devem fazer referência a você, entregar a cada um deles uma cópia das regras. É dito a cada aluno que eles devem seguir sua cópia das regras à risca.

Agora modifique uma das regras dizendo que, no caso de um desastre, você deve ir para o novo abrigo. Você precisa ir a cada aluno e modificar seu conjunto de regras. Se um dos alunos errar e um tornado atingir, o aluno irá para o antigo local e sofrerá uma morte horrível.

ElGringoGrande
fonte
0

Alguém envia um email com um modelo de documento anexado. Fique à vontade para continuar usando-o até que o modelo mude. Não se preocupe, eles não esquecerão de enviar uma cópia atualizada.

JeffO
fonte
0

O modelo de custo CoCoMo.

http://en.wikipedia.org/wiki/COCOMO

Esforço aplicado (E) = a * (KLOC) ** b, onde b> 1,0

Esse expoente significa que o esforço para criar / manter / apoiar / reescrever cresce mais rápido que o número de linhas de código.

S.Lott
fonte
0

Há outro aspecto importante dessa má prática que ninguém levou em consideração ainda: ao copiar cegamente (total ou parcialmente) o código de outra pessoa ( sem a permissão deles ), você pode estar violando as leis de direitos autorais .

karlphillip
fonte
0

A codificação copiar e colar que eu vejo é aquela em que o desenvolvedor não entende ou quer raciocinar o que está fazendo e copia partes diferentes que já fazem "mais ou menos" o que precisam, agitando-as aleatoriamente no final para ajustá-los.

Existem três grandes problemas com isso:

  1. Isso nunca resulta em código livre de erros. Sempre.
  2. Se eles não entendessem o código ao escrevê-lo, nunca poderiam descobrir isso durante a depuração. Somente alguém pode limpar a bagunça que eles fizeram, a um custo adicional.
  3. Se eles evitam pensar no código que estão escrevendo, evitam aprender. Se eles evitarem aprender, nunca serão um bom programador. Se eles nunca serão um bom programador, por que eles estão no seu time?
Joeri Sebrechts
fonte
0

Digamos que você tenha 5 namoradas (você é um cão manhoso) e deseja enviar a todas elas uma mensagem de dia dos namorados. Você digita a primeira letra, adiciona o nome dela e menciona algo memorável que vocês compartilharam. Você copia e cola a carta quatro vezes, perdendo sempre uma instância do nome da namorada nº 1 com copiar e colar porque você digitou um erro. Agora, quatro de suas cinco amigas estão a caminho da casa da namorada nº 1.

Capitão Kenpachi
fonte