web-dev-qa-db-fra.com

Quand une réécriture est-elle appropriée?

J'ai un projet au travail rédigé entièrement par un scientifique qui apprenait la programmation tout en l'écrivant. Il représente près de 200 000 lignes de C++ et presque toutes les variables sont une variable globale (plus de 2 000 variables globales). Je pense qu'il a découvert des variables locales à mi-chemin de l'écriture du projet. Les quelques noms de variables locaux sont presque toujours X, XX, I, II, J, JJ, M ou une autre nom de lettre unique. Ce programme est sujette à la défaillance de SEG et à la valorisation du courant révèle près de mille cas de corruption de mémoire. Il dépend totalement du comportement non défini, au point où il ne produit que les résultats corrects sur Centos 7, et Ubuntu donne des résultats complètement différents et incorrects (son code scientifique). Il est complètement indéchiffrable par quiconque mais l'auteur d'origine. Nous sommes dans une position unique maintenant où la société va tout parier sur ce logiciel écrit par une personne qui n'a jamais écrit de logiciel de production auparavant. Il y a un facteur de bus extrême ici, car après avoir travaillé sur ce codebase pendant des mois, je suis déconcerté par presque toutes les lignes et la mise en œuvre des caractéristiques les plus élémentaires prend une période incroyablement longue. Aucun autre développeur de la société ne veut toucher ce code. C'est de loin le pire code que j'ai jamais vu. Je n'ai jamais vu de code ce mauvais, même d'étudiants de première année CS.

Compte tenu de cette situation, est-ce un cas approprié pour "le brûler et partir de zéro"? Quelle est une bonne stratégie pour en faire une base de code maintenable? Ce code aura besoin de mises à jour fréquentes lorsque la recherche progresse, ce qui signifie que la congélation du code n'est pas une option.

Pour plus de clarification, ce projet n'est pas encore utilisé dans la production. Il a été entièrement la preuve du concept jusqu'à présent et sera utilisé en production cet été.

Pour toute personne curieuse de ce que cela ressemblerait, les fonctions ressemblent à ceci comme ça.

void doSomething(void) {
  sideEffect1();
  sideEffect2();
  sideEffect3();
  ...
  sideEffect145();
}

void sideEffect1(void) {
  if (globalVar1) {
    return;
  }
  anotherSideEffect1();
  if (globalVar2) {
    globalVar1 = globalVar2 + 1;  
  }
  ... hundreds of lines later
}
7
Kyle

Avez-vous des exigences complètes, détaillées et complètes, de préférence comme des tests exécutables?

Je vais deviner: non Alors que l'écrivain n'a probablement pas découvert ces autres ...

Dans un tel cas, aucune garantie qui la brûle et la reconstruction, elle sera même comparable. Comme vous l'avez déjà noté, vous ne pouvez même pas être sûr que le code agit comme si vous vous attendez à ce que cela vous attendait à utiliser des comportements non définis. Sans parler que vous êtes même perplexe à ce que l'algorithme est lui-même en raison des snarles de la logique réparties sur la base de code.

Au lieu de cela, je commencerais en développant une batterie de tests. Même si vous avez simplement attrapé quelques mois d'entrées/sorties et de vérifier simplement que les données correspondent.

À tout le moins, cela vous donnera une forte chance de savoir si vous avez baigné le code.

refacteur

Commencez par choisir une fonction, une variable ou une classe. Voyez ce que vous pouvez faire pour l'améliorer.

  • améliorer son nom. Déterminez la fonction/la variable/la classe/représente/représente.
  • tirez une variable en une portée plus étroite.
  • trouvez quelques lignes de code séquentielles et tirez-la dans sa propre fonction nommée.
  • envelopper les fonctions/variables dans les classes
  • split des classes pour augmenter la cohésion et introduire des frontières entre les préoccupations.
  • rewraser un comportement non défini à l'aide d'une sémantique bien définie.
  • etc ... juste de petits changements qui améliorent votre capacité à lire la base de code et à la comprendre.

Exécutez fréquemment les tests pour trouver quoi que ce soit manifestement brisé.


Ce serait mieux si vous faites cette programmation de copain avec ce scientifique. De cette façon, vous pouvez améliorer la base de code, former le scientifique dans la meilleure façon de rédiger un code et avoir la contribution du scientifique quant à ce que chaque chose signifie/fait.

Cela pourrait également aider si vous instituez des demandes de traction avec une revue de code obligatoire. Cela vous permettra de repousser manifestement le mauvais code, afin que les choses ne s'aggravent pas.

8
Kain0_0

Nous sommes dans une position unique maintenant où la société va tout parier sur ce logiciel écrit par une personne qui n'a jamais écrit de logiciel de production auparavant.

C'est un risque énorme.

C'est pourquoi je me concentrerais sur les problèmes immédiat (pour empêcher le refactor-rage):

  • Est-ce un problème immédiat qu'il ne fonctionne pas sur plusieurs systèmes d'exploitation?
  • Le programme est-il peu fiable dans toutes les circonstances ou peut-il être utilisé de manière fiable de manière fiable et de produire toujours de bons résultats lorsqu'il est utilisé de cette façon?
  • Combien de temps faut-il pour ajuster le code pour les changements les plus courants? Quel est le changement minimal qui peut être fait pour améliorer cela?

En d'autres termes: ne réparez pas ce qui n'est pas cassé et concentrez-vous sur la fabrication d'un produit viable minimal.

Cet objectif aiderait à obtenir le programme et à fonctionner dès que possible.

Ensuite, peut-être en parallèle, commencez à renommer les fonctions et les variables en étroite collaboration avec l'auteur d'origine. Principalement pour apprendre et comprendre le domaine et la solution. Ne changez rien sauf pour les noms. L'objectif est de comprendre.

Après le renommage, un refactoring approprié pourrait être tenté.

3
Erno

Si vous le brûlez et commencez à rom, je peux vous garantir que vous vous retrouverez avec un gâchis qui ne fonctionne pas. Votre meilleure chance est d'embaucher un excellent professionnel avec un peu de strie masochiste et de le payer pour améliorer ce code. Ne sera pas bon marché.

0
gnasher729