Mot-clef « RBS Change »

Plus on enlève de code, mieux ça marche

Encore récemment, dans le cadre du chiffrage d'une migration d'un projet vers la dernière version d'RBS Change (CMS / e-commerce dont j'ai déjà parlé plusieurs fois ici), l'un des développeurs disait en parlant de certaines fonctionnalités développées sur le projet en spécifique et qui entre temps ont été implémentées dans le produit que maintenant que le code spécifique était écrit, ça ne coûtait pas cher de le garder tel quel plutôt que de prendre le temps de le remplacer par des appels au code du produit.

À part si un besoin spécifique n'est pas compatible avec le code du produit, je suis intimement convaincu que c'est faux. Et ce pour un certain nombre de raisons.

Le point le plus évident pour moi c'est le coût en maintenance. S'il y a bien une chose que j'ai appris en travaillant sur un logiciel qui fait plusieurs centaines de milliers de lignes de code, c'est que plus on a de code, plus c'est couteux à maintenir. D'une part parce que chaque ligne ajoutée peut comporter des bugs ou s'avérer incompatible avec d'autres parties du logiciel et d'autre part parce que plus il y a de code, plus il est difficile de retrouver la source d'un problème. C'est d'autant plus vrai si l'équipe chargée du projet change. Quand le développeur est le même pendant des années, il peut connaitre assez bien son code pour s'y retrouver parmi les implémentations parallèles (et encore... que celui qui ne s'est jamais senti perdu en se replongeant dans du code qu'il avait écrit rien qu'un an plus tôt lève la main) mais un nouvel arrivant sur le projet mettra beaucoup plus de temps à s'y retrouver s'il doit apprendre à connaitre les implémentations parallèles en plus du produit lui-même.

On en arrive du coup à un second point connexe au précédent : l'évolutivité. Naïvement on se dit que vu que la fonctionnalité est codée spécifiquement, on peut faire ce qu'on veut avec et donc on est bien plus libre qu'en utilisant une fonctionnalité native du produit sur laquelle on n'aura pas autant la main. Ce n'est pas faux. Mais cela implique de se couper en partie des évolutions du produit et de devoir tout faire soi-même de son côté. De plus, se pose le même problème qu'évoqué précédemment où tout nouvel arrivant devra oublier ce qu'il sait déjà du produit pour apprendre ce que fait le projet.

Ensuite on a les coûts d'interface utilisateur et d'apprentissage. De deux choses l'une : soit on laisse les deux implémentations parallèles accessibles dans l'interface et là c'est l'utilisateur qui se sentira perdu, ne sachant quoi choisir (ce qui implique du coût de formation et de réparation de ce que l'utilisateur aura mal fait), soit on doit masquer de l'interface les éléments relatifs à l'implémentation standard pour les remplacer par l'implémentation spécifique (ce qui implique un coût initial plus un coût à chaque mise à jour pour revalider les choses et les réadapter si besoin).

Après on peut avoir du mal à jeter le produit de nombreuses heures de développement. C'est normal mais pour un développeur c'est une chose à laquelle il faut s'habituer. Un logiciel qui n'évolue pas, à part s'il est extrêmement ciblé sur un besoin très pointu qui n'évolue pas du tout (chose très rare), c'est un logiciel mort. Un logiciel vivant évolue continuellement au gré des nouveaux besoins, des nouvelles possibilités et des nouvelles idées. Seulement on ne peut pas se contenter d'empiler de nouvelles choses dessus, sous peine de voir l'ensemble s'effondrer sous sa complexité, de devenir inmaintenable et incompréhensible au nouvel arrivant.

Des choses qui semblaient - et potentiellement étaient réellement - pertinentes à un moment donné ne le seront plus un an plus tard parce que le besoin aura évolué ou simplement parce qu'à force d'y greffer des verrues, on aboutit à un ensemble qui ne ressemble plus à rien. Il ne faut donc pas hésiter à remplacer des fois des pans entiers du logiciel pour repartir sur des bases plus saines. Qui elles-mêmes dégénèreront plus ou moins rapidement (selon la qualité de l’implémentation et la vitesse à laquelle les besoins liés évoluent) avant d'être à leur tour remplacées à nouveau.

Ce principe vaut aussi bien au niveau macroscopique (une API entière finit par devenir trop lourde et doit être remplacée) qu'au niveau microscopique (une méthode donnée peut souvent être réécrite en cinq fois moins de code parce qu'elle prévoyait des cas qui n'existent plus ou bien parce qu'à force de refactoring, le code se répète trop). Il faut toutefois prendre garde à ne pas sauter trop vite aux conclusions et tout réécrire continuellement, sans quoi d'une part on n'avance plus et d'autre part, à aller trop vite, on passe à côté de subtilités qui ne sautent pas aux yeux sans examen approfondi (pour ce dernier point, des tests unitaires ou autres peuvent aider à éviter les régressions, encore faut-il avoir le temps ou simplement prendre le temps de les mettre en place).

Comme souvent il s'agit de trouver un juste milieu entre tout réécrire et conserver à tout prix l'existant. Mais quand la réécriture consiste à utiliser quelque chose qui existe par ailleurs et qu'on n'aura donc pas à maintenir soi-même, je pense qu'il n'y a pas à hésiter : si fonctionnellement c'est compatible, ça vaut le coup de jeter le spécifique pour utiliser du natif.

Voilà voilà, félicitations si vous avez tout lu jusqu'ici et n'hésitez pas à réagir dans les commentaires si vous avez quelque chose à ajouter sur le sujet ou des objections à formuler :)


Quelques petites BD #1

Au collège et lycée, je dessinais beaucoup, puis j'ai progressivement arrêté. Ces dernières années, ça me reprend une ou deux fois par an mais comme la plupart du temps je n'arrive pas à faire ce que je veux, ça ne dure pas.

Depuis quelques semaines, j'ai commencé à faire quelques petites BD allant de quatre cases à une page présentant de petits gags inspirées pour la plupart (parfois assez librement) d'anecdotes de bureau.

Pour une fois, ça semble tenir un peu. Principalement, je pense, parce que le dessin n'est ici qu'un support pour un gag et pas une fin en soi. Le fait que je trouve la plupart assez ratés techniquement n'est donc pas un si gros problème que d'habitude.

Je les publie au fur et à mesure sur Twitter ou encore deviantART mais je vais aussi les récapituler ici.

Voici donc la première fournée :

BD #1 - 09/04/2012 BD #2 - 21/04/2012 BD #3 - 30/04/2012 BD #4 - 12/05/2012
Images sous licence CC-BY

Concernant la dernière, quelques précisions pour mieux comprendre :

  • Boulder Dash est une célèbre série de jeux vidéos démarrée en 1983 (presque aussi vieille que moi :peur2:), probablement le jeu sur lequel j'ai passé le plus d'heures dans ma vie (même si Guild Wars se défend bien aussi), les captures d'écran sont des captures d'écran du jeu
  • RBS Change, j'en ai déjà parlé ici plusieurs fois, c'est le CMS / solutions e-commerce auquel je contribue au boulot
  • Magento est une solution e-commerce concurrente (l'une des plus connues)
  • Les deux logos dans la dernière case sont les logos des deux solutions

Côté réalisation je fais mes brouillons sur papier (parce que ça reste encore le support où j'arrive le mieux à quelque chose), puis je les scanne je mets au propre, mets en page et colorise via Photoshop Elements et tablette graphique Bamboo de Wacom (ça faisait depuis septembre dernier que je l'avais, il était temps de la rentabiliser un peu ^^).

Là ce sont les premières, donc je tâtonne un peu sur la technique mais j'espère m'améliorer un peu au fil du temps et notamment arriver à les faire un peu plus vite (là même celles qui comporte peu d'illustrations différentes me prennent facilement trois heures... du coup ça bride un peu les choses).


Un nom plus court pour la commande change.php

Cet article n'intéressera pas forcément grand monde. En même temps, le but premier de ce blog était bien à l'origine de me servir de bloc-notes pour garder une trace de certaines choses que j'ai eu plus ou moins de mal à trouver et/ou retenir, pas forcément à intéresser un public très large.

Donc là on parle de développement avec RBS Change et plus particulièrement de la commande change.php. Avant la version 3.5 il fallait installer une commande globale sur le serveur pour pouvoir l'exécuter, à partir de la version 3.5 cette commande globale n'est non seulement plus nécessaire mais carrément gênante (parce qu'on passe dans du code qui n'est plus compatible, même si on ne s'en rend pas compte tout de suite).

Mais toujours est-il que taper php framework/bin/change.php c'est vite lourd. Une solution possible est de passer par un alias de commande dans le .bashrc :

alias change.php="php framework/bin/change.php"

Mais par moment ça marche moyen. Surtout si la commande globale de la version 3.0.x est installée, parce que des fois on se retrouve à exécuter quand même la commande globale alors qu'on voulait exécuter celle contenu dans le framework.

Une meilleure solution est de passer par une commande personnalisée. Sur Ubuntu Serveur inclut par défaut (cf le fichier .profile) le dossier ~/bin dans le PATH. Ainsi il suffit de définir un fichier ~/bin/change.php (sans oublier de lui donner les droits d'exécution : chmod +x ./change.php) contenant :

#!/usr/bin/env php
<?php
if (file_exists("framework/bin/includes")) {
  $script = "framework/bin/change.php";
}
else
{
  $script = "/usr/local/bin/change.php";
}
if (file_exists($script))
{
  array_shift($argv);
  $script = $script . ' ' . implode(' ', $argv);
  system($script);
}
else
{
  echo "Could not find $script";
}

Personnellement j'ajoute aussi un lien symbolique pour pouvoir exécuter simplement c au lieu de change.php :

ln -nfs change.php c

Voilà voilà exécuter juste c plutôt que php framework/bin/change.php c'est quand même nettement plus agréable, surtout quand on développe et qu'on tape la commande toutes les 5 minutes :o


RBS Change 3.5 et messagerie privée

La version 3.5 de RBS Change est sortie il y a peu avec ps mal de nouveautés et améliorations diverses.

À l'occasion de cette version, le module de messagerie privée que j'ai développé pour L'Assemblée des Funomanciens et publié ici a été reversé dans le pool de modules standards d'RBS Change. Le repository sourceforge se sera donc plus alimenté pour les versions à venir et est remplacé par l'entrée modules.privatemessaging.git du repository d'RBS Change.


L'Assemblée des Funomanciens

Depuis plusieurs mois je travaille sur le développement d'un nouveau site/forum dédié au jeu de cartes à collectionner Magic : l'Assemblée. Et on en arrive à un stade où une ouverture "officielle" devient raisonnable (tout n'est pas encore parfait, loin de là, mais il faut bien ouvrir un jour :p).

L'assemblée des Funomanciens

Le site a pour vocation d'aborder le jeu sur l'angle de la créativité et du fun (par opposition aux tournois et à l'optimisation des decks qui sont en général mis en avant par les autres sites).

Pour l'instant on a donc :
- un forum
- une rubrique "FunCards" où l'on peut poster ses cartes perso, les noter, les commenter, tout ça. Plus quelques tutos
- un peu de contenu par ailleurs mais encore minimaliste

Pas mal d'autres sections sont prévues à terme : créations diverses autour de Magic (fond d'écran, avatars, altération de cartes, fanfics...), variantes de jeu, etc.

Le site tourne sur le CMS RBS Change (le logiciel sur lequel je travaille au boulot et dont j'ai déjà parlé ici) et qui à terme sera utilisé pour EDForum et Cultur-ED aussi en remplacement du couple phpBB2 / WordPress (quand j'aurai suffisamment enrichi la partie forum pour se rapprocher du niveau de fonctionnel qu'on a ici actuellement). Puis après tout ça, je migrerai sans doute ce site aussi parce que bon, c'est plus facile de maintenir un des sites tous sur le même système.

Ce projet avait donc deux objectifs :
- créer une communauté autour de Magic
- me motiver pour avancer sur les développements en vue de la migration d'EDForum vers RBS Change et surtout pouvoir tester les développement au fur et à mesure sur un vrai site

Du coup je vais pouvoir sans doute dans les prochains mois sortir plusieurs autres modules utilisables pour Change et reverser quelques fonctionnalités en standard dans la prochaine version du CMS (notamment en ce qui concerne les forums).

Voilà voilà, n'hésitez à pas à venir y faire un tour ^^