![]() |
|
![]() |
Pourquoi ? Simplement car si ces fonctions ne sont pas définies formellement, elles n'en sont pas moins partie intégrante du produit livré une fois qu'elles ont été développées. Elles sont de ce fait couvertes par la garantie, et en cas de dysfonctionnement, c'est la responsabilité de l'entreprise que de les corriger. Cela coûte du temps, et est rendu d'autant plus difficile que l'absence de spécification rend floue la notion de bon fonctionnement. On parle donc de temps développeur, de temps de gestion de projet, et aussi de temps commercial dans les cas les moins favorables.
Outre cela, de telles fonctions, même anodines en apparence, peuvent poser de nombreux problèmes. Problèmes techniques du fait des conséquences de ces ajouts lors des évolutions futures, mais aussi problèmes fonctionnels. Je pense ainsi à un "mode prévisualisation" qui avait ainsi été réalisé sur un projet de back office d'intranet :
La spécification décrivait qu'une fois rempli un formulaire de saisie de contenu de type "articles" par l'utilisateur, celui-ci pouvait au choix abandonner ou valider son entrée. L'abandon le conduisait à l'étape précédente (la liste des "articles" et des actions associées, en l'occurrence), la validation le conduisait à la page de contenu en question, telle que publiée.
Une fonction non spécifiée avait été ajoutée à ce système : la prévisualisation. Elle était assez analogue à ce que l'on peut trouver sur les plateformes de blogs pour les billets et commentaires. Simple à réaliser, il ne nous avait coûté que quelques heures sur un projet de centaines de jours. Le client était ravi car il désirait cette fonction mais sans que celle-ci n'ait été spécifiée et intégrée au budget. Nous étions ravi également car à peu de frais nous avions renforcé la relation avec ce client que nous aimions bien du fait de sa récurrence et de ses qualités humaines trop rares dans le monde du service informatique...
Malheureusement, ce mode prévisualisation s'est révélé problématique lorsqu'il s'est agit de faire évoluer l'application. En effet, lors de la définition de la version suivante, il était maintenant entendu par le client que cette fonction devrait être applicable à tous les formulaires de saisie de contenus, et pas seulement aux articles. L'argument était que par spécification la gestion des formulaires de contenu obéissait aux mêmes règles quelque soit le type de contenu, et que par conséquent, cette fonction disponible pour les seuls "articles" aurait également due être applicable aux "offres d'emplois" et "annonces diverses". Le comportement de la version courante, en production, a dès lors été considéré par le client comme un dysfonctionnement ayant échappé à la recette. Royalement, le client nous a même indiqué que la mise en production valant recette il ne demandait pas réparation de ce manquement à la version courante, mais seulement à la version suivante.
L'interlocuteur client ayant changé[2], il n'était pas possible de le prendre à témoin. Le flou généré par l'ajout de cette fonction non documentée avait donc profité au client, notre service commercial n'ayant - à juste titre à mon sens - pas souhaité contre-argumenter tandis que nous n'étions pas en position de force et que le coût engendré était supportable.
C'est pour éviter ce type d'embêtements qu'on dit toujours de ne jamais faire de cadeaux aux clients et de s'en tenir « à la spécification, rien qu'à la spécification, et à toute la spécification » (dites "je le jure")... Et en cela, oui, les propos de ma direction technique lors de la réunion évoquée au début de ce billet étaient fondés.
Pourquoi l'appréciation du produit par le client ne suffit-elle pas à évaluer la qualité du produit ? Parce que c'est nous qui le maintenons.
L'appréciation du produit par le client est basé sur différentes choses:
Et c'est tout.
Le client ne prend pas en compte la maintenabilité du produit. Il ne prend pas non plus en compte sa portabilité, en cas de changement d'environnement. Il a raison, puisqu'il s'agit de choses purement techniques, transparentes pour lui, et qu'il n'est sauf exception pas en mesure d'évaluer.
Pourtant, ces paramètres doivent être pris en compte impérativement car ils conditionnent la faisabilité et le coût de toute modification future ou de tout changement de plateforme d'hébergement. Pour ne s'intéresser qu'à la maintenabilité, un produit mal ficelé, mal conçu, mal écrit, peut finalement tourner à force de correctifs, et ce au point de donner l'impression d'être "de bonne qualité". Mais alors, la moindre évolution ou correction devient un coûteux casse-tête. L'adhérence entre les différents modules constituant le produit est l'un problèmes de maintenabilité les plus courants. La propreté et la structure du code source en est un autre.[4].
Je ne sais pas s'il est utile de donner un exemple ici, toute personne impliquée dans le processus de développement informatique ayant normalement déjà vu son lot de produits mal pensés ou mal construits.
Or présenter un devis prohibitif pour une modification bénigne n'est pas la meilleure façon d'être compétitif ni de travailller dans de bonnes conditions. Rater une date de livraison ou se voir refuser une recette pour cause d'anomalies nombreuses et sans solution non plus. Donc, si personne ne se préoccupe de la maintenabilité du produit, c'est à la MOE de le faire, ne serait-ce que pour se rendre service. Et si votre hiérarchie vous dit le contraire, vous pouvez toujours opiner du chef et acquiescer, mais gardez à l'esprit qu'elle a tort.
Sans aller jusqu'à suivre la norme ISO 9126 qui définit la qualité logicielle, ce qui serait dans la majorité des cas l'excès inverse de celui de mon ancienne direction technique, il est intéressant d'en avoir le sommaire à l'esprit et de s'en inspirer autant que raisonnablement possible. Rendez-vous service !
Ah... mon ancienne direction technique avait également ajouté « c'est ce que l'on apprend en école d'ingénieurs », à propos de sa définition de la qualité. J'ose croire qu'aucune école sérieuse n'oserait donner pareille leçon, mais je suis intéressé par vos témoignages !
[2]Inutile de préciser que nous y avons perdu au change, je suppose...
[3]Il est déjà arrivé qu'un client me dise "c'est génial ce que vous avez fait là" à propos d'une fonction qu'il avait lui-même défini. Lui rappeler que l'idée était de lui l'avait conduit à m'expliquer que c'était "génial de la voir en vrai" (sic).
[4]L'article "Plat de spaghetti" de Wikipédia illustre bien la chose.
Last updated Il y a 634 jours by Equipe Kixmee


0
commentaires:
Enregistrer un commentaire
Veuillez consulter les mentions légales.
if (!window.google || !google.friendconnect) {
document.write('' +
'');
}
if (!window.registeredBloggerCallbacks) {
window.registeredBloggerCallbacks = true;
gadgets.rpc.register('requestReload', function() {
document.location.reload();
});
gadgets.rpc.register('requestSignOut', function(siteId) {
google.friendconnect.container.openSocialSiteId = siteId;
google.friendconnect.requestSignOut();
});
}
function registerGetBlogUrls() {
gadgets.rpc.register('getBlogUrls', function() {
var holder = {};
holder.currentPost = "http://www.blogger.com/feeds/7674268088161916946/posts/default/7901845977363646937";
holder.currentComments = "http://www.blogger.com/feeds/7674268088161916946/7901845977363646937/comments/default";
holder.currentPostUrl = "";
holder.currentPostId = 7901845977363646937
holder.postFeed = "http://www.blogger.com/feeds/7674268088161916946/posts/default";
holder.commentFeed = "http://www.blogger.com/feeds/7674268088161916946/comments/default";
holder.currentBlogUrl = "http://sofiennerida.blogspot.com/";
holder.currentBlogId = "7674268088161916946";
return holder;
});
}
if (!window.registeredCommonBloggerCallbacks) {
window.registeredCommonBloggerCallbacks = true;
gadgets.rpc.register('resize_iframe', function(height) {
var el = document.getElementById(this['f']);
if (el) {
el.style.height = height + 'px';
}
});
gadgets.rpc.register('set_pref', function() {});
registerGetBlogUrls();
}
BLOG_CMT_createIframe('http://www.blogger.com/rpc_relay.html', '17004817052819583239');