La maggior parte dei programmatori copia e incolla il codice? [chiuso]


48

Ho imparato molto presto che tagliare e incollare il codice di qualcun altro richiede più tempo a lungo termine che scriverlo da soli. A mio avviso, a meno che tu non lo capisca davvero, il codice taglia e incolla avrà probabilmente problemi che saranno un incubo da risolvere.

Non fraintendetemi, voglio dire trovare il codice di altre persone e imparare da esso è essenziale, ma non lo incolliamo semplicemente nella nostra app. Abbiamo riscrivere i concetti nella nostra app.

Ma sento costantemente parlare di persone che tagliano e incollano e ne parlano come se fosse una pratica comune. Vedo anche commenti di altri che indicano che è pratica comune.

Quindi, la maggior parte dei programmatori taglia e incolla il codice?


10
Anche se so come fare qualcosa, cercherò spesso esempi di codice per le migliori pratiche. Una volta che puoi leggere il codice, puoi rapidamente capire se ciò che trovi è migliore di quello che era il tuo piano.
Nicole,

C'è stata una domanda su cut & paste abbastanza recentemente. Perché non lo controlli ?
Naurgul,

Se lo capisco.
johnny,

Risposte:


46

Due casi generali:

Da un progetto all'altro:

La maggior parte dei programmatori taglia e incolla il codice in questa capacità. Potrebbero trovare un progetto precedente o qualcosa online e copiarlo / incollarlo esattamente o copiare / incollare e apportare modifiche ad esso. Penso che questa pratica in genere vada bene. Questo è particolarmente utile quando è dimostrato il codice. (Esempi: una sorta di oggetto di utilità di un progetto passato che ha funzionato bene o eventualmente da un blog con alcune modifiche necessarie). Dove questo può essere negativo, è quando si copia il codice che non si capisce, o dove il codice è scadente o dove esiste una soluzione alternativa molto migliore rispetto al codice che si sta incollando.

All'interno dello stesso progetto: copiare e incollare nello stesso progetto in genere non è una buona idea. Questo è un cattivo odore che il codice che viene copiato dovrebbe essere solo in un metodo / classe da qualche parte e chiamato ripetutamente. Ci sono alcune eccezioni a questo, ma generalmente il programmatore dovrebbe pensare: " C'è un modo in cui posso parametrizzare questo codice che sto copiando? ".


5
Generalmente questo è vero, a meno che tu non stia scrivendo codice che richiede anti-pattern, come potrebbe essere il caso del codice anti-manomissione, come per le licenze software.
Rob Perkins,

+1 Sì, ho fatto entrambe queste cose. Non ho fatto tagliare e incollare il codice all'interno dello stesso progetto per un lungo periodo di tempo (anche se confesserò di farlo raramente sotto estrema pressione con bug registrato per tornare ad esso). Per quanto riguarda le classi di utilità, il mio progetto per proiettare la copia è ora isolato dalla copia di file completi.
John MacIntyre,

2
Quando scrivo il codice del database, di solito ne taglio e ne incollo in una nuova funzione e modifico lo stesso sql per ottenere il risultato desiderato e non ho bisogno di preoccuparmi di riscrivere alcuni dei prerequisiti per effettuare tali chiamate al database. Anche se in generale sono d'accordo con entrambe le osservazioni.
Chris,

1
@ Chris: Copia e modifica il suo cuore è molto diverso dal semplice incollarlo così com'è.
Loren Pechtel,

1
@Loren Pechtel: Ciò nonostante implica ancora l'atto di copiare e incollare il codice.
Chris,

37

La maggior parte dei programmatori lo fa, ma ciò non significa che dovresti farlo

Uno dei miei mantra di programmazione è: "Se sto copiando e incollando il codice, sto facendo qualcosa di sbagliato" . Essenzialmente, ASCIUTTO .

Penso che dovrebbe essere ovvio che il riutilizzo del codice significa usare il codice come risorsa, non ripetere il codice. A volte ho copiato e incollato il mio codice, nella maggior parte dei casi finisco con il codice della piastra della caldaia o cose che sembrano davvero simili.

Dopo aver investito un po 'più di tempo con quel codice in seguito, ho finito con il seguente:

  • Un componente (vedi anche: separazione delle preoccupazioni )
  • Posso ricorrere alla riflessione per rendere le cose più semplici, più pulite e più facili da raccogliere in futuro.
  • Un design migliore , perché anche se funziona, perché non ricominciare da capo dopo aver appreso le lezioni?
  • Un modello che posso astrarre, trasformarlo in un componente di libreria e rimuovere il codice duplicato.

Può essere discutibile se dovremmo o non dovremmo copiare e incollare il codice poiché al client / capo non importa (almeno direttamente e nel breve termine) e potresti finire con gli stessi risultati, ma il problema si presenta davvero quando porta a bug, perdita di modularità e, infine, inferno di manutenzione.

Cosa dovresti fare: refactor al più presto

Nessuno scrive il codice perfetto, anche se funziona, anche quando non si sta copiando e incollando ed è il proprio codice, se non si è abbastanza soddisfatti basta inserire una nota nei commenti (ad esempio un blocco di documenti "@todo") per ricordare te stesso cosa rifattorizzare e perché ... anche se non lo rifatti da solo, potrebbe diventare la differenza tra felicità e frustrazione totale per il manutentore.

Alla fine, finirai con un buon codice alla fine, anche se copi e incolli.

Buon codice

tramite XKCD


15
Ho spesso visto "refactor later" trasformarsi in "refactor never", o peggio ancora "Sono un colpo così piccante che qualche altro SUCKER può refactoring e sistemare il mio codice quasi ma non del tutto ok". Sono un credente nel farlo subito, altrimenti è come domani - non arriva mai.
quick_now

1
@quickly_now - re: "Sono un colpo così piccante che qualche altro SUCKER può refactoring e aggiustare il mio codice quasi ma non del tutto ok" ... Non posso esprimerti quanto odio quei cretini.
John MacIntyre,

Ehi John. Ti sento. Ho passato anni della mia vita a fare schifo ... ho pagato la metà e sudato fino a mezzanotte ottenendo una comprensione davvero buona di quello che sta succedendo (e riscrivendo grandi lastre di codice di merda) - mentre il colpo caldo ha continuato a rovinare qualcos'altro. Sospiro.
quick_now

1
Più persone nella squadra, più "refactor più tardi" diventa "refactor never" per quanto ho potuto vedere: /
wildpeaks

8

Quando sono bloccato e cerco cose per risolvere il mio problema e mi imbatto in qualche utile frammento di codice che fa quello che voglio, lo copio naturalmente. A volte è solo l'essenza di esso. Poi lo cambio in base alle mie esigenze. Ciò accade più spesso quando approfondisco cose di cui non sono esperto (attualmente, Objective-C).

Prendo sempre il tempo per imparare qualcosa dal codice, quindi per me è un ottimo modo per imparare ed evitare di reinventare la ruota.


4
Ho sempre detto "un buon sviluppatore è uno sviluppatore pigro". Non reinvento la ruota se qualcun altro l'ha già fatto. Ma lo tengo piccolo ... Non copio mai più di poche righe di codice, e mai qualcosa che non capisco completamente.
morganpdx,

Sono tutto per imparare dagli altri, ma non trovi che, a meno che tu non stia cercando un problema specifico, avvolgere la testa attorno a ciò che l'altra persona ha fatto richiede più tempo che farlo da zero? (nota che sto parlando di "codice", non di unità complete di funzionalità come le classi, ecc ...)
John MacIntyre,

@John MacIntyre Potrebbe essere, ma di solito quando inserisco un piccolo frammento di codice, lo modifico fino a quando non sono soddisfatto. Spesso deve comunque essere adattato (in una funzione, più generico, migliorato, ottimizzato, ecc.).
Martin Wickman,

@Giovanni: frammenti di codice forniscono quei pezzi che ti mostrano come fare le cose. Certo, taglia e incolla. Ma come sottolinea Martin, scopri cosa sta facendo quel codice. Passerai molto più tempo a cercare un metodo specifico di cui non conosci il nome. Quando non sai cosa significa una parola; lo cerchi nel dizionario. Le definizioni sono chiare al 100%; ma quanto spesso guardi i campioni di utilizzo? Gli esempi di codice sono proprio come esempi di utilizzo del dizionario. MSDN non include sempre esempi di utilizzo o spesso sono incompleti.
Estratto del

6

Parlerò qui di copiare / incollare il codice di altre persone. Afferrare parti del mio lavoro dalla mia biblioteca personale è un gioco equo. Li conosco e li capisco per definizione.

Trovo che la situazione più frequente in cui "taglia e incolla" il codice è quando ho un problema particolare e mi imbatto in un post sul blog che lo risolve. La maggior parte delle volte inserisco nuovamente la soluzione nel mio progetto (dopotutto, è probabilmente scritto nello stile dell'autore del blog, se non altro). Non è proprio il mio codice, ma non mi dispiace usarlo in quello scenario.

Uscire e afferrare interi metodi o sistemi per incollarli nel mio progetto così com'è e chiamarlo fatto è qualcosa che non capisco. L' altro giorno c'era una domanda su StackOverflow che illustrava perfettamente il problema nel fare qualcosa del genere.

Mettere insieme un mostro di Frankenstein tra parti di codice diverse non può essere così efficiente. Voglio dire, se ci riesci, significa che stai replicando la stessa soluzione più e più volte o hai ottenuto abbastanza comprensione del codice di altre persone che lo stesso livello di copia / incolla non dovrebbe più essere necessario e il tuo la produttività migliorerebbe non dovendo risolvere i problemi tra campioni di codice incompatibili.

Personalmente non ho incontrato molti programmatori che copiano / incollano su larga scala. Ho visto molti che si codificano negli angoli più profondi e più bui, ma questa è una storia diversa. Sulla base dei miei aneddoti personali, direi che la maggior parte dei programmatori non copia / incolla intere applicazioni insieme, ma è davvero difficile dirlo con certezza.


1
Forse molti programmatori non copiano / incollano il codice effettivo su larga scala, ma sfrutteranno felicemente una libreria pronta (gratuita o di altro tipo) senza guardare una singola riga di codice ...
hplbsh

1
@Stuart Vero, ma penso che la distinzione sia che quella biblioteca non verrebbe rivendicata come opera propria del programmatore. E onestamente, fintanto che la biblioteca funziona e fa quello che mi serve per farlo, non mi interessa nemmeno occuparmi della sua fonte. (Supponendo che la diligenza dovuta sia altrimenti fatta su quanto sia stimabile / affidabile la biblioteca in primo luogo.)
Adam Lear

In un certo senso è una questione di intenti, sia da parte dell'editore che del consumatore :)
hplbsh,

@stuart - Non includerei una biblioteca in questa discussione in quanto è un'unità coesa ... non proprio 'perdere' il codice, se sai cosa intendo.
John MacIntyre,

In realtà, pensando ai tuoi commenti, devo sinceramente chiedermi se è possibile per un programmatore tagliare e incollare un sistema completo insieme. Penso che il peso della loro arroganza sarebbe rapidamente valanga, schiacciando i loro progressi a un punto morto.
John MacIntyre,

4

Cattivo: copia e incolla più volte lo stesso blocco di codice

Se ti ritrovi a fare questo, probabilmente dovresti prenderti un secondo per pensare a cosa può essere estratto dal codice che si sta copiando e creare una funzione / metodo per gestirlo. È qui che conta il principio DRY (Don't Repeat Yourself).

Buono: copia di un blocco di codice che funziona

DRY (Don't Repeat Yourself) si applica anche qui, solo in un altro senso. IE, non ripetere il lavoro che hai già svolto in passato. Se hai impiegato del tempo per scrivere una sezione di codice, esegui il debug, testalo ed è dimostrato che funziona in una base di codice di produzione; saresti stupido a non riutilizzarlo.

La maggior parte delle persone dà un brutto colpo alla copia e incolla perché molti programmatori principianti passano il loro tempo a setacciare la rete e a copiare / incollare un miscuglio di codice di altre persone senza capire cosa effettivamente fa.

Scrivere tutto da zero ogni volta non è meglio. So che ci sono molti programmatori puristi della vecchia scuola che ogni cosa dovrebbe essere scritta da zero e spero di non rimanere bloccato a lavorare con loro. Se hai 5 anni di esperienza di programmazione, dovresti avere una libreria di codice piuttosto sostanziale che è ottima per il riutilizzo. È una delle risorse migliori che un programmatore esperto può portare sul tavolo perché potenzialmente risparmierà molto tempo di sviluppo.

Se all'inizio non capisci il tuo vecchio codice, prenditi un momento per leggere i commenti e familiarizzare di nuovo. Se i tuoi commenti fanno schifo ... beh, questo è un altro problema.


Invece di copiare e incollare il codice, è del tutto possibile scriverlo in modo riutilizzabile. Quindi usa quello invece di copiarlo e incollarlo.
Bjorn,

1
Sì, di solito è preferibile suddividere il codice in funzioni riutilizzabili a meno che quel processo non aggiunga complessità e il codice non verrà mai riutilizzato
Evan Plaice,

Se lo stai copiando e incollando, lo stai riutilizzando. Sono d'accordo che le persone dovrebbero usare la testa e che le condizioni possono giustificarlo. Mi sono ritrovato a fare copia e incolla durante la scrittura di test, ma anche lì provo a creare funzioni riutilizzabili, ma poi ci sono due o tre righe che sono quasi uguali, ma non riesco abbastanza a generalizzarlo abbastanza da trasformarlo in un funzione riutilizzabile.
Bjorn,

3

Dopo 25 anni di scrittura del codice, ci sono stati momenti in cui (senza accesso al codice che ho scritto per un precedente datore di lavoro) ho desiderato poter tagliare e incollare. TUTTAVIA è stato molto raro (e continua a leggere).

Forse il miglior esempio è un parser di riga di comando davvero semplice che ho incontrato anni fa per i sistemi operativi unix. Un semplice ciclo che sfreccia tra gli arg ed elabora le opzioni. Era diabolicamente semplice ed elegante, e da allora l'ho usato (più come un modello che come un letterale incolla). Questa è l'eccezione piuttosto che la regola.

Di solito un semplice taglio e incolla è del tutto inappropriato - è più incisivo il concetto, o algoritmo, che è stato importante.

Non sono troppo orgoglioso: cercherò felicemente in giro per trovare un algoritmo di verifica di parità o codice hamming molto veloce o qualcosa di esotico del genere. Quindi passa qualche ora a capirlo per vedere se è davvero la cosa incredibilmente super veloce che stavo cercando, o un ingenuo mucchio di spazzatura.

Mi preoccupo ogni volta che qualcuno semplicemente copia il codice senza fermarsi per capirlo. Sono o un genio (capiscilo e tutte le sue sottigliezze a colpo d'occhio) o uno sciocco. Non c'è molto spazio per nulla in mezzo. Oh, e non ci sono nemmeno molti veri geni.

Senza capire, non hai davvero idea di quello che hai appena lanciato DAVVERO, in condizioni non solo felici ma anche infelici. A volte questo non importa perché sei fortunato. E a volte questo provoca molto dolore a lungo termine.


4
d'altra parte, ci sono programmatori che scrivono il codice da soli e continuano a non capirlo ...
hplbsh

3

C'è una situazione comune in cui, in pratica, DEVI farlo per essere produttivo.

Qualsiasi tecnologia che non ti è familiare è difficile da imparare a meno che tu non abbia un esempio funzionante per cominciare. Quindi lo copi e incolli per avere qualcosa che effettivamente gira , e poi inizi a armeggiare con esso.


Correzione: esiste un vero beleif in cui fondamentalmente pensi di ESSERE NECESSARIO farlo per essere produttivo. Quindi copia e incolla il tuo modo di rilasciare qualcosa che in qualche modo funziona e trascorri l'enternità nel tuo modo di riparare il danno.
Newtopian,

3

Come nuovo programmatore (4 mesi dopo il mio primo lavoro), faccio molto affidamento sull'aiuto (sia da SO che da altri posti). Mi impegno a NON copiare e incollare ciecamente il codice degli altri. Anche se il codice fornito è quello che userò, lo scriverò nel mio programma e poi passerò un po 'di tempo per assicurarmi di capire completamente cosa fa e le ragioni.

Voglio assicurarmi di apprendere costantemente e non semplicemente di un esperto di taglia e incolla


1

Ho così tanti sentimenti su questo argomento e non posso onestamente dire che nessuno di essi sia del tutto oggettivo.

Esistono molti argomenti per tagliare e incollare il codice di altre persone nella tua applicazione. Alcuni di loro potrebbero avere un senso, altri no. Ad esempio, se hai un metodo dal blog di qualcuno che prende un input ed esegue un complicato algoritmo matematico che è molto al di fuori delle tue capacità matematiche e sputa un risultato - questo è un argomento per tagliare e incollare - ottieni il permesso dell'autore di usare il loro codificarli e accreditarli dove dovuto - è la cosa onorevole da fare.

Ci sono argomenti per non reinventare la ruota - di nuovo, questo ha senso, in teoria. Ma se non ti prendi il tempo di familiarizzare intimamente con il codice che stai tagliando e incollando, non sai se esiste un modo migliore per risolvere questo problema, non sai se ci sono bug nel codice . Cosa succede se la ruota che stai incollando è rotta?

Ci sono argomenti per la velocità e l'efficienza: crei una libreria di codice di altre persone che hai strappato, rubato, plagiato o altrimenti, ti viene in mente, potresti non aver nemmeno bisogno di sapere come programmare oltre Frankensteining alcune applicazioni insieme da parti di recupero.

Ci sono momenti e luoghi in cui ritengo questo comportamento completamente accettabile. Per hackerare insieme strumenti rapidi da buttare via che non sono progettati per la longevità ma per portare a termine un compito, in questo momento con il gancio o con il truffatore. Ai fini della prototipazione e dello studio di concessioni, per imparare e avanzare in un contesto teorico, penso che questo sia un gioco completamente equo.

Tagliare e incollare il codice di altre persone è un plagio: se hai la loro benedizione e capisci il codice che stai incollando e si adatta al costrutto degli standard di codifica per la tua applicazione, allora va bene, ammetto che è un gioco giusto.

Come ingegnere informatico professionista, mi viene pagato per mantenere uno standard e un codice etico. Non vengo pagato per rubare, plagiare o violare il copyright di altre persone mettendo il mio cliente a rischio di persecuzione. A parte questo, c'è un rischio molto reale che quando si esegue detto codice tagliato / incollato abbia effetti collaterali catastrofici.

Non rivolgendoti a questa risposta, John, so che sei molto eticamente incline quando si tratta di argomenti come questo, quindi questa è davvero solo una tendenza generale nella direzione della domanda stessa.

Addendum : Detto questo, ritengo che tagliare e incollare il proprio codice tra i progetti sia abbastanza accettabile, a meno che non sia stato scritto come lavoro a noleggio per qualcun altro, nel qual caso non si possiede il copyright e si dovrebbe ottenere l'autorizzazione della persona per cui lo hai codificato. Ho scoperto che, a meno che il codice non sia pertinente ai concetti funzionali proprietari, la maggior parte dei datori di lavoro è d'accordo con te nel riutilizzare le tue idee per altri clienti.


Qual è la tua opinione sull'uso del codice dai post del blog che risolvono un problema specifico che stai riscontrando? Copiare / incollare fisicamente il codice è ciò che considereresti una violazione dell'etica o la ridigitazione della soluzione nel tuo progetto rientra nella stessa categoria? La dimensione del codice "preso in prestito" (ovvero un programma / una funzione completa rispetto a un piccolo frammento) influisce sulla tua opinione?
Adam Lear

2
Sento che se è su un post sul blog, l'autore ha voluto che fosse pubblico, quindi se ti è utile, allora è un gioco equo. Tuttavia, quasi mai mi sono imbattuto in frammenti di codice che potrebbero essere copiati alla lettera. Di solito richiedono un po 'di finagling.
Pemdas,

Non ho problemi con il codice di tutorial o post di blog in uso - basta capire cosa fa. Presumibilmente se è stato pubblicato, è disponibile.
quick_now

"Non indirizzare questa risposta a te John" ... In realtà non pensavo che fossi ... beh almeno non fino a quando non ho letto questo. LOL
John MacIntyre,

Mi piacciono i tuoi commenti sul plagio e la completa comprensione del codice, ma pensi davvero che sia più efficiente copiare / incollare il codice di qualcun altro, piuttosto che scriverlo tu stesso? Trovo che o non lo capirai completamente e avrai problemi in seguito, O i tuoi tentativi di comprenderlo appieno impiegheranno più tempo della semplice scrittura da soli. KWIM?
John MacIntyre,


0

Se il codice è valido, invece di copiarlo e incollarlo, dovrebbe essere creato in una libreria comune. Ma le persone non possono essere disturbate dal refactoring e preferiscono avere la stessa funzionalità diffusa per copia e metodo.

Invece di avere una legge assoluta universale di copia e incolla è buona o cattiva, si dovrebbe vedere quando usarla.

I vantaggi di copia e incolla sono: Ti fa andare veloce I contro sono: Lo stesso codice viene distribuito in più punti e qualsiasi problema riscontrato / risolto deve essere risolto ovunque, se invece di copiare e incollare uno lo utilizzava come libreria comune, l'aggiornamento sarà propagarsi ovunque. Per un piccolo investimento iniziale di utilizzo di una libreria invece di diffondere lo stesso codice ovunque molteplice.

La scelta è se risparmiare un po 'di tempo inizialmente rispetto a molto più tardi, quindi copiare e incollare è la strada da percorrere, altrimenti refactore e metterlo in una libreria comune.


Sono assolutamente d'accordo sulla libreria comune, ma dovresti tagliare e incollare quel codice o crearlo da zero?
John MacIntyre,

Il modo più veloce per importare il codice è copiare e incollare, ma si dovrebbe rivedere e, se necessario, modificare il codice prima di collegarlo a un progetto e dimenticarsene.
Arjang,

0

Nella maggior parte dei casi, il codice che troverai in rete non si adatta ai tuoi scopi esatti.

Ciò che mi vede fare molto è copiare il codice da qualcuno, eliminarlo fino all'essenza e quindi aggiungere il codice fino a quando non soddisfa i miei requisiti. Riformo sempre in modo che corrisponda alle mie convenzioni di denominazione e al mio stile di codifica.

Personalmente lo odio quando leggo un tutorial e iniziano mostrando il codice per un caso complicato. Inizia con l'essenza e mostra i blocchi predefiniti per estendere il codice. Se mai avessi aperto un blog, fornirò alle persone un esempio di codice commentato che mostra l'essenza di ciò che voglio fare, come è possibile aggiungere funzionalità / casi speciali e un esempio pienamente funzionante della funzionalità di base.


-1

Perché reinventare la ruota se capisci cosa sta facendo il codice, hai il permesso di riutilizzare il codice (o il suo aperto) e non hai necessariamente bisogno di tutto il codice che l'altra persona ha scritto. Copio spesso un'implementazione dell'algoritmo e la modifico in base alle mie esigenze. Di solito, però, quando ho appena tagliato e incollato è perché non ho bisogno di tutto ciò che era nell'esempio, quindi l'aggiunta di un altro file sarebbe solo uno spreco (o è qualcosa all'interno di una funzione). Sono d'accordo con jzd se stai tagliando e incollando il tuo codice all'interno dello stesso progetto, allora c'è qualcosa di sbagliato e probabilmente dovresti trovare un modo economico per liberarlo o condividere la funzione.


-1

Trovo che i membri del team di " integrazione " o quelli che non hanno molta esperienza con il codice o nella programmazione tendono a copiare e incollare più spesso e non capiscono cosa hanno fatto (entrare nei problemi menzionati nella tua domanda).

Trovo anche che i programmatori spesso stiano lontani dal tagliare e incollare a loro dispiacere perché amano il codice e spesso reinventano la ruota, solo perché vogliono farlo meglio o imparare di più.


+1 per il reinventare. Mi ritrovo anche un sacco di tempo a riscrivere il codice da Internet invece di incollare la copia. Immagino di farlo perché non sono limitato alle scadenze. Posso imparare liberamente da solo e posso imparare cosa en quando voglio.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.