Comment melba a réussi à comprendre le scrum pour rendre le développement logiciel efficace
Melba a rencontré de nombreuses difficultés avant de parvenir à mettre en place un processus de développement logiciel efficace.
On entend par efficace :
Avant d’essayer d’organiser efficacement le travail d’une équipe de développement, il convient de déterminer un périmètre de travail cohérent. Nous y sommes parvenus via la mise en place d’un process produit de qualité.
Cela suppose que nous soyons parvenu à déterminer précisément les prochaines priorités fonctionnelles :
Il faut aussi que l’équipe partage la philosophie scrum et qu’une première personne ait une expérience positive de son application. C’est le cas chez nous, un de nos lead developers l’a ardemment pratiquée.
On a par ailleurs pu se rendre compte de nos erreurs de jeunesse à la lecture de Scrum en Action de Guillaume Bodet. Le livre décrit une bascule que l’on a expérimentée, du travail en cycle en V à l’application de scrum. Un contrat avec un grand groupe avait donné lieu à la rédaction d’un cahier des charges volumineux. Le besoin n’était clair pour personne, évoluait fréquemment et les exigences de notre partenaire et notre envie de nous y conformer nous amenait à sacrifier la qualité : nous étions tombés dans un cercle vicieux où l’urgence nous poussait à bâcler et à mettre en production tous les 3 mois pour se rendre compte de nombreuses régressions et d’une inadéquation avec le besoin des utilisateurs.
Il y a plusieurs cas d’allergie au scrum :
Aujourd’hui melba met en production de très petites tâches 2 à 5 fois par jour sans régression. Nos utilisateurs nous font tous les jours des retours que nous sommes en capacité de traiter rapidement.
Nous avons choisi de travailler sur des sprints courts : 1 semaine.
Cela augmente le overhead mais diminue le travail de préparation et permet d’être plus agile. On pourrait adapter le curseur et choisir de diminuer l’overhead en augmentant le risque lié à la fixation d’un périmètre fonctionnel plus important. Risque :
Car un sprint c’est bien cela : figer la todo de l’équipe de développement pour lui permettre de travailler dans des conditions confortables, sans interruption et sans changement de direction. L’équipe de développement sait quoi faire sur la semaine qui suit et personne ne va la déranger.
Le sprint est constitué de user stories (US).
Avant de rentrer dans le détail, voici ci-dessous une carte Trello représentative d’une US. Son contenu est décrit dans les paragraphes suivants.
Exemple d’une US complète :
Une US prend le format suivant :
On définit également le Why : pourquoi est-ce important, quel est le besoin de l’utilisateur.
Enfin, on ajoute un lien vers une maquette et les autres ressources éventuellement nécessaires (police, picto, image, etc.) afin de limiter le temps de recherche de l’équipe de développement.
On lie l’US à notre wiki qui récapitule tous les tests d’acceptance ainsi qu’à notre documentation d’API statique. Cette documentation d’API statique, rédigée sur le modèle de celle de Stripe, est au développement backend ce que les maquettes sont au développement frontend.
Chaque US peut être mise en production. Si elle fait partie d’un parcours dont le set minimal n’est pas encore prêt à partager avec des utilisateurs, elle est toutefois mise en production et cachée.
Note : on fait parfois la différence entre user story et job story. Melba fait plutôt des job stories qui comportent le contexte tandis que les user stories ne le comprennent traditionnellement pas.
Les tests d’acceptance comportent les éléments de logique métier que la fonctionnalité doit satisfaire. C’est intéressant de découper les US en éléments de petite envergure afin de ne pas imposer une logique trop complexe et ainsi identifier plus facilement des edge cases.
Les tests d’acceptance permettent de se projeter facilement sur le résultat : le développeur qui finit son travail doit cocher les différents éléments ce qui indique qu’il a vérifié que le résultat attendu est obtenu. Si des comportements attendus ne sont pas listés dans ces tests d’acceptance, le PO doit créer un nouveau ticket.
Le backlog refinement est l’occasion pour le PO, l’UX et des membres de l’équipe de développement de parcourir l’ensemble des tickets pressentis pour le prochain sprint (voire un peu plus) afin d’éliminer des incompréhensions, imprécisions, risques, etc..
Des ateliers et des présentations des travaux de conception en amont du backlog refinement permettent de sensibiliser l’équipe technique aux enjeux fonctionnels, mais lors de la découpe on entre dans un niveau de raffinement qui rend cet échange nécessaire. La connaissance métier de l’UX et du PO est partagée et l’équipe technique aide à faire des arbitrages qui vont dans le sens d’un meilleur ROI.
Un deuxième échange est prévu en amont du lancement du sprint pour permettre à l’équipe technique de préciser la todo technique. A cette occasion, chaque tâche fonctionnelle est découpée techniquement.
L’enjeu est de supprimer tous les points de doute de sorte à ce qu’il n’y ait pas d’inconnue lors du développement. Ainsi, on va jusqu’à nommer certaines classes et méthodes et expliciter ce qui va être fait et comment, collectivement, entre développeurs. C’est l’occasion pour les seniors de transmettre aux junior leur expérience plutôt que de leur imposer en flux tendu une todo incomprise ou les laisser patauger.
Exemple d’une découpe technique précise
Si la découpe technique n’est pas possible ou est incertaine, alors on ne sera pas sûr de savoir évaluer la complexité de la tâche et on devra timeboxer le temps passé dessus pour éviter de trop se perdre. On y reviendra.
Lors du planning, l’équipe de développement accompagnée du PO passe en revue les différents tickets.
Ce planning n’est pas une souffrance comme il a pu l’être par le passé quand l’équipe découvrait des besoins incompatibles avec sa capacité à faire ou recelant encore d’énormes inconnues. La collaboration en amont a porté ses fruits.
La capacité à faire est estimée en points de complexité. Cela ne correspond pas strictement à un temps de travail disponible. Toutefois on déduit de la CAF théorique le temps que prendraient les évènements non associés au développement (réunions, entretiens, etc.). A cette occasion uniquement, on fait l’amalgame entre la complexité et le temps de travail.
En particulier, on déduit de la CAF totale le temps dédié au backlog refinement, à la découpe technique et au sprint planning. Cela incite à en faire des réunions efficaces et supprime le risque lié au fait que ces réunions puissent se rallonger.
Pour estimer la complexité, nous utilisons un jeu de cartes agile et nous nous basons sur des tickets de référence. On note chaque ticket et la somme des notes des tickets à faire doit être proche de la CAF de l’équipe dont on affine la mesure sprint après sprint.
Chaque membre de l’équipe estime de manière indépendante la complexité des tâches et présentant à l’équipe une carte du jeu Agile sur laquelle figure un chiffre. S’il n’y pas de consensus sur cette estimation, les extrêmes s’expriment jusqu’à ce qu’un consensus soit trouvé.
Cela ne fonctionne que si on respecte les éléments suivants :
Si on ne sait pas estimer la complexité, on timebox le temps passé sur la tâche. Exemple :
Un ticket timeboxé :
A la fin d’une timebox, on a soit :
Lors du planning poker, l’équipe prend les tickets du product backlog qui ont été priorisés par importance décroissante et les estime tour à tour. L’équipe arrête d’estimer les tickets du product backlog quand la somme des points de complexité des tickets insérés dans le sprint backlog dépasse la CAF moyenne de l’équipe.
L’équipe a veillé aux deux points suivants lors de la définition du périmètre du sprint.
Un graph de dépendances des tickets est réalisé qui permet de définir dans quel ordre effectuer les tickets.
Les dépendances sont telles que l’équipe ne peut théoriquement pas être bloquée. Si une fonctionnalité bloque toutes les autres, le périmètre du sprint est modifié pour laisser à l’équipe de la marge de manœuvre sur des tâches parallèles et exploiter au mieux sa CAF.
Exemple d’un graphe de dépendances entre tickets d’un sprint :
Une fois l’ensemble des tickets évalué et le périmètre du sprint figé, on défini un sprint goal.
Le sprint goal englobe plusieurs tickets et constitue la priorité de l’équipe de développement, c’est une macro-US, un epic ou encore un parcours complet. C’est la priorité du sprint global.
Il doit être suffisamment élémentaire pour que moins de 50% de la CAF de l’équipe puisse y répondre, sans quoi on prendrait le risque des inconnues et on ne le tiendrait pas.
Exemple de deux sprint goals atteints par l’équipe :
Ce qui a été fait : le burndown chart
Le matin, le PO réunit l’équipe de développement et chacun s’exprime sur ce qui a été fait. Le graphe de dépendances est utilisé et les tickets terminés sont barrés.
Le burndown chart est ré-edité et permet de savoir où l’équipe se situe par rapport à son objectif de sprint :
Ce qui reste à faire
Chaque membre de l’équipe se prononce alors sur ce qu’il va faire. Le choix est libre dans la limite de ce qu’impose le sprint backlog et le graph de dépendances, avec une priorité mise sur les tickets du sprint goal.
Chaque membre choisit également des tickets qu’il saura terminer dans la journée. On essaie de ne pas traîner un ticket d’une journée à l’autre ce qui induirait des effets indésirables :
Daily email
Un récap est adressé à l’équipe entière pour tenir au courant de l’avancée. En tant que CEO, ce recap est extrêmement apprécié. C’est un reporting de qualité qui me permet de comprendre s’il y a des problèmes et de réagir en conséquence. C’est aussi un formidable outil d’aide à la décision pour le PO !
Exemple de daily email :
Exemple d’un autre email qui aborde une résolution de problème
A chaque finalisation d’un ticket par un développeur, celui ci veille à respecter :
Outre les tests d’acceptance déjà présentés, la definition of done réunit des éléments à valeur générale.
Le développeur tire une feature branch grâce à now, un outil de Zeit.co
Il effectue une PR et vérifie la conformité aux règles suivantes :
Il ne reste plus qu’à obtenir une revue positive, être à jour de master et faire passer les test sur notre outil de CI, CircleCI (désormais Github Actions) :
Le développeur partage alors l’adresse de la feature branch sur son ticket, une notification slack est adressée au PO qui teste. Si le test est positif, la PR est mergée et la fonctionnalité arrive directement en production 🙂
Chez melba, un push sur github lance les tests avec CircleCI :
L’application est déployée sur un serveur cloud via un script ansible et le build de la SPA est effectué par webpack sur un serveur hébergé par Zeit.co.
Mettre en production très fréquemment suppose que :
La lecture de The Gold Mine est très riche d’enseignements pour entendre l’intérêt de ce processus : toute la valeur ajoutée de l’équipe, à toute étape du cycle de développement au sens large (depuis le sourcing jusqu’aux corrections en production), est tirée au maximum vers l’utilisateur final. On garde un minimum de stock de valeur ajoutée aux différents stades de développement :
Yay ! le sprint goal a été atteint et le sprint est terminé !
Il y a deux objectifs au cours d’un sprint : le sprint goal et la complétion de toutes les tâches du sprint. Le sprint goal permet de sécuriser un objectif moins ambitieux et de s’assurer qu’un gain est toutefois acquis à la fin de chaque sprint.
Nous faisons la démonstrations des nouveautés soit devant toute l’équipe soit lors de la rétro qui précède le planning (pour diminuer le overhead dû aux réunions)
La démo est utile pour se synchroniser avec les membres de l’équipe qui ne font pas partie du processus de développement du produit et participe de la satisfaction des membres de l’équipe de développement.
Lors de la rétro en particulier, ou à chaque daily, des problèmes sont soulevés.
Exemple :
Chacun d’entre eux fait l’objet d’une procédure de résolution des problèmes afin d’éviter qu’il ne se manifeste à nouveau.
On a emprunté à Théodo le framework de résolution des problèmes suivant avec en colonnes :
Pendant 2 ans, melba s’est essayé au scrum sans grand succès. Nous ne respections pas suffisamment son esprit et nous n’avions pas de compétence préalable dans le domaine.
On dénigre d’ailleurs souvent cette méthodologie :
Pour avoir testé du scrum qui ne marche pas puis du scrum qui marche, je pense que ces remarques sont évidentes quand on manque d’expérience mais qu’elle ne sont pas justes dans l’absolu :