Carte Context Mapping #3 : Conformist
📇 Carte #3 : Conformist
Vue Rapide
🎯 Objectif : L’équipe downstream adopte le modèle upstream sans traduction
👥 Relation d’équipe : Upstream/Downstream (asymétrique)
📊 Couplage : Haut (adhérence au modèle upstream)
Concept
L’équipe downstream accepte simplement le modèle et les conventions de l’équipe upstream.
Upstream (modèle de référence)
↓ (pas de traduction)
Downstream (adopte le même modèle)
La philosophie : “Ce que vous donnez, nous l’utilisons tel quel”
Quand l’Utiliser ? ✅
- ✅ Le modèle upstream est suffisamment bon pour votre besoin
- ✅ Créer une ACL serait trop complexe ou non rentable
- ✅ L’upstream est stable et bien conçu
- ✅ Vous avez une dépendance forte et c’est acceptable
- ✅ L’équipe upstream a du poids politique ou est essentielle
Exemples
- API publique stable : Adopter directement une API bien conçue
- Plateforme core : Tous les services acceptent le modèle core
- Standard industrie : Utiliser un standard reconnu (ISO, RFC, etc.)
Quand l’Éviter ? ❌
- ❌ Le modèle upstream est incompatible avec votre domaine
- ❌ L’upstream change fréquemment sans coordination
- ❌ Vous avez besoin de dépendances croisées (Partner pattern est meilleur)
- ❌ C’est une dépendance temporaire (better: Anticorruption Layer)
- ❌ Le modèle upstream est mal conçu (Big Ball Of Mud)
Questions Clés à se Poser 💭
- Est-ce que le modèle upstream nous convient vraiment ?
- Allons-nous devoir le modifier plus tard ?
- Quels sont les risques de cette adhérence ?
- Comment restons-nous informés des changements ?
- Qui décide des évolutions du modèle shared ?
Implications pour l’Équipe Downstream
Responsabilités
- ✓ Accepter le modèle tel qu’il est
- ✓ Communiquer rapidement si le modèle pose problème
- ✓ Collaborer avec upstream pour améliorations
- ✓ Supporter les changements d’upstream
Avantages
- ✓ Simple : pas de couche de traduction
- ✓ Rapide à intégrer : implémentation directe
- ✓ Couplage intentionnel : c’est du domaine partagé
- ✓ Moins de bugs : une seule source de vérité
Risques
- ⚠️ Pollina votre modèle : compromis sur votre pureté
- ⚠️ Couplage fort : difficile à défaire
- ⚠️ Bloqué par upstream : changements lents
- ⚠️ Conflit de visions : deux domaines, une structure
Implications pour l’Équipe Upstream
Responsabilités
- ✓ Maintenir une API stable : les downstream dépendent de vous
- ✓ Communicer les changements : informer rapidement
- ✓ Respecter la compatibilité : ou avoir un processus de migration
- ✓ Écouter les besoins downstream
Avantages
- ✓ Influence : votre modèle devient référence
- ✓ Couplage maîtrisé : par design
Risques
- ⚠️ Responsabilité : you break it, you own all the consequences
- ⚠️ Évolution lente : devoir négocier avec tous les conformists
Exemples de Conformist Patterns
1. Shared Business Model
Upstream Team (Orders Domain)
├── Order { id, customerId, items, status }
├── OrderItem { productId, quantity, price }
└── Status enum
Downstream Team (Invoicing)
└── Adopte exactement le même modèle
├── Invoice utilise Order directement
├── InvoiceItem utilise OrderItem
└── Respecte Status enum
2. API Publique Standard
Upstream: REST API (JSON well-known)
{
"id": "...",
"name": "...",
"type": "...",
"metadata": { ... }
}
Downstream Services:
└── Tous utilisent exactement cette structure
Pas de traduction
3. Industrie Standard (XML/JSON Schema)
Standard: UBL Invoice
Upstream (supplier): génère UBL
Downstream (customer): consomme UBL
→ Pas de traduction
Exemple Concret : Plateforme E-commerce
Contexte
Vous avez une équipe Product Core qui gère l’essai central.
Modèle Core (Upstream)
class Product {
sku: string
name: string
category: Category
price: Money
inventory: Inventory
status: ProductStatus
tags: string[]
}
Équipes Downstream Conformistes
// Équipe Pricing
class PriceCalculator {
calculatePrice(product: Product): Money {
// Utilise directement product.price
// Respecte la structure core
}
}
// Équipe Recommendation
class RecommendationEngine {
recommend(product: Product): Recommendation {
// Utilise directement product.tags, category
// Pas de traduction
}
}
// Équipe Search
class SearchIndexer {
index(product: Product): void {
// Indexe directement les champs product
}
}
Le Défi
Si Product Core décide de renommer status → productStatus :
- ✅ Facile : juste mettre à jour partout
- ❌ Rigide : tous les services doivent suivre immédiatement
Processus de Conformité
Upstream Decision
↓
Communicate to all Conformists
↓
All teams implement change
↓
Verify all are synchronized
Quand Basculer vers Anticorruption Layer ?
Signes d’alerte 🚨
- ❌ Le modèle upstream pose problème dans 2+ équipes downstream
- ❌ Vous avez des " hacks locaux" pour adapter le modèle
- ❌ L’upstream change sans coordination
- ❌ Vous envisagez de “contourner” les conventions
Signal : “On devrait créer une ACL”
Intégration avec Context Mapping
Patterns Associés
- Shared Kernel : Quand c’est du code partagé, pas juste un modèle
- Anticorruption Layer : Si le conformism devient trop coûteux
- Partnership : Quand les downstream ont du poids politique
Risques Combinés
Trop de Conformists
↓
Upstream devient responsable de l'impact
↓
Upstream bloqué par les dépendances
↓
Besoin d'une meilleure architecture
Checklist de Mise en Place ✓
- Le modèle upstream est vraiment applicable à votre contexte
- Vous êtes d’accord pour être “locked in” à ce modèle
- Il y a un processus de communication pour les changements
- Vous avez une stratégie de migration si ça ne fonctionne plus
- L’équipe upstream accepte la responsabilité
Ressources et Lectures
- Domain-Driven Design par Eric Evans - Conformist
- Building Microservices par Sam Newman - Shared Data
- DDD Crew - Context Mapping
Notes de Facilitation pour l’Atelier
Animation
- Demandez : “Pouvez-vous vraiment vivre avec ce modèle ?”
- Testez : “Et dans 2 ans, quand ça aura changé ?”
- Documentez : “Pourquoi avez-vous choisi Conformist ?”
Pièges Communs
- ⚠️ Pas de vraie raison : “Conformist par défaut”
- ⚠️ Trop de Conformists : Upstream devient goulot
- ⚠️ Pas de communication : Les changements surprennent
- ⚠️ Mauvaise raison : “On n’a pas le choix” = power imbalance
Questions Provocatrices
- “Et si vous deviez contourner ce modèle ? Qu’est-ce que ça veut dire ?”
- “Est-ce que cette adhérence est une force ou une faiblesse ?”
- “Qui a le poids politique pour décider des changements ?”
- “Quand allez-vous basculer vers une ACL ?”