Amis

Accueil‎ > ‎

Les spécifications Agile

Mis à jour en novembre 2010

Voilà plusieurs mois que j'avais en tête de rédiger un article traitant des spécifications. J'ai toujours été convaincu que l'art de rédiger des spécifications pouvait constituer un levier fort de réussite d'un projet. Dans cet article, je partage donc mon expérience et mes connaissances sur le sujet, j'y décris un processus de rédaction dans le cadre d'une approche Agile ainsi que deux techniques d'écriture. D'une part la rédaction de User Stories (pratique issue de eXtreme Programming) et d'autre part, celle des cas d'utilisation à la Alistair Cockburn (porteur de la méthode Agile Crystal et faisant parti des 17 premiers signataires du manifeste Agile).


Pré requis : "accepter la réalité"

On ne peut pas comprendre l'approche Agile de rédaction des spécifications sans admettre les réalités suivantes :
  • Les besoins ne sont pas complètement connus tant qu’un projet n’a pas débuté
  • Les utilisateurs savent ce qu’ils veulent uniquement après avoir vu une première version du logiciel (Principe d’incertitude du besoin de Humphrey).
  • Les besoins changent souvent durant le processus de développement du logiciel (Principe d’incertitude de Hadar Ziv - 1996)
  • Spécifier intégralement un système interactif est impossible (Lemme de Peter Wegner - 1995)
Une autre réalité importante concerne les travers de la communication par écrit (voir schéma ci dessous). En effet, les écrits peuvent être interprétés de différentes façons, en particulier lorsque le sujet traité est complexe. Inutile de rappeler que la réalisation d'un logiciel de nos jours est une tâche particulièrement complexe tant fonctionnellement que techniquement. D'autre part, la communication par écrit est unilatérale (pas de questions/réponses).

Source : Alistair Cockburn


Or il est malheureusement assez fréquent de constater - dans des projets traditionnels - que le rédacteur du cahier des charges, n'est pas la même personne que le rédacteur des spécifications fonctionnelles générales qui n'est pas la même personne que le rédacteur des spécifications fonctionnelles détaillées qui n'est pas la même personne que celle qui développe qui n'est pas la même personne que celle qui teste. Il arrive même que ces différents acteurs ne se rencontrent jamais dans un projet. 

Comment dans ces cas là garantir une bonne couverture du besoin ?

Autrement dit, on peut tout de suite oublier l'idée de spécifier à l'avance tout un logiciel et faire valider de son sang au client un gros pavé de spécifications indigestes à forte connotation contractuelle. Pavé qu'il validerait sans vraiment le lire, puisqu'au delà du côté "indigestion", on le bouscule afin de démarrer au plus vite les développements (hé oui, le planning est déjà serré !). 
Dans le cadre d'une approche Agile, on spécifie au fil de l'eau. Chaque itération comporte des activités de spécification au même titre que celles de développement et de test.

Processus de spécification

Cahier des charges

A bien y réfléchir, le processus de spécification commence dès le cahier des charges (CDC). Un CDC traditionnel est déjà porteur de spécifications relativement détaillées du besoin. Souvent ces premières spécifications sont rédigées par des consultants métier consciencieux et particulièrement soucieux de ne rien oublier quitte à en rajouter et s'y noyer (et noyer le(s) lecteur(s) surtout).
Or dans le cadre d'un appel d'offre Agile, le CDC est particulièrement light étant donné qu'au mieux, ce dernier ne contient que la liste des besoins (ou liste d'exigences) sans rentrer dans le détail de chacun. 

Liste des besoins

Certain consultants Agile chevronnés donnent une première leçon d'agilité à un client en jetant le CDC traditionnel détaillé à la poubelle (c'est une bonne façon de capter l'attention du client ;-) ) pour ensuite prendre un paper board et remplir ce dernier de la liste des besoins (Product Backlog ou liste d'exigence). Liste obtenue en discutant directement avec le client. La liste ne sera peut être pas complète mais en principe les fonctionnalités les plus attendues sont là. Ces dernières sont "estimées" par l'équipe de développement, la durée de l'itération est fixée, le tout en collaboration avec le client.

Avant l'itération

Avant de planifier une itération, les besoins prioritaires (candidats au périmètre de la prochaine itération) doivent être ajustés. Les profils porteurs du besoin à couvrir par l'application à développer peuvent assurer cet ajustement qui va consister principalement à formaliser le besoin en User Stories. On va donc s'assurer que ce besoin est mûr, que les pré requis sont ou seront disponibles en temps voulu (décisions, jeux de données,...). 

La rédaction d'une User Story concentre l'effort sur le besoin de fond laissant de côté les détails d'IHM (au besoin une maquette peut être annexée). Aucune connotation technique n'est permise, le langage naturel de l'utilisateur est privilégié. Une User Story doit être lisible aussi bien par un utilisateur que par un développeur. Par ailleurs, la User Story est porteuse des tests d'acceptation permettant de vérifier la couverture du besoin. Ces tests doivent être rédigés en amont des développements afin de guider au maximum ces derniers.

Pendant l'itération

Pendant l'itération, on retrouve l'ensemble des activités classiques : analyse du besoin, conception, développement et test. Ces activités peuvent intervenir à n'importe quel moment de l'itération, une fonctionnalité 'A' peut être conçue, développée et testée en début d'itération alors qu'une fonctionnalité 'B' peut être conçue, développée et testée en milieu ou fin d'itération.

Au cours de l'itération, le développeur et le rédacteur de la User Story (utilisateur, expert métier, consultant métier AMOA, Product Owner) peuvent compléter cette dernière (un test auquel personne n'avait pensé à ajouter par exemple). Avant la fin de l'itération, l'équipe de développement se charge de mettre à jour la documentation générale du produit (spécifications fonctionnelles détaillées pouvant être rédigées en cas d'utilisation, dossier d'architecture technique, procédure d'installation,...). Au besoin chaque document peut être versionné à chaque itération.

Autrement dit l'enjeu de validation des spécifications est faible voir nul, car on accorde plus d'importance au produit partiel que l'on va présenter en démonstration à la fin de l'itération.

Fin d'itération

A la fin de l'itération, l'équipe de développement présente donc le produit partiel incrémenté des nouvelles fonctionnalités développées. A cette occasion, le Product Owner accepte ou rejette ces fonctionnalités. C'est bel et bien sur ces dernières que l'enjeu se situe plutôt que sur la validation des spécifications qui ne servent plus à verrouiller contractuellement le périmètre mais à maintenir le produit pour les futurs développeurs qui maintiendrons le produit.

Techniques de spécifications

Une bonne spécification fonctionnelle est synthétique, facile (voir agréable) à lire aussi bien par un développeur que par un utilisateur, facile à maintenir et non ambiguë. Autrement dit, c'est tout un challenge. L'objectif est d'aboutir à des spécifications nécessaire et suffisantes.

Les techniques de rédaction des cas d'utilisation façon Alistair Cockbrurn ou de rédaction des User Stories permettent d'atteindre cet objectif.

Quelques soit la technique choisie, 2 règles d'or doivent être respectées :
  • La principale consiste à exclure toute connotation technique et tous les détails d'IHM de la spécification écrite. La documentation technique de type architecture (logicielle ou matérielle) trouvera sa place dans un dossier d'architecture si le projet le nécessite ainsi que dans le code source. Les détails d'IHM seront portés par d'éventuelles maquettes d'écran. Quant aux détails tels que les libellés (les messages d'erreurs et de confirmation de saisie d'un formulaire par exemple) coûtent si peu cher à modifier par la suite qu'on pourrait presque se passer de les tracer dans les spécifications. Au pire si certaines personnes ont besoin d'être rassurée, on peut les centraliser dans un document annexe.
  • Une autre règle consiste à privilégier le vocabulaire de l'utilisateur, le langage naturel et de décrire l'expérience utilisateur. Je m'explique : on préfère écrire "L'utilisateur saisie un numéro d'une carte bleue expirée, le paiement échoue." plutôt que "Le système doit échouer si un numéro de carte bleue expirée est utilisé".
Bien appliquées, ces 2 règles permettent d'atteindre une bonne part des objectifs évoqués au début de ce paragraphe.

Une dernière précision avant de décrire la façon de rédiger une User Story puis un cas d'utilisation : le périmètre fonctionnel d'une User Story est la plupart du temps inférieur à celui d'un cas d'utilisation "haut niveau", autrement dit un cas d'utilisation peut contenir plusieurs User Story mais l'inverse est rare (à moins de rédiger des cas d'utilisation bas niveau décrivant des mécanismes invisibles pour l'utilisateur).

Les 2 techniques sont très complémentaires et peuvent donc être utilisées ensemble. Dans certain contexte exigeants, les User Stories ne peuvent être considérées comme des spécifications mais simplement comme un précieux support permettant de planifier plus facilement les itérations et de piloter les développements par les tests. Dans ce cas, on utilisera les cas d'utilisation en complément afin de formaliser davantage les choses.

User Story

Rien de mieux qu'un exemple pour poser le décor.

Exemple de User Story

ID : #33
Titre : Paiement par carte bleue

Résumé : En tant que client du site internet FoireAuLivre.com je peux payer ma commande par carte bleue afin de me simplifier la vie.

Notes :...

Tests d'acceptations :
  • Tester avec une carte bleue mastercard : OK
  • Tester avec une carte sofinco : KO
  • Tester avec une carte expirée : KO
  • Tester avec un numéro de carte incorrect : KO
  • Tester avec un montant supérieur à 100 € : OK



Principales caractéristiques :
  • Absence de connotation technique et de détails d'IHM (voir paragraphe précédant)
  • Utilisation d'un template de phrase pour le résumé permettant de se concentrer sur l'essentiel : "En tant que <Acteur principal> je peux <fonctionnalité> afin de <objectif(s)>"
Plus précisément, une User Story doit être INVEST :
  • Indépendante des autres User Story de façon à ce qu'on puisse les développer dans n'importe quel ordre. Evidemment, ce n'est pas toujours possible, mais il faut garder cet objectif à l'esprit pour savoir saisir ou créer les opportunités de rendre indépendante une User Story (des techniques de découpage peuvent aider).
  • Négociable au sens où elle ne sert pas à verrouiller contractuellement le périmètre. Elle capture l'essence du besoin mais pas les détails qui seront co-définit pendant le sprint par le développeur associé à l'utilisateur, au Product Owner ou au consultant/expert métier.
  • Valeur : elle doit être porteuse de valeur métier, d'où l'importance d'utiliser le vocabulaire métier et de rédiger sous l'angle de l'expérience utilisateur.
  • Estimable par l'équipe de développement en termes de coût. Si le besoin est trop flou, on réalise un "spike" à la place (investigation timeboxée permettant d'éclaircir la situation)
  • Small : une User Story doit être suffisamment petite pour être réalisée au cours d'une seule itération. Sur des itérations de 3 semaines, une dizaine de jours homme peut être une limite raisonnable. D'autre part, plus une User Story est petite, plus l'estimation est précise.
  • Testable afin de pouvoir vérifier la bonne couverture du besoin. Ces tests doivent être rédigés en amont des développements afin de piloter au mieux ces derniers.
Le pilotage des développements par les tests constitue un facteur qualité important. Une spécification sous forme de test lève toute ambiguïté ou presque, laissant peu de place aux mauvaises interprétations du besoin. Une fonctionnalité n'est pas considérée comme terminée tant que les tests inscrits sur la User Story ne sont pas tous passants. D'autre part, ces tests vont aider le développeur à coder les bons tests unitaires automatisés en approche TDD.

Une bonne approche consiste également à utiliser le format bristol A5, pour différentes raisons :
  • Simplicité : en cours d'itération, le développeur attaque la User Story X, prend le carton et va voir le rédacteur pour en discuter avec lui, le rédacteur sait tout de suite de quoi on parle en lisant le résumé de 1 à 3 lignes. Peu importe où ils se trouvent avec ou sans PC, ils annotent le bristol pour par exemple ajouter sous la forme d'un test supplémentaire une règle de gestion découverte au détour de leur conversation. Le développeur repart avec son bristol qu'il pose à côté de son clavier. Pendant ses développements, en un coup d'oeil il pourra trouver l'information dont il a besoin pour réaliser ses développement et ses tests.
  • Taille limitée : le format A5 est une bonne taille car elle oblige le rédacteur à se concentrer sur l'essence du besoin. Si il n'y a plus assez de place, c'est peut être un bon indicateur révélant la nécessité de découper la User Story en 2.
  • Planification plus facile : Pendant la réunion de planification d'itération, c'est plus simple de prioriser les User Story en étalant les cartons sur une table ou sur le sol et en les déplaçant de gauche (priorité haute) à droite (priorité faible). C'est plus vivant et interactif que le fichier Excel.
Pendant ou à la fin de l'itération, le contenu des User Stories alimentera au besoin la documentation du produit (spécifications fonctionnelles détaillées par exemple. Après tout il faut pas oublier ceux qui reprendrons le projet en cours de route) ainsi que les plans de test détaillés (pour les tests d'ensemble avant mise en production, généralement réalisés par l'AMOA).
Une fois ce travail réalisé, les User Stories peuvent être jetées ou archivées.

Pour en savoir plus, je recommande l'ouvrage "User Stories applied" de Mike Cohn.
Un livre à acheter les yeux fermé, il regorge de conseils précieux et d'exemples concrets.
Même si comme toutes les pratiques Agile, on peut assez facilement se jeter à l'eau sans forcément lire le bouquin.

Cas d'utilisation

Ce que je vais décrire dans ce paragraphe ne concerne pas les cas d'utilisation UML.
Dans un contexte Agile, on considère l'UML comme trop difficile d'accès pour un utilisateur ou le client (parfois même pour les développeurs non initiés).

On préférera donc utiliser des cas d'utilisation textuels. Là encore, rien ne vaut un exemple.

Exemple de cas d'utilisation

Titre : Commande d'article(s)
ID : 45

Résumé : Ce cas d'utilisation décrit le processus de commande d'un ou plusieurs articles en partant de la recherche jusqu'à la confirmation du paiement.

Acteur concerné : Internaute

Pré-condition : L'internaute s'est authentifié sur FoireAuLivre.com.

Scénario nominal :
  1. L'internaute lance une recherche d'article.
  2. Il sélectionne l'article de son choix parmi les résultats affichés et l'ajoute à son caddie.
  3. L'internaute affiche son caddie, vérifie le montant à payer et choisit de payer sa commande.
  4. Il opte pour le paiement par carte bleu.
  5. Il saisit son numéro, la date d'expiration ainsi que le cryptogramme de sa carte bleue.
  6. Un message affiché sur le site interne lui confirme que le paiement a été accepté.
  7. L'internaute reçoit un email lui confirmant que sa commande est enregistrée et résumant le contenu de cette dernière.
Scénarios alternatifs :
3.a L'internaute répète l'étape 2 ou 1 puis 2.
4.a.1 L'internaute opte pour le paiement par Paypal.
4.a.2 L'internaute saisit ses identifiants Paypal.
4.b.1 L'internaute opte pour le paiement par chèque.
4.b.2 Un message indique à l'internaute l'adresse à laquelle envoyer le chèque ainsi que le numéro de commande à joindre à ce dernier.
6.a Le paiement à échoué, l'internaute en est informé.



Cet exemple ci dessous est un cas d'utilisation plutôt "haut niveau". On peut au besoin descendre un peu plus et détailler certaines étapes.
Dans ce cas, on souligne généralement dans le cas d'utilisation "haut niveau" le mot clef de l'étape en question illustrant le plus le sous cas d'utilisation lié (exemple : "payer", "recherche",...). On établit ainsi un lien entre le cas d'utilisation et ses sous cas d'utilisation.

Pour aller plus loin, l'ouvrage suivant st votre ami : Rédiger des cas d'utilisation efficaces.