samedi 17 novembre 2012

Legacy remains legacy




Le code legacy, vous savez tous ce que c'est. Vous arrivez sur un projet, vous
regardez le code et vous faites une grimace.
Je suis sur un projet un peu comme ça. Toutefois, comme je suis joueur, je me
dis : "chouette, il y a pleins d'opportunités d'amélioration, on va bien se marrer !".
Alors sur mes premières interventions, j'ai essayé discrètement de remettre
le code à ma sauce, factoriser un peu tout ça pour faciliter la maintenance.
C'est alors qu'arrive une demande d'évolution nous proposant de réaliser un
tout nouveau module de l'application. C'était le début de l'été, on était à
l'aise... il y avait 2 packages PLSQL à coder. J'ai dit à mon stagiaire d'en
coder un et j'ai gardé le second.

J'ai réutilisé la structure du code existant -c'est une exigence du client-
tout en tentant de l'améliorer : en réduisant la redondance, en essayant de
faire un maximum de fonctions pour que cela reste lisible.
J'ai également écrit les 2 shells de lancement, en poussant les fonctions
communes aux deux scripts dans un troisième fichier. Ça marchait bien,
j'étais vraiment content du boulot qu'on avait effectué et j'étais persuadé
que le client allait être satisfait.

Après l'été, le module entre en VABF. Premiers griefs : qu'est-ce que vous avez
fait dans ce shell ? On y comprend rien, il y a des fonctions partout. En plus
vous avez mis les fonctions communes dans un troisième fichier ! C'est trop en
rupture avec l'existant, ce serait pas mal que vous nous relivriez, après avoir
recopié les fonctions communes dans chacun des deux scripts pour ne pas sourcer
de script externe. Au passage, une remarque en off : c'est pas si mal de factoriser, mais il
faudrait le faire pour toute l'application. Ben voyons, gratos, c'est bien
ça ?

Soupir, respiration, je modifie, je relivre et je me dis que c'est bon...

Peu de temps après seconde remarque : le code du package PLSQL que j'avais
rédigé n'est lui non plus pas conforme. Le style de codage est trop en rupture,
ce qui rend le code non maintenable (sic). Pluies d'anomalies, KPI en berne,
palabre avec le client. On refait le tout.
Il y avait une vraie ano fonctionnelle relativement minime, j'ai quand même
réécrit tout mon code... et ravalé ma fierté.

Essayons de comprendre le client. Celui-ci n'avait pas de TMA depuis plusieurs moi
et a dû prendre en charge évolutions et corrections sans équipe de développeurs
SQL chevronnés. Ceci nécessite de son point de vue :

  • que le style de codage soit uniforme et que tous les modules suivent strictement le même modèle ;

  • que le code soit abondamment (sur)commenté ;

  • que les fonctions un peu compliquées soient évitées. Quand ce n'est pas possible, elles sont très abondamment commentées.


  • En plus, mon code n'était pas cohérent avec celui de mon stagiaire... code qui au
    passage est considéré comme meilleur que le mien (Nassim, si tu nous lis ;-)) !
    Bref, une bonne douche froide et un suppo d'humilité pour moi. Je me remets en
    question, j'hésite à démarrer une thérapie... Je me rappelle d'un passage du
    livre Pragmatic Programmer, celui qui parle du good enough software... et de boiled frog.

    En théorie, les anomalies du client devraient être liées à des tests
    fonctionnels. Le comportement de l'application n'était pas celui attendu. Dans
    mon cas, c'était effectivement le cas, mais je l'ai découvert moi-même par la
    suite. La vraie ano que j'ai eu est "le code est complètement faux".
    Dans les faits, bah, on retouche le code à la demande pour que le client soit
    satisfait, assuré qu'il a une compréhension globale de ce qui est réalisé et
    accepte la livraison. On promet qu'on ne prendra plus les mêmes libertés par la
    suite. C'est la joie de la sous traitance.

    À titre personnel, c'est un peu dur pour moi car je réfléchis toujours
    au façon d'améliorer un système (c'est mon côté geek... ah pardon, lean), d'aller chercher une
    meilleure maintenabilité pour faciliter l'évolutivité (c'est une belle phrase
    ça, ça ferait un bon tweet). Par  exemple, j'imaginais mettre en place un framework pour la
    partie PHP. Une telle idée me fait gentiment sourire aujourd'hui.
    Au final, la situation s'améliore pour moi : à l'heure actuelle je ne code
    quasiment plus pour cette application.
    Dernier mot sur l'histoire de la boiled frog pour ceux qui n'ont pas lu le livre.

    Si vous voulez cuire une grenouille en la plongeant dans une casserole d'eau
    bouillante, celle-ci sautera systématiquement hors de la casserole. Si
    toutefois, vous la mettez dans une casserole d'eau froide que vous portez à
    ébullition, la grenouille restera dans la casserole car elle ne comprend pas
    qu'elle est en train de se faire ébouillanter vivante !

    Si vous bossez avec un client (une MOE) et que vous voulez organiser une évolution en
    rupture dans un système, rappelez vous que vos solutions ne seront jamais
    les bonnes tant que votre client ne se les ait pas appropriées. Faites en sorte
    que vos propositions d'évolution deviennent celles de votre client, que ce soit
    lui qui les porte. À vous d'être suffisamment malin... tout en restant
    honnête à 100%, cela va se soi.