Qual è un modo valido e conciso per spiegare i pericoli della programmazione di copia-incolla ai non programmatori? [chiuso]

26

Sto cercando una buona analogia o metafora che possa illustrare i problemi della programmazione di copia-incolla ai non programmatori. Di tanto in tanto eseguo revisioni di codice / sistema per potenziali clienti e uno dei problemi comuni che vedo sono enormi quantità di codice copia-incolla su tutte le basi del codice. È una cosa che di solito scrivo nelle recensioni, e ogni volta devo spiegare perché questo è un problema (questo è particolarmente difficile con i clienti che sanno abbastanza sulla programmazione per capire che il riutilizzo è una buona cosa, ma non abbastanza per capire perché il copia-incolla non è una buona forma di riutilizzo). Ovviamente, posso (e faccio) spiegare il problema in termini di manutenzione del codice, ma sarebbe bello avere una buona analogia concisa per questo problema che colpirebbe i non-programmatori. Bonus se l'analogia illustra perché la ricerca e la sostituzione non è una soluzione efficace per questo problema. Qualche suggerimento?

Giusto per chiarire (sulla base della risposta di Jaroslav qui sotto) - Non sto parlando di usare frammenti di codice qui; quello che vedo (inquietantemente spesso) è la copia e incolla di vaste fette di codice o un pezzo di codice di dieci righe per ottenere alcuni dati utente (completi di query SQL inline) incollati in dozzine di pagine PHP o ASP.NET. Quindi, duplica il codice da un'altra parte nello stesso progetto.

Aggiornamento: ci sono molte risposte davvero buone qui; Ho spiegato nei commenti perché ho scelto la risposta di Scott Whitlock, ma vorrei anche raccomandare vivamente la risposta di whatsisname se hai a che fare con clienti che hanno familiarità con la produzione.

    
posta E.Z. Hart 02.04.2011 - 17:49
fonte

17 risposte

36

È così ... hai un orologio in casa tua. Grande! Sai che ore sono, ma devi sempre andare in quella stanza per guardarlo.

Ma ovviamente vuoi sapere che ore sono senza andare in quella stanza tutto il tempo, quindi comprati un po 'di orologi e li distribuisci in tutta la casa. Ciascuno di questi orologi è indipendente. Loro tutti mantengono il loro tempo. Questo significa:

  • Quando l'ora cambia a causa dell'ora legale, devi cambiarli tutti
  • Anche quando sono tutti impostati, sono tutti un po 'diversi e raramente concordano perfettamente. Nel tempo si spostano.

Ora immagina lo stesso problema in una grande struttura con dozzine o centinaia di orologi. Ecco perché hai bisogno di qualcosa come questo orologio in rete che si mantiene in sincrono con una base di tempo centrale. In questo modo il tempo è definito una volta e una sola volta .

La programmazione di copia-incolla è come acquistare più orologi indipendenti. Non scala.

    
risposta data 29.03.2011 - 19:56
fonte
38

Immagina di progettare un aereo. Hai un singolo motore. Si vende bene. Ora progetterai un aereo a 4 motori per lunghe tratte attraverso l'oceano.

Ora, non crei un set completo di specifiche tecniche e disegni per ogni singolo motore, vero? No, usi lo stesso motore in tutti e quattro i posti. Ora immagina se avessi 4 serie di disegni e devi cambiare qualcosa. Ora devi cambiarlo in tutti e quattro i disegni del motore. Cosa succede se dimentichi accidentalmente di cambiare qualcosa nel 4 ° motore perché stavi distanziando?

Quindi dì che stai cambiando la lunghezza di una vite o una filettatura del tubo. Ora non puoi semplicemente "cercare e sostituire" sul tuo database di disegni tecnici, potresti accidentalmente cambiare le viti di montaggio nelle pompe del carburante perché erano delle stesse dimensioni. Oppure la linea idraulica che alimenta il timone di coda ha usato lo stesso filo, ma ora è diverso e non puoi più alimentare la coda.

Ora immagina di essere infastidito dall'NTSB perché i tuoi motori scagliano a caso le pale delle turbine ed esplodono mentre volano a sud della Florida. Ora quali disegni del motore guardi? Tutti loro, uno di loro? Come fai a sapere che tutti e quattro sono uguali? Forse le correzioni sono state fatte, ma sono applicate solo al motore uno, perché il tizio che ha progettato i motori ha lasciato un anno fa per suonare in un gruppo reggae ed è stato l'unico a ricordare che i quattro motori sono in file separati, e il il tizio che ha riparato la turbina esplosiva era il suo sostituto.

Copia e incolla codice è analogo ad avere disegni duplicati di componenti, sia che si tratti di una vite o di un motore. Si desidera astrarre componenti fino a pezzi fondamentali che vengono riutilizzati il più possibile.

Non duplicare i motori, basta scrivere il codice che monta i motori all'ala.

    
risposta data 29.03.2011 - 18:45
fonte
7

Devi spiegarlo in termini di condivisione della stessa risorsa rispetto alla duplicazione della stessa risorsa.

Per esempio, avrebbe senso che ogni casa di una grande città avesse una centrale elettrica dedicata che fornisse elettricità alla casa o avrebbe più senso che ogni casa condividesse la stessa centrale elettrica? Se qualcosa va storto con un particolare componente utilizzato nella (e) centrale (e) e le riparazioni sono necessarie, sarebbe più facile effettuare le riparazioni in un posto e tutti beneficeranno di queste riparazioni rispetto a fare le riparazioni in ogni centrale dedicata e solo ciascuna benefici della casa individualmente.

    
risposta data 29.03.2011 - 18:22
fonte
6

"Hey Look all surgery is somewhat similar right?, so you wouldn't mind if I randomly copy surgical instruction for different procedures from different surgeons for your operation?"

    
risposta data 29.03.2011 - 18:29
fonte
6

Copia e incolla è come provare a produrre parti senza uno stampo. È lento, e avrai un uso una tantum da ogni parte, dal momento che una volta è determinato a essere difettoso o rotto, non puoi semplicemente aggiustare lo stampo per creare un sostituto adatto.

Nella ricerca di un'analogia, per prima cosa dobbiamo considerare i pericoli della programmazione copia e incolla :

  • Problemi introdotti perché la copia non è esatta (variabili non necessarie e percorsi del codice non ripuliti)
  • Requisiti di prova aumentati : l'astrazione aiuta a rimuovere la necessità di test di regressione mentre testi solo ciò che hai modificato e cambi solo le foglie, non i rami.
  • Duplicazione duplica tutto, bug inclusi. Ogni bug fix o funzionalità che si applica a entrambe le sezioni di codice ora costa il doppio da implementare e c'è un'alta probabilità di dimenticarlo completamente.
  • Cerca e sostituisci esacerba il problema precedente, dato che non puoi trovare facilmente il codice duplicato.

L'arma principale nella lotta contro la programmazione di copia e incolla è astrazione . Quindi, per trovare una buona analogia, cerca esempi di astrazione nel mondo che ci circonda.

Abstraction si basa sull'idea di impostare le definizioni e quindi di utilizzare tali definizioni in esecuzione . Come sarebbe il mondo senza definizioni?

  • Le definizioni sono una parte fondamentale del linguaggio legale. Immagina un contratto che non aveva definizioni di base ma definiva completamente ogni termine ogni volta che veniva utilizzato.
  • Definizioni e modelli sono utilizzati nella costruzione. Un problema comune nella costruzione sta facendo ogni nuovo taglio basandosi sull'ultimo piuttosto che su una singola misurazione presa all'inizio. Ciò può comportare lunghezze estremamente variabili nel tempo.
  • L'organizzazione aziendale è basata su abstract e definizioni. E se ogni volta che la tua azienda dovesse espandersi, dovessero definire il nuovo ruolo da zero? Non funzionerebbe. Quindi, se decidessero di scegliere un ruolo simile e di modificarlo leggermente per adattarlo. Tutti sarebbero bloccati in posizione perché sarebbe impossibile spostare le risorse intorno.

La copia ha solo un posto quando il pezzo da copiare è permanente. Altrimenti, ogni copia crea un'intera nuova filiale da trattare, testata, mantenuta e aggiornata separatamente.

L'astrazione combatte questo legando tutti i rami insieme in un tronco e isolando le modifiche su rami più piccoli o persino foglie.

    
risposta data 29.03.2011 - 19:36
fonte
4

Penso che tu stia parlando di codice duplicato, non di copia-incolla (usando snippet e simili).

Ecco un'analogia da un libro di storia, che lo illustra molto bene. Prima della stampa di Gutenberg i monaci erano seduti e scrivevano i libri a mano e riscrivevano lo stesso libro più e più volte. I libri che i monaci scrivevano erano spesso con bug e grazie a Gutenberg questo problema veniva eliminato.

Un'altra analogia: i cash machine. Hai un bancomat in grado di servire varie carte e serve sempre bene. La duplicazione del codice crea diversi cash machine, quindi tutti dovrebbero andare in un altro e talvolta la macchina ti darebbe anche un BSOD.

C'è un fantastico articolo sul copia-incolla di Jeff link

P.S So che c'era una macchina da stampa prima di Gutenberg.

    
risposta data 29.03.2011 - 18:23
fonte
2

Per i non programmatori presumo che stiamo parlando di uomini d'affari, quindi vorrei essere breve e coinvolgere la realtà del denaro.

  1. Ogni riga di codice ti costa denaro (sia scritto che copiato)
  2. Ogni bug ti costa molto di più rispetto a ogni riga.
  3. Ogni riga di codice aggiunge potenziali bug
  4. Codice duplicato = bug duplicati
  5. I bug duplicati non vengono quasi mai trovati nello stesso ciclo di test.

Taglia e incolla = Guadagna denaro.

    
risposta data 29.03.2011 - 20:45
fonte
1

Non posso rispondere alla domanda ma dire che in realtà non hai bisogno di un'analogia qui, e cercare di trovare la giusta analogia per ogni idioma o modello di sviluppo sembra perverso ed è spesso controproducente. È come cercare di fare yoga con i piedi piatti ...

Ci sono alcuni motivi per cui copia / incolla porta a problemi, diffonde bug esistenti in aree appena incollate, in alcuni ambienti in cui era considerato un miglioramento delle prestazioni, in realtà è più lento (posso fornire esempi se qualcuno è interessato, ma si tratta di JIT e pensi davvero di essere più intelligente di un compilatore moderno?).

Mostra che lo sviluppatore è pigro o egoista o entrambi. Se questa è una battaglia che stai combattendo in una squadra al momento, a seconda della tua posizione in questa squadra (team lead / jnr dev, snr dev, cosa mai) devi risolverlo, possibilmente tramite un arbitrato all'interno della tua organizzazione.

EDIT: Alla luce del commento qui sotto, questo è un codice di revisione del codice di terze parti per conto della terza parte (o forse anche una quarta parte :)) Ci sono alcune cose utili che posso aggiungere speranzosamente.

Per prima cosa, quando il codice è stato prodotto per la terza parte, avevano qualche metrica in atto? Linee di codice (LoC) per esempio.

Penso ancora che un po 'di ciò che ho detto sopra conti ancora. Probabilmente avrei anche chiesto qual era l'obiettivo della recensione. Se è necessario ottenere un preventivo per mantenerlo, o sostituirlo, è necessario porre un sacco di domande diverse.

In ogni caso, stai valutando la qualità del codice, beh, copia qualsiasi pasta rientra nella categoria "Lo sviluppatore ha mostrato un'adeguata comprensione dell'astrazione e / o del progetto di controllo del flusso del programma":

Commento: lo sviluppatore non ha mostrato alcuna comprensione dell'astrazione e il loro approccio al controllo del flusso del programma era soggetto a errori. Potresti introdurre qui la "complessità ciclomatica". In realtà è abbastanza facile da capire, e penso che avrei potuto trovare una risposta: D Sì, per me.

Ok La complessità ciclomatica è così. Hai una mappa. Ha la tua posizione iniziale e ogni possibile destinazione. Non deve essere molto. Pensa, parcheggio, bar, servizi igienici. La complessità ciclomatica è una misura del numero di diversi percorsi che ci sono per raggiungere la tua posizione di partenza verso una qualsiasi destinazione.

La copia e il codice incollato probabilmente aumenteranno la complessità ciclomatica perché includeranno la logica ripetuta che potrebbe essere stata estratta nel suo stesso blocco (o metodo).

Sembra ragionevole?

    
risposta data 29.03.2011 - 20:13
fonte
1

Prendi una parola inglese per qualcosa. Ora immagina ogni volta che vuoi descrivere quella cosa, hai usato la definizione completa del dizionario invece della sola parola. Quanto sarebbe facile per gli altri capirti?

I forma un'immagine mentale di qualcosa che non è presente o che non è il caso (immagina) Indica un'azione o uno stato che è condizionato da un altro; Semplice passato di volontà. Indicazione della futurity relativa a un tempo passato. Indicare un'azione nel passato che si è verificata ripetutamente o comunemente (sarebbe) piuttosto non facile; richiede un grande sforzo fisico o mentale per realizzare o comprendere o sopportare (difficile).

Inoltre non sarebbe male mostrare un vero e proprio precedente e successivo esempio di codice reale che è stato rifattorizzato per rimuovere la duplicazione.

    
risposta data 30.03.2011 - 00:31
fonte
0

Ci sono un paio di percorsi diversi che potrei vedere prendere qui:

  1. Plagio - Alcuni potrebbero ricordare questo da scuola dove il furto di proprietà intellettuale è un grande no-no. La programmazione di copia-incolla può essere proprio come qualcuno potrebbe non capire la fonte o che cosa può derivare dall'utilizzo di una particolare soluzione che è stata copiata e incollata ciecamente senza analizzare quanto bene funzioni e capire perché questo possa o meno essere una soluzione efficace al problema.

  2. Seguire le indicazioni in modo trasparente - La maggior parte delle persone probabilmente avrebbe avuto esperienze dovendo raggiungere un posto dove non erano mai state in precedenza. Alcuni potrebbero aver utilizzato MapQuest o Google Maps per trovare un luogo e quindi seguire le indicazioni fornite. Ci sono state storie di persone che si perdevano o che non trovavano dove avrebbero dovuto essere, anche se il software forniva istruzioni specifiche su come arrivarci. Questo è l'altro grande pericolo di copia-incolla è che è come se qualcuno ti avesse appena dato le indicazioni per andare da A a B senza farti vedere alcuna mappa dell'area che potrebbe rendere un viaggio un po 'più difficile. Se ciò non sembra difficile, potresti alzare la posta chiedendo alla persona di passare da A a B indossando una benda in modo che debbano fare affidamento su altri sensi per determinare in quale direzione si trovano e raggiungere un bersaglio.

Dati, informazioni, conoscenze e saggezza possono essere un buon modello a cui è possibile fare riferimento per mostrare perché la ricerca e la sostituzione non sono È efficace come soluzione perché la copia e incolla è molto meccanica e senza molti pensieri, in modo che i dati trasferiti possano essere privi della conoscenza e dell'opportunità di utilizzarli correttamente. Si potrebbe guardare all'energia nucleare per esempi di come capire la differenza può essere piuttosto potente. Contrastare un reattore nucleare con una bomba nucleare in termini di sicurezza e utilizzo per vedere come sapere solo cosa va dove non è abbastanza per sfruttare in sicurezza la potenza dell'atomo.

    
risposta data 29.03.2011 - 18:19
fonte
0

Immagina di avere studenti di gruppo e una serie di regole per la scuola. Invece di postare le regole in un luogo comune tutti gli studenti devono fare riferimento a ciascuno di essi una copia delle regole. A ogni studente viene detto che devono seguire la loro copia delle regole alla lettera.

Ora modifica una delle regole dicendo che in caso di disastro dovresti andare al nuovo rifugio per disastri. Devi andare da ogni studente e modificare il loro set di regole. Se uno degli studenti viene perso e un colpo di tornado lo studente andrà al vecchio posto e morirà in modo orribile.

    
risposta data 29.03.2011 - 18:20
fonte
0

Qualcuno ti invia un'email con un modello di documento allegato. Sentiti libero di continuare a usarlo fino a quando il modello non cambia. Non preoccuparti, non dimenticheranno di inviarti una copia aggiornata.

    
risposta data 29.03.2011 - 19:01
fonte
0

Il modello di costo CoCoMo.

link

Sforzo applicato (E) = a * (KLOC) ** b, dove b > 1.0

Questo esponente significa che lo sforzo per creare / mantenere / supportare / riscrivere cresce più velocemente rispetto al numero di righe di codice.

    
risposta data 29.03.2011 - 20:38
fonte
0

C'è un altro aspetto importante di questa cattiva pratica che nessuno ha ancora preso in considerazione: copiando ciecamente (completo o parziale) il codice di qualcun altro ( senza il loro permesso ) potresti spezzare leggi sul copyright .

    
risposta data 29.03.2011 - 20:53
fonte
0

La codifica copia-incolla che vedo è quella in cui lo sviluppatore non capisce o vuole ragionare su quello che sta facendo e copia insieme parti diverse che già fanno "più o meno" ciò di cui hanno bisogno, muovendole a caso alla fine per farli stare insieme.

Ci sono tre principali problemi con questo:

  1. Non risulta mai in un codice privo di bug. Mai.
  2. Se non hanno capito il codice mentre lo scrivevano, non potevano mai capirlo mentre eseguivano il debug. Solo qualcun altro può ripulire il casino che hanno fatto, ad un costo aggiuntivo.
  3. Se evitano di pensare al codice che stanno scrivendo, evitano di imparare. Se evitano di imparare, non saranno mai un buon programmatore. Se non saranno mai un buon programmatore, perché sono nella tua squadra?
risposta data 29.03.2011 - 22:09
fonte
0

Diciamo che hai 5 fidanzate (tu sei un cane malizioso) e desideri inviare a tutti un messaggio di San Valentino. Digiti la prima lettera, aggiungi il suo nome e menzioni qualcosa di memorabile che voi ragazzi avete condiviso. Quindi copia e incolla la lettera quattro volte, ogni volta che manca un'istanza del nome della fidanzata n. 1 con copia e incolla perché hai fatto un refuso. Ora, 4 delle tue cinque amiche sono sulla strada per la fidanzata # 1's house.

    
risposta data 15.08.2013 - 17:43
fonte
0

Esistono anche problemi di sicurezza e di integrità del codice.

Come dimostrato qui , è possibile incorporare dati dannosi in caratteri unicode che vengono trasferiti negli appunti.

A seconda di come il tuo editor risponde ai caratteri unicode, questo potrebbe portare a cambiamenti imprevisti del codice sorgente, output del compilatore imprevisti o cose che non avevo ancora pensato.

    
risposta data 17.03.2017 - 11:46
fonte

Leggi altre domande sui tag