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.
fonte
Respostas:
É 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:
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.
fonte
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.
fonte
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.
fonte
fonte
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 :
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?
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.
fonte
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.
fonte
Para não programadores, suponho que estamos falando de pessoas de negócios, então eu seria breve e envolveria a realidade do dinheiro.
Recortar e colar = Queima de dinheiro.
fonte
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?
fonte
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.
fonte
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.
fonte
Existem algumas rotas diferentes que eu pude ver tomando aqui:
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.
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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 .
fonte
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:
fonte
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.
fonte