JSJS Memo🎙️ Coach

Principe FIRST

Le principe FIRST c'est un ensemble de critères permettant de garantir que les tests sont bien conçus, efficaces et maintenables. L'acronyme FIRST représente une caractéristique comme:

F pour Fast (Rapide) : Les tests unitaires doivent s'exécuter rapidement. Un test trop lent risque d'être ignoré, ce qui peut compromettre la qualité du code.

I pour Isolated/Independent (Isolé ou Indépendant) : Chaque test doit pouvoir être exécuté indépendamment des autres. Il ne doit y avoir aucune dépendance entre les tests, ni à des bases de données. Cela garantit que les échecs d'un test ne provoquent pas ceux d'autres tests.

R pour Repeatable (Répétable) : Un test unitaire doit toujours donner les mêmes résultats, quel que soit le moment ou l'environnement dans lequel il est exécuté.

S pour Self-Validating (Auto-validant) : Un test unitaire doit être en mesure de déterminer automatiquement s'il a réussi ou échoué. Cela signifie qu'il doit se terminer par une condition binaire (réussi/échoué) sans nécessiter d'intervention humaine ou d'inspection visuelle des résultats.

T pour Timely (Temporaire) : Les tests unitaires doivent être écrits au bon moment, idéalement avant ou en même temps que le code testé. Cela garantit que le code est bien conçu pour être testé et qu'il remplit les exigences dès le départ.

Test double ou doublure de test

Les "Test Doubles" sont des objets utilisés pour remplacer des dépendances réelles dans les tests, afin d'isoler la logique qu'on souhaite tester. Ils permettent de simuler des comportements sans avoir à recourir aux véritables objets ou services externes, souvent complexes ou lents (comme les bases de données ou les API externes). Il existe plusieurs types de doubles de test: Dummy, Stub, Spy, Mock

Dummy

Un Dummy est le double de test le plus simple. Il est utilisé lorsqu'un objet doit être passé en argument pour une méthode, mais n'est jamais utilisé. Son rôle est simplement de "remplir" une place, et il ne contient aucune logique ou comportement spécifique.

Exemple concret : Dans un système de gestion des utilisateurs, supposons qu' on ait une méthode envoyerEmail qui prend en paramètre un objet Utilisateur ainsi qu'un objet EmailService. Dans un test de la logique métier, on ne se soucie pas de l'objet EmailService, on peut donc le remplacer par un Dummy.

Stub

Un Stub est un double test qui remplace une dépendance et renvoie des réponses pré-définies à certaines méthodes. Il ne contient pas de logique complexe, mais il permet de contrôler le comportement des appels externes afin de tester le code dans un contexte donné.

Exemple concret : Imaginons que vous testez une méthode qui récupère des données d'une API externe. Pour éviter de faire des appels réseau pendant les tests, vous utilisez un Stub qui renvoie toujours les mêmes données simulées. Le Stub remplace le service API et renvoie des résultats fixes, facilitant ainsi le test du comportement de votre code sans dépendre de l'API réelle.

Spy

Un Spy est un double test qui enregistre les interactions faites avec lui. Il permet de vérifier si certaines méthodes ont été appelées, combien de fois, avec quels arguments, etc. Contrairement au Mock, le Spy conserve le comportement d'origine du code.

Exemple concret : Dans un système de suivi des commandes, vous souhaitez vous assurer qu'une méthode de notification est appelée une fois qu'une commande est validée. Le Spy permet de vérifier cela.

Dummy/Stub/Spy/Fake

Dummy : Utilisé lorsque l'objet n'a aucune importance pour le test (juste un placeholder). Stub : Utilisé pour fournir des réponses préprogrammées, souvent pour simuler des API ou services externes. Spy : Utilisé pour vérifier que certaines méthodes ont été appelées et avec quels arguments, tout en conservant le comportement réel. Mock : Utilisé pour vérifier et définir des comportements spécifiques sur un objet ou une méthode, en remplaçant l'implémentation réelle. Fake : Utilisé pour remplacer une dépendance avec une version simplifiée mais fonctionnelle, comme une base de données en mémoire.

BDD (Behavior Driven Developpement)

BDD (Behaviour Driven Development) est une approche agile pour le développement logiciel qui se concentre sur le comportement attendu du système du point de vue des utilisateurs. Contrairement au TDD qui met l'accent sur les tests techniques (unitaires), le BDD se concentre sur la collaboration entre les développeurs, les testeurs, et les parties prenantes non techniques pour définir les comportements attendus à travers des scénarios concrets écrits en langage naturel comme Gherkin ou fitness, robot framework.

BDD se concentre sur le "quoi" (comportement) et TDD se concentre sur le "comment" (implémentation).

Scénarios Gherkin

Les scénarios Gherkin, décrivent le comportement attendu d'une fonctionnalité d'un point de vue utilisateur. Ils sont écrits sous la forme de phrases simples en utilisant Given-When-Then, ce qui permet de les comprendre facilement même par des non-développeurs. Par exemple :

  • Given une condition initiale,
  • When une action est effectuĂ©e,
  • Then un rĂ©sultat spĂ©cifique est attendu.

Bonne pratique BDD

Une bonne pratique est de suivre la règle du single responsibility dans les scénarios, c'est-à-dire qu'un scénario doit tester un seul comportement ou fonctionnalité spécifique. Cela aide à maintenir des tests clairs, compréhensibles et faciles à maintenir. Par exemple :

  • Un scĂ©nario ne doit pas tester plusieurs cas de bord ou inclure de la logique conditionnelle.
  • Utiliser des termes abstraits dans les Given, When, et Then pour rendre les scĂ©narios rĂ©utilisables et indĂ©pendants des changements techniques mineurs (comme le nom des boutons).

Mesure succès BDD

Le succès de BDD peut être mesuré en suivant plusieurs indicateurs :

  • QualitĂ© du produit : RĂ©duction des bugs en production, car les comportements sont validĂ©s avant et pendant le dĂ©veloppement.
  • Collaboration accrue : AmĂ©lioration de la communication entre les Ă©quipes techniques et non techniques, avec une meilleure comprĂ©hension des besoins mĂ©tiers.
  • Cycle de dĂ©veloppement : Un cycle de dĂ©veloppement plus rapide grâce Ă  des exigences clarifiĂ©es et des tests automatisĂ©s intĂ©grĂ©s au processus CI/CD.
  • Couverture des tests : Mesurer le pourcentage de fonctionnalitĂ©s couvertes par des tests BDD automatisĂ©s et valider la non-rĂ©gression.

Résolution par BDD

Lorsqu'on utilise BDD en complément de TDD (Test-Driven Development), on cherche à résoudre plusieurs problèmes liés à la communication, la clarté des exigences, et l'alignement entre l'équipe technique et les parties prenantes.

Alignement sur les exigences métier

  • Problème : Avec TDD, les tests sont souvent Ă©crits en se concentrant sur l'implĂ©mentation technique du code, ce qui peut crĂ©er un fossĂ© entre ce que le produit doit faire et la manière dont il est testĂ©. Les tests peuvent ĂŞtre trop techniques et ne pas reflĂ©ter clairement les attentes des utilisateurs finaux.
  • Solution BDD : En utilisant un langage commun et accessible Ă  tous les acteurs (comme le format Gherkin en BDD, avec des mots-clĂ©s comme "Given", "When", "Then"), BDD permet de dĂ©finir les tests en termes de comportements attendus du système du point de vue mĂ©tier. Cela facilite l'alignement entre les dĂ©veloppeurs, les testeurs, et les parties prenantes non techniques.

Clarté et compréhension partagée

  • Problème : En TDD, les tests unitaires peuvent parfois ĂŞtre difficiles Ă  comprendre pour des personnes qui ne sont pas des dĂ©veloppeurs. Cela peut poser problème lorsque des non-techniciens, comme des chefs de produit ou des clients, veulent s'assurer que le système est bien conforme Ă  leurs besoins.
  • Solution BDD : Les scĂ©narios BDD sont Ă©crits de manière simple et comprĂ©hensible pour tous, y compris les non-techniciens. Ils dĂ©crivent les fonctionnalitĂ©s sous forme de comportements observables, ce qui amĂ©liore la communication et garantit que tout le monde a la mĂŞme comprĂ©hension des fonctionnalitĂ©s Ă  dĂ©velopper.

Focus sur la valeur métier

  • Problème : Avec TDD, il est possible que les dĂ©veloppeurs se concentrent trop sur les dĂ©tails d'implĂ©mentation et testent des parties du système qui n'apportent pas directement de valeur au client final.
  • Solution BDD : BDD oblige Ă  se concentrer sur les fonctionnalitĂ©s qui ont un impact direct sur le comportement observable par les utilisateurs. En dĂ©crivant les tests en termes de "comportements attendus", on s'assure que l'effort de dĂ©veloppement est orientĂ© vers la crĂ©ation de valeur mĂ©tier.

Tests plus robustes et orientés utilisateurs

  • Problème : Les tests TDD peuvent parfois manquer de perspective sur l'expĂ©rience utilisateur, car ils sont centrĂ©s sur le bon fonctionnement du code, mais pas nĂ©cessairement sur le bon fonctionnement du système du point de vue utilisateur.
  • Solution BDD : Avec BDD, les tests sont basĂ©s sur des comportements que l'utilisateur final s'attend Ă  voir. Cela permet de couvrir plus facilement des cas d'utilisation rĂ©els et d'Ă©viter des bugs ou des comportements inattendus dans des situations que les tests purement techniques auraient pu ignorer.

Documentation vivante

  • Problème : Les tests unitaires en TDD sont souvent cryptiques pour les personnes extĂ©rieures Ă  l'Ă©quipe technique et ne servent pas nĂ©cessairement de documentation explicite sur le comportement du système.
  • Solution BDD : Les scĂ©narios de BDD servent de documentation vivante, car ils dĂ©crivent de manière claire et comprĂ©hensible le comportement attendu du système. Ils peuvent ĂŞtre relus et validĂ©s par toutes les parties prenantes, servant Ă  la fois de spĂ©cification, de test et de documentation.

Amélioration de la collaboration entre équipes

  • Problème : Le TDD est souvent perçu comme une activitĂ© strictement rĂ©servĂ©e aux dĂ©veloppeurs, ce qui peut limiter la collaboration entre les dĂ©veloppeurs, les testeurs et les parties prenantes mĂ©tier.
  • Solution BDD : Le processus BDD invite Ă  une meilleure collaboration dès le dĂ©part. En impliquant les dĂ©veloppeurs, les testeurs et les reprĂ©sentants mĂ©tier dans l'Ă©criture des scĂ©narios BDD, on favorise une approche collaborative oĂą tout le monde contribue Ă  la comprĂ©hension des fonctionnalitĂ©s Ă  dĂ©velopper.

Avantage par BDD

Les avantages de BDD sont:

  • Alignement avec les besoins mĂ©tiers : Les tests BDD sont Ă©crits en collaboration avec les parties prenantes, ce qui garantit que les fonctionnalitĂ©s dĂ©veloppĂ©es rĂ©pondent aux besoins des utilisateurs.
  • Documentation vivante : Les scĂ©narios Gherkin servent de documentation claire et toujours Ă  jour, facilitant la comprĂ©hension des fonctionnalitĂ©s pour toute l'Ă©quipe.
  • RĂ©duction des erreurs de communication : En traduisant les exigences en scĂ©narios clairs, on minimise le risque de malentendus entre dĂ©veloppeurs et parties prenantes.
  • Tests d'acceptation automatisĂ©s : BDD permet d'automatiser les tests d'acceptation, augmentant ainsi la couverture des tests et rĂ©duisant les efforts manuels lors des tests de rĂ©gression.

Tests flakies

Les tests flakies, ou tests instables, sont des tests automatisés qui échouent de manière intermittente, sans que cela soit dû à des erreurs dans le code ou des changements dans les spécifications. Ils posent un problème majeur pour les équipes de développement et de test, car ils peuvent rendre difficile la détermination de la qualité réelle du logiciel.

Pourquoi les tests flakies se reproduisent-ils ?

  • Problèmes de synchronisation : Chargement asynchrone : Dans les applications modernes, notamment les applications front-end, des Ă©lĂ©ments peuvent se charger de manière asynchrone. Les tests peuvent tenter d'interagir avec des Ă©lĂ©ments qui ne sont pas encore disponibles, entraĂ®nant des Ă©checs intermittents. Timing : Les tests peuvent dĂ©pendre de dĂ©lais ou de temps d'attente qui ne sont pas correctement gĂ©rĂ©s, ce qui peut conduire Ă  des rĂ©sultats imprĂ©visibles.
  • État global partagĂ© :Les tests peuvent partager des ressources ou des Ă©tats globaux, ce qui peut provoquer des conflits. Par exemple, si un test modifie l'Ă©tat d'une base de donnĂ©es ou d'un système de fichiers, cela peut affecter d'autres tests qui s'exĂ©cutent par la suite.
  • DĂ©pendances externes : L'utilisation de services externes, d'APIs ou de bases de donnĂ©es externes peut causer des instabilitĂ©s. Les tests peuvent Ă©chouer si ces services sont temporairement non disponibles ou si leurs rĂ©ponses sont imprĂ©visibles.

Comment gérer les tests flakies ?

  • Stabilisation des tests : Attentes explicites : Utilisez des attentes explicites pour attendre que les Ă©lĂ©ments soient prĂ©sents et visibles avant d'interagir avec eux. Par exemple, avec des outils comme Selenium, cela pourrait impliquer l'utilisation de WebDriverWait pour attendre des conditions spĂ©cifiques. Retries automatiques : ImplĂ©mentez une logique de rĂ©essai pour relancer un test Ă©chouĂ© après un court dĂ©lai. Cela peut aider Ă  rĂ©duire le nombre d'Ă©checs dus Ă  des problèmes temporaires.
  • Isolation des tests : Tests indĂ©pendants : Assurez-vous que chaque test est indĂ©pendant, en Ă©vitant les effets de bord. Utilisez des donnĂ©es de test isolĂ©es pour chaque test, plutĂ´t que de partager des ressources ou des Ă©tats. Nettoyage après les tests : ImplĂ©mentez des mĂ©canismes de nettoyage pour rĂ©initialiser l'Ă©tat après chaque test, assurant ainsi qu'aucun test n'affecte les autres.
  • Utilisation de mocks et de stubs : Éviter les dĂ©pendances externes : Utilisez des mocks ou des stubs pour remplacer les dĂ©pendances externes lors des tests, afin de rĂ©duire la variabilitĂ© due Ă  des services tiers.

TDD( Test Driven Developpement)

Le TDD est une méthode où les tests sont écrits avant le code de production ou la logique. Quand on utilise le TDD, on suit le processus en trois étapes :

  • Écrire un test qui Ă©choue (red).
  • Écrire le code minimal nĂ©cessaire pour faire passer le test (green).
  • Refactoriser le code pour amĂ©liorer la qualitĂ© tout en s'assurant que les tests passent toujours (refactor).

Les avantages du TDD sont

  • QualitĂ© du code amĂ©liorĂ©e : Les tests aident Ă  identifier les bogues dès le dĂ©but du dĂ©veloppement.
  • Documentation vivante : Les tests servent de documentation pour le comportement du système.
  • Confiance lors des changements : Les dĂ©veloppeurs peuvent modifier le code en toute confiance, sachant que les tests dĂ©tectent les rĂ©gressions.

Type ou pyramide de test

Les types de tests sont:

  • Tests unitaires : VĂ©rifient des unitĂ©s de code isolĂ©es (par exemple, des fonctions ou des classes).
  • Tests d'intĂ©gration : VĂ©rifient l'interaction entre diffĂ©rentes unitĂ©s de code.
  • Tests fonctionnels : Évaluent des fonctionnalitĂ©s entières du système selon les exigences spĂ©cifiĂ©es.
  • Tests d'acceptation : Assurent que le système rĂ©pond aux critères d'acceptation des utilisateurs.
  • Tests de Smoke : c'est une sĂ©rie de tests prĂ©liminaires pour vĂ©rifier que les principales fonctionnalitĂ©s d'une application fonctionnent après un dĂ©ploiement ou une mise Ă  jour. L'objectif est de s'assurer que le build est stable avant de procĂ©der Ă  des tests plus approfondis.

TDD et agile

TDD s'intègre avec les méthodologies Agile en favorisant un développement itératif et incrémental. Les tests peuvent être écrits pendant les sprints, et les résultats des tests guident le développement et les ajustements. Cela renforce la collaboration entre les équipes, car les tests aident à clarifier les exigences et à garantir que le produit respecte les attentes des utilisateurs.

Défis TDD

  • Temps d'exĂ©cution des tests : Si les tests sont lents, cela peut ralentir le dĂ©veloppement. Les tests unitaires doivent ĂŞtre rapides.
  • ComplexitĂ© de l'Ă©criture des tests : Pour des fonctionnalitĂ©s complexes, Ă©crire des tests peut nĂ©cessiter un effort important.
  • Pression pour livrer rapidement : Les Ă©quipes peuvent ĂŞtre tentĂ©es de nĂ©gliger les tests pour respecter des dĂ©lais serrĂ©s, ce qui peut compromettre la qualitĂ© du code.
  • RĂ©sistance au changement : Certains dĂ©veloppeurs peuvent ĂŞtre rĂ©ticents Ă  adopter TDD en raison d'habitudes bien ancrĂ©es.

Best practice TDD

Pour moi, les meilleures pratiques pour écrire des tests unitaires efficaces sont si :

  • Isolation : on assure que les tests unitaires ne dĂ©pendent pas d'autres tests ou de l'Ă©tat global.
  • Noms clairs : on donne aux tests des noms descriptifs qui indiquent leur intention.
  • SimplicitĂ© : on Ă©crit des tests simples qui vĂ©rifient une seule fonctionnalitĂ© Ă  la fois.
  • RapiditĂ© : Les tests doivent s'exĂ©cuter rapidement pour permettre un retour d'information rapide.
  • Utilisation d'assertions claires : on utilise des assertions qui dĂ©crivent clairement ce qui est attendu.

Challenge en TDD

L'adoption du TDD nécessite un changement de mentalité. De nombreux développeurs ont l'habitude d'écrire le code d'abord et de tester ensuite. Le TDD impose une inversion de cette logique, où l'écriture des tests précède le développement du code. Cela peut être difficile pour les équipes habituées à des pratiques plus traditionnelles.

Solution : Pour surmonter cela, j'ai investi du temps dans la formation et l'accompagnement des équipes pour les sensibiliser aux avantages à long terme du TDD (qualité de code améliorée, réduction de la dette technique, meilleure documentation). J'ai aussi montré des exemples concrets d'améliorations sur des projets où TDD a été adopté.

Clean Architecture

La Clean Architecture, c'est un modèle d'architecture logicielle basé sur des couches concentriques qui respectent le principe d'inversion des dépendances.

L'idée principale est de séparer clairement les préoccupations, en plaçant les règles métier (core business) au centre et en les isolant des dépendances externes comme les bases de données, frameworks, et interfaces utilisateur.

Structure

La Clean Architecture est généralement représentée sous forme de cercles concentriques avec les couches suivantes (du centre vers l'extérieur) :

  • Entities (EntitĂ©s) : — Contient les règles mĂ©tier fondamentales, indĂ©pendantes de tout framework ou technologie. — Exemples : Calcul d'impĂ´ts, validation de règles mĂ©tier.
  • Use Cases (Cas d'utilisation) : — DĂ©finit les actions spĂ©cifiques de l'application (logique applicative). — Coordonne les entitĂ©s pour accomplir des tâches mĂ©tier. — Exemples : "CrĂ©er un utilisateur", "Passer une commande".
  • Interface Adapters (Adaptateurs) : — Traduit les donnĂ©es pour qu'elles soient comprĂ©hensibles par les couches externes et internes. — Exemples : DTOs, contrĂ´leurs API, mappers.
  • Frameworks and Drivers (Frameworks et pilotes) : — Contient les dĂ©tails techniques et les outils externes, comme les bases de donnĂ©es, les frameworks web, les bibliothèques, etc. — Exemples : Express.js, MongoDB, RabbitMQ.

Fonctionnement

  • Les dĂ©pendances vont toujours de l'extĂ©rieur vers l'intĂ©rieur.
  • Les couches internes ne doivent jamais dĂ©pendre des couches externes.
  • Exemple : La logique mĂ©tier n'a pas besoin de connaĂ®tre le type de base de donnĂ©es utilisĂ©, car elle passe par des interfaces dĂ©finies dans les couches internes.

But

  • Maintenir la logique mĂ©tier indĂ©pendante des dĂ©tails techniques.
  • Faciliter les tests unitaires en isolant les règles mĂ©tier.
  • Rendre l'application rĂ©sistante aux changements technologiques (exemple : remplacer une base de donnĂ©es avec un autre moteur).

---

Architecture Hexagonale (Ports et Adaptateurs)

Concept

L'architecture hexagonale, introduite par Alistair Cockburn, est un modèle qui met l'accent sur l'interaction entre le cœur métier et le monde extérieur. Elle utilise les concepts de ports (interfaces définies par le domaine) et adaptateurs (implémentations concrètes des interfaces).

L'objectif est de rendre le code indépendant des mécanismes d'entrée et de sortie (par exemple, les API, bases de données, etc.).

Structure

Elle est souvent représentée comme un hexagone avec les éléments suivants :

  • Core Business Logic (CĹ“ur mĂ©tier) : — Contient les règles mĂ©tier et les cas d'utilisation. — Est totalement indĂ©pendant des couches externes.
  • Ports : — Interfaces qui dĂ©finissent les points d'entrĂ©e et de sortie du cĹ“ur mĂ©tier. — Exemples : — Ports d'entrĂ©e : Interfaces pour les contrĂ´leurs ou les scripts CLI. — Ports de sortie : Interfaces pour la communication avec des bases de donnĂ©es, des services externes, etc.
  • Adapters (Adaptateurs) : — ImplĂ©mentations concrètes des ports, situĂ©es en pĂ©riphĂ©rie. — Exemples : Un contrĂ´leur REST est un adaptateur d'entrĂ©e ; un dĂ©pĂ´t qui interagit avec une base de donnĂ©es est un adaptateur de sortie.
  • Monde extĂ©rieur : — Les outils ou services externes qui interagissent avec les adaptateurs, comme des frameworks, des bases de donnĂ©es ou des services tiers.

Fonctionnement

  • Les dĂ©pendances sont dirigĂ©es vers le cĹ“ur mĂ©tier.
  • Les ports dĂ©finissent comment le cĹ“ur mĂ©tier interagit avec les Ă©lĂ©ments externes, mais n'en connaissent pas les dĂ©tails.
  • Les adaptateurs fournissent des implĂ©mentations concrètes pour les interactions externes.

But

  • DĂ©coupler le cĹ“ur mĂ©tier des technologies externes.
  • Faciliter les tests unitaires en simulant les adaptateurs avec des implĂ©mentations factices (mocks).
  • Rendre l'application flexible pour intĂ©grer de nouveaux moyens d'interaction (par exemple, ajouter une interface CLI Ă  une application REST).

---

Clean Architecture VS Hexagonale Contribution Ă  la mise en place d'architecture

Lors de la mise en place de l'architecture hexagonale, j'ai réalisé les tâches suivantes :

Analyse et Conception :

  • J'ai participĂ© activement aux ateliers techniques pour identifier les diffĂ©rents domaines fonctionnels et dĂ©terminer les frontières entre les couches mĂ©tiers et techniques, pour dĂ©coupler clairement le domaine mĂ©tier des dĂ©tails techniques (accès aux donnĂ©es, services externes, etc.). ImplĂ©mentation du cĹ“ur mĂ©tier :
  • J'ai implĂ©mentĂ© des services mĂ©tiers indĂ©pendants de toute technologie spĂ©cifique, en respectant le principe de la règle mĂ©tier isolĂ©e. en assurant la cohĂ©rence de la logique mĂ©tier en dĂ©veloppant des cas d'utilisation (use cases) clairement dĂ©finis et testables de manière isolĂ©e.

Développement des adaptateurs (entrée/sortie) :

  • J'ai créé des adaptateurs entrants (contrĂ´leurs d'API, gestionnaires d'Ă©vĂ©nements) et sortants (persistance en base de donnĂ©es, appels Ă  des APIs externes), assurant ainsi que chaque adaptateur communique avec le cĹ“ur mĂ©tier uniquement Ă  travers les ports dĂ©finis.
  • J'ai veillĂ© Ă  la sĂ©paration nette entre ces adaptateurs et le code mĂ©tier pour faciliter l'Ă©volutivitĂ© et la testabilitĂ©. Tests et Validation :
  • J'ai mis en place des tests unitaires et d'intĂ©gration pour valider chaque composant de manière indĂ©pendante, ainsi que des tests de bout en bout pour vĂ©rifier l'ensemble du fonctionnement.
  • J'ai vĂ©rifiĂ© que l'architecture mise en place respectait les principes d'isolation du mĂ©tier et de testabilitĂ© accrue, facilitant ainsi la maintenance. Documentation et partage :
  • J'ai rĂ©digĂ© la documentation technique dĂ©taillant l'architecture choisie, les flux d'interaction, et les principes Ă  respecter par les Ă©quipes techniques.
  • J'ai animĂ© ou participĂ© Ă  des revues de code et des sessions de partage pour m'assurer que l'Ă©quipe adhère Ă  l'architecture choisie.

DOD et DOR

DOD – Definition of Done (Définition de Terminé)

C'est une checklist qui définit les critères minimaux qu'un élément (user story, tâche, bug) doit satisfaire pour être considéré comme "terminé" et potentiellement livrable.

Elle est utilisée à la fin du développement pour s'assurer que :

  • Le code est Ă©crit, compilĂ© et fonctionne.
  • Les tests unitaires sont passĂ©s.
  • Le code est relu (code review effectuĂ©e).
  • Le produit est testĂ© fonctionnellement et validĂ©.
  • La documentation est mise Ă  jour (si nĂ©cessaire).
  • La story a Ă©tĂ© dĂ©montrĂ©e au Product Owner.

📌 Exemple de DOD :

  • Code poussĂ© sur la branche principale
  • Tests automatisĂ©s Ă©crits et passĂ©s Ă  100 %
  • Aucun bug bloquant
  • FonctionnalitĂ© validĂ©e en dĂ©monstration
  • Documentation utilisateur mise Ă  jour

🟨 DOR – Definition of Ready (Définition de Prêt)

C'est une checklist qui définit quand une user story (ou un élément du backlog) est suffisamment claire, détaillée et estimable pour être prise en charge par l'équipe de développement.

Elle est utilisée AVANT d'entrer dans un sprint (au moment du raffinement).

📌 Exemple de DOR :

  • La user story est rĂ©digĂ©e selon le format "En tant que... Je veux... Afin de..."
  • Les critères d'acceptation sont clairs
  • Les dĂ©pendances sont identifiĂ©es
  • L'estimation en points est faite
  • Le design ou prototype est disponible si nĂ©cessaire

Three Amigos Meeting

Le Three Amigos Meeting est une réunion qui implique trois rôles principaux : le développeur, le testeur et le représentant du métier (product owner ou analyste business). Ce meeting a pour objectif de :

  • Clarifier les exigences et les comportements attendus.
  • Discuter des scĂ©narios possibles et Ă©liminer toute ambiguĂŻtĂ©.
  • Assurer que tous les angles (mĂ©tier, test, technique) sont couverts dans les scĂ©narios Gherkin.

L'impact de ce processus est pour la qualité des scénarios, car il permet de détecter les éventuels malentendus avant que le développement ne commence. Cela favorise la création de scénarios plus réalistes et exécutables.

Agile scrum

Dans la méthodologie Agile Scrum, le cycle de développement est divisé en plusieurs étapes, qui permettent à l'équipe de collaborer et d'itérer rapidement sur les fonctionnalités. Les étapes principales d'un cycle Scrum:

Sprint Planning (Planification du Sprint)

  • Objectif : DĂ©finir les tâches Ă  accomplir pendant le prochain sprint.
  • Description : L'Ă©quipe Scrum (dĂ©veloppeurs, Product Owner, Scrum Master) se rĂ©unit pour dĂ©cider quelles user stories du backlog seront dĂ©veloppĂ©es dans le sprint Ă  venir, en fonction de leur prioritĂ© et de la capacitĂ© de l'Ă©quipe.
  • RĂ©sultat : Un Sprint Backlog, qui est la liste des tâches ou user stories que l'Ă©quipe s'engage Ă  rĂ©aliser pendant le sprint (gĂ©nĂ©ralement 1 Ă  4 semaines).

Sprint (Développement du Sprint)

  • Objectif : DĂ©velopper, tester et livrer les fonctionnalitĂ©s dĂ©finies dans le Sprint Backlog.
  • Description : Le sprint reprĂ©sente la pĂ©riode durant laquelle l'Ă©quipe travaille pour dĂ©velopper les fonctionnalitĂ©s prĂ©vues. Durant cette phase, l'Ă©quipe de dĂ©veloppement s'efforce de complĂ©ter les tâches dĂ©finies tout en respectant les critères d'acceptation.
  • DurĂ©e : Un sprint dure gĂ©nĂ©ralement entre 1 et 4 semaines.

Daily Scrum (Scrum quotidien)

  • Objectif : Coordonner l'Ă©quipe et rĂ©soudre les obstacles.
  • Description : Chaque jour, l'Ă©quipe se rĂ©unit pour une courte rĂ©union (15 minutes maximum) appelĂ©e stand-up. Chaque membre partage :Ce qu'il a fait depuis la dernière rĂ©union.Ce qu'il compte faire aujourd'hui.Les obstacles ou blocages qu'il rencontre.
  • RĂ©sultat : L'Ă©quipe est alignĂ©e sur les progrès et peut rĂ©agir rapidement aux obstacles.

Sprint Review (Revue de Sprint)

  • Objectif : PrĂ©senter le travail accompli et recueillir des retours des parties prenantes.
  • Description : Ă€ la fin de chaque sprint, l'Ă©quipe prĂ©sente les fonctionnalitĂ©s dĂ©veloppĂ©es aux parties prenantes (Product Owner, clients, managers). C'est l'occasion de recueillir des retours sur les fonctionnalitĂ©s et d'ajuster les prioritĂ©s pour les futurs sprints.
  • RĂ©sultat : Les fonctionnalitĂ©s potentiellement livrables sont dĂ©montrĂ©es, et des ajustements peuvent ĂŞtre apportĂ©s au backlog en fonction des retours reçus.

Sprint Retrospective (Rétrospective du Sprint)

  • Objectif : AmĂ©liorer les processus internes de l'Ă©quipe.
  • Description : Après chaque sprint, l'Ă©quipe Scrum se rĂ©unit pour discuter de ce qui a bien fonctionnĂ© et des aspects Ă  amĂ©liorer. Cette Ă©tape est cruciale pour l'amĂ©lioration continue. L'Ă©quipe peut identifier des actions concrètes Ă  prendre pour rendre le prochain sprint plus productif ou plus fluide.
  • RĂ©sultat : Un plan d'action pour amĂ©liorer le processus, la collaboration, ou l'efficacitĂ© de l'Ă©quipe dans le sprint suivant.

Backlog Refinement (Affinage du Backlog)

  • Objectif : PrĂ©parer les user stories pour les futurs sprints.
  • Description : Bien que ce ne soit pas une cĂ©rĂ©monie formelle dans tous les frameworks Scrum, l'affinage du backlog est une Ă©tape cruciale. L'Ă©quipe et le Product Owner travaillent ensemble pour s'assurer que les user stories dans le backlog sont bien dĂ©finies, priorisĂ©es, et prĂŞtes Ă  ĂŞtre prises en charge dans un sprint futur.
  • RĂ©sultat : Un product backlog plus clair, avec des user stories bien dĂ©finies et estimĂ©es, prĂŞtes pour les prochains sprints.

Avantage Agile scrum

J'ai constaté que les cérémonies Agile (daily stand-ups, sprint reviews, etc.) favorisent une meilleure collaboration au sein de l'équipe. Le fait de se rencontrer régulièrement permet de résoudre les problèmes rapidement, d'éviter des malentendus et de partager plus facilement des idées. Par exemple, lors d'un projet complexe avec plusieurs développeurs juniors, les stand-ups quotidiens ont permis d'éviter des retards en identifiant rapidement des blocages.

Cela renforce la transparence et la cohésion d'équipe, et on peut détecter plus tôt les problèmes potentiels.

Agile aussi permet de s'adapter rapidement aux changements de priorités. Par exemple, lors d'un projet, des besoins imprévus venant des utilisateurs finaux ont émergé en milieu de sprint. Grâce à l'approche Agile, nous avons pu ajuster le backlog et prioriser ces besoins sans perturber l'ensemble du projet.

Impact : J'apprécie particulièrement la capacité à livrer des incréments fonctionnels rapidement, ce qui permet d'obtenir des retours d'utilisateurs précoces et d'ajuster le produit en conséquence.

Inconvénient Agile scrum

J'apprécie beaucoup Agile Scrum pour sa flexibilité et sa capacité à renforcer la communication dans l'équipe. Mais s'il y a un point que je trouve parfois moins efficace, c'est quand la méthode devient trop rigide ou appliquée mécaniquement, sans l'adapter au contexte.

Par exemple, j'ai vu des cas où les cérémonies (daily, retro, planning…) étaient faites "par obligation", sans réelle valeur ajoutée, juste pour "cocher une case". Résultat : perte de temps, ou même lassitude dans l'équipe.

Un autre point, c'est que dans certains environnements, le changement de priorités trop fréquent, même en cours de sprint, peut créer de la frustration : on a l'impression de ne jamais terminer ce qu'on a commencé.

Enfin, si le Product Owner n'est pas assez disponible ou clair sur les priorités, le backlog peut devenir flou, et l'équipe perd du temps à interpréter ou à deviner les besoins.

Donc pour moi, Scrum fonctionne très bien à condition qu'il soit bien compris, adapté au contexte et soutenu par une vraie collaboration entre les rôles.

DoD

La Definition of Done (DoD) est une liste de conditions minimales obligatoires qu'un ticket (user story, tâche, bug) doit remplir pour être considéré comme "terminé" dans un projet Agile (Scrum, Kanban, etc.).

Elle est définie collectivement par l'équipe (développeurs, QA, PO, Scrum Master) et doit être claire, mesurable et partagée.

Conditions typiques pour valider un ticket DoD

  • Code
  • Le code est dĂ©veloppĂ© et compilĂ© sans erreur
  • Il respecte les standards de l'Ă©quipe (linters, conventions, etc.)
  • Il est pushĂ© et commitĂ© dans le bon repo / branche
  • Tests
  • Les tests unitaires sont Ă©crits et passent
  • Les tests d'intĂ©gration sont couverts si pertinents
  • Les tests E2E ou manuels ont Ă©tĂ© exĂ©cutĂ©s
  • Aucune rĂ©gression n'est dĂ©tectĂ©e dans les tests
  • Revue / validation
  • Le code a Ă©tĂ© relu et approuvĂ© en peer review (pull request)
  • Les retours de revue ont Ă©tĂ© traitĂ©s
  • Le ticket est validĂ© par le QA ou le Product Owner (PO)
  • Documentation / traçabilitĂ©
  • Les commentaires ou doc techniques sont mis Ă  jour si besoin La documentation fonctionnelle ou utilisateur est Ă  jour (si nĂ©cessaire)
  • Le ticket est bien liĂ© au bon commit ou merge request
  • DĂ©ploiement / environnement
  • La fonctionnalitĂ© est dĂ©ployĂ©e en environnement de test ou staging Elle est intĂ©grĂ©e dans la CI/CD
  • Elle est prĂŞte Ă  ĂŞtre livrĂ©e en production sans modifications
  • Valeur mĂ©tier
  • Le comportement attendu est respectĂ©
  • Tous les critères d'acceptation sont vĂ©rifiĂ©s
  • Le PO confirme que la valeur mĂ©tier est livrĂ©e

Ready (DoR)

C'est un ticket qui est compréhensible, estimable, priorisé, et sans dépendances bloquantes. Il peut être confié à un développeur sans besoin de clarifications majeures.

Conditions typiques pour qu'un ticket respecte la DoR

  • ClartĂ©: Le titre et la description sont clairs et comprĂ©hensibles
  • Objectif mĂ©tier Le besoin ou la valeur mĂ©tier est bien exprimĂ©
  • Critères d'acceptation: Ils sont dĂ©finis, concrets et testables (Given / When / Then si besoin)
  • ComprĂ©hension partagĂ©e: Le ticket a Ă©tĂ© prĂ©sentĂ© ou expliquĂ© Ă  l'Ă©quipe en refinement ou grooming
  • Pas de dĂ©pendances bloquantes: Aucun ticket ou composant externe ne bloque son dĂ©marrage
  • Estimable: L'Ă©quipe peut lui attribuer une estimation (temps ou story points)
  • Priorisation: Le Product Owner l'a validĂ© comme prioritaire ou prĂŞt Ă  ĂŞtre pris
  • TestabilitĂ©: Il est testable (techniquement ou fonctionnellement)
  • Design ou maquette disponibles: Si requis (UI/UX), les specs sont jointes au ticket
  • DonnĂ©es ou environnement prĂŞts: Si le ticket implique des prĂ©requis (ex : base de test), ils sont prĂŞts

Collaboration avec UI/UX

J'ai l'habitude de collaborer avec l'équipe UI/UX à travers des outils de design comme Figma ou Zeplin. Ces plateformes facilitent la collaboration en fournissant des spécifications claires pour les développeurs (mesures, couleurs, typographies, etc.). Lors d'un projet récent, j'ai utilisé Figma pour laisser des commentaires directement sur les maquettes, ce qui a accéléré la résolution de certaines incohérences entre les besoins UI/UX et les contraintes techniques.

Impact : L'utilisation de ces outils rend la collaboration plus fluide et permet d'assurer que l'implémentation du design correspond exactement à la vision de l'équipe UI/UX, tout en facilitant les ajustements en temps réel.

En tant que développeur senior, je comprends que l'expérience utilisateur (UX) est aussi importante que la qualité du code. Par exemple, dans un projet où la rapidité d'interaction était essentielle, nous avons optimisé certains composants front-end pour réduire les temps de chargement et améliorer la fluidité des transitions. J'ai travaillé avec l'équipe UI/UX pour ajuster les animations afin de trouver un bon équilibre entre performance et esthétique.

Collaboration avec PO

Je collabore étroitement avec le Product Owner tout au long du projet. En général, notre échange commence dès la phase de refinement, où je participe activement à la clarification des user stories. J'essaie de poser les bonnes questions pour bien comprendre les besoins métier, les cas limites, et anticiper les contraintes techniques.

Ensuite, pendant le sprint, je reste en contact régulier avec le PO — que ce soit via Slack, des points informels, ou lors des daily meetings — pour lever rapidement les ambiguïtés ou discuter des ajustements éventuels.

Je n'hésite pas à faire des démos intermédiaires si un sujet est sensible ou flou, pour valider l'orientation avant d'aller trop loin dans le développement.

En sprint review, je présente les fonctionnalités que j'ai développées et j'écoute les retours du PO et des parties prenantes. Ça permet de s'assurer que le produit reste aligné avec les attentes.

J'apprécie quand le PO est accessible, clair dans ses priorités et ouvert à l'échange. Et de mon côté, j'essaie toujours d'apporter une vision technique pragmatique pour aider à prendre de bonnes décisions produit.

Différence entre PO et dev Si le PO me demande une fonctionnalité urgente et que j'estime qu'elle prend 4 jours alors qu'il pense que ça peut être fait en 1 jour, je ne rentre pas dans un débat frontal. Mon réflexe, c'est de clarifier ensemble ce qu'il attend exactement. Très souvent, il peut y avoir une différence de perception sur la complexité ou les impacts techniques.

Donc je prends le temps de lui expliquer pourquoi ça prend 4 jours : par exemple, parce que ça touche plusieurs composants, ou qu'il faut gérer des cas particuliers, des tests, ou une intégration avec un service externe.

Ensuite, je propose une alternative si c'est vraiment urgent :

– Soit on découpe la fonctionnalité pour livrer une version plus simple en 1 jour (MVP), puis on complète dans un second temps. – Soit on dépriorise autre chose si cette demande est devenue plus importante.

Ce qui compte pour moi, c'est de trouver une solution ensemble, en étant transparent, tout en respectant la qualité du code et la maintenabilité du produit.

Collaboration equipe PO

Je travaille avec l'équipe Produit comme un partenaire plutôt que comme un simple exécutant.

Lorsqu'un besoin est présenté, mon premier réflexe est de comprendre le problème utilisateur et l'objectif métier avant de parler de solution technique.

Je pose souvent des questions comme :

  • Quel problème cherche-t-on Ă  rĂ©soudre ?
  • Qui sont les utilisateurs concernĂ©s ?
  • Comment fait-on aujourd'hui ?
  • Comment mesurera-t-on le succès de cette Ă©volution ?
  • Existe-t-il des contraintes rĂ©glementaires ou mĂ©tier particulières ?

Une fois le besoin compris, je participe aux ateliers de conception avec le Product Manager, le Product Designer et parfois les équipes métier afin de trouver la solution la plus adaptée.

Mon rôle est aussi d'apporter une vision technique. J'explique les impacts, les risques, les dépendances, les coûts de maintenance ou les conséquences sur les parcours existants afin que les décisions soient prises avec tous les éléments en main.

J'essaie également de proposer des alternatives lorsqu'une solution me paraît trop complexe par rapport à la valeur apportée à l'utilisateur.

Idée rejetée

Si je propose une idée et qu'elle est déclinée au profit d'une autre solution, je l'accepte sans problème.

Mon but, ce n'est pas d'imposer mon idée, mais de trouver la meilleure solution pour l'équipe et le produit. Si une autre approche est choisie parce qu'elle est plus simple, plus rapide, ou plus adaptée au contexte, je joue collectif.

Évidemment, si je pense qu'il y a un risque technique ou fonctionnel, je le signale avec des faits. Mais si après discussion, on tranche autrement, je passe à autre chose — sans blocage ni ego.

Par expérience, il vaut mieux avancer ensemble sur une décision imparfaite que bloquer sur un désaccord. Et parfois, on revient plus tard sur mon idée si elle devient plus pertinente dans un autre contexte.

Désaccord technique

Je considère qu'un désaccord technique est normal dans une équipe. Si une personne n'est pas d'accord avec mon idée, j'écoute ses arguments et j'essaie de comprendre ce que je n'ai peut-être pas vu.

Il m'est arrivé plusieurs fois de changer d'avis après une discussion.

Mon objectif n'est pas que mon idée soit retenue, mais que l'équipe prenne la meilleure décision possible.

Exemple

Chez OUIGO, sur certains sujets d'anomalies ou d'évolutions complexes, il m'est arrivé de proposer une solution différente de celle initialement envisagée.

Je commençais par analyser l'impact métier, les risques techniques et la charge de développement.

Ensuite, je présentais plusieurs options avec leurs avantages et leurs limites.

Cela permettait au Product Owner, au Tech Lead et à l'équipe de prendre une décision éclairée plutôt que de suivre une intuition.

Proposition / influence idée

J'essaie d'influencer par l'argumentation et les faits plutôt que par l'autorité.

Quand j'ai une idée ou une proposition technique, je commence toujours par expliquer le problème que je cherche à résoudre et la valeur que cela apporte à l'équipe ou au produit.

Par exemple, si je propose une évolution d'architecture ou un changement de pratique, je présente les avantages, les inconvénients, les impacts sur la maintenance, les performances, la qualité ou la productivité de l'équipe.

J'évite les débats basés sur les préférences personnelles du type "j'aime cette technologie". Je préfère m'appuyer sur des éléments concrets : retour d'expérience, métriques, complexité de mise en œuvre ou coût de maintenance.

Exemple de proposition idée

Sur un projet, on avait beaucoup de logique de validation dispersée dans plusieurs composants.

J'ai proposé de centraliser ces règles avec une approche basée sur Zod afin d'éviter les incohérences entre le frontend et les règles métier.

Au lieu d'arriver avec une solution toute faite, j'ai préparé un petit exemple, montré les problèmes actuels et expliqué les bénéfices attendus.

Cela a permis à l'équipe de comparer objectivement les approches et la proposition a finalement été adoptée.

Stress

Oui, plusieurs fois. En tant que développeur, on fait souvent face à des environnements à forte pression : délais serrés, incidents en production, demandes métiers urgentes ou pivot de dernière minute.

L'une des situations les plus stressantes que j'ai vécues, c'était lors d'une mise en production critique juste avant le gel de production. Une régression avait été détectée dans un composant clé quelques heures avant le déploiement.

Ce que j'ai fait :

  • J'ai proposĂ© de couper le problème en petits morceaux et d'identifier le pĂ©rimètre exact du bug.
  • J'ai travaillĂ© en binĂ´me avec un QA pour tester rapidement les cas impactĂ©s.
  • On a corrigĂ© le bug, Ă©crit un test unitaire pour s'assurer qu'il ne reviendra pas, et communiquĂ© avec le product owner pour prioriser un patch rapide mais maĂ®trisĂ©.

Résultat :

  • La mise en production a Ă©tĂ© maintenue avec succès.
  • L'Ă©quipe a apprĂ©ciĂ© la gestion de crise calme et collaborative.
  • On a ensuite proposĂ© un postmortem pour Ă©viter que ça se reproduise (amĂ©lioration du coverage et intĂ©gration continue).

Manager une équipe ou référent technique

Je n'ai pas eu un poste officiel de manager avec des entretiens annuels, la gestion des congés ou le pilotage hiérarchique d'une équipe.

En revanche, j'ai régulièrement occupé un rôle de référent technique sur les sujets Frontend.

Par exemple, sur mes dernières missions, j'étais souvent sollicité pour les choix d'architecture, les revues de code, l'analyse des sujets complexes et l'accompagnement des développeurs moins expérimentés.

Je participais également aux refinements et aux ateliers de conception afin d'apporter une vision technique et d'identifier les risques en amont.

Sur certains sujets, lorsqu'une anomalie complexe arrivait en production, c'était souvent moi qui réalisais l'analyse technique, proposais la stratégie de correction et accompagnait les autres développeurs jusqu'à la mise en production.

J'ai aussi l'habitude de partager mes connaissances à travers les code reviews, les présentations techniques ou le pair programming.

Aujourd'hui, je me sens à l'aise dans un rôle de référent technique Frontend ou React Native. Le management hiérarchique n'a pas encore été une responsabilité officielle dans mon parcours, mais l'accompagnement technique et le leadership d'influence font déjà partie de mon quotidien.

Estimation trois semaines

Vous estimez trois semaines. Que faites-vous pendant ces trois semaines ?

Je ne développe pas trois semaines sans échanger.

Je commence par clarifier le besoin avec vous :

  • quel problème utilisateur voulons-nous rĂ©soudre ?
  • quel est le parcours cible ?
  • quels sont les critères d'acceptation ?
  • existe-t-il un MVP ?

Ensuite, je découpe la fonctionnalité en incréments plus petits.

Cela permet d'avoir des démonstrations régulières et d'obtenir rapidement des retours.J'évite autant que possible les développements très longs sans validation intermédiaire.

Et si je change d'avis au bout d'une semaine ?

C'est une situation classique. Si le travail est découpé en petites User Stories, l'impact reste limité.

On peut réévaluer la priorité, ajuster le backlog et adapter la suite du développement. C'est aussi pour cela que je préfère livrer progressivement plutôt qu'attendre trois semaines avant de montrer quelque chose.