Developpez.com

Le Club des Développeurs et IT Pro

Trolldi : comment écrire du code non maintenable et qui vous assurera un travail à vie ?

Petites astuces dans le langage Java

Le 2018-09-07 02:54:18, par Stéphane le calme, Chroniqueur Actualités
Sur un ton satirique, le développeur Roedy Green s’est proposé de transmettre son savoir dans l’écriture d’un code qui donnerait des sueurs froides au développeur qui viendra faire la maintenance. Son illustration est axée sur la programmation Java.

« Je vous transmets les conseils des maîtres sur la façon d'écrire du code si difficile à gérer, qu’il faudra des années aux personnes qui vont en assurer la maintenance pour effectuer les changements les plus simples », promet-il.

Et de poursuivre en disant « De plus, si vous respectez toutes ces règles religieusement, vous vous garantissez même une vie d’emploi, car personne, sauf vous, ne pourra espérer maintenir le code. D’ailleurs, si vous suiviez toutes ces règles religieusement, vous même ne seriez pas en mesure de maintenir le code ! »

Bien entendu, cela doit rester un art. Votre code ne doit pas sembler impossible à maintenir de prime abord, sinon il risque simplement d’être réécrit.

Principes généraux

Pour mystifier le développeur qui va effectuer la maintenance, vous devez comprendre comment il pense. Face à lui se tient votre programme géant. Il n'a pas le temps de le lire en entier, encore moins de le comprendre. Il veut rapidement trouver l’endroit où effectuer une modification, la faire et s’en aller tout en espérant ne pas avoir d’effets secondaires inattendus.

Il est donc question de l’empêcher d’avoir une vision d’ensemble. Vous voulez donc qu’il soit plus difficile pour lui de trouver le code qu'il recherche. Mais plus important encore, il faut que ce soit tellement difficile qu’il ne puisse pas ignorer quoique ce soit.

Pour réussir cet exercice, il donne quelques conseils : « Les développeurs sont plongés dans la complaisance par les conventions. Mais de temps en temps, en violant subtilement la convention, vous les forcez à lire chaque ligne de votre code avec une loupe ».

Vous pourriez avoir l’idée que toutes les fonctionnalités de langage rendent le code impossible à maintenir, ce qui n’est pas le cas si elles sont mal utilisées.


Les appellations

L'art de nommer des variables et des méthodes est une grande partie de la compétence « rédaction d’un code non maintenable ». Elles ne comptent pas du tout pour le compilateur. Cela vous donne une grande latitude pour les utiliser afin de dérouter le développeur qui va effectuer la maintenance.

Les noms de variable à lettres uniques

Si vous appelez vos variables a, b, c, alors il sera impossible de rechercher des instances de celles-ci en utilisant un simple éditeur de texte. De plus, personne ne pourra deviner à quoi elles servent.

La mauvaise orthographe créative

Si vous devez utiliser des noms de variables et de fonctions descriptives, orthographiez-les mal. En mal orthographiant certains noms de fonctions et de variables et en les orthographiant correctement dans d’autres (tels que SetPintleOpening et SetPintalClosing), nous annulons efficacement l’utilisation des techniques de recherche grep ou IDE. Cela fonctionne étonnamment bien.

Soyez abstrait

En nommant des fonctions et des variables, faites un usage intensif de mots abstraits tels que tout, données, descripteur, élément, tâche, routine, exécution et les chiffres, par ex. routineX48, PerformDataFunction, DoIt, HandleStuff et do_args_method.

Acronymes

Utilisez des acronymes pour garder le code laconique. Les vrais hommes ne définissent jamais les acronymes; ils les comprennent génétiquement.

Camouflage

Une grande partie de l'habileté à écrire un code non maintenable est l'art de se camoufler, de cacher des choses ou de faire en sorte que les choses semblent être ce qu'elles ne sont pas. Beaucoup dépendent du fait que le compilateur est plus capable de faire des distinctions que l'œil humain ou l'éditeur de texte. Voici quelques-unes des meilleures techniques de camouflage.

Code qui se déguise en commentaires et vice versa

Inclure des sections de code qui sont commentées mais qui à première vue ne semblent pas l’être

Code Java :
1
2
3
4
5
6
7
8
9
10
for (j=0; j<array_len; j+=8) { 
    total += array[j+0]; 
    total += array[j+1]; 
    total += array[j+2]; /* Main body of 
    total += array[j+3]; * loop is unrolled 
    total += array[j+4]; * for greater speed. 
    total += array[j+5]; */ 
    total += array[j+6]; 
    total += array[j+7]; 
}

Sans la coloration, remarqueriez-vous que trois lignes de code sont commentées ?

Masquer les définitions de macro

Cachez-les dans les commentaires inutiles. Le développeur va s'ennuyer et ne va abandonner sa lecture des commentaires et il ne découvrira donc jamais la macro. Assurez-vous que la macro remplace ce qui ressemble à une assignation parfaitement légitime avec une opération bizarre, un exemple simple:

Code :
#define a=b a=0-b
Conception du programme

La clé pour écrire du code maintenable est de spécifier chaque fait de l'application dans un seul endroit. Il vous suffit donc d’effectuer le changement à un seul endroit et vous avez la garantie que le programme entier fonctionnera toujours. Par conséquent, pour écrire un code qui ne sera pas maintenable, il faut spécifier un fait à plusieurs reprises, dans autant d'endroits que possible, de toutes les manières possibles.

Heureusement, des langages tels que Java font tout leur possible pour que l’écriture de ce type de code soit plus facile. Par exemple, il est presque impossible de modifier le type d'une variable largement utilisée, car toutes les fonctions de conversion ainsi que les Casts ne vont plus fonctionner et les types de variables temporaires associés ne seront plus appropriés.

Java Casts

Le système de casting de Java est un cadeau des dieux. Vous pouvez l'utiliser sans culpabilité puisque le langage l'exige. Chaque fois que vous récupérez un objet d'une collection, vous devez le replacer dans son type d'origine. Ainsi, le type de la variable peut être spécifié dans des dizaines de lieux. Si le type change ultérieurement, tous les Casts doivent être modifiés pour correspondre. Le compilateur peut ou peut ne pas détecter si le développeur qui effectue la maintenance ne parvient pas à les modifier tous (ou en modifie un de trop).

Exploiter la redondance de Java

Java insiste sur le fait que vous spécifiez deux fois le type de chaque variable. Les développeurs Java sont tellement habitués à cette redondance qu'ils ne vont pas remarquer si les deux types sont légèrement différents, comme dans cet exemple:

Code :
Bubblegum b = new Bubblegom();
Malheureusement, la popularité de l’opérateur ++ rend plus difficile l’absence de code pseudo-redondant comme celui-ci:

Code :
swimmer = swimner + 1;
Source : Roedy Green

Et vous ?

Êtes-vous déjà tombé sur du code dont la maintenance était difficile ?
L'entreprise a-t-elle fait appel à la personne/l'équipe qui l'a conçue, avez-vous du réécrire le code ou vous êtes vous contenter de publier des fix pour corriger les problèmes ?
Avez-vous déjà volontairement écrit du code pour rendre difficile la maintenance par un autre développeur ?
Quelles astuces pouvez-vous rajouter à cette liste ?

Voir aussi :

Trolldi : qu'avez-vous pu faire dans le passé pour détruire involontairement votre carrière en informatique ? Quelques pistes à explorer
Trolldi : comment prendre sept ans pour livrer une bêta d'un jeu vidéo ? L'art d'allonger les délais en développement logiciel
Trolldi : les meilleurs employés ne sont pas ceux qui sont les plus agréables, selon un psychologue qui explique sa réflexion
Trolldi : Good Luck With That, enfin une licence pour le code spaghetti ? Les devs peuvent modifier votre code tant qu'ils ne vous mentionnent pas
Trolldi : quelles sont les pires excuses que les entreprises pourraient avancer, pour refuser le passage à l'IPv6 ?
  Discussion forum
24 commentaires
  • Cid1894
    Nouveau Candidat au Club
    Quelles astuces pouvez-vous rajouter à cette liste ?
    • Si le langage le permet, l'utilisation massive de label / goto.
    • Avec des RegEx volontairement complexes, on peut facilement compliquer la lecture.
    • Faire ça :


  • comment écrire du code non maintenable et qui vous assurera un travail à vie ?
    Passer sa vie à maintenir un code pourri que l'on a créé...
    Un belle vie bien remplie de vide...
    Mettons que l'on se fixe des objectifs à hauteur de ses compétences...
  • setni
    Membre averti
    J'ai travaillé avec un dev comme cela, On était géré par des commerciaux qui ne comprenaient rien à notre taf et en plus, qui n'hésitaient pas à virer des devs pour des motifs futiles... Donc, l'un d'eux a fait une boite noire. Et le jour on les commerciaux l'on menacés, il n'a plus répondu aux demandes des clients... Il a obtenu une augmentation et du remote.

    Quelles astuces pouvez-vous rajouter à cette liste ?
    Inspiré de ce fait réel:

    Les poupées Russes d'héritage et les calls intempestifs d'une classe à l'autre. L’œil humain ne peut pas garder plus de 7 références en tête, donc avec des hierarchies de 8-10 classes hérités, le code devient illisible.
  • grunk
    Modérateur
    Envoyé par LebonJaime
    Jamais tombé sur ces exemples là. Je suis déjà tombé sur du code non maintenable mais un peu moins gros que ca:
    • fichiers pyhton de 5000 lignes
    • 40 classes dans le même fichier
    • des méthodes de 200 lignes

    J'ai déjà eu le droit à un fichier C++ d'un peu plus de 23000 lignes et c'est pas du codé généré ^_^ .
    Les méthodes 200 lignes ca peut se justifier. Parfois il y'a pas matière à découper du code et faire 10 fonctions de 20 lignes juste pour le principe de découper je suis pas fan. (c'est d'ailleurs assez fastidieux de sauter de méthode en méthode quand on lit du code je trouve)
  • sebastiano
    Membre extrêmement actif
    Envoyé par ShigruM
    au lieu de nous insulter, pour pouvoir avoir le diplôme d'ingénieure en informatique il faut au moins 750 au toeic en France, je ne sais car j'ai du le passer pour avoir l'équivalence de diplôme avec l'université d'alger.
    le francais par contre je savais pas le parler mais cela n'est pas éliminatoire

    l'anglais en informatique est indispensable.
    Oui enfin il n'a pas parlé d'Anglais, mais "écrire dans une langue étrangère, que les collègues ne maîtrisent pas".

    J'imagine qu'écrire des variables en Polonais, Suédois ou Néerlandais va pas spécialement aider à la compréhension du code...
  • esperanto
    Membre émérite
    Envoyé par sebastiano
    Oui enfin il n'a pas parlé d'Anglais, mais "écrire dans une langue étrangère, que les collègues ne maîtrisent pas".
    Merci sebastiano de confirmer que c'était compréhensible. En effet, la partie entre guillemets était bien là en particulier pour exclure l'anglais. Mais comme certains font toujours l'amalgame " langues étrangères <=> anglais " bien fait pour eux.

    Après je reconnais un oubli malencontreux dans la dernière phrase, en fait je voulais initialement écrire "les développeurs anglo-saxons", histoire de souligner le fait que cet article ne fait que traduire les conseils d'un anglophone, pour qui l'idée même de parler autre chose que sa propre langue relève probablement de la science-fiction. J'avais lu un jour un article similaire entièrement rédigé par un français (pas de traduction) et lui avait bien pensé à la possibilité d'utiliser une langue étrangère pour rendre le code moins lisible (sauf pour son auteur)

    Et puis si je dois des excuses aux programmeurs alors forcément je dois m'en faire à moi-même
  • el_slapper
    Expert éminent sénior
    Après, il faut garder son calme. On a un expert avec 25 ans de maison qui s'est fait virer pour une altercation(il s'est un peu fait piéger, mais beaucoup de gens souhaitaient son départ, et on témoigné en sa défaveur devant le nouveau patron). Il a laissé un code de ce genre à sa successeur, qui depuis a une vie compliquée - mais à eu droit à une grosse augmentation sans même la demander, et a en plus obtenu un télétravail. Je dois l'aider cet automne. Argh.

    Sinon, j'ai vu des horreurs en COBOL. Un langage semi-positionnel, avec 72 colonnes utiles. Et chose normalement interdite sur tous les sites sérieux, mais que certains font quand même juste pour faire chier : le point ferme tous les IF ouverts avant.

    Code :
    1
    2
    3
    4
    5
    6
    7
               IF AB=FDSFDS
               MOVE AB TO CD                                            ELSE
               IF EF=FDSFDS
               MOVE EF TO CD                                            ELSE
               MOVE GH TO CD                                               .
               MOVE TT TO RG                                               .
    Notez les ELSE et les . en fin de ligne, loin du regard du développeur distrait par l'absence d'intendation. le MOVE TT se produit toujours, un seul des trois autres MOVE se produit, mais avant de le voir, vous vous êtes bien torturé les yeux. Et encore, j'ai simplifié, le vrai code avait 30 lignes de ELSE planquées partout, avec un ou deux points pour piéger le lecteur au milieu.

    Il y a parfaitement moyen de faire ce code là proprement en COBOL, mais certains préfèrent déposer des mines antipersonnel.

    EDIT : j'ai eu beaucoup de mal à taper ce code sous OpenCOBOLIDE. Cet outil de qualité française ne voulait pas me laisser coder aussi cradement, j'ai du le forcer un peu. J'ai honte.
  • 10_GOTO_10
    Membre expérimenté
    Envoyé par Stéphane le calme 
    Inclure des sections de code qui sont commentées mais qui à première vue ne semblent pas l’être

    On peut aussi faire le contraire : Inclure du code qui semble commenté mais qui ne l'est pas (ici, en C) :

    Code C :
    1
    2
    3
    4
            // 2013-04-01 dhartmei: split scratch 29-to-3 bits???/ 
            /* You have a strange feeling for a moment, then it passes 
             *             (&q+10)=='@'?!(0??(*(&q+14)??)=&q+16):0 ;/*~ 
             */

    Vous voyez pourquoi ? Même la coloration syntaxique se fait prendre au piège.







    "??/" est un trigraphe qui est remplacé (au moins sur les vieux compilateurs) par un antislash

    Code :
    1
    2
    3
    4
            // 2013-04-01 dhartmei: split scratch 29-to-3 bits???/ 
            /* You have a strange feeling for a moment, then it passes 
             *             (&q+10)=='@'?!(0??(*(&q+14)??)=&q+16):0 ;/*~ 
             */


  • shadowmoon
    Membre émérite
    Envoyé par setni
    Les poupées Russes d'héritage et les calls intempestifs d'une classe à l'autre.
    J'ai déjà croisé une variante avec de multiples niveaux d'héritages, des surcharges de fonctions et des appels entre-elles disséminés à travers.

    Un "exemple" simple :

    Une fonction A est définie au niveau 2, surchargée au niveaux 3, 5 et 8.

    Une fonction B est définie niveau 7.

    Une fonction C définie au niveau 1, surchargée au niveau 4 et 7.

    La fonction B fait appel à la surcharge de C du niveau 4, et celle-ci utilise la surcharge de A du niveau 3.
  • sebastiano
    Membre extrêmement actif
    Êtes-vous déjà tombé sur du code dont la maintenance était difficile ?
    Oui.

    Appli d'un ministère. Code spé PHP vieux de 11 ans, codé avec des pieds amputés.

    Maintenance + rétrodoc. Mon projet le moins intéressant en +10 ans de carrière.

    L'entreprise a-t-elle fait appel à la personne/l'équipe qui l'a conçue, avez-vous du réécrire le code ou vous êtes vous contenter de publier des fix pour corriger les problèmes ?
    Nope.

    Ni personnel, ni aucune doc technique ou fonctionnelle.