lo2k


Weblog

18/12

2009

0 Comment

Comment réutiliser son propre code (et ne pas réinventer la roue) ?

Cela fait bientôt… longtemps que je dev :) . Ouh là ! Bien plus de 10 ans ! Je prend un coup de vieux là d’un coup mais fort est de constaté que ma mentalité a pas mal évolué avec le temps.

J’ai envie aujourd’hui de vous faire partager un certain nombre de choses dont je me rend compte en même temps que je commence a perdre mes cheuveux :-) .

La réutilisabilité.

Ahhh la jeunesse, la fac ! Quel nostalgie !

Je me souviens a chaque fois que j’avais une idée d’amélioration dans un programme, je reprogrammais TOUT. Repartir d’un projet vide et tout refaire pour atteindre le code “ultime”, celui qui sera maintenable et rapide à la fois.

Mais voilà… en prenant de l’age. Il n’y a plus maman pour faire les courses, la vaisselle, la lessive et du coup il y a forcément moins de temps pour dev. Alors forcément, si j’ai quelque chose qui marche, j’ai pas très envie de réinventer la roue (surtout carré).

Oui mais j’ai fait ça il y a 2 ans !

N’étant pas un fervent défenseur de la javadoc, phpdoc ou autre joyeuseriedoc, je ne documente pas beaucoup mon code (PÔ BIEN !!!) mais je fais des tests unitaires. Si j’avais un conseil a vous donnez, faites des tests unitaires au moins vous aurez un vague souvenir de ce que fais chaque fonctions :) .

A partir du moment ou mes tests unitaires passent, je considère que mon code “fonctionne”. Il n’est surement pas parfait mais je ne vais pas le changer tant qu’il

  • n’est pas horriblement lent
  • n’a aucun bug detecté

Et puis… le code a t’il besoin d’être parfait ? Injection de dépendances, Design pattern, Meta modèle, les concepts en informatiques fleurissent tellement que le temps de finir un projet, techniquement il est déjà dépassé :) . Il faut vivre avec son temps mais cela ne sert a rien de modifier quelque chose qui marche et qui semble “plutôt” maintenable.

Ouh là… mais c’est en PHP4 !

Avec le temps, on apprend aussi de nouveau langage. Basic, Delphi, C++, PHP, Python, Ruby, Java… c’est qu’on aime expérimenter un peu tout. Il faut aussi avouer qu’il serait un peu bête de ne pas utiliser le langage le plus approprié pour la tache. Je ne m’amuserais pas a faire une appli web en C++ ni a faire un programme en PHP/QT.

Mais comment réutiliser du code d’un autre langage ? C’est très simple, en utilisant une interface.

Le mot “interface” ici est a prendre au sens large. Que ce soit du xmlrpc, une page en JSON ou une exécution dans le langage actuel avec une glue quelconque (je pense a python avec des dll ou java avec jython, jruby), l’important ici est d’utilisé une technique de communication “standardisée”.

Mais le mot “interface” est aussi a prendre au sens propre d’un langage de programmation. Plus vous aurez d’interface définis, plus il sera facile de changer son implémentation par la suite.

Souvent on me regarde de travers quand je dis “on peut faire du code bien crade si l’interface est propre“. Peut importe d’avoir un bout de programme en TCL/TK tant que son utilisation dans le programme principal reste transparente et que cette brique puisse être interchangeable.

Concretement cela donne quoi ?

Si j’ai eu l’idée de faire ce petit post c’est parce qu’actuellement j’ai 2 projets en parallèles que je traine depuis un moment et où je suis très content de réutiliser le code existant.

Le premier c’est scrutator où une partie du code serveur est en PHP. Même si la nouvelle implementation est en python twisted, la couche de sauvegarde s’effectue en XML-RPC et utilise toujours l’ancien code de sauvegarde. Une partie de l’ancienne logique de déploiement repose toujours sur du code PHP mais elle a tendance au fur et a mesure a disparaitre.
Le fait d’avoir décidé de réutilisé une partie de mon code PHP m’a facilement fait gagné 2 a 3 semaines de développement. La logique de déploiement disparaitra mais la sauvegarde se fera a mon avis toujours par la couche PHP qui reste robuste.

Le 2ème c’est MyLibrary. Je suis en train de réfléchir a le refaire en GWT. Ici aucun intérêt a changer la couche de sauvegarde et de requête sur Amazon. Je pense développer une couche en JSON pour dialoguer avec PHP. L’interface de sauvegarde risque ensuite de s’améliorer par la suite pour surement utiliser la sauvegarde PHP et Google Gears.

Ne pas faire de programmation spaguetti

Oui il faut réutiliser ! Oui on peut réutiliser du code imbuvable ! Mais attention a ne pas faire n’importe quoi non plus. Vous devez garder le contrôle.

Rien ne vous empêche de faire des tests unitaires dans votre nouvelle implémentation (en java par exemple) pour vérifier que votre ancienne implémentation (en PHP) fonctionne toujours.

Il faut aussi éviter de réutiliser un code qui utilise lui même un code déjà recyclé. Utiliser du code Perl dans un programme PHP qui est repris en Python… Il serait peut être un peu temps de se remettre en question et de voir si tout est réellement nécessaire.

En conclusion

Pour réutiliser son code il y a quelques règles simples à suivre.

  1. Assurez qu’il est facile de se replonger dans le code. Tests unitaires, exemples, doc automatique, il y a bien des moyens de faciliter la reprise d’un code existant. Personnellement je préfère les tests unitaires qui assureront aussi des tests de régressions, de plus ils doivent en théorie être complet et donc utiliser toutes les interfaces ceux qui vous permettra de vous souvenir des entrées/sorties de chaque fonctions.
  2. Faites des interfaces ! Il faut en faire le plus possible. Des interfaces sont nécessaire pour chaque partie “clé” de votre code.
  3. Ne pas être perfectionniste. Pourquoi refaire un code qui marche alors que votre implémentation actuelle fonctionne correctement et qu’il n’y a pas d’évolution prévu pour cette partie de code ?

En espérant que cela vous aidera a faire du très bon recyclage ;)

  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • TwitThis
  • StumbleUpon
  • Technorati


Post a Comment


Exponential Fault is proudly powered by WordPress
Entries (RSS) and Comments (RSS). Theme by Jérôme Wax
Contact