it-swarm.it

La maggior parte dei programmatori copia e incolla il codice?

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 riscriviamo 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?

48
John MacIntyre

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à proveniente da 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: Copia e incolla 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: " Esiste un modo per parametrizzare questo codice che sto copiando? ".

46
jzd

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" . In sostanza, DRY .

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 codice piastra 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 a reflection 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 buon codice alla fine, anche se copi e incolli.

Good Code

via XKCD

37
dukeofgaming

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.

8
Martin Wickman

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 è davvero il mio codice , ma non mi sento male a 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. C'è stato un domanda su StackOverflow l'altro giorno che ha illustrato 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.

6
Adam Lear

Bad: copia e incolla ripetutamente dello 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.

4
Evan Plaice

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 della riga di comando davvero semplice che ho incontrato anni fa per i sistemi operativi unix. Un semplice ciclo che sfreccia attraverso gli arg e processa 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 della parità davvero veloce o del codice di hamming 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, non solo nelle circostanze felici o infelici o nelle condizioni di input. A volte questo non importa perché sei fortunato. E a volte questo provoca molto dolore a lungo termine.

3
quickly_now

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 corre, e poi inizi a armeggiare con esso.

3
user1249

Come nuovo programmatore (4 mesi dopo il mio primo lavoro), mi baso molto sull'aiuto (sia da SO o altri posti). Mi impegno a NON copiare ciecamente e incollare altri codici 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

3
Darren Young

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 algoritmo matematico complicato che è ben al di fuori delle tue capacità matematiche e sputa un risultato - questo è un argomento per tagliare e incollare - ottenere 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 di lancio rapido 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 alla struttura degli standard di codifica per la tua applicazione, allora va bene, ammetterò 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 tuo 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 possiedi il copyright e dovresti ottenere il permesso 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.

1
BenAlabaster

Dato che, in un repository open source, il 15% di tutti i metodi viene copiato da un progetto all'altro (pdf), la risposta sembra essere un chiaro sì.

1
nes1983

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

Ciò che mi vedo fare molto è copiare il codice da qualcuno, ridurlo 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 avessi mai 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.

0
J. Maes

Se il codice è buono, invece di copiare e incollare, 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 pro per 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.

0
Arjang