Traces (log) dans les applications

On m’a récemment demandé d’expliquer quelles étaient les bonnes pratiques en terme de trace dans les applications. Voilà rapidement mon opinion sur le sujet.

Tracer, pour quoi faire?

Les traces servent à raconter ce qui se passe dans la partie cachée d’un programme informatique. Cette partie cachée étant tout ce qui n’est pas visible par l’utilisateur final. En fonction de leur niveau (ERROR, WARNING, INFO, DEBUG), elles ne s’adressent pas à la même personne, mais elles sont indispensables pour:

  • surveiller simplement l’activité de l’application. Sans parler des capacités des outils de trace moderne comme log4j, un simple tail sur un fichier de log permet de surveiller simplement l’activité d’un programme.
  • savoir ou, quand et surtout dans quel contexte une erreur est apparue
  • permettre au développeur d’analyser un problème sans qu’il soit nécessaire de le reproduire sur son poste

Ce dernier point est particulièrement important, et l’ensemble des bonnes pratiques à mettre en place visent à améliorer cette capacité d’analyse.

Lire la suite

Témoignage pour le guide « Libre Association »

Je me suis récemment inscrit sur la liste de diffusion de « Libre Association », un groupe de l’April, association dont je suis membre. Alors qu’ils élaboraient la prochaine version d’un guide sur les logiciels libres, j’ai mentionné l’existence de Project-1901. Le logiciel n’est manifestement pas encore assez abouti et/ou accessible pour être indiqué pour une association (et je suis d’accord sur ce point), mais ils m’ont demandé d’écrire un témoignage, ce que j’ai fait sur leur page wiki dédiée. Voici mon texte original reproduit ci-après

Développement d’un logiciel de gestion d’adhérents: Project-1901

Qui témoigne ?

Je suis Julien Béti, aka Motofix, 35 ans. Je travaille chez un éditeur en tant que « Responsable Méthodes et Outils » (Infrastructure / Usine de production logicielle / Socle Technique). Plongeur, je suis membre du CA et responsable informatique du CNHC, Club Nautique de Houilles et Carrières-sur-Seine, qui regroupe les sections Aquaforme, Éveil Aquatique, Natation, Nage avec Palmes en plus de la Plongée enfants et adultes (1059 adhérents cette année).

Comment Project-1901 est-il né ?

La section Plongée est animée par des moniteurs et encadrants bénévoles, qui ne comptent ni leur temps ni leurs efforts pour faire découvrir et enseigner la plongée. Adhérent au CNHC depuis plusieurs années, j’y ai passé mes niveau jusqu’au N3, mon grade actuel. Il y a 4 ans, lorsque le club a annoncé rechercher de l’aide pour remplacer le responsable informatique actuel, j’ai trouvé là l’occasion remercier le club, et j’ai répondu présent.

La gestion des adhérents était alors effectuée via un logiciel « client lourd » maison, très spécifique à chaque section, développé depuis des années sur une plate-forme propriétaire. Je tiens à saluer l’effort qu’a représenté ce logiciel, développé et mis en place par un non-informaticien. Le résultat était plus qu’honorable, et bien intégré par les utilisateurs. Mais plusieurs raisons m’ont amené à proposer une alternative:

  • Technologie lourde, propriétaire et obsolète. J’ai vraiment eu du mal à m’y mettre, la maintenance était difficile
  • Une application spécifique par section, et une dernière application pour re-centraliser les données (via échanges de fichiers, export / imports douloureux)
  • Pas de base centralisée accessible par les responsables du CA

Mon activité professionnelle évoluant, je voulais conserver une activité de développement, en en profitant pour me former à de nouvelles technos (Hibernate, ExtJS,…). Voilà l’occasion de joindre l’utile à l’agréable: je développerai l’alternative proposée.

Licence Libre ?

J’utilise le logiciel libre depuis des années, et pour moi les licences libres s’imposent d’elles-même dans le milieu associatif. Le développement de ce logiciel est ma contribution bénévole à mon club. Cela étant dit, dans le milieu du logiciel libre comme ailleurs, je supporte assez mal que le travail bénévole des uns enrichisse financièrement les autres. Ainsi, mon logiciel n’est placée sous licence libre que dans le cadre d’une activité à but non lucratif.

Travailler sur la HEAD d’abord

Les bugs sont souvent levés sur une branche « stable » ou encore « de production », et il semble donc naturel de corriger l’erreur d’abord sur cette branche, puis de reporter les modifications sur la HEAD.

Je pense que c’est une erreur. Dans un monde où on prendrait le temps de corriger et tester aussi bien sur une branche que sur une autre, fût-elle la HEAD, ça ne devrait pas avoir d’importance. Malheureusement, on est plus dans des optiques de « quick, dirty and auto-merge »… Autant limiter la casse, avec un seul objectif en tête: que le futur soit meilleur.

Privilégier l’état du code actuel

La première raison est de privilégier le code tel qu’il est sur la HEAD. C’est le « vrai » code présent, et surtout la seule base logique des développements futurs.

Lorsqu’on appréhende la correction d’un bug ou l’implémentation d’une évolution, il faut donc l’optimiser et la penser avec l’état présent du code, puis ensuite l’adapter au code ancien. Si cet effort n’est pas fait:

  • Le code de la HEAD finit par n’être qu’une adaptation de merge de code ancien.
  • L’éventuel objectif d’amélioration de l’architecture sur la HEAD se retrouve brouillée / parasitée par du code « à l’ancienne ».

Profiter des dernières avancées technologiques

C’est sur la dernière version du logiciel que les dernières technologies, architectures et versions d’API sont intégrées. En Java, ces intégrations peuvent être par exemple une nouvelle version du JDK, le passage à J2EE 6 (ou à OSGi!), ou encore la mise à jour de toutes les librairies Commons Apache.

Si les développements ne sont pas d’abord faits sur la HEAD, ils ne sont pas adaptés dès leur conception à ces changements. On peut ainsi voir du code « neuf » ne pas profiter des avancées du JDK 1.5 juste parce que les développements ont été faits sur une branche plus ancienne qui ne le supportait pas.

Maximiser les chances de résolution rapide des régressions

Il paraît évident que plus un bug est détecté tôt, moins il coûte cher à tout le monde (éditeur, client et utilisateur). On s’acharne donc à mettre en place une palanquée de mesures pour « traquer le bug » au plus tôt: développement en binôme, tests unitaires, outils d’analyse de code, intégration continue, tests automatiques, tests manuels, recette…

Plus on s’éloigne dans cette chaîne, plus le coût de correction est élevé. Si en plus on ajoute le facteur temps, c’est à dire la durée écoulée entre le moment où le code a été écrit et le moment où le bug a été trouvé, les coûts explosent. En effet, le développeur qui aura à corriger le bug ne sera plus dans le contexte, sera peut-être même une personne différente de celle qui a écrit le code, etc. Les risques de régression suite à cette correction deviennent non seulement importants, mais surtout difficiles à évaluer.

Les premiers éléments de cette chaîne (binôme, tests unitaires, intégration continue) sont censés prévenir tout risque de conception ou de régression et sont effectués quelque soit la branche. Les derniers éléments (tests automatiques et manuels, recette) sont sensés tester l’ensemble des processus métiers de manière exhaustive, et passer de manière systématique sur chaque version « officielle ».

Dans la pratique, non seulement il est rare de voir des tests unitaires nombreux, entretenus et pertinents, mais en plus ils ne permettent pas de mettre en évidence les bugs les plus complexes liés à l’exécution d’un workflow métier complet. Les tests automatiques et manuels quant à eux se focaliseront plus volontier sur des workflows métier particuliers sur une livraison de branche de prod, ceeux-là même qui sont impactés par la correction /évolution effectivement attendue. De plus, ils seront exécuté rapidement après le développement. Sur HEAD au contraire, les tests manuels et automatiques, même complets, seront non seulement moins focalisés sur des processus précis, mais en plus seront exécutés bien après le développement: au moment de la première livraison de la future version majeure.

Dans ce contexte, imaginons maintenant qu’une correction, ou pire une évolution, s’intègre assez mal entre la HEAD et une branche de production d’une application, ce qui arrive relativement souvent ;-):

  • Dans le cas où la correction est d’abord conçue et effectuée sur la branche, la correction sera faite plus vite mais entraînera des régressions sur la HEAD, lesquelles ne seront détectées que…trop tard.
  • Dans le cas où on s’occupe d’abord de la HEAD, les éventuelles régressions introduites sur la branche seront immédiatement trouvées, puisque la fonctionnalité incriminée sera intensivement et rapidement testée.

En conclusion…

Bien sûr, c’est surtout vrai pour les éditeurs dont le but n’est pas de faire du code jetable, qui partent rarement de la page blanche et qui souvent, si il est petit face à ses clients, sera forcé de faire des évolutions sur branche issue de branche de production, à l’inverse de toute logique, entraînant des coûts en terme de temps, d’argent et de motivation.

Ce coût doit être calculé pour couvrir la surcharge de travail que peut entraîner, à court terme, l’application de cette recommandation: travailler sur la HEAD d’abord. Les économies seront réalisés dans la maintenabilité, l’évolutivité et la compétitivité des développements futurs.

PicassaRSS2File

Edit: je ferai évoluer ça

Vite fait un petit programme Java qui permet de télécharger les photos d’un album Picassa grâce à son flux RSS. Il manque plein de chose pour qu’il soit facile à utiliser mais bon.

  • Sauvegarder le flux RSS dans un fichier (par exemple in.xml)
  • Lancer le programme en redirigeant la sortie (java -cp . PicassaRSS2File ./in.xml > go.sh)
  • Lancer go.sh

Code à 2 balles:

import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class PicassaRSS2File extends DefaultHandler{

    private int index = 0;

    public static void main(String[] args) throws Exception {
        XMLReader saxReader = XMLReaderFactory.createXMLReader();
        saxReader.setContentHandler(new PicassaRSS2File());
        saxReader.parse(args[0]);
    }
    public void startElement(
        String uri,
        String localName,
        String qName,
        Attributes atts) throws SAXException {
        if (localName == "enclosure") {
            System.out.println(
                "wget -O img" + 
                this.index + ".jpg \"" + 
                atts.getValue("url") + "\"");
            this.index++;
        }
    }
}

YANoPaste! 1.3.0

C’est l’hiver, j’ai laissé de côté mon Hayabusa pour quelques semaines… À moi les joies du transilien et du « lap-development » sur eee-pc, et faire avancer ainsi YANoPaste! et Project-1901.

YANoPaste!, pour Yet Another NoPaste!, est un « paster » en PHP sans base de donnée sous licence libre GPLv3. Ce genre de logiciel permet de partager du contenu en ne référençant q’une URL, avec des fonctionnalités comme la colorisation, numérotation de ligne, etc.

Cette nouvelle version 1.3.0 est le résultat de la prise en compte de la plupart des remarques remontées sur LinuxFR suite à l’annonce de la version 1.2.0 (c’était il y a … bon sang 2 ans déjà!), et des évolutions prévues. On a donc principalement:

  • Choix de la durée de rétention (configurable), y compris rétention définitive.
  • Protection des bots par un « catcha » simple à partir d’une certaine durée de rétention (configurable)
  • Possibilité de faire un « reply » sur un paste pour modifier le contenu par exemple
  • Possibilité de demander un « diff » entre 2 reply

La version 1.3.0 est déjà disponible en démo (pas de rétention définitive, j’ai pas de NAS chez moi 😉 ), que vous pouvez utiliser à loisir. Si vous rencontrez un bug, n’hésitez pas à me le signaler sur mon bug-tracker.

Top 50 Programming Quotes of All Time

Via le blog de Norman Walsh (Docbook), je suis tombé sur ce post des 50 meilleures citations sur la programmation. De quoi passer un bon moment 🙂 Voilà mes préférées (les traductions sont de moi, et sont donc pour le moins approximatives):

Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. (La correction d’erreur est deux fois plus difficile que d’écrire la première version du code. Par conséquent, si vous écrivez du code aussi intelligemment que possible, vous serez, par définition, pas assez malin pour corriger les erreurs)

Unix is user-friendly. It’s just very selective about who its friends are. (Heu… Unix est utilisable. Il est juste très sélectif parmi les utilisateurs)

Et une spéciale dédicace pour Raph:

Walking on water and developing software from a specification are easy if both are frozen. (Marcher sur l’eau comme développer à partir de spécifications est facile si les deux sont gelées)

Gandi #fail

Voilà la deuxième fois que je suis impacté par le manque de sérieux de Gandi

La première fois, je n’en avais pas parlé parce que c’était pendant la période « Beta » de leur service de VPS. J’avais « juste » perdu l’intégralité du serveur sur lequel j’avais bossé tout un Week-End… Mais j’avais eu 1 mois gratuit soit 12€ à l’époque!! Houa, ça me fait une belle jambe. Encore une autre et j’aurai pu marcher. Bref, fin de l’histoire, c’était une Beta, donc rien à dire (il faut dire que perdre 3 disque dans un RAID6, c’est vraiment pas de bol).

Ce qui est arrivé en début de mois par contre est impardonnable, et les dédommagements proposés sont limite insultants. Comme résumé sur ma notice identi.ca:

« gandi: explosent leur serveur mail, perdent tous les mails de leur clients, incapables de remonter bckp, et les gestes com. sont dérisoires »

Pour recadrer l’événement dans son contexte, j’ai migré mi novembre le nom de domaine du club nautique dont je suis le responsable informatique, de 1and1 à Gandi. Chez 1and1, on payait 26€ par ans pour le nom de domaine, 15 boîtes mails avec 5Go de stockage, et un hébergement PHP/MySQL pour le site du club. J’ai bougé chez Gandi parce que j’y ai créé le serveur virtuel de l’association où tournera le futur logiciel de gestion des adhérents, Project-1901, pour un budget annuel de 300€ environs par an.

Il y a donc eu une longue conduite du changement auprès des responsables des sections de mon association qui utilisent ces boîtes mail, pour leur expliquer pourquoi on migrait, comme Gandi c’était super bien, et comme il fallait qu’il me fassent confiance, etc. J’en ai même profité pour leur démontrer les avantages du protocole IMAP, bien meilleur à mes yeux que le POP3. Première grave erreur

Comme je ne souhaitait pas me prendre la tête à créer un serveur de messagerie pour le moment, j’ai décidé de profiter des 5 boîtes mail proposées par Gandi avec le dépôt de nom de domaine. La messagerie est un service complètement central dans nos vie numériques aujourd’hui, et j’ai préféré m’appuyer sur la sécurité que représentait le service de Gandi. Seconde grave erreur.

La suite se résume à un échange de mail affligent. Voici donc le premier mail reçu le 30 novembre à 20h07:

Cher client,

Ce matin à 10h une alerte a remonté un problème de corruption sur une unité de stockage qui héberge la/les boites emails ci-dessous.

Malgré nos efforts sur la journée, nous n’avons pas moyen de nous assurer de l’intégrité du contenu de votre boite ou que son contenu ne soit pas mélangé avec le contenu d’une autre boite.

L’incident a été causé par un problème matériel de contrôleur disque que nous avons pu identifier et corriger.

Concernant votre boite mail, elle est de nouveau disponible mais vierge de tout contenu si vous y accédiez via notre webmail ou via le protocole Imap. Les mails non délivrés aujourd’hui le seront dans la nuit.

Enfin, nous avons offert 1 mois de souscription gratuit à tous les client ayant souscrit au pack Gandi mail.

Au nom de toute l’équipe Gandi, je tiens sincèrement à vous présenter nos excuses pour cette regrettable première et nous vous invitons à consulter notre service clientèle si vous rencontrez encore un problème.

Je dois avouer que j’ai du relire le courriel plusieurs fois pour réaliser ce qu’ils étaient en train de me raconter… « On a perdu tous vos mails, désolés, hein… ». Vérification faite, on était pas le première avril, pas de blague douteuse donc. Je me connecte aux boîtes… vides. Sueurs froides, noms d’oiseaux… Bien évidement le « reply » sur le mail ne fonctionne pas, il faut passer par le support. J’essaie de garder mon calme et le lendemain 1er décembre à 10h:

En réponse à votre communication d’hier sur l’incident mail:

L’ensemble des boîtes que vous mentionnez (x,y,z…) sont utilisée en IMAP. Nous sommes un club sportif de plus de 1000 adhérents, et ces boîtes sont utilisées pour la relation avec ces derniers, l’organisation des compétitions, etc.

La perte des courriels qu’elles contenaient n’est pas une option. Je vous demande donc par le présent courriel de bien vouloir procéder aux opérations de récupération via vos systèmes de backup le plus rapidement possible.

En vous remerciant pour votre compréhension,

Cordialement,

La réponse à 18h20:

Bonjour,

Merci pour votre retour.

Malheureusement, le problème matériel que nous avons rencontré a également, à notre grand regret, impacté nos sauvegardes

Sachez que sis nous pouvions récupérer vos emails, nous n’aurions pas hésité une seconde, mais ces données étant complémentent corrompues, aucune restauration n’est envisageable.

Notez que nous regrettons sincèrement cette situation indépendante de notre volonté, nous avons mis tous les moyens possibles pour minimiser l’impact de cet incident, malheureusement, sans succès.

Nous vous présentons une nouvelle fois toutes nos excuses pour les désagréments occasionnés.

Nous restons bien évidemment à votre disposition pour toute demande d’information complémentaire que vous souhaiteriez obtenir.

Cordialement,

Je réponds le 2 décembre à 12h00:

Bonjour,

J’ai eu du mal à convaincre le conseil d’administration de notre association de vous faire confiance, en ouvrant un serveur virtuel chez vous pour héberger notre site institutionnel ainsi que nos outils de gestion.

J’ai transféré le nom de domaine, et les boîtes mail qui vont avec récemment. Il est inutile je pense de vous décrire la panique qui règne ici suite à votre défaillance, et l’état de la confiance qui vous est accordé.

J’attends de votre part un geste fort, sachant que le renouvellement annuel de notre serveur virtuel est prévu pour mars.

Leur réponse, à 18h

Bonjour,

Nous comprenons votre situation.

A titre exceptionnel, nous vous offrons la gratuité du Pack GandiMail associé au nom de domaine jusqu’à sa date d’expiration soit au xx/xx/2011.

Notez que nous regrettons sincèrement cette situation indépendante de notre volonté, nous avons mis tous les moyens possibles pour minimiser l’impact de cet incident (perte des emails), malheureusement, sans succès. Nous vous présentons une nouvelle fois toutes nos excuses.

En espérant avoir répondu à vos attentes

Cordialement

En gros, ils m’offrent la moitié d’une option à 2 euros, que j’ai même pas prise!. Ma réponse à 22h:

Bonjour,

Sauf erreur de ma part, les fonctions de boîte mail dont nous nous servons sont celles inclues avec le nom de domaine cnhc.fr, c’est à dire 5 boîtes physiques et 1Go de stockage (volatile?). Il me semble donc que votre offre n’est pas applicable.

Le renouvellement gratuit pour 1 ans de nos 2 parts de serveur virtuel me semble plus en adéquation avec la gravité de la situation.

Cordialement,

Et là, le lendemain à 10h18, c’est le drame:

Bonjour,

Justement, notre offre vous permettra de créer jusqu’à 1000 boites mail (alors que vous étiez limitée à 5 boites gratuites)

Nous ne pouvons donner une suite favorable a votre demande de gratuité sur un autre service que celui qui a été impacté par l’incident.

Nous regrettons cette situation.

Cordialement

Le final à 10h33:

Bonjour,

Je trouve regrettable que vous ne puissiez donner suite à ma demande. En tant que responsable informatique dans le milieu professionnel comme associatif, je trouve que si votre défaillance de service peut être comprise, votre incapacité à remonter des sauvegardes, même partielles, ainsi que l’insignifiance des gestes commerciaux proposés en conséquence sont tout simplement inacceptables.

Je m’occuperai bien entendu de la publicité de cette affaire.

Cordialement,

Pour référence, voilà le post qu’ils ont publié sur leur site. Soit ces gens là ne saisissent pas l’importance des données gérées, soit ils cherchent à en minimiser les conséquences. La conclusion est simple: ne pas compter sur eux, ils ne sont pas fiables.

Quelque part ça m’a servi de leçon. Je ne peux pas me permettre pour le moment de migrer à nouveaux nom de domaine et serveur virtuel, j’ai autre chose à faire. Par contre, j’ai bien verrouillé les backup du serveur virtuel, et je prépare la mise en place du serveur de messagerie dessus.

Je pense qu’à la première occasion, je partirai. Et en attendant je raconte mon histoire à qui veut l’entendre dans le milieu pro comme dans le milieu associatif. Sans vouloir exagérer mon influence, je pense qu’ils ont perdu bien plus que l’année de location du serveur virtuel qu’ils auraient du, à minima, me proposer.

La question des standards dans le plan numérique des collèges

Photo Kathy Cassidy - Creative Commons

Il y a une chose que je trouve intéressante avec les systèmes de statuts comme Twiter ou identi.ca: on peut se mettre à suivre des organismes publics, et ainsi se tenir facilement au courant, par exemple, des évènements dans son département. C’est ainsi que je « follow » mon département, le Val d’Oise.

J’apprends par ce canal que des investissements ont été consentis dans les collèges pour un « plan numérique ».

En parcourant l’article sur le site, plusieurs choses me chagrinent:

  • On se limite a des effets d’annonce, entre la dépêche AFP et le publi-communiqué
  • Pas de références pour en savoir plus, pas de moyen de contacter l’auteur de l’article
  • Pas de possibilité de laisser un commentaire, même modéré, pour exprimer son opinion, poser des questions, discuter…

Or il se trouve que dès que l’on parle d’équipements informatiques dans le public, je trouve qu’il y a des questions importantes qui méritent d’être posées…

A la lecture de l’article, j’identifie M. Gérard SEBAOUN comme la personne à contacter pour poser ces questions. Une rapide recherche sur internet et je tombe sur son blog, dont le survol des titres ne me rassure guère: ça à l’air de remuer beaucoup d’air, plus intéressé par sa ville que par le département, une tendance manifeste à la polémique… En tout cas rien sur son rôle de « vice-président chargé de l’Education, la Jeunesse et la Prévention »… Je fini par trouver lien pour contacter l’auteur, voici mon message:

Monsieur,

Je me permet de vous contacter aujourd’hui suite à la lecture de l’article « Rentrée des collèges : Tout pour la réussite des jeunes Valdoisiens » paru sur le site internet du département du Val d’Oise.

On y apprend que des investissement ont été réalisés pour l’équipement numérique de collèges « pilotes », et notamment des tableaux interactifs.

On ne peut que se féliciter de voir l’équipement de nos structures d’éducation se moderniser, mais dans le monde du numérique il est primordial de s’assurer de l’ouverture de ces équipements, du respect de standards qui permettront de rester indépendants des fournisseurs, notamment des fournisseurs de logiciels.

Pilotes, logiciels, formats de fichiers… il y a cependant quelques questions à se poser si l’on ne veut pas se retrouver pieds et poings liés autour d’une technologie propriétaire.

Je ne saurais que trop vous conseiller la lecture de l’article suivant publié sur le Framablog, traitant de ce sujet: Tableau numérique interactif et interopérabilité.

En espérant avoir retenu toute votre attention, je vous prie d’agréer, Monsieur, l’expression des sentiments distingués.

C’était il y a 4 jours, pas de réponse reçue à ce jour. Je ferai bien entendu une mise à jour si cela devait se produire.