Comment réparer le modèle copier / coller?


16

Là où je travaille, les gens (consultants) se sentent obligés de publier les fonctionnalités le plus rapidement possible. Ainsi, au lieu de passer trop de temps à réfléchir à la façon de faire les choses correctement ou parce qu'ils ne veulent rien casser, le code est copié à partir de différents modules et modifié.

Ce n'est pas facile de l'empêcher, car la base de code est ouverte à toute l'entreprise. Beaucoup de gens y travaillent.

Maintenant que le désordre est déjà là, quelle est la meilleure façon de supprimer ces redondances sans trop casser?


3
La chose la plus ennuyeuse est lorsque le code est copié / collé à partir d'un site et que même les commentaires ne sont pas supprimés. Vous pouvez donc trouver: "// Merci pour ce Carlo" ... Et quand vous le leur montrez, ils rient et disent: "Laissez-le!))". Ce n'est pas professionnel et triste !!!
CoffeeCode

2
ses non seulement consultants
AndersK

Réponses:


14

Une partie de la réponse est la refactorisation .

Tout d'abord, commencez à écrire des tests unitaires pour vous assurer de ne rien casser accidentellement avec vos modifications. Ensuite, commencez à améliorer la conception, à supprimer les doublons, etc. par petites étapes, à exécuter vos tests unitaires après chaque étape, à résoudre les problèmes si l'un des tests échoue ou à revenir immédiatement si vous rencontrez un problème plus grave que vous ne pouvez le résoudre facilement.

L'autre partie est l' éducation .

Il faut apprendre aux gens à ne pas laisser de mauvais code derrière eux. Il s'agit certainement d'une bataille à long terme, car les habitudes et les processus de pensée sont difficiles (parfois même impossibles) à changer . Cependant, sans cela, vous continuerez simplement à obtenir une quantité infinie de mauvais codes hurlant à refactoriser.

Vous pouvez choisir de faire des révisions de code de groupe pour ouvrir une discussion sur les bonnes et les mauvaises habitudes de codage et diffuser les mérites des premières. Il ne suffit pas de dire "vous devez (pas) écrire du code comme celui-ci", vous devez convaincre les gens avec de la logique et des faits concrets. Comme "si vous avez dupliqué ce morceau de méthode sur la base de code n fois, quelles sont les chances que si un bogue est trouvé dans cette méthode, il sera corrigé dans chaque copie du code de méthode?"

Votre entreprise peut également avoir besoin de réviser les incitations et les critères d'acceptation pour les consultants - s'ils peuvent s'en tirer avec l'écriture de code bâclé, ils continueront sûrement à choisir le chemin le plus facile. Si l'entreprise continue de valoriser la «livraison rapide» sur la maintenabilité à long terme, rien ne changera :-( Vous devrez donc peut-être en discuter avec la direction également. comprendre et maintenir. Oublier le refactoring, c'est comme amasser des dettes sur votre carte de crédit. Vous pouvez vous en tirer pendant un certain temps, mais si vous ne gérez pas activement vos habitudes d'achat et vos dettes, elles s'effondreront inévitablement un jour. Dans la vie d'un projet logiciel, la faillite se produit lorsque le projet devient irréalisable: il devient plus facile de le réécrire à partir de zéro que d'ajouter une nouvelle fonctionnalité à la base de code existante. Ou les utilisateurs en ont tellement marre du niveau inférieur de support et de fonctionnalités qu'ils passent simplement à la concurrence.


4
"Premièrement, commencez à écrire des tests unitaires pour vous assurer de ne rien casser accidentellement avec vos modifications." Woah, pompe les freins là-bas. Je n'aime vraiment pas la façon dont tout le monde sur les sites SE lance cette ligne de manière si nonchalante. C'est extrêmement difficile à comprendre et n'est pas aussi décontracté que 99% des utilisateurs qui le suggèrent le font.

@Sergio Tapia - vrai, mais vous ne pouvez pas refactoriser sans elle. Bienvenue dans la réalité, vers 2011.
Scott Whitlock

1
@Sergio, si vous voulez dire que le test de code hérité est difficile, je ne pourrais pas être plus d'accord. Je suis heureux d'étendre la phrase citée comme "D'abord, vous devriez commencer la tâche ardue et stressante d' écrire des tests unitaires ..." :-) Cependant, si vous voulez dire que puisque les tests unitaires sont difficiles, il faut essayer de s'en sortir sans je suis fortement en désaccord (basé sur l'expérience pratique, pas sur la théorie). Il n'y a pas de voie royale pour maintenir le code hérité.
Péter Török

9

Dans le cadre d'une formation comme @Peter l'a dit, vous pouvez introduire un détecteur copier-coller comme PMD et l'utiliser dans le cadre de votre build cycly pour aider à appliquer cette partie de vos normes de codage.

Assurez-vous que la norme de codage de vos projets couvre ce modèle afin d'avoir une base de référence à partir de laquelle démarrer les discussions.


1
J'aime ça, chouette!
ozz

Est-il possible d'exiger le respect d'une norme de codage dans le contrat d'un entrepreneur?
Armand

1
@Alison Vous pouvez exiger le respect de tout ce que vous voulez, tant que vous déclarez à l'avance que vous ne devriez pas avoir de problème. En tant qu'entrepreneur, j'adhère à toutes les exigences de développement des entreprises dans lesquelles je travaille, l'une d'entre elles est conforme à leurs normes de codage. La révision du code avant de le soumettre au tronc pourrait également aider à résoudre ce problème
DBlackborough

Merci, après votre message, j'ai également trouvé clonedigger.sourceforge.net pour Python / Java.
LennyProgrammers

@ G3D est logique; aimez-vous avoir une norme de codage sur laquelle travailler? Mon problème avec les revues de code comme forme d'acceptation est qu'en tant qu'entrepreneur, je craindrais que le code puisse être rejeté pour des raisons arbitraires (par exemple, politique ou changement de budget)
Armand

8

les gens (consultants) se sentent obligés de publier les fonctionnalités le plus rapidement possible

Vous n'avez pas de problème technique, vous avez un problème social. En effet, vous avez un problème de gestion.

Ce n'est pas facile de l'empêcher, car la base de code est ouverte à toute l'entreprise. Beaucoup de gens y travaillent.

La «base de code est ouverte à toute l'entreprise» n'est pas un problème. Peu importe.

Ce qui importe, c'est qu'il existe un système de récompense de gestion pour le copier-coller. La cause profonde est que les gens sont récompensés (c'est-à-dire payés ou félicités ou promus ou étendus) pour le copier-coller.

Vous ne pouvez pas rompre cela sans changer fondamentalement la culture de "pressé de publier les fonctionnalités le plus rapidement possible" à "récompensé pour avoir effectué les changements de base de code appropriés et bien testés".

Vous devez

  1. Commencez par le haut, avec les managers qui renforcent les récompenses. Vous devez exposer la pratique actuelle et documenter les coûts et les risques. Vous devez proposer une alternative qui réduit les coûts et les risques.

  2. Vous devez sans relâche documenter et exposer les coûts et les risques pour le reste de votre mandat dans cette organisation. Implacable. Basé sur des faits. Coût et risque. Chaque semaine, le copier-coller augmente les coûts et les risques.

  3. Vous devrez aider les managers à prendre le crédit de la nouvelle approche qui leur donnera une belle apparence et vous serez ignoré.

Il est très important de réduire le copier-coller. Mais il est difficile de changer la culture d'une organisation. Vous devez fournir un grand nombre de faits et vous devez sans cesse faire valoir vos arguments auprès des gestionnaires qui ne sont pas d'accord avec vous.


1
+1 spécialement pour "Vous devrez aider les managers à prendre le crédit de la nouvelle approche qui leur donnera une belle apparence et vous serez ignoré.". Mieux vaut être préparé que trop souvent c'est la réalité :-(
Péter Török

@ Péter Török: Trop de gens y renoncent. Soit ils ne collectent pas les faits sur les problèmes causés par le copier / coller, soit ils ne continuent pas de faire valoir leurs arguments auprès de la direction.
S.Lott

Je sais qu'il y a ici un problème non technique plus profond. Mais c'est un problème que personne ne se soucie peut résoudre de sitôt. C'est comme un bogue dans une bibliothèque tierce que vous devez contourner.
LennyProgrammers

@ Lenny222: Votre commentaire n'a pas de sens. "c'est un problème que personne qui se soucie peut résoudre de sitôt" est claire à partir de la question. Que signifie ce commentaire? Qu'est-ce qui manque dans la réponse? Qu'as-tu besoin de plus?
S.Lott

Ce sera un processus d'éducation continue.
JeffO

5

J'ai maintenant une base de code qui commençait à pourrir à partir de cela. J'avais plus de 10 fonctions statiques par module qui étaient fondamentalement identiques aux mêmes fonctions statiques dans d'autres modules. Chacun s'est comporté juste assez différemment pour justifier une nouvelle incarnation afin de faire les choses le plus rapidement possible.

Aujourd'hui, j'ai dû ajouter une autre fonctionnalité et je ne pouvais plus la prendre. J'ai créé une nouvelle bibliothèque, combiné les 100 + fonctions en 10 fonctions réentrantes qui modifient légèrement leur comportement en fonction des indicateurs de bits, puis j'ai écrit une série de tests pour m'assurer que les modifications apportées à cette bibliothèque ne cassent rien d'autre.

Temps total passé: 4 heures. J'étais prêt à faire un marathon de 20 heures si nécessaire et j'ai été surpris de la rapidité avec laquelle j'ai maîtrisé un désordre croissant. En prime, il était plus facile de corriger ultérieurement un tas de problèmes de dépendance d'en-tête. De plus, étant donné que beaucoup de nos éléments propriétaires sont maintenant dans des objets statiques pour la liaison, nous pouvons donner à nos clients qui ont accès au code source plus que nous ne le faisions auparavant.

Mon conseil: mordre la balle et re-factoriser ce désordre maintenant avant de le faire devient vraiment mauvais . Cela ne prendra probablement pas aussi longtemps que vous le pensez, mais créez une nouvelle branche pour vous au cas où.

En outre, vous pouvez toujours copier / coller pour obtenir des fonctionnalités tout en résolvant le problème fondamental. Lorsque vous avez terminé, extrayez simplement les éléments collés et utilisez plutôt la nouvelle bibliothèque.


Curieux, en avez-vous trouvé des identiques?
JeffO

@Jeff - Oui, quelques-uns. Mais la plupart du temps, le schéma a montré que la duplication était le résultat de quelqu'un qui voulait ce que devrait être le code de bibliothèque pour faire quelque chose d'un peu différent.
Tim Post

5

Je suis d'accord avec les réponses données jusqu'à présent. Vous devriez:

  • créer des tests unitaires
  • refactor
  • éduquer
  • déployer des efforts dans les normes de codage et détecter les violations

Mais d'un autre côté, vous devez regarder ce qui pousse les gens à copier-coller et à corriger cela.

  • les gens pourraient ne pas être en mesure de réutiliser le code dans le bon sens car il est couplé à beaucoup
  • les gens ne savent peut-être pas qu'il existe une bibliothèque qu'ils peuvent utiliser
  • Le code de la bibliothèque n'est peut-être pas assez générique et cuire votre propre version est beaucoup plus facile que d'utiliser une bibliothèque existante
  • Il peut ne pas y avoir de bonne stratégie de version (pas de contrôle de code source) et le changement d'une bibliothèque générique peut également entraîner le test de nombreuses autres applications.

Je pense donc que pour arrêter le modèle de copier / coller dont vous avez besoin pour faciliter la réutilisation.

  • rendre les bibliothèques découvrables et bien documentées
  • rendre les bibliothèques indépendantes de tout
  • penser à une bonne stratégie de versioning
  • assurer la compatibilité descendante
  • penser à l'extensibilité facile des bibliothèques

lire les directives de conception du cadre

J'espère que cela t'aides.


3

Il existe une forte attitude de "copier-coller considéré comme nuisible". Je pense que c'est bien, mais va un peu trop loin. Copier coller comme un exercice pour découvrir les similitudes et les différences entre deux méthodes ou classes - comme une étape dans le processus de triangulation - je pense que c'est sain. Mais éviter la triangulation complète - éliminer la duplication introduite par le copier-coller - est en effet nuisible.

Si vous pouvez trouver des moyens d'utiliser cette attitude plus nuancée, pour dire aux développeurs non pas "c'est mauvais!", Mais plutôt "c'est incomplet, pouvez-vous travailler avec moi pour terminer la refactorisation?", Alors vous pourriez vous retrouver à avoir des conversations plus constructives.


2

Je suis préoccupé par le même problème ici, et mon point de vue est le suivant: n'essayez pas de l'éviter dès le départ, refactorisez-le quand il devient trop mauvais.

Le module sur lequel je travaille actuellement sur startet en tant que copie d'un autre module, maintenant je change tout ce qui doit être différent. Une fois cela fait et le nouveau module terminé, je le comparerai avec le module d'origine et découvrirai quelles parties sont plus ou moins inchangées et devraient être déplacées vers une bibliothèque, une classe parent abstraite, etc.


2

Celui qui est en charge est en faute. On ne peut pas s'attendre à ce qu'une personne examine chaque ligne de code, mais elle définit les normes et les délais.

Les entrepreneurs (ou toute personne à court terme sur un projet) peuvent être placés dans une position où ils ne sont rémunérés que pour le faire fonctionner la première fois. Il y a une certaine incitation à le faire dès que possible. Le code copié peut ne jamais avoir besoin d'être modifié et s'il l'est, ce ne sera pas par eux.

Vous pourriez essayer de les forcer à le réparer à leur propre rythme. Ensuite, ils commenceront à le faire depuis le début, mais prendront alors un temps insoutenable pour faire avancer les choses. Je pense que AmmoQ a la bonne idée de refactoriser les choses qui causent des problèmes.


Je suis d'accord. Le fait est que les chefs de projet ne sont pas incités à payer plus pour un code bien conçu. Si je dois perdre une semaine, ils ne sont pas facturés.
LennyProgrammers

@ Lenny222 - ce que vous pouvez essayer, c'est de choisir vos points sur un projet pour améliorer le code. Le point de vente pour le PM ne se produira pas jusqu'à ce qu'ils reviennent (généralement avec la queue entre les jambes) et aient besoin de ce qu'ils pensent être un changement majeur uniquement pour entendre votre réponse `` pas de soucis, nous avons construit cette partie pour être plus flexible '' . Ils peuvent éventuellement apprendre qu'il existe une bonne façon de faire les choses et de gérer les attentes des clients. Tout le monde veut un logiciel de qualité, mais peu savent ce qu'il en coûte vraiment.
JeffO

1

La seule façon d'éliminer le code copier / coller consiste à réviser le code (à mon humble avis), demander à une personne (ou de préférence plus) de vérifier le code et quand elle trouve du code qui semble provenir d'une action copier / coller, laissez le programmeur refactoriser.


1

Comme suggéré, c'est principalement un problème dans l'organisation. Essayez de commencer par éduquer les gens (n'oubliez pas la couche de gestion directe au-dessus de votre position). Il est très utile de commencer à embarquer une ou deux personnes dans votre train et à laisser le virus se propager. Lorsque la majorité pense que c'est une bonne idée, décrivez-le et essayez d'introduire des critiques pour garantir que cela reste ainsi. C'est un processus très lent et fastidieux, mais il ne peut tout simplement pas changer rapidement. Au début, cela coûtera plus de temps, il est donc important que la direction connaisse et soutienne l'objectif à long terme.

@Anders K. Les avis sont un bon moyen de maintenir la pratique en place. En forçant les gens à écrire du code auquel ils ne croient pas, cela crée beaucoup de friction. Ils se replieront dans l'ancien habbit dès que possible. Je crois fermement que vous devriez commencer par l'éducation pour prendre de l'ampleur.

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.