Carte Context Mapping #13 : Matrice de Sélection des Patterns

📇 Carte #13 : Matrice de Sélection des Patterns

Vue Rapide

🎯 Objectif : Choisir le bon pattern selon votre situation

📊 Type : Guide de décision


Arbre de Décision

Q1: Les deux contextes dépendent-ils l'un de l'autre?

├─ NON, zéro dépendance
│  └─ SEPARATE WAYS ✓ (ou Independent Teams)
│
└─ OUI, il y a dépendance
   │
   ├─ Q2: Est-ce une dépendance mutuelle (symétrique)?
   │  │
   │  ├─ OUI, mutuelle
   │  │  │
   │  │  ├─ Q3: Vous voulez partager du code?
   │  │  │  ├─ OUI → SHARED KERNEL ✓
   │  │  │  └─ NON → PARTNERSHIP ✓
   │  │  │
   │  │  └─ (Relation d'équipe: Mutually Dependent)
   │  │
   │  └─ NON, asymétrique (Upstream/Downstream)
   │     │
   │     ├─ Q3: Combien de downstream?
   │     │  │
   │     │  ├─ Beaucoup (3+)
   │     │  │  └─ PUBLISHED LANGUAGE ✓
   │     │  │
   │     │  └─ Peu (1-2)
   │     │     │
   │     │     ├─ Q4: Collaborer sur l'interface?
   │     │     │  ├─ OUI → CUSTOMER/SUPPLIER DEVELOPMENT ✓
   │     │     │  └─ NON
   │     │     │     │
   │     │     │     ├─ Q5: Le modèle upstream convient?
   │     │     │     │  ├─ OUI → CONFORMIST ✓
   │     │     │     │  └─ NON → ANTICORRUPTION LAYER ✓
   │     │     │
   │     │     └─ (Relation d'équipe: Upstream/Downstream)
   │
   └─ SPÉCIAL: Découvrir un Big Ball Of Mud?
      └─ BIG BALL OF MUD = symptôme (stratégie: Strangler)
         Puis appliquer les patterns au nouveau code

Matrice Décisionnelle

Par Type de Relation d’Équipe

Relation Patterns Possibles Couplage Avantages Risques
Independent Separate Ways Aucun Vitesse, Autonomie Duplication
Mutually Dependent Shared Kernel, Partnership Haut/Moyen Collaboration, Cohésion Synchronisation lente
Upstream/Downstream Published Language, Customer/Supplier, Conformist, ACL Moyen-Bas Clarté, Scalabilité Blocking sur upstream

Par Situation

Situation 1: Legacy System + Nouveau Projet

Q: Pouvez-vous modifier le legacy?
├─ NON, intouchable
│  └─ ANTICORRUPTION LAYER
│     (Bubble Context protégeant le nouveau)
│
└─ OUI, progressif
   └─ SEPARATE WAYS + Strangler Pattern
      (Extraire nouveau, laisser legacy coexister)

Situation 2: Plateforme Core + Multiples Services

Q: Core tient-il le poids?
├─ NON, trop changements
│  └─ SEPARATE WAYS
│     (Chacun sa version)
│
└─ OUI, stable et bon
   ├─ Peu de consumers
   │  └─ CUSTOMER/SUPPLIER DEVELOPMENT
   │
   └─ Beaucoup de consumers
      └─ PUBLISHED LANGUAGE
         (Spec stable, chacun sa traduction)

Situation 3: Deux Équipes, Même Produit (Frontend/Backend)

Q: Avez-vous du code réellement partagé?
├─ OUI (domain models, value objects)
│  └─ SHARED KERNEL + PARTNERSHIP
│
└─ NON, juste interfaces
   └─ PARTNERSHIP
      (API négociée, chacun son code)

Situation 4: Données Critiques Partagées

Q: Temps-réel synchronisation requise?
├─ OUI, toujours sync
│  ├─ Même équipe/code
│  │  └─ SHARED KERNEL (literal)
│  │
│  └─ Équipes différentes
│     └─ PARTNERSHIP + synchrone
│        (Risque: tightly coupled)
│
└─ NON, batch/async OK
   └─ SEPARATE WAYS + Events
      (Broadcast events, each reacts asynchronously)

Par Critères Techniques

Critère: Modèle Upstream Compatible?

Compatible?
├─ OUI, parfait fit
│  └─ CONFORMIST
│
└─ NON, beaucoup diffère
   └─ ANTICORRUPTION LAYER

Critère: Interface Complexité

Traduction simple?
├─ OUI (champs directs)
│  └─ CONFORMIST ou ACL simple
│
└─ NON (calculs, agrégation)
   └─ ACL complexe
      ou chercher alternative (Published Language?)

Critère: Scalabilité

Combien de consumers?
├─ 1-2
│  └─ Upstream/Downstream simple OK
│
├─ 3-5
│  └─ Published Language commence
│
└─ 5+ ou communauté
   └─ Published Language obligatoire
      (ou découpler vers Independent)

Par Coût d’Intégration

Coût TRÈS haut?
├─ OUI (complexe, risqué)
│  └─ Réévaluer dépendance
│  └─ Considérer SEPARATE WAYS
│  └─ Ou créer ACL (isolation)
│
└─ NON, acceptable
   └─ Choisir selon la relation d'équipe

Anti-patterns à Éviter

❌ Anti-pattern 1: Partnership Sans Communication

"On va faire de la partnership!"
→ Pas de réunions régulières
→ Changements unilatéraux
→ Dépendances cassées

Correction: Ajouter governance (réunions, process)
Ou revenir à Upstream/Downstream plus clair

❌ Anti-pattern 2: Shared Kernel Sans Propriétaire

"On partage le code!"
→ Personne ne le maintient
→ Divergence progessive
→ Chacun ajoute ses trucs

Correction: Nommer responsables du kernel
Ou réduire à vraiment partagé

❌ Anti-pattern 3: Trop d’Upstream/Downstream

"Platform est upstream de 50 services"
→ Platform bottleneck
→ Trop lent, trop tendu

Correction: Migrer vers Published Language
Ou découpler (services Independent)

❌ Anti-pattern 4: Oublier la Team Relationship

"On applique Shared Kernel"
→ Mais équipes ne communiquent jamais
→ Chaos prévisible

Correction: Pattern compatible avec relation d'équipe!

Feuille de Décision Rapide

Remplissez:

Question 1: Dépendance mutuelle ou asymétrique?

  • Mutuelle → Q2
  • Asymétrique → Q4
  • Aucune → Separate Ways

Question 2 (si mutuelle): Code partagé ?

  • Oui → Shared Kernel
  • Non → Partnership

Question 3 (si asymétrique-peu): Collaborer sur design?

  • Oui → Customer/Supplier Development
  • Non → Q4

Question 4 (si asymétrique-simple): Modèle upstream OK?

  • Oui → Conformist
  • Non → Anticorruption Layer

Question 5 (si asymétrique-beaucoup): Published Language

  • Oui (stable, public) → Published Language
  • Non (instable) → Attendre stabilisation

Checklist: Ai-je Choisi le Bon Pattern?

  • Type d’équipe : corresponde au pattern (Mutuelle/Asymétrique/Indépendant)
  • Communication : fréquence OK pour maintenir pattern
  • Interface : clairement définie et documentée
  • Escalation : processus défini pour conflits
  • Métriques : tracking la santé de l’intégration
  • Rôles : clairement définis (propriétaire, maintenant)
  • Evolution : plan si situation change

Migrations Entre Patterns

Evolution Naturelle

Partnership (trop couplé)
    → Anticorruption Layer (découpler)
    → vers Separate Ways ou Independent

Upstream/Downstream (1-2 services)
    → Published Language (5+ services)
    → vers scalabilité

Shared Kernel (trop lourd)
    → Reduce à vraiment partagé
    → ou Partnership + moins de partage

Conformist (model drift)
    → Anticorruption Layer (adapter)
    → si drift important

Déclencheurs de Migration

Performance → Independent Teams
Communication overhead → Anticorruption / Separate Ways
Political power → Change relation d'équipe
Scalability → Published Language
Stability → Conformist → ACL

Ressources et Lectures

  • Domain-Driven Design par Eric Evans - Bounded Contexts
  • DDD Reference - Strategic Design Patterns
  • DDD Crew - Context Mapping
  • Team Topologies - Org Design + Context Mapping alignment

Utilisation en Atelier

Exercice 1: Identifier le Pattern Actuel

Pour chaque contexte:
1. Dessiner les contextes
2. Identifier la dépendance
3. Classifier équipes
4. Identifier pattern
5. Est-ce intentionnel ou accidentel?

Exercice 2: Designer le Pattern Futur

1. Où aimeriez-vous être?
2. Pattern ciblé?
3. Étapes de transition?
4. Risques?
5. Bénéfices?

Exercice 3: Matrice de Votre Système

Créer une matrice 2D:
├─ X axis: contextes (Catalog, Order, Payment, ...)
├─ Y axis: contextes (Catalog, Order, Payment, ...)
├─ Cells: pattern actuel
└─ Color code: sain vs problématique

Cas d’Usage Réel

E-commerce (Exemple)

Catalog ↔ Inventory: Shared Kernel (Product partagé)
Catalog ← Pricing: Upstream/Downstream (Published Language)
Catalog ← Search: Upstream/Downstream (Anticorruption Layer, data pipeline)
Order ↔ Billing: Partnership (négocie interface)
Order → Payment: Upstream/Downstream (Published Language)
Payment ← Analytics: Separate Ways (batch export nightly)

Relation d’équipe:

Catalog Team: Upstream pour 3 services
Product Team (Order+Billing): Partnership (mutuelle)
Ops Team (Payment, Infrastructure): Independent