63 votes

Être poussé à passer du côté obscur au côté obscur

Nous avons une situation au travail où les développeurs travaillant sur un ancien système (de base) sont poussés à utiliser des instructions GOTO lorsqu'ils ajoutent de nouvelles fonctionnalités au code existant qui est déjà infecté par du code spaghetti.

Maintenant, je comprends qu'il puisse y avoir des arguments pour utiliser "juste un petit GOTO" au lieu de passer du temps à refaire une solution plus facile à maintenir. Le problème est que ce "juste un petit GOTO" isolé n'est pas si isolé que cela. Au moins une fois par semaine, il y a un nouveau "one little GOTO" à ajouter. Cette base de code est déjà une horreur à travailler car le code datant d'avant 1984 est criblé de GOTOs qui feraient de nombreux Pastafariens Le monstre spaghetti volant a été inspiré par le monstre spaghetti volant lui-même.

Malheureusement, le langage dans lequel il est écrit ne dispose pas d'outils de refactorisation prêts à l'emploi, ce qui rend plus difficile l'idée de "Refactoriser pour augmenter la productivité plus tard", car les gains à court terme sont les seuls auxquels il est prêté attention ici...

Quelqu'un d'autre a-t-il rencontré ce problème où tout le monde est d'accord pour dire que nous ne pouvons pas ajouter de nouvelles GOTO pour sauter 2000 lignes dans une section aléatoire, mais où les Anaylsts insistent continuellement pour le faire juste cette fois-ci et pour que la direction l'approuve ?

tldr ;

Comment peut-on s'attaquer au problème des développeurs qui sont poussés (forcés) à ajouter continuellement des instructions GOTO (par ajouter, j'entends ajouter pour sauter à des sections aléatoires situées à plusieurs lignes de distance) parce que cela "fait" ? que dans "quicker" ?

Je commence à craindre que nous perdions de précieux développeurs au profit des rapaces à cause de cela...

Credit: XKCD

Clarification :

Goto here

alsoThere: Non, je parle du genre de goto qui fait sauter 1000 lignes d'un sous-programme à un autre au milieu d'une boucle while. Goto somewhereClose

there: Je ne parlais même pas du genre de gotos que l'on peut raisonnablement lire et déterminer ce que faisait un programme. Goto alsoThere

somewhereClose: C'est le genre de code qui permet de faire des boulettes de viande midpoint: S'il s'agit de la première fois, Goto nextpoint detail: (chacune presque complètement différente) Goto pointlessReturn

here: Dans cette question, je ne parlais pas de l'utilisation occasionnelle d'un goto. Goto there

tacoBell: et il vient de retourner à la planche à dessin. Goto Jail

elsewhere: Lorsqu'il faut des semaines aux analystes pour décrypter ce que fait un programme à chaque fois qu'il est touché, c'est que quelque chose ne va pas du tout dans votre base de code. En fait, je suis jusqu'à mon hell: if not up-to-date goto 4 rendu de la spécification goto detail pointlessReturn: goto tacoBell

Jail: En fait, il s'agit juste d'une petite mise à jour et d'une petite victoire. J'ai passé 4 heures à refactorer une partie de ce programme particulier, un seul label à la fois, en sauvegardant chaque itération dans svn au fur et à mesure. Chaque étape (une vingtaine) était petite, logique et assez facile à mettre en oeuvre. goto bypass nextpoint: sauter spontanément de votre repas à votre écran par une sorte de magnétisme bizarre entre spaghettis et boulettes de viande. Goto elseWhere bypass: vérifier raisonnablement qu'il ne devrait pas introduire de changements logiques. En utilisant cette nouvelle version plus lisible, je me suis assis avec l'analyste et j'ai maintenant terminé la quasi-totalité de ces changements. Goto end

4: première *si première fois ici goto hell pas de second si c'est la première fois que l'on se trouve ici, on passe à l'étape suivante hell , pas de troisième si c'est la première fois que l'on se trouve ici, on passe à l'étape suivante hell quatrième maintenant à jour goto hell

end:

28voto

twk Points 6300

Combien de bogues ont été introduits à cause de GOTOs mal écrits ? Combien d'argent ont-ils coûté à l'entreprise ? Faites de ce problème quelque chose de concret, plutôt que de dire "ça fait mal". Une fois que vous avez réussi à faire reconnaître le problème par les responsables, transformez-le en une politique telle que "pas de nouveaux GOTO pour quoi que ce soit d'autre que la simplification de la logique de sortie d'une fonction", ou "pas de nouveaux GOTO pour les fonctions qui n'ont pas une couverture de test unitaire de 100 %". Au fil du temps, renforcez les politiques.

12voto

Igor Zevaka Points 32586

Les GOTO ne font pas du bon code un spaghetti, une multitude d'autres facteurs entrent en ligne de compte. Cette discussion sur la liste de diffusion linux peut aider à mettre certaines choses en perspective (commentaires de Linus Torvalds sur la situation globale de l'utilisation des gotos).

Essayer d'instituer une "politique de non goto" juste pour le plaisir de ne pas avoir de gotos n'apportera rien à long terme, et ne rendra pas votre code plus facile à maintenir. Les changements devront être plus subtils et se concentrer sur l'augmentation de la qualité globale du code, en pensant à l'utilisation des meilleures pratiques pour la plate-forme/le langage, la couverture des tests unitaires, l'analyse statique, etc.

4voto

user unknown Points 15555

Vous pouvez peut-être utiliser le modèle du boycout : Laissez l'endroit un peu plus propre que vous ne l'avez trouvé. Ainsi, pour chaque demande de fonctionnalité, n'introduisez pas de nouveaux gotos, mais supprimez-en un.

Cela ne prendrait pas trop de temps pour les améliorations, mais donnerait plus de temps pour trouver les nouveaux bogues. Peut-être que cela ne coûterait pas beaucoup de temps supplémentaire si l'on supprimait un goto de la partie qui a dû passer du temps à comprendre et à introduire la nouvelle fonctionnalité.

Argumentez qu'un remaniement de 2 heures permettra d'économiser 20 fois 15 minutes à l'avenir, et permettra des améliorations plus rapides et plus profondes.

4voto

drekka Points 10020

La réalité du développement est que, malgré toutes les belles paroles sur la bonne façon de procéder, la plupart des clients sont plus intéressés par la rapidité. Le concept d'une base de code évoluant rapidement vers le point d'implosion et les retombées qui en résultent pour leur entreprise est quelque chose qu'ils ne peuvent pas comprendre parce que cela signifierait qu'il faut penser au-delà du présent.

Ce que vous avez n'est qu'un exemple parmi d'autres. La position que vous adopterez à cet égard déterminera la manière dont vous ferez du développement à l'avenir. Je pense que vous avez quatre options :

  1. Acceptez la demande et acceptez que vous fassiez toujours cela.

  2. Acceptez la demande et commencez immédiatement à chercher un nouvel emploi.

  3. Refuser de faire et être prêt à se battre pour réparer le gâchis.

  4. Démissionner.

L'option que vous choisirez dépendra de l'importance que vous accordez à votre travail et à votre estime de soi.

3voto

Carlos Points 1652

Retour aux principes :

  • Est-il lisible ?
  • Cela fonctionne-t-il ?
  • Est-il possible de le maintenir ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X