La programmazione di copia e incolla è errata? [duplicare]

14

Con semplici strumenti di ricerca Google e Google Code è facile trovare come programmare l'utilizzo di alcune risorse o risolvere determinati problemi (come creare una classe Java o un blocco FTP in Perl, ecc.). Quindi gli sviluppatori sono tentati di copiare e ampli puramente; incollare il codice (in un modo riutilizzare). È un'incompetenza? L'ho fatto anch'io, anche se penso di essere un programmatore migliore di molti altri che ho visto. Chi ha tempo per RTFM ? In questa era di abbondanza di informazioni, non penso che copia & la programmazione della pasta è sbagliata.

Non è quello che siti come Stack Overflow fanno comunque? Le persone chiedono - OK, ecco il mio problema - come risolverlo? Ora qualcuno pubblicherà il codice completo e la persona che ha posto la domanda semplicemente copierà & incolla la risposta più votata. Non importa quanto piccolo sia il problema.

Sto lavorando con un gruppo di giovani programmatori che fanno molto affidamento su Internet per portare a termine il loro lavoro. Vedo la comodità nel copiare / incollare e modificare il codice per portare a termine il lavoro. Ad esempio, potresti essere abbastanza bravo con algoritmi e simili, ma potresti non sapere come usare un BufferedReader in Java - leggeresti completo Javadoc per BufferedReader o cerca qualche esempio di utilizzo da qualche parte?

Quali sono i veri pericoli del copy & codifica incolla che può influire sulla loro competenza?

    
posta Peter Mortensen 18.12.2016 - 11:36
fonte

15 risposte

50

È cattivo? Forse ... per imparare piccoli esempi, per testare un concetto, non è poi così male.

MA ... devi capire cosa copia / incolla. Altrimenti, come fai a sapere che il codice è veramente che fa? Certo, ottiene il risultato one che vuoi sullo schermo ma forse ha prestazioni orribili, forse ha buchi di sicurezza, forse causa perdite di memoria, forse evoca Cthulhu, forse causerà la carta di credito del cliente i numeri devono essere trapelati, forse contiene una backdoor ...

E la maggior parte probabile, forse richiede qualche ritocco per soddisfare i requisiti aziendali e se non si capisce il codice non sarà in grado di modificarlo correttamente (o meglio ancora: scrivi una versione più "corretta") ...

Come per "RTFM", sì, lo faccio quando è disponibile. Vorrei leggere il BufferedReader javadocs, e se non riesco a ottenere abbastanza informazioni per far funzionare il mio codice, allora colpirei Google e cercare "Esempio di Java BufferedReader". Non mi aspetto che il codice che trovo funzioni immediatamente con il mio codice, ma mi aspetterei di trovare un semplice esempio standalone funzionante che possa essere utilizzato come esempio per correggere il mio codice.

E quando è il tuo proprio codice che stai copiando / incolla, di solito è un segno per iniziare il refactoring.

    
risposta data 28.06.2011 - 18:15
fonte
15

È forse il peggior modo possibile per programmare.

is this an incompetency?

Sì. Se qualcuno non riesce a capirlo abbastanza bene da scriverlo da sé, ha davvero bisogno di trovare un nuovo lavoro in cui non ci si aspetti che codifichi.

Ancora più importante, se qualcuno può scrivere il caso di test unitario, deve essere in grado di scrivere il codice. O dimostrare che il problema non può essere risolto in un ragionevole lasso di tempo. Se ci sono problemi di tecnologia, la formazione è essenziale. Se ci sono problemi con l'algoritmo, allora anche la formazione è essenziale.

Who has the time to RTFM?

Tutti.

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

No.

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

Il codice più votato potrebbe non funzionare come previsto. Potrebbe non essere ottimale. Non può gestire correttamente condizioni limite o casi speciali. In effetti, potrebbe non funzionare nemmeno per l'architettura del questionario, anche se ha funzionato per la persona che risponde.

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

Leggi l'intero javadoc. Sempre.

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

Regola 1: Il software è solo conoscenza codificata.

Se non c'è alcuna conoscenza dietro il software, è una spazzatura casuale che sembra funzionare per alcuni esempi. Non c'è alcun valore in questo.

    
risposta data 28.06.2011 - 19:25
fonte
14

In realtà è una buona idea sapere cosa sta facendo il tuo codice. Consiglierei di leggere codice 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...
    
risposta data 09.06.2013 - 13:48
fonte
6

Quando parliamo di programmazione di copia incolla come una cattiva pratica, intendiamo la programmazione della copia incolla che è fatta per pigrizia. Invece di programmare una corretta classe base per eliminare l'odore del codice, alcuni violano semplicemente ASCIUGAMANO per pigrizia. Inoltre, introduce molti bug, perché in questo caso si tende a ignorare le sottili differenze del caso d'uso e non si applicano le modifiche necessarie. Questo è principalmente il motivo per cui è considerato una cattiva pratica.

Non penso che sia generalmente una cattiva pratica prendere un pezzo di codice qua e là da Internet. Ma penso che sia una cattiva pratica quando prendi un pezzo di codice che non capisci, poiché introduci il codice nel tuo software che nessuno può mantenere.

Inoltre, guarda solo siti come Il progetto del codice . Ogni articolo fornisce una soluzione a un problema. La maggior parte delle soluzioni è abbastanza buona. Ma quando rivedo l'implementazione, ogni secondo o terzo di loro mi fa venire voglia di vomitare, e non permetterei che un simile pezzo di codice appaia nel mio software.

    
risposta data 10.05.2014 - 22:58
fonte
6
  • Ogni buon professionista in qualsiasi campo copia ciò che è stato creato da altri in quel campo.
  • Perché dovrei reinventare la ruota da solo se ce n'è una già adatta alle mie esigenze?
  • Il riutilizzo del codice è il Santo Graal, utilizziamo estensivamente librerie, componenti, progetti open source; perché dovremmo rifiutare questo particolare modulo, se funziona bene?
  • La programmazione patchwork è un modello molto produttivo, specialmente se il codice copiato proviene da una fonte autorevole o è stato esaminato da una community.
  • Se non sei bravo a programmare, non sei bravo a copiare il codice degli altri, questo è un dato di fatto.
  • Non si tratta di copiare codice all'interno di un'applicazione, che deve essere evitato il più possibile.
risposta data 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.

Questo non è certo il modo in cui visualizzo il sito. Lo vedo come un posto dove chiedere aiuto, non fare il lavoro per te.

Inoltre, sai quante volte le persone votano risposte errate? Molto.

Tutto ciò che posso veramente dire è "Wow!"

    
risposta data 10.05.2014 - 23:00
fonte
3

Puoi risolvere alcuni problemi facendolo così. Ma non tutti i problemi; non è molto utile.

Inoltre, è un plagio.

Va bene riutilizzare il codice in qualche misura , ma assicurati di capire il codice e di non violare il copyright . Per la maggior parte delle attività di programmazione più comuni, esistono librerie, framework e toolkit, utilizzare quelli disponibili quando disponibili.

    
risposta data 10.05.2014 - 22:54
fonte
2

La programmazione di copia-incolla presenta due problemi.

  1. c'è qualche preoccupazione in merito violazione del copyright se lo fai anche tu molto di questo
  2. alla fine un problema arriverà che non puoi risolvere con programmazione copia-incolla, quando questo succede che tu non abbia acquisito le competenze necessarie per risolvere da solo.

Oltre a ciò, per risolvere piccoli problemi, la programmazione di copia-incolla può aiutarti a risolverli in modo rapido ed efficiente.

Un'ultima nota, ovviamente ci affidiamo tutti ad altre persone per risolvere problemi di volta in volta, se prendi il tempo necessario per capire il codice fornito e implementarlo avrai imparato qualcosa e risolto il tuo problema.

    
risposta data 28.06.2011 - 17:35
fonte
2

Copia e incolla programma significa due cose diverse per me. Uno è che cuci insieme altri esempi di codice per ottenere un programma. L'altra cosa è che stai tagliando / incollando un po 'di codice ripetitivo e poi modificandolo leggermente. Penso che in qualche modo stiamo tutti unendo esempi di codice, se non tagliando / incollando esplicitamente poi dalla memoria. Sulla cosa di codice ripetitivo taglia e incolla, è un costo rispetto alla ricompensa. Per una piccola quantità di taglia / incolla o anche una grande quantità se non hai il tempo di farlo bene, può valere la pena di fare il taglia e incolla .... ma in generale ad un certo punto con una grande quantità arriverà torna al morso.

Copiamo e incolliamo tutti i programmi. Un sacco di codice è la piastra della caldaia e così anche gli algoritmi. Se stai scrivendo un ordinamento veloce, non l'hai inventato. Molto probabilmente hai memorizzato un'implementazione tipica da qualche parte, una conferenza o un libro. Sei una specie di copia e incolla di programmazione. A volte è possibile leggere un documento in cui viene presentato un algoritmo e implementare l'algoritmo nel documento. Per me questa è anche la programmazione di copia incolla. Inoltre la maggior parte delle librerie è piena di esempi. Aka apre un lettore bufferizzato in java BufferedReader br = new BufferedReader (System.out); Sono abbastanza sicuro di aver visto quel codice da qualche parte, e se non del codice esattamente .... la struttura / il modello di base con i miei nomi sostituiti .... NET è molto buono per avere esempi di codice in tutta la libreria. Se voglio aprire una pagina web, cercherò la classe per fare richieste web, e quindi imitare l'esempio di codice. A volte ritorni e modifichi più tardi (ad es. Devi impostare i timeout) ma in generale stai praticamente passando all'esempio.

In generale, direi che la maggior parte dei programmi sono una sorta di programmi copia / incolla. Si inizia con esempi di base / algoritmi / ecc. preso dalla memoria, libri, ecc. e poi si modifica in base alle proprie esigenze. Finché capisci cosa stai cucendo insieme, penso che vada bene. Non hai bisogno di capire tutto ciò che stai tagliando e incollando, esattamente, solo in generale quello che fa e qualsiasi funzione. È proprio come usare una libreria eccetto che hai anche il codice sorgente sottostante. Vale sicuramente la pena di andare alle fonti giuste, e in generale se puoi ottenere una funzionalità da taglio / incolla da esempi di codice, o una libreria ... è meglio andare con la libreria in quanto può essere aggiornata in seguito.

La seconda cosa è tagliare / incollare il tuo codice. Hai un sacco di codice ripetitivo, quindi puoi tagliare / incollare e modificare. Grandi quantità di questo fanno un casino per cambiare, e inoltre è molto noioso e ansioso della mente ... A volte l'alternativa giusta è usare un altro approccio, ma altre volte taglia e incolla è il modo migliore per fare ciò che vuoi, in cui caso dovresti creare un generatore di codice per gestire il codice ripetitivo. Ma se sono solo poche righe o una cosa sola, potrebbe non valerne la pena. Tagliare / incollare un codice simile è spesso più rapido di un'astrazione complessa o la creazione di un generatore di codice. Alla fine della giornata, se taglia e incolla risparmia ore e sei sotto la pistola per ottenere un prodotto prima che il tuo avvio vada a pancia all'aria, fallo. Dopotutto se non spedisci il codice, non avrai un futuro. Ma sostanzialmente tutto questo diventa debito tecnico che dovrebbe essere ripulito più tardi. Si tratta di capire il compromesso che stai prendendo e gestire quando ti morde. Per esempio. affrettatevi a proiettarlo oggi in modo da non andare fuori mercato, per poi finire a ripararlo la prossima settimana quando la duplicazione rende troppo difficile aggiungere questa nuova funzione .....

Nel complesso, tutti tagliamo / incollano mentalmente per esempi / algoritmi. E nel secondo tipo si tratta di sapere quando è appropriato e quando non lo è ... Come qualsiasi strumento, è necessario comprendere i compromessi su ciò che si sta facendo ....

    
risposta data 29.06.2011 - 05:10
fonte
2

Con il codice di copia-incolla, suppongo che sia uno snippet di codice che viene copiato / incollato. I frammenti di codice sono principalmente per la dimostrazione dell'idea o dell'algoritmo, non per la produzione reale perché potrebbero non essere allineati al tuo contesto. Peggio ancora, potrebbe contenere bug perché l'autore dello snippet di codice potrebbe non aver mai testato il codice stesso.

Esempio di vita reale? Sì, ce ne sono tanti e ne ho avuto uno simile l'anno scorso. Il mio collega stava cercando di eseguire la codifica / decodifica Base64 in iOS e ha ottenuto questa risposta

link

che in seguito ho scoperto che ha un brutto bug qui:

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

Bene, se conosci bene C, potresti essere in grado di individuare l'errore. L'autore è appena malloc il buffer corto di 1 (eppure è riuscito comunque a ottenere 8 voti ..). Il mio collega ha usato semplicemente questo codice per Base64 e ha funzionato bene la maggior parte del tempo. Questo causa un tremendo mal di testa a tutto il team dato che eravamo dei principianti dello sviluppo di iOS e l'app è appena uscita dal nulla. Tutti controllano il loro codice ancora e ancora, incluso me stesso, ma non abbiamo mai trovato cosa stesse andando storto. Fino a un giorno, penso che il bug decida da sé che dovrebbe apparire. L'app si è bloccata nel simulatore e ho ricevuto qualche suggerimento dallo stack trace che è lì. Ho individuato il bug, risolto e chiuso il caso. È stato dopo un sacco di lamentele da parte degli utenti finali che la nostra app si è sempre bloccata senza motivo. Il danno è stato fatto.

Quindi, dov'è il merito della storia, chiedi? Il merito è che il codificatore è responsabile per qualsiasi codice che si sottometta al codebase, e un programmatore cattivo può causare ore sprecate per l'intero team. Copia-incolla il codice non è una cattiva idea di per sé, ma molti programmatori credono ciecamente su ciò che internet dice e mettono il codice lì senza convalidarlo e senza capire cosa realmente fa. Quando vengono visualizzati i bug, l'ultima cosa che penserebbero è che il bug è nel loro codice incollato perché pensano sempre che i codici internet siano migliori di lui. Se hai molti colleghi programmatori che fanno il codice copia-pasta la maggior parte del tempo, allora sii avvertito.

    
risposta data 23.05.2017 - 14:40
fonte
1

Il problema di lavorare direttamente (e unicamente) da un riferimento API come Javadoc è che spesso non fornisce un contesto sufficiente per eseguire un flusso di lavoro completo. Certamente è utile capire cosa può fare l'API e quali argomenti e metodi individuali sono disponibili, ma collegarlo a un'applicazione non banale nel mondo reale è qualcosa di diverso.

Per Javadoc nello specifico, trovo che solo pochi javadoc di Sun / Oracle hanno un testo di panoramica sufficiente per dare contesto (ma quelli stessi forniscono lo stesso codice copia / incolla). Per la maggior parte, anche Sun / Oracle non fornisce un contesto completo ed è raro trovare un Javadoc di terze parti completo e completamente scritto.

Non penso che questo sia colpa degli scrittori Javadoc, piuttosto che spesso c'è un'impedenza di mismatch tra i metodi API e i blocchi attività di livello superiore.

    
risposta data 28.06.2011 - 18:58
fonte
1

Hai detto che tutti i giovani programmatori lo fanno; quello dovrebbe dirti qualcosa. Se sto costruendo un prototipo, probabilmente lo farò alcune volte perché sto imparando / cercando di vedere se qualcosa funzionerà. Il problema è quando finisci per costruire tutto usando strategie di livello junior. Si finisce con "Ho sempre fatto così e ha funzionato". mentalità e rischio non ne derivano mai.

Se vuoi diventare un programmatore migliore, devi sviluppare un po 'di fluidità. Fino a quando non applichi ripetutamente e usi ciò che hai imparato, questo è difficile da sviluppare. La quantità di cose necessarie a Google dovrebbe diminuire. La creazione della propria area di riferimento dovrebbe impedire di cercare sempre la stessa cosa. Se lo stai facendo, allora stai creando una copia e un'ampiezza maggiore; incolla la violazione Probaly peggio è copiare e incollare il tuo codice.

    
risposta data 28.06.2011 - 20:19
fonte
1

La mia opinione è che copiare / incollare esempi / soluzioni dal web è un approccio valido ... come ogni altra cosa, può essere abusato.

Se lavori in una lingua moderna, c'è un ton di codice che hai copiato e che non comprendi appieno (almeno, per il 99% di noi). Non guardo abitualmente il codice sorgente delle librerie di classi che uso. Non conosco i dettagli di come viene implementato Array.Sort (). Ho una comprensione zero di ciò che è entrato nei controlli Infragistics che uso sulle mie applicazioni winForms.

Molte persone hanno un'obiezione emotiva al codice di copia e incolla da internet; ma non vedo perché è diverso. Perché aggiungere una funzione e una logica incapsulante non mi sono preoccupato di scrivere o capire peggio che includere un riferimento a una libreria e una logica incapsulatrice che non mi sono preoccupato di scrivere o capire?

Le persone diranno "Ma, ma potrebbe essere un codice errato !" ma è vero per qualsiasi libreria che usi. Certo, con le librerie standard puoi sperare che siano state ben implementate, ma non è sempre così. Tutto il resto è solo "roba" su Internet. Chiunque può pubblicare "cose". Puoi fidarti di recensioni e valutazioni; ma siti come SO consentono alle persone di valutare i frammenti di codice pubblicati nello stesso modo in cui lo fanno CodePlex e altri.

Come sviluppatori potremmo riconoscere una differenza tra chiamare una libreria e il codice che hai incollato. I tuoi utenti non lo faranno. A loro non importa Ho passato ore a saltare attraverso tutti i tipi di cerchi perché un componente di terze parti che abbiamo costruito la nostra applicazione aveva una perdita di memoria e alla fine avrebbe fatto crashare l'app. Il fatto che si trattasse della libreria di qualcun altro non ha reso più facile la correzione (in realtà, probabilmente, era più difficile perché non avevo la fonte).

L'incolla del codice non è un sostituto per sapere come codificare. Ma saper codificare non significa che non puoi usare il codice esistente.

    
risposta data 29.06.2011 - 01:29
fonte
0

Copia-incolla ha due implicazioni, che possono essere entrambe negative.

Quando copia codice da una parte della tua base di codice a un'altra parte, stai violando il principio di responsabilità singola di < a href="https://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29"> SOLID progettazione del codice; ora hai la stessa riga di codice che risiede in due punti nella tua base di codice, e se una di quelle righe di codice cambia dovresti andare a cercare e cambiare l'altra (SE ricordi che è ancora lì). Devi chiederti perché hai bisogno del codice in due punti e se c'è qualcosa che puoi fare per mantenere il codice in un posto mentre lo usi da altri due posti.

Copia-incolla una riga di codice è quasi sempre un segnale che il codice dovrebbe invece essere estratto in un metodo, o inserito in un ciclo, permettendogli di essere accesso e / o iterato da remoto.

Copia-incolla da un sito Web o blog non è di per sé intrinsecamente cattiva; è un codice funzionante che stai adottando per il tuo uso senza reinventare la ruota. Tuttavia, è fondamentale che tu capisca il codice che stai copiando, perché se non capisci come e perché, sarà difficile per te mantenere quel codice. Inoltre, per quanto funzionino bene, ci sono alcuni frammenti di codice davvero mal progettati, che se copiati e incollati diventeranno un incubo solo in virtù del loro layout e della loro architettura.

    
risposta data 10.05.2014 - 23:05
fonte
0

Questo tipo di codice è chiamato programmazione settoriale Cargo . Come uno sviluppatore Ruby on Rails in un'azienda molto professionale abbiamo dovuto gestire diversi progetti che i clienti ci hanno chiesto di refactoring, dopo un altro la compagnia era riuscita a rovinarli in questo modo.

Nella programmazione Ruby on Rails (o programmazione web in generale) questa è una cattiva abitudine, forse causata e assistita dall'uso generale di molti strumenti e plug-in e dalla grande quantità di esempi di codice e tutorial disponibili. Finirai con un codice che non ha alcun significato nel contesto del tuo specifico progetto e con il codice che si basa su funzionalità che non capisci, che non possono cambiare e che non possono eseguire il debug.

Anche i plugin che devono essere inclusi in questo modo possono fallire. (Ricorda che una prima versione di act_as_taggable è eseguita in un ciclo infinito quando hai provato a eliminare un tag). Il codice pubblicato sul Web viene raramente testato anche nel contesto in cui è stato scritto, meno per le tue esigenze speciali.

Questo è chiaramente il lato oscuro della forza. Non vuoi questo nel tuo progetto.

    
risposta data 10.05.2014 - 23:07
fonte

Leggi altre domande sui tag