Trolldi : comment écrire du code non maintenable et qui vous assurera un travail à vie ?
Petites astuces dans le langage Java

Le , 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 : Sélectionner tout
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 : Sélectionner tout
#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 : Sélectionner tout
Bubblegum b = new Bubblegom();
Malheureusement, la popularité de l’opérateur ++ rend plus difficile l’absence de code pseudo-redondant comme celui-ci:

Code : Sélectionner tout
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 ?


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse Signaler un problème

Avatar de sebastiano sebastiano - Membre habitué https://www.developpez.com
le 07/09/2018 à 9:15
Ê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.
Avatar de gros_rougeot gros_rougeot - Membre régulier https://www.developpez.com
le 07/09/2018 à 10:12
Oui, j'ai rencontré ce type de code. Tous les préceptes mentionnés dans l'article ont été utilisés ... ainsi que quelques autres.
Le gars n'a même pas fait exprès. Il a juste commencé la programmation sur ce projet, tout seul, sans conseil.
D'ailleurs, ce gars là me fait penser qu'il serait aussi champion de l'IHM la plus nulles à chier.
Avatar de benoit1024 benoit1024 - Membre habitué https://www.developpez.com
le 07/09/2018 à 10:44
et ne pas oublier d'appliquer ces règles aux base de données !
Avatar de LebonJaime LebonJaime - Candidat au Club https://www.developpez.com
le 07/09/2018 à 10:50
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

Ca suffit amplement à rendre du code non maintenable.
Ca me désole un peu si des gens font les exemples mentionnés dans l'article de manière intentionnelle tout de même.
Un exemple sympa aussi pourrait être d'écrire des TU qui ne test rien mais augmentent la couverture de code et font croire aux futurs personnes travaillant sur le projet que leurs modifications ne causent aucunes régressions vu que les tests passent toujours.
Avatar de caalors caalors - Nouveau membre du Club https://www.developpez.com
le 07/09/2018 à 11:17
Pas besoin de chercher à écrire du code non maintenable avec Java, Java s'en occupe tout seul ! :-)
Comme de faire souffrir des serveurs à longueur de vie.
Avatar de grunk grunk - Modérateur https://www.developpez.com
le 07/09/2018 à 11:22
Citation Envoyé par LebonJaime Voir le message
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)
Avatar de 10_GOTO_10 10_GOTO_10 - Membre éprouvé https://www.developpez.com
le 07/09/2018 à 11:42
Citation Envoyé par Stéphane le calme Voir le message
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 : Sélectionner tout
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 : Sélectionner tout
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 ;/*~
         */
Avatar de Sodium Sodium - Membre éprouvé https://www.developpez.com
le 07/09/2018 à 13:29
Oui, j'ai un collègue qui code comme ça, son travail est tellement désastreux qu'on a du embaucher une boîte externe pour faire son travail à sa place.

Récemment j'ai du debuger un de ses script ayant une fonction essentielle et qui plantait parce qu'il avait dans une requête sql "AND WHERE id <> ?" et oublié de spécifier l'id en question. Aucun commentaire pour expliquer quel id devait être exclu ni pourquoi, la table faisant des dizaines de milliers de lignes avec des données de type totalement différents et des entrées pouvant dépendre d'autres entrées. J'ai bien été obligé de mettre un chiffre au hasard pour débloquer le truc en attendant son retour.
Avatar de escartefigue escartefigue - Expert éminent https://www.developpez.com
le 07/09/2018 à 13:33
Le langage assembleur permet de faire pointer le code sur les données et inversement, ainsi l'un et l'autre peuvent s'altérer à l'envie, à partir de là il est extrêmement difficile, même pour le concepteur, de savoir jusqu'où on peut aller...
Avatar de ShigruM ShigruM - Futur Membre du Club https://www.developpez.com
le 07/09/2018 à 13:50
travail oui
a vie non je pense pas sauf si il est fonctionnaire
Contacter le responsable de la rubrique Accueil