Est-ce que la plupart des programmeurs copient et collent du code? [fermé]


48

J'ai appris très tôt que couper et coller le code de quelqu'un d'autre prend plus de temps à long terme que l'écrire vous-même. À mon avis, à moins que vous ne le compreniez vraiment, couper et coller du code aura probablement des problèmes qui seront un cauchemar à résoudre.

Ne vous méprenez pas, je veux dire que trouver le code d'autres personnes et en tirer des leçons est essentiel, mais nous ne le collons pas à notre application. Nous réécrivons les concepts dans notre application.

Mais j'entends constamment parler de gens qui coupent et collent, et ils en parlent comme si c'était une pratique courante. Je vois aussi des commentaires d'autres personnes qui indiquent que c'est une pratique courante.

Alors, la plupart des programmeurs coupent-ils du code?


10
Même si je sais comment faire quelque chose, je vais quand même souvent chercher des exemples de code pour les meilleures pratiques. Une fois que vous pouvez lire le code, vous pouvez rapidement déterminer si ce que vous trouvez est meilleur que ce que votre plan était.
Nicole

Il y avait une question concernant couper et coller assez récemment. Pourquoi tu ne vérifies pas ?
Naurgul

Si je le comprends
johnny

Réponses:


46

Deux cas généraux:

D'un projet à l'autre:

La plupart des programmeurs coupent et collent le code de cette manière Ils peuvent trouver un projet précédent ou quelque chose en ligne et le copier / coller exactement ou le copier / coller et le modifier. Je pense que cette pratique est généralement bien. Ceci est particulièrement utile lorsqu'il s'agit de code éprouvé. (Exemples: une sorte d'objet utilitaire d'un projet précédent qui a bien fonctionné, ou éventuellement d'un blog avec peu de modifications nécessaires). Là où cela peut être mauvais, c'est lorsque vous copiez du code que vous ne comprenez pas, ou que le code est médiocre, ou qu'il existe une solution alternative bien meilleure que le code que vous collez.

Dans le même projet: Copier et coller dans le même projet n'est généralement pas une bonne idée. C'est une mauvaise odeur que le code en cours de copie devrait juste être dans une méthode / classe quelque part et appelé à plusieurs reprises. Il y a quelques exceptions à cela, mais généralement le programmeur devrait se dire: " Est-il possible de paramétrer ce code que je copie? ".


5
En règle générale, cela est vrai, sauf si vous écrivez du code nécessitant des anti-modèles, comme cela pourrait être le cas avec du code anti-amortissement, comme pour les licences logicielles.
Rob Perkins

+1 Oui, j'ai fait ces deux choses. Cela fait très longtemps que je n'ai pas fait de copier-coller de code dans le même projet (bien que j'avoue qu'il soit rare de le faire sous une pression extrême avec un bogue enregistré pour y revenir). En ce qui concerne les classes d'utilitaires, mon projet de copie de projet est maintenant isolé pour copier des fichiers complets.
John MacIntyre

2
Lors de l’écriture du code de base de données, j’ai l'habitude de couper et coller une partie de celui-ci dans une nouvelle fonction et de modifier le SQL lui-même pour obtenir le résultat souhaité. Bien qu'en général je suis d'accord avec les deux remarques.
Chris

1
@Chris: Copier et modifier le cœur de celui-ci est très différent du simple fait de le coller tel quel.
Loren Pechtel le

1
@ Loren Pechtel: Néanmoins, il s'agit toujours de copier et de coller du code.
Chris

37

La plupart des programmeurs le font, mais cela ne signifie pas que vous devriez

L'un de mes mantras de programmation est le suivant: "Si je copie et colle du code, je fais quelque chose de mal" . Essentiellement, SEC .

Je pense qu'il devrait être évident que la réutilisation du code signifie utiliser le code comme une ressource, et non le répéter. Parfois, j'ai copié et collé le code de mon propre code. Dans la plupart des cas, je termine par un code de plaque de chaudière ou des éléments très similaires.

Après avoir investi un peu plus de temps avec ce code, je termine avec les éléments suivants:

  • Un composant (voir aussi: séparation des préoccupations )
  • Je peux recourir à la réflexion pour rendre les choses plus simples, plus propres et plus faciles à reproduire à l'avenir.
  • Une meilleure conception , car même si cela fonctionne, pourquoi ne pas le refaire après avoir appris les leçons ?.
  • Un modèle que je peux résumer, transformer en composant de bibliothèque et supprimer le code dupliqué.

On peut se demander si nous devrions ou non copier / coller du code puisque le client / responsable ne s’en soucie pas (du moins directement et à court terme) et que vous pourriez vous retrouver avec les mêmes résultats, mais le problème vient vraiment de la situation. conduit à des bugs, à une perte de modularité et, finalement, à la maintenance.

Ce que vous devriez faire: refactor ASAP

Personne n’écrit un code parfait, même si cela fonctionne, même si vous n’êtes pas copier / coller et qu’il s’agit de votre propre code, si vous n’êtes pas complètement satisfait, il suffit de mettre une note dans les commentaires (par exemple, un docblock "@todo") pour le rappeler. vous-même quoi refactoriser et pourquoi… même si vous ne le faites pas vous-même, cela pourrait faire la différence entre le bonheur et la frustration totale du mainteneur.

Finalement, vous finirez avec un bon code , même si vous copiez et collez.

Bon code

via XKCD


15
J'ai souvent vu «refactor plus tard» se transformer en «refactor jamais», ou même pire «je suis un coup si chaud qu'un autre SUCKER peut refactoriser et corriger mon code presque-mais pas-tout-ok». Je suis convaincu de le faire dès le départ, parce que sinon c'est comme demain - ça ne vient jamais.
Rapidement maintenant

1
@quickly_now - re: "Je suis tellement excité qu'un autre SUCKER peut refactoriser et corriger mon code presque-mais-pas-tout-à-fait-correct" ... Je ne peux pas vous dire à quel point je déteste ces saccades.
John MacIntyre

Salut John. Je t'entends. J'ai passé des années de ma vie à être ce meunier ... payé la moitié moins et transpirant jusqu'à minuit pour bien comprendre ce qui se passait (et réécrire de superbes morceaux de code merdique) - pendant que le coup brûlant continuait à bousiller autre chose. Soupir.
Rapidement maintenant

1
Plus il y a de personnes dans l'équipe, plus "refactor plus tard" devient "refactor jamais" pour autant que je puisse voir: /
wildpeaks

8

Lorsque je suis coincé et que je cherche des éléments pour résoudre mon problème et que je tombe sur un extrait de code utile qui fait ce que je veux, je le copie naturellement. Parfois, c'est juste l'essentiel. Je le change ensuite pour répondre à mes besoins. Cela se produit plus souvent lorsque je fouille dans des domaines pour lesquels je ne suis pas un expert (actuellement, Objective-C).

Je prends toujours le temps d'apprendre quelque chose du code. C'est donc pour moi un excellent moyen d'apprendre et d'éviter de réinventer la roue.


4
J'ai toujours dit "un bon développeur est un développeur paresseux". Je ne réinvente pas la roue si quelqu'un d'autre l'a déjà fait. Mais je le garde petit… Je ne copie jamais plus de quelques lignes de code et jamais rien que je ne comprenne pas complètement.
morganpdx

Je suis tout pour apprendre des autres, mais ne trouvez-vous pas que, sauf si vous recherchez un problème spécifique, vous en tenir à l'esprit de ce que l'autre personne a fait prend plus de temps que de le faire à partir de zéro? (remarquez que je parle de 'code', et non d'unités complètes de fonctionnalités telles que les classes, etc.)
John MacIntyre le

@ John MacIntyre Peut-être, mais généralement lorsque je dépose un petit extrait de code, je le façonne jusqu'à ce que j'en sois satisfait. Il doit souvent être adapté (en une fonction, de manière plus générique, améliorée, optimisée, etc.).
Martin Wickman

@ John: Des extraits de code fournissent ces éléments qui vous montrent comment faire les choses. Bien sûr, couper et coller. Mais, comme le souligne Martin, découvrez ce que fait le code. Vous passerez beaucoup plus de temps à rechercher une méthode spécifique dont vous ne connaissez pas le nom. Quand vous ne savez pas ce que signifie un mot; vous le cherchez dans le dictionnaire. Les définitions sont claires à 100%; mais combien de fois regardez-vous les échantillons d'utilisation? Les exemples de code sont similaires aux exemples d'utilisation de dictionnaire. MSDN n'inclut pas toujours les exemples d'utilisation ou est souvent incomplet.
Résumé de

6

Je vais parler de copier / coller le code d'autres personnes ici. Obtenir des parties de mon propre travail à partir de ma bibliothèque personnelle est un jeu juste. Je les connais et les comprends par définition.

Je constate que la situation la plus fréquente dans laquelle je code "copier-coller" est lorsque j'ai un problème particulier et que je rencontre un article de blog qui le résout. La plupart du temps, je ressaisis la solution dans mon projet (après tout, c'est probablement écrit dans le style de l'auteur du blog, si rien d'autre). Ce n'est pas vraiment mon code, mais je ne me sens pas mal de l'utiliser dans ce scénario.

Sortir et saisir des méthodes ou des systèmes entiers pour les coller dans mon projet tel quel et appeler cela fait est quelque chose que je ne comprends pas. Il y avait une question sur StackOverflow l'autre jour qui illustrait parfaitement le problème de faire quelque chose comme ça.

Concilier un monstre Frankenstein à partir de différentes parties de code ne peut tout simplement pas être aussi efficace. Je veux dire, si vous y arrivez bien, cela signifie que vous reproduisez la même solution encore et encore ou que vous avez suffisamment compris le code des autres personnes pour que le même niveau de copie / collage ne soit plus nécessaire. la productivité s'améliorerait si on n'avait pas à résoudre les problèmes entre les échantillons de code incompatibles.

Personnellement, je n'ai pas rencontré beaucoup de programmeurs qui copient / collent à grande échelle. J'en ai vu beaucoup qui se codent dans les coins les plus profonds et les plus sombres, mais c'est une autre histoire. Sur la base de mon anecdata personnelle, je dirais que la plupart des programmeurs ne copient / colle pas des applications entières ensemble, mais il est très difficile de dire avec certitude.


1
Beaucoup de programmeurs ne copient peut-être pas le code réel à grande échelle, mais ils se serviront volontiers d'une bibliothèque prête à l'emploi (gratuite ou autre) sans regarder une seule ligne de code ...
hplbsh

1
@Stuart C'est vrai, mais je pense que la distinction est que cette bibliothèque ne serait pas revendiquée comme le travail du programmeur. Et honnêtement, tant que la bibliothèque fonctionne et fait ce dont j'ai besoin, je ne tiens pas particulièrement à en explorer la source. (En supposant que la diligence raisonnable soit établie sur la fiabilité de la bibliothèque en premier lieu.)
Adam Lear

D'une certaine manière, c'est une question d'intention, à la fois de l'éditeur et du consommateur :)
hplbsh

@stuart - Je n'inclurais pas de bibliothèque dans cette discussion car il s'agit d'une unité cohérente ... pas vraiment de "perdre" du code, si vous voyez ce que je veux dire.
John MacIntyre le

En réfléchissant à vos commentaires, je dois honnêtement me demander s’il est possible pour un programmeur de couper et coller un système complet ensemble. Je pense que le poids de leur orgueil serait rapidement une avalanche, freinant leur progression.
John MacIntyre le

4

Bad: copier et coller le même bloc de code encore et encore

Si vous faites cela, vous devriez probablement prendre une seconde pour réfléchir à ce qui peut être extrait du code en cours de copie et créer une fonction / méthode pour le gérer. C’est là que le principe DRY (ne vous répétez pas) compte.

Bon: Copier un bloc de code connu pour fonctionner

DRY (Don't Repeat Yourself) s'applique également ici, mais dans un sens différent. IE, ne répétez pas le travail que vous avez déjà fait dans le passé. Si vous avez pris le temps d'écrire une section de code, de la mettre au point, de la tester et que son efficacité est prouvée dans une base de code de production; vous seriez stupide de ne pas le réutiliser.

La plupart des gens donnent l’impression de ne pas bien copier-coller parce que beaucoup de programmeurs débutants passent leur temps à parcourir le net et à copier / coller un méli-mélo du code d’autrui sans comprendre ce qu’il fait réellement.

Tout écrire à partir de rien à chaque fois n'est pas mieux. Je sais qu'il y a beaucoup de programmeurs puristes de la vieille école qui pensent que tout devrait être écrit à partir de rien et j'espère ne pas rester coincé à travailler avec eux. Si vous avez 5 ans d’expérience en programmation, vous devriez avoir une bibliothèque assez substantielle de code à réutiliser. C'est l'un des meilleurs atouts qu'un programmeur expérimenté peut apporter à la table, car il permet potentiellement de gagner beaucoup de temps de développement.

Si au début vous ne comprenez pas votre ancien code, prenez un moment pour lire les commentaires et ré-familiarisez-vous. Si vos commentaires sont nuls ... eh bien, c'est un tout autre problème.


Au lieu de copier et coller du code, il est tout à fait possible de l'écrire de manière réutilisable. Ensuite, utilisez-le au lieu de le copier-coller.
Bjorn

1
@BjornTipling Oui, il est généralement préférable de décomposer le code en fonctions réutilisables, à moins que ce processus ne soit complexe et que le code ne soit jamais réutilisé
Evan Plaice

Si vous le copiez et le collez, vous le réutilisez. Je conviens que les gens devraient utiliser leur tête et que les conditions peuvent le justifier. Je me suis retrouvé en train de copier-coller en écrivant des tests, mais même là, j'essaie de créer des fonctions réutilisables, mais il y a deux ou trois lignes qui sont presque identiques, mais je ne peux pas assez généraliser pour en faire un fonction réutilisable.
Bjorn

3

Après 25 ans d'écriture de code, il y a eu des moments où (sans accès au code que j'ai écrit pour un employeur précédent), j'ai souhaité pouvoir copier et coller. CEPENDANT, cela a été très rare (et continuez à lire).

Le meilleur exemple est peut-être un analyseur en ligne de commande très simple que j'ai rencontré il y a des années pour les systèmes d'exploitation Unix. Une simple boucle permettant de parcourir les arguments et de traiter les options. C'était incroyablement simple et élégant, et je l'ai utilisé (plus comme un motif que comme un copier-coller littéral) plusieurs fois depuis. C'est l'exception plutôt que la règle.

Habituellement, couper et coller un ole uni est tout à fait inapproprié - il faut davantage couper et coller le concept, ou l’algorithme, qui a été important.

Je ne suis pas trop fier - je me ferai un plaisir de chercher un algorithme de vérification de parité ou de code de blocage très rapide ou quelque chose d'exotique comme ça. Ensuite, passez quelques heures à comprendre si c’est vraiment ce que je cherchais, ou une pile naïve de bêtises.

Je m'inquiète chaque fois que quelqu'un copie simplement du code sans s'arrêter pour le comprendre. Ils sont soit un génie (comprenez-le et toutes ses subtilités en un coup d'œil), soit un imbécile. Il n'y a pas beaucoup de place pour rien entre les deux. Oh, et il n'y a pas beaucoup de vrais génies non plus.

Sans compréhension, vous n'avez vraiment aucune idée de ce que vous venez d'introduire VRAIMENT, dans des circonstances non seulement heureuses mais malheureuses, mais également dans des conditions d'entrée. Parfois, cela n'a pas d'importance car vous avez de la chance. Et parfois, cela cause beaucoup de douleur à long terme.


4
d'autre part, il y a des programmeurs qui écrivent le code eux-mêmes et ne le comprennent toujours pas ...
hplbsh

3

Il existe une situation courante dans laquelle vous devez BESOIN de le faire pour être productif.

Toute technologie qui ne vous est pas familière est difficile à maîtriser à moins d’avoir un exemple concret pour commencer. Par conséquent, vous copiez et collez-le pour que quelque chose fonctionne réellement , puis vous commencez à le bricoler.


Correction: Il y a une croyance réelle dans laquelle vous pensez qu'il est NÉCESSAIRE de le faire pour être productif. Par conséquent, vous copiez et collez votre manière de libérer quelque chose qui fonctionne et passez l’enthousiasme en subissant votre façon de réparer les dégâts.
Newtopian

3

En tant que nouveau programmeur (après 4 mois d’activité), je compte beaucoup sur l’aide (que ce soit de SO ou d’autres lieux). Je tiens à ne pas copier et coller aveuglément le code des autres. Même si le code fourni correspond à ce que je vais utiliser, je le dactylographierai dans mon programme, puis je passerai un peu de temps à vérifier que je comprends parfaitement ce qu'il fait et les raisons qui le motivent.

Je veux m'assurer que j'apprends constamment et pas simplement un expert en couper-coller


1

J'ai tellement de sentiments sur ce sujet, et je ne peux honnêtement pas dire qu'aucun d'entre eux soit tout à fait objectif.

Il existe de nombreux arguments pour couper et coller le code d'autres personnes dans votre application. Certains d'entre eux peuvent avoir un sens, d'autres non. Par exemple, si vous utilisez une méthode d'un blog qui prend une entrée et exécute un algorithme mathématique complexe qui sort de vos capacités mathématiques et crache un résultat - c'est un argument pour couper / coller - obtenez l'autorisation de l'auteur pour utiliser leurs code et les créditer où il est dû - c'est la chose honorable à faire.

Il existe des arguments pour ne pas réinventer la roue - encore une fois, cela a du sens, en théorie. Mais si vous ne prenez pas le temps de vous familiariser avec le code que vous copiez et collez, vous ne savez pas s'il existe un meilleur moyen de résoudre ce problème, vous ne savez pas s'il y a des bogues dans le code. . Et si la roue que vous collez est cassée?

Il existe des arguments en faveur de la rapidité et de l'efficacité: vous construisez une bibliothèque de codes d'autres personnes que vous avez volés, volés, plagiés ou autrement. ensemble de pièces récupérées.

Il y a des moments et des endroits où je considère ce comportement comme totalement acceptable. Pour bidouiller ensemble des outils rapides à jeter qui ne sont pas conçus pour durer, mais pour accomplir une tâche, en ce moment, que ce soit par gré ou de force. Dans le but de prototyper et d'étudier les accords, d'apprendre et de progresser dans un contexte théorique, je pense que c'est un jeu totalement juste.

Couper et coller le code des autres utilisateurs est du plagiat - si vous avez la bénédiction et comprenez le code que vous collez et si cela cadre avec les normes de codage de votre application, alors je vous concède que c'est un jeu juste.

En tant qu’ingénieur logiciel professionnel, je suis rémunéré pour maintenir une norme et un code d’éthique. Je ne suis pas payé pour voler, plagier ou enfreindre le droit d'auteur d'autrui, exposant ainsi mon client à des poursuites. En dehors de cela, il existe un risque très réel que lorsque vous exécutez un code coupé / collé, il ait des effets secondaires catastrophiques.

Sans cibler cette réponse sur vous John, je sais que vous êtes très enclin à l’éthique quand il s’agit de sujets comme celui-ci, alors c’est vraiment un discours général qui va dans le sens de la question elle-même.

Addendum : Cela dit, j’estime que couper et coller votre propre code entre les projets est tout à fait acceptable - à moins que cela ait été écrit en tant que travail à la location pour quelqu'un d'autre, auquel cas vous ne possédez pas le droit d'auteur et vous devriez obtenir la permission. de la personne pour laquelle vous l'avez codé. J'ai constaté que, à moins que le code ne concerne les concepts fonctionnels relatifs à la propriété, la plupart des employeurs acceptent que vous réutilisiez vos propres idées pour d'autres clients.


Que pensez-vous de l’utilisation de code provenant de billets de blog qui résolvent un problème spécifique que vous rencontrez? Est-ce que copier / coller physiquement le code de ce que vous considériez comme une violation de l'éthique ou retaperiez la solution dans votre projet appartiendrait à la même catégorie? Est-ce que la taille du code "emprunté" (c'est-à-dire un programme complet / une fonction par rapport à un petit extrait) a une incidence sur votre opinion?
Adam Lear

2
Je pense que si c'est sur un article de blog, l'auteur a voulu que ce soit public, alors si cela vous est utile, alors c'est un jeu juste. Cependant, je n'ai presque jamais rencontré d'extraits de code pouvant être copiés textuellement. Ils nécessitent généralement un peu de bagarre.
Pemdas

Je n'ai pas de problème avec le code des tutoriels ou des articles de blog utilisés - il suffit de comprendre ce qu'il fait. Vraisemblablement, si elle était affichée, elle est disponible.
Rapidement maintenant

"Je ne vous adresse pas cette réponse, John" ... En fait, je ne pensais pas que vous l'étiez ... du moins, pas avant d'avoir lu ceci de toute façon. LOL
John MacIntyre

J'aime vos commentaires sur le plagiat et la compréhension complète du code, mais pensez-vous vraiment qu'il est plus efficace de copier / coller le code de quelqu'un d'autre que de l'écrire vous-même? Je trouve que vous ne le comprendrez pas entièrement et que vous rencontrerez des problèmes plus tard OU si vous tentez de le comprendre pleinement, cela prendra plus de temps que de l'écrire vous-même. KWIM?
John MacIntyre le


0

Si le code est bon, au lieu de copier et coller, il devrait être transformé en une bibliothèque commune. Mais les gens ne peuvent pas s’embêter à penser à la refactorisation et ils préfèrent avoir la même fonctionnalité répartie par copie et par méthode.

Au lieu d'avoir une loi absolue universelle de copier et coller est bonne ou mauvaise, il faut voir quand l'utiliser.

Les avantages du copier-coller sont les suivants: vous permet d'aller vite Les inconvénients sont les mêmes: le même code est répandu à plusieurs endroits et tout problème détecté / résolu doit être résolu partout, si au lieu de copier-coller, on l'utilisait comme bibliothèque commune, puis la mise à jour se propager partout. Pour un petit investissement initial consistant à utiliser une bibliothèque au lieu de répandre le même code partout, de multiples variétés.

Le choix consiste à gagner du temps au lieu de gagner beaucoup de temps par la suite, puis copier et coller est la meilleure solution, sinon refactorez-le et placez-le dans une bibliothèque commune.


Je suis tout à fait d’accord sur la bibliothèque commune, mais devriez-vous copier / coller ce code ou le créer à partir de zéro?
John MacIntyre

Le moyen le plus rapide d'importer du code est de copier-coller, mais vous devez le réviser et, si nécessaire, le modifier avant de le plonger dans un projet et de l'oublier.
Arjang

0

Dans la plupart des cas, le code que vous trouverez sur le net ne correspondra pas à vos objectifs.

Ce que je vois faire beaucoup, c’est copier le code de quelqu'un, le réduire à l'essentiel, puis l'ajouter jusqu'à ce qu'il réponde à mes exigences. Je le restructurerai toujours pour qu'il corresponde à mes conventions de nommage et à mon style de codage.

Personnellement, je déteste quand je lis un tutoriel et ils commencent par montrer du code pour un cas compliqué. Commencez avec l'essence et montrez les blocs de construction pour étendre le code. Si jamais je commence mon propre blog, je fournirai aux gens un exemple de code commenté qui montre l'essentiel de ce que je veux faire, comment ajouter des fonctionnalités / des cas spéciaux et un exemple pleinement fonctionnel de la fonctionnalité de base.


-1

Pourquoi réinventer la roue si vous comprenez ce que fait le code, si vous êtes autorisé à le réutiliser (ou à son ouverture) et si vous n'avez pas nécessairement besoin de tout le code écrit par l'autre personne. Je copie souvent une implémentation d'algorithme et le modifie selon mes propres besoins. Habituellement, cependant, quand je viens de couper et coller c'est parce que je n'ai pas besoin de tout ce qui était dans l'exemple, donc ajouter un autre fichier serait juste un gaspillage (ou c'est quelque chose dans une fonction). Je suis d’accord avec jzd si vous copiez et collez votre propre code dans le même projet, il ya un problème et vous devriez probablement trouver un moyen économique de le libérer ou de partager la fonction.


-1

Je trouve que les membres de l'équipe "d' intégration " ou ceux qui n'ont pas autant d'expérience en code ou en programmation ont tendance à copier-coller plus souvent et à ne pas comprendre ce qu'ils ont fait (se lancer dans les problèmes mentionnés dans votre question).

Je trouve également que les programmeurs évitent souvent le copier / coller car ils aiment le code et réinventent souvent la roue, simplement parce qu'ils veulent le faire mieux ou en apprendre davantage.


+1 pour la réinvention. Je me trouve également beaucoup de temps pour réécrire le code sur Internet au lieu de copier-coller. Je suppose que je le fais parce que je ne suis pas limité aux délais. Je peux apprendre librement par moi-même et je peux apprendre quoi en quand je veux.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.