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?
refactoring
LennyProgrammers
la source
la source
Réponses:
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.
la source
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.
la source
Vous n'avez pas de problème technique, vous avez un problème social. En effet, vous avez un problème de gestion.
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
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.
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.
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.
la source
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.
la source
Je suis d'accord avec les réponses données jusqu'à présent. Vous devriez:
Mais d'un autre côté, vous devez regarder ce qui pousse les gens à copier-coller et à corriger cela.
Je pense donc que pour arrêter le modèle de copier / coller dont vous avez besoin pour faciliter la réutilisation.
lire les directives de conception du cadre
J'espère que cela t'aides.
la source
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.
la source
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.
la source
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.
la source
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.
la source
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.
la source