La faute de frappe

Un module de mise à jour…

CiviKey a été mis en ligne sur son nouveau site www.civikey.fr il y a quelques semaines.
Avant cela, il avait été distribué au sein de l’hôpital de Garches et d’Alcatel-Lucent.
Il comporte depuis longtemps un module d’update,  qui va chercher la dernière mise à jour disponible sur internet, et la met dans un dossier temporaire de la machine utilisateur pour l’exécuter au lancement suivant.

Ce module avait été éprouvé lors de sa distribution limitée, il a fait ses preuves et est fonctionnel.
Avant la mise en ligne sur le site, nous avons fait une petite refonte du produit, et notamment du module d’update, rien de bien méchant, un déplacement de quelques classes, des commentaires en plus.

…Qui ne met pas à jour

La semaine dernière, nous avons décidé de pousser un nouveau setup sur le serveur, pour intégrer le web installer du Framework .NET 4.0 Client Profile à l’installeur CiviKey, ayant eu beaucoup de retours d’utilisateurs ne comprenant pas la marche à suivre pour le mettre en place.

L’équipe de test s’est rendue compte avec un bonheur évident qu’après avoir téléchargé une mise à jour, L’application ne la lançait pas, et pire, proposait à nouveau de télécharger cette mise à jour. « Pourtant, le fichier de mise à jour est bien présent dans le bon dossier. Voilà qui est étrange ! »

Le code qui posait le fichier de mise à jour semblait correct :

« Le fichier Update.exe, qui contient l’installeur de la mise à jour, est bien mis dans Temp/CiviKey/Standard/Updates… »


Avec anxiété, nous sommes allés voir le code qui va lancer cette mise à jour, et là, nous sommes tombés sur :



Trouvé ?

 

Attendez… avec un zoom c’est plus facile.





 

…Updares ? Sérieusement ?

La légère refonte a inséré une jolie faute de frappe au seul endroit absolument crucial de l’application.

A cause d’elle, le module télécharge la mise à jour, mais cette mise à jour n’est pas détectée au lancement suivant. Le module de mise à jour, très simple, détecte à nouveau une mise à jour et propose fatalement de la télécharger à nouveau. On obtient donc un prompt inutile et incompréhensible à chaque lancement de l’application.

Evidemment, on ne peut pas régler le problème en lançant une mise à jour, puisque le bug est précisément dans le module  de mise à jour.

Même les meilleurs font des erreurs

Et qui a fait ça ? Un stagiaire étourdi ? Un dyslexique avéré ?
Non, le patron d’Invenietis lui-même, 25 ans de métier  et deux-trois développements plutôt trapues derrière lui, dont un gestionnaire de portails web dynamique, un moteur de plugins avec gestion des cycles d’interdépendance (intégré à CiviKey d’ailleurs) et bien d’autres outils dont la seule vue du code pourrait scotcher toute personne normalement constituée. Il vous suffit de regarder quelques-uns des autres posts de ce blog pour vous rendre compte qu’on n’a pas affaire ici à un débutant et que le souci du détail ne lui est pas inconnu.

Et où étaient les tests à ce moment-là ? 
« C’est Olivier qui a codé, on ne pensait pas que ça pouvait être buggé. »

Bien joué.

Etat des lieux

Invenietis a pêché par excès de confiance. Résultat : tous les gens ayant téléchargé l’application (et dont nous n’avons pas les coordonnées bien entendu), devront la télécharger à nouveau manuellement pour récupérer une version de CiviKey capable de se mettre à jour automatiquement.

Le projet est encore en béta, et est gratuit, ce n’est donc pas un drame et les utilisateurs savent que des problèmes peuvent encore apparaitre.
Les gens intéressés par le projet suivront son évolution, et les différents hôpitaux et ergothérapeutes s’en arrangeront probablement.
Les développeurs, eux, se sentent tout de même très  mal.

Une leçon à en tirer : Même si Linus Torvald lui-même pose trois lignes de code dans votre application, testez-la.

Une question subsiste : « Qui a mis cette touche ‘r’ à côté du ‘t’ » ?

Commentaires (2) -

Je pense qu'une même chaîne utilisée à deux endroits est une source d'erreur.

Dans la mesure ou les constantes peuvent être accessibles depuis les deux bouts de code, je pense que ce code aurait évité l'erreur.

const string UPGRADE_DIR = "Updares"; //avec la faute Wink
const string UPGRADE_FILENAME = "Update.exe";

//Ficher A
string newVersionDir = Path.Combine( Path.GetTempPath(), HostInformation.AppName, _distributionName, UPGRADE_DIR );


//Fichier B
string updateFile = Path.Combine(_dir, UPGRADE_DIR ,UPGRADE_FILENAME );


De plus on évite l’échappement tout moche des \

Malheureusement, les deux bouts de code ne se connaissent pas, l'un des deux étant dans un plugin séparé du reste de l'application.

Par contre, je suis d'accord avec ta remarque sur l'échappement des \. On va remédier à ça !

Ajouter un commentaire

  Country flag

biuquote
  • Commentaire
  • Prévisualiser
Loading