Workflow de développement piloté par les spécifications : des exigences au code

Cinq phases, de l'intention au code vérifié.

Sommaire

Le développement piloté par les spécifications fonctionne lorsque la spécification est un flux de travail, et non un document que l’on classe après le lancement. L’objectif n’est pas de produire un vaste document de exigences produit.

L’objectif est de traverser une séquence d’artefacts révisables, chacun réduisant l’ambiguïté avant que quiconque – humain ou agent IA – ne modifie le code de production.

Si vous ne savez pas ce qu’est le SDD conceptuellement, commencez par Qu’est-ce que le développement piloté par les spécifications ? pour les définitions, les comparaisons avec le TDD et le BDD, et le cas pour traiter la spécification comme source de vérité. Cet article du cluster de documentation Architecture d’application est le guide opérationnel. Il parcourt les cinq phases, montre ce que chaque artefact doit contenir, explique où s’insèrent les agents IA, et fournit des modèles réutilisables que vous pouvez copier dans votre dépôt dès aujourd’hui.

Flux de travail du développement piloté par les spécifications – exigences, conception, tâches, implémentation, validation

Le SDD est un flux de travail, pas un document

Le mode de défaillance le plus courant en développement piloté par les spécifications est de traiter la spécification comme une paperasse. Une équipe rédige un long document d’exigences, le stocke dans un wiki, puis code à partir de mémoire et de fils de discussion. La spécification existe, mais elle ne conduit à rien. C’est du théâtre de documentation, et c’est pire que l’absence de spécification car cela crée une fausse confiance.

Un flux de travail SDD fonctionnel produit une chaîne d’artefacts, chacun révisé avant le début de la phase suivante. Les exigences réduisent l’ambiguïté produit. La conception réduit l’ambiguïté technique. Les tâches réduisent l’ambiguïté d’exécution. L’implémentation produit du code contre une cible connue. La validation prouve que la chaîne a tenu. Lorsqu’une phase révèle une erreur, vous corrigez l’artefact et relancez à partir de ce point – pas après que trois mille lignes de dérive soient atterries dans main.

flowchart LR A[Spécifier] --> B[Planifier] B --> C[Tâches] C --> D[Implémenter] D --> E[Valider] E -->|dérive trouvée| A E -->|livrer| F[Terminé]

Le flux de travail est neutre en matière d’outils. Vous pouvez l’exécuter avec des fichiers markdown dans Git, avec GitHub Spec Kit, avec des plans Cursor, ou avec un éditeur de texte brut et un réviseur discipliné. Ce qui compte, c’est la séquence et les portes d’examen, pas la marque de l’outil.

Phase 1 – Spécifier les exigences

La phase de spécification répond à la question du problème que vous résolvez et de ce à quoi ressemble la fin. Elle évite délibérément comment le construire. Le moment où votre spécification d’exigences dit « utiliser des ensembles triés Redis », vous avez cessé de spécifier et avez commencé à concevoir dans le mauvais document. Gardez l’implémentation hors des exigences. Mettez-la dans le plan.

Énoncé du problème et utilisateurs

Commencez par un paragraphe qui énonce le problème en langue claire. Nommez les utilisateurs affectés et la situation qui rend le problème douloureux. Un bon énoncé de problème permet à un réviseur qui n’était pas à la réunion de planification de décider si une solution proposée adresse réellement la douleur.

Exemple pour une fonctionnalité de limitation de taux d’API :

Les consommateurs d’API du niveau gratuit peuvent envoyer des requites illimitées, ce qui provoque des pics de coûts et des impacts de voisinage bruyant sur les locataires payants. Les opérateurs de plateforme ont besoin d’une limite par clé exécutable sans intervention manuelle.

Objectifs, non-objectifs et critères d’acceptation

Les objectifs décrivent les résultats que vous livrerez. Les non-objectifs décrivent le travail adjacent tentant que vous ne ferez pas explicitement. Ensemble, ils bornent la créativité de l’agent, ce qui est essentiel lorsque les outils IA « aident » autrement à étendre la portée.

Section Bon exemple Mauvais exemple
Objectif Rejeter les requêtes dépassant la limite par clé avec HTTP 429 Rendre l’API plus rapide
Non-objectif Tableaux de bord de facturation par locataire Améliorer toutes les performances de l’API
Critère d’acceptation Les requêtes non authentifiées reçoivent 401 avant que la vérification de taux ne s’exécute Le point de terminaison est sécurisé

Les critères d’acceptation doivent être suffisamment précis pour que chacun se traduise par au moins un test. « Le point de terminaison est sécurisé » n’est pas un critère d’acceptation. « Les requêtes non authentifiées reçoivent HTTP 401 » l’est. Si vous ne pouvez pas écrire un critère concret, l’exigence est encore trop vague pour être implémentée.

Questions ouvertes

Listez chaque décision qui n’est pas encore tranchée. Les questions floues ne sont pas un signe d’échec. Elles sont la phase de spécification qui fait son travail. Résolvez-les avant d’écrire le plan de conception, ou vous paierez pour l’ambiguïté dans le rétravail d’implémentation.

Un modèle d’exigences minimal :

## Problème
[Un paragraphe : qui souffre, pourquoi, et ce qui déclenche la douleur.]

## Utilisateurs
- [Rôle utilisateur principal]
- [Rôle utilisateur secondaire]

## Objectifs
1. [Résultat mesurable]
2. [Résultat mesurable]

## Non-objectifs
- [Explicitement hors champ]
- [Explicitement hors champ]

## Critères d'acceptation
- [ ] [Comportement vérifiable]
- [ ] [Comportement vérifiable]

## Questions ouvertes
- [ ] [Question qui bloque la planification]

Phase 2 – Planifier la conception

La phase de planification traduit l’intention en décisions techniques. C’est ici que les ensembles triés Redis appartiennent, ainsi que les limites des modules, les changements de schéma, les contrats API, les étapes de migration, les contraintes de sécurité et la stratégie de test. Le plan est dérivé de la spécification d’exigences plus des contraintes existantes de votre projet – choix de pile, enregistrements de décision, et conventions stockées dans des fichiers comme AGENTS.md ou une constitution de projet.

Architecture et modules affectés

Nommez les modules, services ou packages qui changeront et résumez le modèle d’intégration. Si la fonctionnalité traverse une limite de service, documentez le contrat des deux côtés. Les agents hallucinent des API lorsque les contrats sont implicites. Les rendre explicites dans le plan empêche les points de terminaison inventés et les formes de réponse incorrectes.

Modèle de données, contrats API et migrations

Documentez les changements de schéma, les nouvelles tables ou champs, les exigences d’index et les règles de compatibilité ascendante. Pour les API HTTP, écrivez la méthode, le chemin, la forme de la requête, la forme de la réponse et les codes d’erreur. Pour les événements, écrivez les noms de sujets, les schémas de charge utile et la sémantique de livraison. Incluez les étapes de migration et les notes de restauration lorsque le modèle de données change.

Sécurité, observabilité et stratégie de test

Les contraintes de sécurité appartiennent au plan, pas en après-pensée lors de la revue de code. Notez les exigences d’authentification, les règles d’autorisation, les limites de validation des entrées et les données qui ne doivent pas apparaître dans les journaux. L’observabilité doit couvrir les métriques, journaux ou traces nécessaires pour confirmer que la fonctionnalité fonctionne en production.

La stratégie de test relie aux critères d’acceptation. Identifiez quels critères nécessitent des tests unitaires, lesquels nécessitent des tests d’intégration et lesquels nécessitent une vérification manuelle. Si vous utilisez les tests unitaires en Go ou les tests unitaires en Python, nommez les packages et fichiers de test que vous vous attendez à ajouter. Un plan sans stratégie de test est un plan qui sera livré avec des lacunes que vous découvrirez en production.

flowchart TB subgraph plan [Contenu du plan de conception] R[Spécification d'exigences] C[Constitution du projet / ADR] R --> D[Décisions d'architecture] C --> D D --> M[Modèle de données et migrations] D --> A[Contrats API] D --> S[Contraintes de sécurité] D --> T[Stratégie de test] end

Phase 3 – Décomposer les tâches d’implémentation

La phase de tâche décompose le plan en tranches suffisamment petites pour être implémentées, révisées et validées indépendamment. C’est ce qui rend le développement assisté par agent révisable. Au lieu d’une différence énorme, vous obtenez une séquence de changements cibles qui chacun remontent à une exigence nommée.

Dimensionnement des tâches et dépendances

Une bonne tâche touche un ensemble borné de fichiers, se complète en une session d’agent et se termine par une étape de vérification. Les tâches doivent déclarer explicitement les dépendances. Les tâches de migration s’exécutent avant le code qui lit le nouveau schéma. Les changements de bibliothèque partagée s’exécutent avant les consommateurs. Les changements de middleware d’authentification s’exécutent avant les points de terminaison qui dépendent du nouveau comportement.

flowchart TD T1[Tâche 1 -- migration de schéma] --> T2[Tâche 2 -- couche de référentiel] T2 --> T3[Tâche 3 -- gestionnaire HTTP] T2 --> T4[Tâche 4 -- instrumentation des métriques] T3 --> T5[Tâche 5 -- tests d'intégration] T4 --> T5

Fichiers, validation et points de contrôle de révision

Chaque tâche doit lister les fichiers susceptibles de changer, les critères d’acceptation qu’elle satisfait et comment valider l’achèvement. La validation peut être une commande de test, un exemple curl ou une vérification manuelle décrite en étapes copiables. Chaque tâche se termine à un point de contrôle de révision humaine. Le réviseur confirme que la différence correspond à la description de la tâche avant que la tâche suivante ne commence.

Une entrée de tâche minimale :

### Tâche 3 -- Ajouter le middleware de limitation de taux

**Dépend de :** Tâche 1 (schéma), Tâche 2 (référentiel)
**Fichiers :** middleware/ratelimit.go, middleware/ratelimit_test.go, server.go
**Satisfait :** AC-2 (429 au-delà de la limite), AC-3 (en-têtes de limite dans la réponse)
**Valider :** `go test ./middleware/...` passe ; curl au-delà de la limite retourne 429 avec Retry-After
**Point de contrôle de révision :** Confirmer que le middleware s'exécute après l'authentification, avant le gestionnaire

Garez-vous aux explosions de tâches générées. Les agents IA peuvent produire des plans de cinquante tâches en quelques secondes. La plupart de ces tâches seront redondantes ou trop granulaires pour être révisées efficacement. Une liste de tâches utile pour une fonctionnalité moyenne a souvent cinq à quinze éléments, pas cinquante.

Phase 4 – Implémenter une tâche à la fois

L’implémentation est délibérément étroite. Choisissez une tâche, donnez à l’agent uniquement le contexte dont il a besoin pour cette tâche, et arrêtez lorsque la validation passe. Les réinitialisations de contexte entre les tâches sont une fonctionnalité, pas un bug. Elles empêchent les hypothèses antérieures de polluer le travail ultérieur et gardent les différences révisables.

Appliquer les contraintes de la pile de spécification

L’agent d’implémentation doit lire la spécification d’exigences, le plan de conception, la description de la tâche actuelle et les contraintes au niveau du projet. Les contraintes sont la section au ROI le plus élevé que la plupart des équipes sautent. Elles disent à l’agent ce qu’il ne doit pas faire – ne refactorisez pas les modules non liés, ne changez pas les signatures d’API publiques en dehors de cette fonctionnalité, n’introduisez pas de nouvelles dépendances sans mettre à jour le plan.

Mettre à jour le plan lorsque la réalité diffère

L’implémentation fera surface des surprises. Une bibliothèque ne supporte pas le comportement supposé. Une migration prend plus de temps que prévu. Un cas limite manquait aux critères d’acceptation. Lorsque cela se produit, mettez à jour la spécification avant de continuer. Corrigez les exigences ou le plan, obtenez une révision rapide, puis reprenez l’implémentation contre l’artefact corrigé. Le code qui diverge silencieusement de la spécification est ainsi que la dérive devient permanente.

sequenceDiagram participant H as Réviseur humain participant A as Agent IA participant S as Artefacts de spécification H->>S: Approuver tâche N A->>S: Lire tâche + plan + contraintes A->>A: Implémenter tâche N A->>A: Exécuter validation de tâche A->>H: Soumettre différence pour révision H->>H: Réviser différence contre tâche alt dérive ou surprise H->>S: Mettre à jour spécification/plan H->>A: Relancer avec contexte corrigé else approuvé H->>S: Marquer tâche N comme terminée H->>A: Passer à tâche N+1 end

Phase 5 – Valider contre la spécification

La validation est là où le SDD gagne sa vie. Sans elle, la spécification est un exercice de planification. Avec elle, la spécification est un contrat que vous pouvez vérifier contre le code livré.

Vérifications automatisées

Exécutez la suite complète de tests, lint et vérifications de type sur CI. Connectez-les à votre pipeline en utilisant des modèles de la cheat sheet GitHub Actions si vous avez besoin d’un point de départ pratique. Les vérifications automatisées attrapent les régressions. Elles n’attrapent pas les mauvaises fonctionnalités construites correctement, c’est pourquoi la révision des critères d’acceptation compte toujours.

Critères d’acceptation et révision manuelle

Parcourez chaque critère d’acceptation de la spécification d’exigences. Marquez chacun comme satisfait, échoué ou reporté avec justification. La révision manuelle attrape les problèmes UX, les lacunes de sécurité et les comportements incorrects que les tests ont manqués parce que les tests étaient écrits pour correspondre à une spécification défectueuse.

Différence spécification-code

L’étape finale de validation compare l’implémentation contre le plan de conception. Les fichiers qui ont changé correspondent-ils aux fichiers que le plan a prédits ? Les décisions architecturales dans le code correspondent-elles aux décisions enregistrées ? Les fichiers inattendus dans la différence sont un signal – soit le plan était incomplet, soit l’agent a erré. Les deux méritent attention avant la fusion.

Couche de validation Attrape
Tests unitaires et d’intégration Régressions et logique incorrecte dans le champ
Lint et vérifications de type Problèmes de style et erreurs de type
Parcours des critères d’acceptation Mauvais comportement construit selon spécification
Différence spécification-code Dérive architecturale et dépassement de champ

Où les agents IA s’insèrent dans le flux de travail

Les agents IA sont des accélérateurs sur chaque phase, pas des remplacements pour la révision. Le modèle productif est brouillon, révision, raffinage, puis procéder. Demandez à un agent de rédiger la spécification d’exigences à partir d’une description de problème, puis éditez l’intention jusqu’à ce que les objectifs, non-objectifs et critères d’acceptation soient corrects. Demandez à un agent de rédiger le plan de conception à partir des exigences approuvées, puis révisez les décisions d’architecture avant qu’aucun code n’existe. Demandez à un agent d’implémenter une tranche de tâche à la fois, avec vous approuvant chaque différence avant que la tâche suivante ne commence.

flowchart LR subgraph human [L'humain possède] H1[Intention et priorités] H2[Approbation d'architecture] H3[Révision de différence aux points de contrôle] H4[Acceptation finale] end subgraph agent [L'agent accélère] A1[Rédiger exigences] A2[Rédiger plan de conception] A3[Générer liste de tâches] A4[Implémenter tranches de tâche] A5[Rédiger tests] end H1 --> A1 --> H1 A1 --> A2 --> H2 H2 --> A3 --> A4 --> H3 H3 --> A4 A4 --> A5 --> H4

Les agents sont particulièrement utiles pour produire des premiers brouillons et des tests boilerplate. Les humains sont particulièrement utiles pour attraper les mauvais objectifs, l’architecture unsafe et le dépassement de champ subtil. Le flux de travail échoue lorsque l’un ou l’autre côté est sauté – lorsque les agents implémentent sans spécifications, ou lorsque les humains écrivent des spécifications sans jamais les valider contre le code.

Cet article de flux de travail reste neutre en matière d’outils par intention. Les guides d’exécution spécifiques aux outils – configuration d’éditeur, commandes slash, configuration d’agent – appartiennent au cluster Outils de développement IA. Le pilier processus vit ici sous les pratiques de documentation parce que les artefacts comptent plus que le vendeur.

Erreurs courantes qui tuent le développement piloté par les spécifications

Des spécifications énormes avant toute validation. Un document d’exigences de trente pages écrit avant un prototype ou un spike est de la paperasse en cascade, pas du SDD. Écrivez la spécification minimale qui retire l’ambiguïté pour la phase suivante, puis validez les hypothèses tôt. Chaque fonctionnalité n’a pas besoin de la boucle complète de cinq phases – Développement piloté par les spécifications vs Vibe Coding explique quand une structure plus légère suffit.

Des critères d’acceptation vagues. Les adjectifs comme « rapide », « propre » et « convivial » ne sont pas des critères d’acceptation. Remplacez-les par un comportement mesurable. Si vous ne pouvez pas le tester, vous ne pouvez pas l’implémenter de manière fiable – surtout avec un agent IA.

Des non-objectifs manquants. Sans non-objectifs, les agents étendent le champ par défaut. Ils ajoutent des couches de cache, refactorisent les modules voisins et introduisent des dépendances que vous n’avez pas demandées. Les non-objectifs sont comment dire non à l’avance.

Aucun plan de test dans la phase de conception. Les tests écrits uniquement après l’implémentation ont tendance à confirmer ce qui a été construit, pas ce qui était intentionnel. Le plan doit nommer quels critères d’acceptation se traduisent dans quels types de tests avant que le premier fichier de production ne change.

Sauter la révision aux limites de phase. La spécification révisée avant le plan. Le plan révisé avant les tâches. Les tâches révisées avant l’implémentation. Chaque porte est bon marché. Corriger la dérive après une grande fusion est coûteux.

Laisser les tâches générées exploser. Traitez une liste de tâches générée par IA de cinquante éléments comme un premier brouillon, pas un calendrier. Fusionnez les éléments redondants, divisez les surdimensionnés et supprimez les tâches qui ne se traduisent pas à une exigence.

Le SDD fonctionne lorsque chaque phase réduit l’ambiguïté. Il échoue lorsqu’il crée de la paperasse.

Modèles réutilisables

Copiez-les dans votre dépôt et adaptez-les. Stockez les spécifications à côté de la branche de fonctionnalité, révisez-les dans les pull requests, et gardez-les sous contrôle de version pour que les agents et les humains lisent la même source.

Modèle d’exigences

# Fonctionnalité -- [nom]

## Problème
## Utilisateurs
## Objectifs
## Non-objectifs
## Critères d'acceptation
## Questions ouvertes

Modèle de conception

# Conception -- [nom de la fonctionnalité]

## Résumé
## Modules affectés
## Changements de modèle de données
## Contrats API
## Migrations
## Sécurité
## Observabilité
## Stratégie de test
## Risques et atténuations

Modèle de liste de tâches

# Tâches -- [nom de la fonctionnalité]

## Tâche 1 -- [titre]
Dépend de :
Fichiers :
Satisfait :
Valider :
Point de contrôle de révision :

## Tâche 2 -- [titre]
...

Liste de vérification de validation

# Validation -- [nom de la fonctionnalité]

## Automatisé
- [ ] Tous les tests passent
- [ ] Lint propre
- [ ] Vérification de type propre

## Critères d'acceptation
- [ ] AC-1 --
- [ ] AC-2 --

## Spécification-code
- [ ] Les fichiers modifiés correspondent au plan
- [ ] Aucun changement architectural non documenté
- [ ] Spécification mise à jour si l'implémentation a différé

Conclusion

Le développement piloté par les spécifications n’est pas question d’écrire plus de documents. C’est une question de traverser spécifier, planifier, tâches, implémenter et valider avec une porte de révision à chaque étape. Chaque phase devrait laisser l’acteur suivant – humain ou agent – avec moins de devinettes que la phase précédente.

Commencez petit. Exécutez le flux de travail complet sur une fonctionnalité de taille moyenne. Gardez les artefacts en markdown dans le dépôt. Mettez à jour la spécification lorsque la réalité diverge. Validez avant la fusion. Lorsque la chaîne fonctionne, vous obtenez moins de dérive, des différences révisables plus petites et un enregistrement durable d’intention qui survit aux réinitialisations de session et aux transferts d’équipe.

Lorsque la chaîne devient de la paperasse, coupez le champ – pas la révision. Une spécification de deux pages qui a été validée vaut mieux qu’une spécification de trente pages que personne n’a lue.

Liens utiles

S'abonner

Recevez de nouveaux articles sur les systèmes, l'infrastructure et l'ingénierie IA.