Vous organisez un code sale non commenté?

22

Je voudrais vous poser quelques questions sur le code sale. Il y a des débutants qui ont codé sur un projet moyen. Le code est une énorme boule de boue. Ce ne sont pas des programmeurs avancés. Ils savent juste comment utiliser le clavier un peu sur java. Ils viennent d'écrire du code avec 12 000 lignes dans leur classe principale, cependant, 6 000 lignes appartiennent à NetBeans lui-même.

Mon travail consiste à analyser le code et à suggérer un bon moyen de maintenir le code. Mon idée est d'abandonner le projet et d'en démarrer un nouveau avec la méthodologie OOP. Récemment, j'ai recueilli quelques notes et idées sur le problème, à partir de ce site et de quelques autres.

Maintenant, j'ai les questions suivantes:

  1. Faut-il réparer le code et le changer en POO? Nous le déboguons maintenant.
  2. Le code n'a aucun commentaire, aucune documentation, aucun style de programmation particulier, etc. Le changer coûte vraiment cher et prend du temps. Que pouvons-nous faire à ce sujet?
  3. Comment puis-je leur apprendre à suivre toutes les règles (commentaires, POO, bonne qualité de code, etc.)?
  4. Le code est erroné et sujet aux erreurs. Que pouvons-nous faire? Essai? Nous écrivons presque deux ou trois papiers A4 pour correction, mais cela semble sans fin.

Je dois dire que je suis nouveau avec eux. Je pense que j'ai également enfreint les règles concernant l'ajout de personnes trop tard dans le projet. Pensez-vous que je dois les laisser?

Salivan
la source
Cela doit être divisé en deux ou trois questions, c'est beaucoup trop large pour le moment.
Jon Hopkins
2
Ce projet est-il sous contrôle de version?
JBRWilkinson
2
Le code actuel est-il en production?
JeffO
Oui Jeff. C'est une production, un projet de gestion pour gérer un dossier financier!
Salivan
Désolé JBR, ils n'ont pas entendu parler d'une chose pareille. Le simple fait de couper des codes de copier-coller sur tout le disque dur est leur technique pour effectuer le contrôle de version.
Salivan

Réponses:

36

Étape 0: sauvegarde sur SCM

Parce que, comme l'indique JBRWilkinson dans les commentaires, le contrôle de version est votre première ligne de défense contre les catastrophes (irréversibles).

Faites également une sauvegarde des détails de configuration du logiciel, des procédures pour créer des livrables, etc ...

Étape 1: Testez d'abord

Commencez ensuite par écrire des tests :

  • pour ce qui fonctionne,
  • et pour ce qui échoue.

Peu importe ce que vous décidez de faire, vous êtes couvert. Vous pouvez désormais:

  • recommencer à zéro et réécrire ,
  • ou le réparer .

Mon conseil serait de recommencer l'architecture générale à partir de zéro , mais d' extraire du désordre les parties qui valident les points de contrôle et de les refaçonner comme bon vous semble.

Étape 2: vérifier et surveiller

Mettre en place un système d' intégration continue (pour compléter l' étape 0 et l' étape 1 ) ET un système d' inspection continue (pour préparer l' étape 4 ).

Étape 3: Tenez-vous sur les épaules des géants

(comme vous devriez toujours ...)

Étape 4: nettoyer

Cela va sans dire, mais au lieu de parcourir le code vous-même, vous pouvez simplement exécuter des linters / analyseurs statiques et d'autres outils sur la base de code cassée pour trouver des erreurs dans la conception et la mise en œuvre.

Ensuite, vous voudrez peut-être également exécuter un formateur de code, qui aidera déjà un peu avec le ménage.

Étape 5: Examen

Il est facile d'introduire de petits bugs en refactorisant ou en nettoyant les choses. Il suffit d'une mauvaise sélection et d'une touche rapide sur une touche, et vous pouvez supprimer quelque chose d'assez important sans vous en rendre compte au début. Et parfois, l'effet n'apparaîtra que quelques mois plus tard. Bien sûr, les étapes ci-dessus vous aident à éviter cela (en particulier en mettant en œuvre un harnais de test solide), mais vous ne savez jamais ce qui peut et va passer. Assurez-vous donc de faire réviser vos refactorisations par au moins une autre paire de globes oculaires dédiés (et de préférence plus que cela).

Étape 6: pérennisez votre processus de développement

Prenez tout ce qui précède et faites-en une partie inhérente de votre processus de développement habituel, si ce n'est déjà fait. Ne laissez pas cela se reproduire sous votre surveillance et collaborez avec votre équipe pour mettre en œuvre des garanties dans votre processus et les appliquer (si cela est même possible) dans vos politiques. Faites de la production de Clean Code une priorité.


Mais vraiment, testez . Beaucoup .

haylem
la source
Une excellente suggestion - peu importe les dommages que vous faites si vous avez des tests qui peuvent détecter les problèmes. Bien sûr, nous supposons tous qu'ils ont déjà le contrôle de version ..
JBRWilkinson
@JBRWilkinson: bon point en fait! En effet, ils ont complètement supposé que oui.
haylem
2
Commencez par contrôler la version; Mieux vaut tard que jamais.
JeffO
@Jeff O: oui, c'est déjà ce que j'ai ajouté à la réponse.
haylem
Réécrit pour rendre plus clair après les modifications. Attributions à gauche :)
haylem
15

Personnellement, je ne commencerais pas ce projet avant d'avoir une copie de Travailler efficacement avec Legacy Code à portée de main. Sérieusement, il a été écrit pour exactement ce genre de chose. Il regorge de stratégies pour gérer le code délicat et va beaucoup plus en détail que je ne peux vous le donner ici.

Jason Baker
la source
1
+1 pour l'utilisation d'une référence externe étendue qui dit tout.
haylem
Malheureusement, ici, les gens n'ont aucune idée de la lecture de livres. Il suffit de développer un projet qui fonctionne, c'est tout ce dont ils ont besoin. J'ai commencé à lire le livre que vous avez mentionné et CODE COMPLETE 2 aussi. Permettez-moi de dire qu'ils sont merveilleusement écrits.
Salivan
1
@Salivan - Peut-être n'ont-ils simplement eu personne pour les convaincre que de tels livres valent la peine d'être lus. Si seulement il y avait une personne qui travaillait avec eux qui était intéressée à lire de tels livres ...
Jason Baker
1
@Salivan - l'essentiel est de trouver une ou deux victoires rapides. Faites quelque chose qui a un retour sur investissement presque immédiat. Comme le contrôle de version, la prochaine fois que quelqu'un dit "comment cela s'est-il passé", vous pouvez le rechercher. Ensuite, indiquez-les dans votre lecture de votre copie de WELC. Ne vous contentez pas de leur lancer le livre.
2
@Salivan Vous pouvez lire les livres à leur place et leur envoyer du contenu en tant que conseil. Vous pourriez devenir le gourou de l'équipe.
MarkJ
8

J'y suis allé plusieurs fois. Ma règle est la suivante: si le logiciel n'est pas anodin (plus de 1 semaine de travail pour la ressource que vous avez) et qu'il fonctionne, alors conservez-le et procédez à une refactorisation incrémentielle.

Si le logiciel ne fonctionne pas vraiment (nombre très élevé de bogues, exigences peu claires, etc.), il vaut mieux le réécrire à partir de zéro. La même chose si elle est assez petite.

L'intérêt du refactoring (comme dans le livre de Fowler et celui de Kerievsky http://www.industriallogic.com/xp/refactoring/ ) est qu'il maintient le système en marche, peut-être que le refactoring prendra deux fois le temps mais les risques sont nuls.

La réécriture à partir de zéro pourrait introduire de nombreux risques, des exigences de malentendu à une mauvaise mise en œuvre (après tout, la plupart de l'équipe sera la même).

En fait, j'ai vu une procédure complexe être réécrite à partir de zéro deux fois et ne fonctionnait toujours pas comme prévu.

Uberto
la source
Je suggère également d'écrire des tests unitaires pour les méthodes appropriées, si possible. Ils aideront à définir clairement ce que le code est censé faire en premier lieu, ce qui facilitera le processus de refactorisation.
Michael K
2
Cela va sans dire ... Je considère TDD comme une condition requise pour tout bon code (alias le nouveau).
Uberto
Écrire dès le début est une très bonne idée. Mais vous devez d'abord avoir des diagrammes du travail. Mais que ferez-vous si vous devez analyser le code pour extraire les relations? De plus, la taille du projet le rend impossible, ou nous obligera à embaucher d'autres programmeurs.
Salivan
Le développement piloté par les tests est apprécié!
Salivan
"Mais que ferez-vous si vous devez analyser le code pour extraire les relations?" -> si tel est le cas, cela signifie que le projet n'est ni minuscule ni cassé. Aka, je vais commencer à refactoriser une pièce à la fois. Voir aussi la méthode Mikado. danielbrolund.wordpress.com/2009/03/28/…
Uberto
2

Je le réécrirais complètement. Parfois, il est impossible de réparer un tel code. Une autre option est de le faire fonctionner, sans ajouter de nouvelles fonctionnalités. Pour apprendre à l'équipe à écrire du bon code (bien conçu, documenté, avec des tests), laissez-le réparer le code que vous avez maintenant. Laissez tout le monde corriger les bugs / revoir le code des autres développeurs, pas sa part. Après quelques tentatives, ils comprendront qu'il est presque impossible de revoir / corriger ces codes.

L'ajout de personnes à des projets tardifs est très rare. Habituellement, cela brise les délais. Vous devez faire tout votre possible pour terminer le projet avec succès, puis penser à partir.

duros
la source
Combien cela coûterait-il de le réécrire complètement par rapport à l'amélioration itérative? Quelle approche donnerait les résultats les plus rapides?
JBRWilkinson
@JBRWilkinson Cela dépend. L'approche itérative est bonne, lorsque vous avez du code de travail.
duros
1
@duros, pour le code cassé, oui. Ce code s'exécute en production.
2

Mon conseil sera de ne pas supprimer entièrement le code entier. C'est le problème de la vie quotidienne, auquel chaque équipe de développement est confrontée. Attaquez une partie du code à la fois. Réparez-le, nettoyez-le, documentez-le. Et puis passez à l'autre partie. L'essentiel est toujours de garder un code livrable à portée de main. Réécrire l'intégralité du code à partir de zéro prendra le temps qui a été passé jusqu'à présent et il n'y aura aucune garantie qu'il sera plus agréable que le courant.
Mais alors, les gens devraient également éviter d'écrire le code de cette manière. Passez plus de temps dans les révisions de code. Adaptez-vous à un style de codage uniforme. Discutez d'abord de la conception, puis écrivez le code. Ces choses simples feront de grands changements.

Joli blog expliquant pourquoi Netscape est lâche

Manoj R
la source
2
Commencer un nouveau projet, tout en mettant à jour / déboguer l'ancienne version entre-temps (et vous ne pouvez pas l'éviter alors n'en rêvez pas) essaie de tirer sur plusieurs cibles mobiles.
JeffO
"Attaquer une partie du code à la fois" n'a pas fonctionné, Manjo. avec une profonde tristesse, le code contient beaucoup d'erreurs. Cela se tourne toujours vers autre chose. Nous devons attaquer et détruire une partie du code et le construire ensuite. J'ai suggéré cette pensée au gestionnaire une fois, mais les codeurs doivent être en dehors de l'écriture de tout nouveau code.
Salivan
@Salivan ... ne doit plus écrire de nouveaux codes . Je suis sûr que la direction le dit. Mais la première chose à faire lorsque vous êtes dans un trou est d'arrêter de creuser (ne continuez pas à faire les mêmes erreurs). Permettre de créer plus dans ces conditions, c'est continuer à creuser le trou. La partie difficile est de savoir comment amener la direction et les codeurs à comprendre les problèmes.
SeraM
1

Si cela fonctionne, refactorisez-le. Il existe des outils pour vous y aider. Si cela ne fonctionne pas, utilisez la commande d'amélioration du code magique, c'est- deltreeà- dire sous Windows resp. rm -rfsous Linux.

user281377
la source
2
Il est particulièrement inutile de suggérer "d'effacer complètement tout le code" - avez-vous une réponse plus constructive?
JBRWilkinson
LOL. Je suis complètement d'accord avec toi, ammoQ!
Salivan
JBRWilkinson: Faire un nouveau redémarrage est probablement une meilleure approche que d'essayer de nettoyer et de nettoyer le gâchis. Une entreprise pour laquelle j'ai travaillé a essayé cela, et année après année, ils ont gaspillé beaucoup de ressources et ne sont arrivés nulle part.
user281377
@ammoQ, vous avez besoin de l'ancien code pour voir ce qu'il a réellement fait, lorsque vous vous trompez.
1
Thorbjorn: Nous parlons de code qui ne fonctionne pas , non? Analyser un code sale non commenté qui ne fait pas la bonne chose en dit plus sur l'état mental de ses créateurs qu'autre chose.
user281377
1

Faut-il réparer le code et le changer en POO? Nous le déboguons maintenant. [... contient des erreurs, pas de documentation ...]

J'y suis allé, vous avez mes sympathies. J'ai même écrit un article à ce sujet qui pourrait vous aider à vous faire une idée. Mais en bref:

Si le code contient beaucoup de duplication, vous devez réécrire. S'il n'y a pas de structure discernable (pas d'interfaces claires, spaghetti), le refactoring échouera et vous devriez probablement réécrire.

Comment puis-je leur apprendre à suivre toutes les règles?

Commencez par expliquer pourquoi ils pourraient vouloir faire cela en leur montrant ce qu'ils peuvent en retirer personnellement. Quand ils sont d'accord avec cela et sont prêts à apprendre, commencez à leur enseigner le shuhari .

Martin Wickman
la source
Merci Martin. "Commencez par expliquer pourquoi ils pourraient vouloir faire cela en leur montrant ce qu'ils peuvent en retirer personnellement. Quand ils sont d'accord avec cela et qu'ils sont disposés à apprendre, commencez à leur enseigner le shuhari."
Salivan
0

Ma suggestion est une combinaison des réponses de @ duros et @Manoj R.

Commencez à zéro, en gardant à l'esprit de créer du bon code / OOP / commenté / etc cette fois, référez / copiez et collez à partir de votre ancien code. Lorsque vous rencontrez les mauvaises parties de votre ancien code, réécrivez / refactorisez-les.

Si vos développeurs ne sont pas bien formés, je pense qu'il est bon de les envoyer pour des cours. Son important pour le recyclage régulier dans l'industrie informatique en évolution rapide

Jiew Meng
la source