Archives pour novembre, 2009

Il ne faut pas juger le sac à son étiquette

Rien de tel qu’un mauvais processus de gestion des faits techniques pour ruiner un projet. Or, le monde est scindé en deux catégories étanches : ceux qui ont vu la Vierge (ou Ganesha, ou Raël), et ceux qui se sentent concernés par leur emploi. Généralement, ce sont les premiers qui ont pour charge de poser les fondations qui permettront à l’immense majorité que consitituent les seconds de travailler. Le processus de gestion des faits techniques en fait partie. Ce sont également les premiers qui ne comprennent pas que le doute soit permis quand une correction est proposée.

Petite expérience récente : prenez un processus de gestion des faits techniques qui ne permette pas de se tromper. Exemple : s’il existe une production officielle intégrant une proposition de correction pour un fait technique donné, alors ce fait technique doit être dans un état dont le nom peut varier mais souvent évocateur : clos, fermé, réglé, terminé, effacé ou encore abattu. Notez bien l’inversion de la relation de causalité : « j’ai une tentative de correction, c’est donc que le problème est réglé ». Si, par un étrange coup du sort, votre équipe ne contenait pas que des développeurs capables de produire 100.000 lignes d’assembleur sans bogue (ce qui serait très étonnant dans notre monde de l’ultra-performance), vous voilà bien.

Perrin vient vers vous avec son correctif pour le fait technique 12327, il a remplacé le signe ‘-’ par le signe ‘^’ dans la fonction qui doit couvrir l’exigence PQ-3265.b : « Étant donné les constantes K_TRUC et K_MACHIN dont les valeurs sont précisées en annexe B.3, le système doit fournir le résultat de leur multiplication à l’utilisateur, conformément à la norme IEEE-754 par temps de pluie ». Perrin est vaseux. Il s’est couché tard pour avoir voulu assister à la finale de « La maison des secrets ». C’est bien Léo, Académicien de 23 ans, qui a gagné le concours d’ingestion de gaspacho. Perrin est soulagé, mais fatigué. Malgré tout, c’est jour de livraison. Et oui, on livre tous les jours désormais. Quand ce n’est pas au client, c’est à la qualité, ou à l’équipe système, ou au restaurateur du site. Alors vous imaginez bien : la production sort, elle est fournie avec force bolduc à son destinataire, le FT 12327 est mort et enterré, on passe tous à autre chose.

Sauf que… le problème initial n’est pas si bien corrigé que ça. Que faire ? Le processus ne permet pas de rouvrir le FT 12327, d’autant plus qu’il a été livré au client. Et puis on ne va pas avoir tort quand même, surtout si c’est patent, vu que c’est le client lui-même qui s’est rendu compte que le dit problème n’était pas franchement corrigé. Alors on va ouvrir un autre fait technique, le 24055 (oui, en deux jours, on peut en trouver des problèmes vous savez). S’enclenchent alors la double-comptabilité et le dialogue de sourds. « Le FT12327 a été corrigé, le problème dont vous me parlez c’est le FT24055″. Et puis, songez que si vous êtes payé au fait technique corrigé, c’est extrêmement juteux, puisque le FT12327 est effectivement clos, tout le monde pourra le vérifier. Les indicateurs sont impitoyables.

Il ne faut jamais confondre intégration de correctif et validation fonctionnelle associée.

Ce n’est pas parce qu’une tentative de correction existe que le problème est dissout. Tout le monde peut se tromper, y compris en corrigeant un problème. Il faut donc se méfier d’une correction non testée. Les effets de bord, ça existe. Mais c’est là que le bât blesse : à vouloir parler vite, on utilise des formules courtes qui occultent la réalité des choses. Ce que l’on appelle au quotidien « une correction » n’est jamais qu’une proposition. Ce simple oubli a de vastes conséquences et est source de problèmes multiples : incompréhension, excès de confiance, puis atteinte de la fierté de celui qui propose une correction incomplète ou ratée, bref, de l’effet Joule à tire-l’arigot.

Je ne crois pas non plus qu’on puisse toujours éviter les doublons dans une base de fait technique. « Oui, je connais ce problème, on l’a vu il y a trois mois, c’est amusant qu’il ressurgisse. Si je me souviens bien, c’est le FT 504″. Un bon processus de gestion des faits techniques doit pouvoir permettre d’en rouvrir, ne serait-ce parce que c’est admettre qu’on peut se tromper. Ça évitera quelques doublons et facilitera bon nombre de communications. À l’inverse, interdire la réouverture force à dupliquer les problèmes et pousse inexorablement à une confiance excessive et aux conversations de type bingo « Le 17542 ? Non, tu dois vouloir parler du 18309. Ou le 18776 peut-être ? »

Mais ça se saurait aussi si les fidèles de Marie lisaient ces lignes.

Tags: ,

Qui fait deux fois naufrage ne doit pas s’en prendre à la mer

Il y a fort à parier que vous vous soyez déjà frotté à la pierre philosophale du développement logiciel : la génération automatique de code. Ça c’est une vraie bonne idée de manager moderne ! Un développeur, ça coûte des sous, ça geint, c’est lent, mais alors, vraiment, ça fait du code tout sale, qui colle aux doigts, qui marche moyennement d’ailleurs, de façon tellement médiocre qu’il doit aussi écrire des tests qui vont avec, tests qu’il va également falloir valider… Vous le voyez le serpent qui se mord la queue et qui coûte des sous ? Du code généré automatiquement, c’est trop mieux : pas besoin de tests en face, juste un bouton à appuyer et des milliers, voire des millions de lignes de code viendront remplir les disques durs automagiquement ! Le code généré a forcément raison : s’il y a malgré tout un bogue, ce sont les entrées du générateur qui sont moisies (modèle UML, spécifications, conception, que sais-je ?) En plus, ça augmente la productivité de toutes ces sales faignasses au regard bovin qui constituent la masse salariale. Alors, elle est pas belle la vie ?

Disons, oui et non. Il y a généralement deux stratégies :

  1. génération préliminaire de code, puis maintenance manuelle des pièces (comprendre fichiers) générées ;
  2. génération systématique de code à partir des entrées.

La première est souvent très pratique et permet de mettre en place une grosse architecture en place rapidement, mais peut mal vieillir, surtout si la génération a lieu bien avant que les entrées ne soient mûres. La seconde est bien plus pernicieuse, donc amusante au quotidien : les développeurs n’ont plus à maintenir le code opérationnel, mais uniquement les entrées. Ça, c’est la théorie. En pratique, ni le générateur, ni les entrées ne sont mûres. Par entrées j’entends les entrées pures du générateur citées plus haut, mais aussi potentiellement l’architecture, la plateforme, etc. Pourtant les impératifs du projet restent ce qu’ils sont : on corrige, on ajoute et on avance, rapidement s’il-vous-plaît. Alors, autant sans générateur toute la capacité de modification d’un composant se concentre à un seul niveau (le code opérationnel), autant avec, on en obtient trois : les entrées, le générateur … et le code généré bien entendu ! Et c’est l’entropie de l’univers qui se félicite, la complexité de gestion vient de gagner deux facteurs d’échelle, comme ça.

Un générateur de code doit produire du code humainement maintenable et débogable.

Il sera toujours temps de discuter toutes les stratégies de génération dans d’autres articles, mais le fondamental ci-dessus ne doit jamais être oublié. Que faire de millions de lignes de code auxquelles on ne comprend rien ? Comment modifier manuellement et rapidement du code généré (si si, ça peut s’avérer intéressant à petites doses) si le générateur duplique, triple les références aux mêmes choses sous différentes formes ? Un générateur de code, même certifié, ne fait que ce qu’on lui demande : il transpose des idées depuis un formalisme vers un autre. C’est un outil, et comme tel, il doit aider et non contraindre. De la même manière que vous pouvez comprendre ce que vous lui donnez à manger (diagramme UML et consorts), vous devez comprendre facilement le code produit.

Tags: ,