Pourquoi est un "copier-coller" du code dangereux? [fermé]

parfois, mon patron se plaindra à nous:

Pourquoi avons-nous besoin d'un délai aussi long pour mettre en œuvre une fonctionnalité?

en fait, la fonctionnalité a été implémentée dans une autre application avant, vous avez juste besoin de copier et coller des codes à partir de là. Le coût devrait être faible.

c'est vraiment une question difficile, parce que copier et coller des codes n'est pas une chose si simple à mon point de vue.

avez-vous de bonnes raisons d'expliquer cela à votre patron non-technique?

125
demandé sur GraemeMiller 2010-03-22 11:57:12

18 réponses

si vous trouvez un bug dans votre code de copier-coller, vous devrez le corriger à chaque endroit où vous l'avez fait et espérer que vous vous en souviendrez (cela vaut aussi pour les exigences modifiées).

si vous gardez la logique au même endroit, il est plus facile de changer au besoin (donc si vous décidez que l'application doit être mise à jour, vous ne le faites qu'à un seul endroit).

demandez à votre patron de lire le dry principle (ne vous répétez pas).

ce que vous décrivez ressemble à l'utilisation parfaite pour bibliothèques , où vous partagez le code et ne le conservez qu'à un seul endroit.

Je n'ai jamais copier-coller le code que si j'avais l'intention de refactor il peu de temps après - en s'assurant que je plus tard sur le code commun extrait donc je pourrais réutiliser autant de logique que possible. Et par peu de temps après, je veux dire des minutes et des heures plus tard, pas des jours et des semaines.

166
répondu Oded 2010-07-30 20:49:55

Vous seriez beaucoup mieux partage le code par la construction d'une bibliothèque plutôt que de copie le code à copier-coller.

vous aurez quand même un avantage de vitesse sur la réécriture (regarder à sec) mais vous n'aurez qu'un seul endroit pour maintenir le code.

25
répondu CResults 2014-06-25 06:43:16

la raison évidente est que vous prenez une "dette" pour l'avenir: tout changement que vous devez faire dans le code (pas seulement des corrections de bogues, n'importe quel changement) sera maintenant deux fois plus cher à faire parce que vous devez mettre à jour deux endroits - et plus risqué parce que vous allez oublier l'un d'eux éventuellement. En d'autres termes, le faire fonctionner plus rapidement maintenant rendra votre travail encore plus lent à l'avenir, qui peut bon sens des affaires, mais ne l'est généralement pas.

mais le raison plus importante est que l'hypothèse "c'est le même" qui est le plus souvent subtilement mal. Chaque fois que votre code dépend d'hypothèses non exprimées pour être correct, le copier dans un autre endroit entraîne des erreurs à moins que ces hypothèses tiennent également dans le nouvel endroit. Par conséquent, le code collé est souvent erroné dès le début et pas seulement après le prochain changement.

12
répondu Kilian Foth 2010-03-22 09:05:01

Design-wise, code copié-collé est certainement un désastre, avec le potentiel de causer beaucoup de problèmes à l'avenir. Mais vous vous demandez pourquoi il vous faut beaucoup de travail en ce moment , la réponse est: parce que ce n'est jamais seulement la copie et le collage.

si le code original a été écrit dans le but d'être réutilisé, comme une bibliothèque assez indépendante, avec la flexibilité et l'utilisation du client à l'esprit - alors très bien, mais ce n'est pas copier-coller, c'est utiliser un code bibliothèque.

  • " bien sûr, j'ai déjà un code qui fait exactement ça!"
  • d'Attente", lequel de ces cinq versions de code est celui que je veux utiliser comme source?"
  • "Hmmm, que font toutes ces fonctions "util_func_023"? N'ai-je pas le document? Qui dois-je maintenant?"
  • "Oh, oui, ce code utilise une Base de Code Y. Suppose que j'ai besoin d' [ choisir une: copier toute la base de Code Y dans mon nouveau projet / passer une journée à sortir la fonction que je veux de la base de Code Y / passer une semaine à sortir la fonction que je veux de la base de Code Y]."
  • " j'ai tout copié, yay!"
  • " pourquoi ça ne marche pas?"
  • C'est le point où vous passez des heures/jours/semaines à déboguer le code existant qui est similaire à ce que vous voulez, au lieu d'écrire le code que vous voulez réellement commencer avec.

en résumé, le code existant qui ne peut pas être utilisé directement peut, au mieux, servir de bonne référence pour écrire un code similaire. Elle ne peut certainement pas être levée en entier et on s'attend à ce qu'elle fonctionne dans un système complètement différent. En général, il est raisonnable de supposer que tout code qui a été écrit et complété doit être modifié le moins possible - même s'il s'agit d'une copie et non de l'original lui-même.

si vous voulez vous baser votre projet sur la copie-collage, vous devez coder pour commencer par d'une manière qui permettra une réutilisation facile, sans copier ce code original et de jouer avec elle. Cela vaut la peine de le faire, et si c'est ce que votre patron attend, alors vous devez tous les deux vous assurer que c'est la façon dont vous concevez et travaillez en premier lieu.

10
répondu Ziv 2010-03-23 11:30:01

copier-coller est un désastre. Votre patron devrait évaluer le prix de l'expédition tôt en ce qui concerne le prix d'avoir cassé le code expédié à l'utilisateur final très bientôt.

9
répondu Stefano Borini 2010-03-22 08:58:57

si vous avez déjà implémenté les fonctionnalités et que vous avez besoin de pour les copier et les coller pour les réutiliser, il semble que vous avez fait quelque chose de mal. Ne pouvez-vous pas mettre ces fonctionnalités dans une bibliothèque pour pouvoir les réutiliser sans copier/coller?

9
répondu Brian Rasmussen 2010-03-22 09:02:40

Le principe DRY (Don't Repeat Yourself): SEC sur wikipédia .

" chaque connaissance doit avoir une représentation unique, non ambiguë et faisant autorité au sein d'un système."

autre lien .

8
répondu Gauthier 2010-03-22 09:05:08

il me semble que la pire idée fausse que votre patron non-technique a, c'est que votre travail est principalement la dactylographie. Ils pensent que vous pouvez économiser beaucoup de temps en éliminant la saisie.

je pense que la meilleure éducation que vous pourriez donner à cette personne l'est à souligner tout le travail que vous faites qui n'est pas saisie. Même si la plupart de ce travail se passe invisiblement, dans votre tête, en même temps que la dactylographie.

bien sûr, l'élimination de la dactylographie permettra d'économiser certains temps. Mais alors la partie beaucoup plus grande, Non-dactylographiée, de votre travail devient plus grand et mange tout gain de temps et plus encore.

6
répondu Martin 2011-09-22 11:28:23

êtes-vous sûr que votre patron veut entendre parler de Dry principle, bugs et autres trucs technologiques?

ce genre de commentaires que vous entendez habituellement lorsque votre patron ou votre entreprise a sous-estimé le temps nécessaire pour terminer un projet. Et sur la base d'une estimation erronée, un contrat a été signé, etc. Dans la plupart des cas, les programmeurs n'étaient pas impliqués dans les estimations.

pourquoi cela arrive-t-il? Parfois, le promoteur du projet dispose d'un budget trop modeste. Peut - être un processus d'affaires que vous êtes automatiser l'utilisation d'un logiciel ne vaut pas la peine pour votre travail d'équipe. Les gestionnaires ont généralement tendance à être très fermés pour de mauvaises nouvelles dans de tels cas. Au début du projet il y a un vœu pieux. Ensuite, les gestionnaires essaient de blâmer les programmeurs. Dans votre cas, indirectement via copier-coller. Dans les cas extrêmes cela s'appelle une marche de la mort .

4
répondu Greg Dan 2011-03-29 21:22:43

code de copie et de collage conduit habituellement à programmation par coïncidence

3
répondu Lucas Ayala 2010-03-22 09:08:28

je pense " une autre application " est la clé ici, si l'application est déjà testé et utilisé, il doit pas changé pour utiliser une bibliothèque commune, par conséquent, vous ne pouvez pas partager le code avec elle.

dans la même application ," copier et Coller "est mauvais, mais entre les bases de code qui sont développés par différentes équipes ou avec des cycles de libération différents" copier et coller " peut être la meilleure option.

3
répondu Ian Ringrose 2011-02-18 14:39:20

j'ai travaillé pour une compagnie similaire. En tant que stagiaire, Je ne le savais pas mieux à l'époque, donc quand j'ai commencé un nouveau projet, Mon patron m'a aussi suggéré de coller le code d'un autre endroit. Eh bien, comme vous pouvez le penser, tout le logiciel était un sacré gâchis, jusqu'au point que lorsque vous avez essayé de corriger un bogue, deux nouveaux bogues sont apparus.

2
répondu helpermethod 2010-03-22 09:08:48

même si l'autre application a déjà la fonctionnalité dont vous avez besoin, le code de cette fonctionnalité pourrait tout simplement ne pas s'adapter à votre application actuelle sans une réécriture majeure. C'est comme prendre le moteur d'une Ford et essayer de le faire rentrer dans une Toyota. En général, il y a une règle empirique qui veut que si vous devez modifier plus de 25% du code que vous copiez, il est préférable (moins cher) de le réécrire à partir de zéro.

extraire le code en question dans une bibliothèque son convaincant, mais il pourrait être plus difficile qu'il n'y paraît, selon la façon dont ce système est construit. Par exemple: le code de cette fonctionnalité peut être difficile à extraire parce qu'il se connecte à beaucoup d'autres codes de manière malsaine (par exemple en accédant à beaucoup de variables globales, etc.)

2
répondu Erich Kitzmueller 2010-03-23 11:41:45

dites à votre patron que la partie du nom de chaque variable inclut le nom de l'ancien projet et maintenant vous devez tous les changer, manuellement. Si votre patron ne sait pas (ou veut savoir) pourquoi copier / coller est mauvais il / elle pourrait aussi bien croire que:)

1
répondu Simon 2010-07-22 09:08:22

il y a des compromis entre la vitesse de développement de la fonctionnalité immédiate en face de vous (surtout lorsque l'application est petite), et les coûts de maintenance à plus long terme que l'application se développe.

copier-coller est plus rapide pour la fonctionnalité immédiate, mais vous coûtera cher que l'application augmente en taille, en termes de correction de bogues et de faire des changements à l'échelle du système et de maintenir des flux de travail entre les différents composants de l'application.

C'est l'argument que les propriétaires d'entreprise doivent entendre. Il est similaire aux coûts acceptés de l'entretien d'un parc de véhicules, mais, avec le logiciel, les aspects cassés de l'architecture du logiciel sont généralement cachés du côté des affaires, et ne peut être vu par les développeurs.

1
répondu user2686692 2013-08-15 16:46:18

il a raison que si l'équipe a mis en œuvre une fonctionnalité similaire avant, en répétant il sera beaucoup plus facile la deuxième fois.

Toutefois, vous devriez probablement expliquer que chaque application est différente. Juste parce que vous avez installé une porte dans une maison ne signifie pas que vous pouvez installer une autre porte dans une autre maison dans pas de temps plat - vous serez plus rapide en raison de l'expérience (# portes installées), mais il sera encore prenez le temps de vous procurer de l'équipement, de monter la porte, de vous assurer qu'elle est à aplomb et de la visser dans le cadre.

0
répondu bobobobo 2011-10-15 14:37:34

Oui, le plus gros problème est qu'il ne s'agit pas seulement de copier et coller - son copie puis coller puis modifier légèrement.

puis plus tard quand l'une des variantes collées a un problème, elle est changée. Puis, plus tard, une autre variante est changé.

ensuite, vous découvrez que toutes les variantes doivent changer car la copie originale avait des bugs. Maintenant, vous êtes bien foutu car toutes les zones collées ne sont plus les mêmes.

et vous ne le savez pas, ce genre de code merdique est généralement presque entièrement vide de commentaires.

pour moi, la différence est que quand vous avez plusieurs copies de code faisant la même chose, ce que vous avez est un tas de code. Quand vous avez seulement un morceau de code faisant chaque chose particulière, alors vous avez un système.

les comportements d'un système peuvent être changés avec des modifications de point simple assez facilement - changeant le comportement d'un groupe de le code nécessite un tas de code.

j'aime les systèmes, pas un tas de code.

0
répondu Rodney P. Barbati 2012-12-11 00:39:38

dans mon entreprise, nous travaillons toujours avec des classes et des méthodes, et faisons de la documentation technique pour eux. Je pense que c'est la meilleure pratique si vous pouvez utiliser vos propres applications de recherche svn avec de bonnes clés pour trouver la classe de méthode utilisée avant:)

0
répondu Sebastian 506563 2013-04-18 06:45:54