Skip to content

L'Entropie des Systèmes d'Information

Définition de l'entropie

"L'entropie mesure le degré de désordre d'un système. Dans un SI, l'entropie augmente naturellement avec le temps si rien n'est fait pour la contrôler."

Loi fondamentale :

  • Tout système d'information tend naturellement vers le chaos
  • Sans intervention constante, la complexité augmente
  • La dette technique s'accumule exponentiellement
  • Les couplages se multiplient

Manifestations concrètes de l'entropie

SymptômeCause racineImpact businessImpact équipe
Code spaghettiCouplage fort, pas de structure claire-50% vélocité développementFrustration, turnover
Bugs récurrentsAbsence tests, refactoring impossible-30% satisfaction clientsPompiers permanents
Déploiements risquésPas d'automatisation, dépendances cachéesIncidents ×3, downtimeStress, astreintes
Documentation obsolètePas maintenue, connaissances tacitesOnboarding 6 moisBus factor = 1
Silos organisationnelsCommunication rompue entre équipesTime to market ×2Conflits, inefficacité
Performances dégradéesOptimisations premières suppriméesPerte clients impatientsHotfixes en urgence

Visualisation : Évolution entropie SI

Complexité/Coût

    │                             ╱╱╱ Sans gouvernance
    │                          ╱╱╱    (Chaos total)
    │                       ╱╱╱
    │                    ╱╱╱
    │                 ╱╱╱
    │              ╱╱╱
    │           ╱╱╱
    │        ╱╱╱─────────── Avec pilotage actif
    │     ╱╱╱                (Entropie maîtrisée)
    │  ╱╱╱
    │╱╱╱________________________________________________
    0   1    2    3    4    5    6    7    8    9   10
                                              Temps (années)

Point de rupture → Refonte inévitable

Message clé :

"Sans action, l'entropie transforme votre actif (SI) en passif. La courbe exponentielle vous rattrape toujours."


Stratégies anti-entropie

1. Architecture intentionnelle (vs émergente subie)

Principe : Concevoir pour le changement, pas pour aujourd'hui seulement.

Actions concrètes :

  • ✅ Bounded Contexts clairs (DDD)
  • ✅ Interfaces/Contracts explicites entre modules
  • ✅ Séparation concerns (hexagonale)
  • ✅ Couplage lâche, cohésion forte

Anti-pattern :

❌ "On verra plus tard pour l'archi"
❌ "Quick & dirty, on refactorera"
❌ Architecture émergente non pilotée

Exemple :

typescript
// ❌ Entropie : Couplage direct DB partout
class OrderController {
  async createOrder(req, res) {
    const order = await db.query('INSERT INTO orders...');
    await db.query('UPDATE inventory...');
    await emailService.send(...); // Mélange responsabilités
    res.json(order);
  }
}

// ✅ Anti-entropie : Couches séparées, contracts clairs
class OrderController {
  constructor(private placeOrderUseCase: PlaceOrderUseCase) {}
  
  async createOrder(req, res) {
    const command = new PlaceOrderCommand(req.body);
    const orderId = await this.placeOrderUseCase.execute(command);
    res.status(201).json({ orderId });
  }
}
// Domain ignorant de HTTP, DB, Email

2. Remboursement dette technique continu

Principe : La dette technique est comme un crédit à intérêts composés.

Formule :

Coût total dette = Dette initiale × (1 + Taux intérêt)^Années

Exemple :
Année 1 : 100K€ dette
Taux intérêt : 20%/an (baisse vélocité)

Année 1 : 100K€
Année 2 : 120K€
Année 3 : 144K€
Année 4 : 173K€
Année 5 : 207K€  → Dette doublée !

Stratégie de remboursement :

ApprocheDescriptionQuand l'utiliser
20% Rule20% du temps sprint dédié refactoringContinu (recommandé)
Boy Scout Rule"Laisser code plus propre qu'on l'a trouvé"À chaque modification
Refactoring Sprints1 sprint/trimestre 100% detteDette critique accumulée
RewriteRéécriture complèteDette > 80% coût développement

Mesure de la dette :

Outils automatiques :
- SonarQube : Code smells, duplications, complexité
- CodeClimate : Maintenability score
- NDepend (.NET) / JArchitect (Java)

Métriques :
- Complexité cyclomatique (< 10 par méthode)
- Duplication code (< 3%)
- Couverture tests (> 80%)
- Ratio commentaires (10-30%)

KPI Business :
Dette technique (€) = Temps perdu bugs/refactoring × Coût équipe

Exemple chiffré :

Équipe 5 devs, coût 350K€/an

Temps perdu dette technique :
- Bugs récurrents : 30% temps
- Code incompréhensible : 20% temps  
- Refactoring obligé : 16% temps
Total : 66% temps = 231K€/an de dette !

Plan remboursement 18 mois :
Investir 150K€ refactoring → Réduire dette à 50K€/an
ROI : Économie 181K€/an dès année 2
Payback : 10 mois

3. Automatisation maximum

Principe : Tout ce qui est manuel sera oublié, mal fait, ou source d'erreurs.

Pyramide d'automatisation :

       Niveau 4 : Auto-scaling, self-healing

       Niveau 3 : Déploiement continu (CD)

       Niveau 2 : Tests automatisés, CI

       Niveau 1 : Build automatisé

       Niveau 0 : Tout manuel (CHAOS)

Checklist automatisation :

  • [ ] Build : npm run build → artefact déployable (< 5min)
  • [ ] Tests : Suite complète à chaque commit (< 15min)
  • [ ] Qualité : Linting, formatage, analyse statique (< 2min)
  • [ ] Déploiement : 1 commande (ou auto) vers tous envs
  • [ ] Infrastructure : Terraform/IaC (reproductible)
  • [ ] Monitoring : Dashboards auto-générés
  • [ ] Alertes : Escalation automatique selon gravité
  • [ ] Backups : Quotidiens, testés mensuellement
  • [ ] Rollback : 1 clic, < 5min

ROI automatisation :

Déploiement manuel :
- Préparation : 30min
- Exécution : 1h
- Vérification : 30min
- Total : 2h/déploiement
- Fréquence : 2×/mois
- Coût : 4h × 12 mois = 48h/an = 4 800€

Déploiement automatisé :
- Setup initial : 40h (one-time)
- Déploiement : 5min (automatique)
- Fréquence : 10×/jour (!) 
- Coût : 40h setup = 4 000€
- Payback : 10 mois

Bénéfices :
✅ Déploiements 10×/jour vs 2×/mois
✅ Rollback immédiat si problème
✅ Confiance équipe ↑
✅ Time to market ↓

4. Documentation vivante

Principe : La documentation statique est morte à l'instant où elle est écrite.

Techniques documentation vivante :

A) Architecture Decision Records (ADR)

markdown
# ADR-001 : Choix PostgreSQL comme base de données principale

Date : 2024-01-15
Statut : ✅ Accepté
Décideurs : CTO, Tech Lead, Architecte

## Contexte
Refonte SI nécessite choix base de données pour domaine transactionnel.

## Décision
PostgreSQL 15+ sera utilisé comme base principale.

## Raisons
1. ACID complet (transactions critiques commandes)
2. JSON support (flexibilité schéma certain modules)
3. Maturité (25+ ans, production-proven)
4. Écosystème riche (extensions, outils)
5. Compétences équipe (DBA PostgreSQL existant)

## Alternatives considérées
- MySQL : Moins de features avancées (JSON, window functions)
- MongoDB : Pas ACID multi-documents, risque cohérence
- Oracle : Coûts prohibitifs (licences)

## Conséquences
✅ Transactions ACID garanties
✅ Pas de coûts licensing
⚠️ Scaling horizontal complexe (si > 10M rows)
→ Mitigation : Read replicas + partitioning si besoin

## Références
- Benchmark : https://www.postgresql.org/about/benchmarks/
- Migration guide : docs/migration/postgres.md

Avantages ADR :

  • Contexte décision préservé
  • Onboarding nouveaux devs
  • Éviter "pourquoi on a fait ça ?"
  • Historique traçable (Git)

B) Tests comme documentation

typescript
// ❌ Documentation séparée (obsolète rapidement)
/**
 * Place une commande.
 * @param customerId - ID du client
 * @param items - Liste produits
 * @returns ID commande
 */
function placeOrder(customerId, items) { ... }

// ✅ Tests documentent le comportement attendu
describe('PlaceOrder', () => {
  it('should create order when customer exists and stock available', () => {
    // Given
    const customer = aCustomer().withId('C123').build();
    const items = [{ sku: 'P1', qty: 2, price: 50 }];
    givenCustomerExists(customer);
    givenStockAvailable('P1', 10);
    
    // When
    const orderId = placeOrder('C123', items);
    
    // Then
    expect(orderId).toBeDefined();
    expect(orderTotal(orderId)).toBe(100);
  });
  
  it('should reject order when customer not found', () => {
    givenCustomerDoesNotExist('C999');
    
    expect(() => placeOrder('C999', [...])).toThrow(CustomerNotFoundError);
  });
  
  it('should reject order when insufficient stock', () => {
    givenStockAvailable('P1', 1);
    const items = [{ sku: 'P1', qty: 10 }];
    
    expect(() => placeOrder('C123', items)).toThrow(InsufficientStockError);
  });
});

Avantages :

  • Documentation toujours à jour (sinon tests cassent)
  • Exemples concrets d'utilisation
  • Lisible par non-devs (Given/When/Then)

C) Diagrammes as Code (C4, Mermaid)

javascript
// docs/architecture/context-diagram.mmd
graph TB
    User[Utilisateur] -->|HTTPS| WebApp[Application Web]
    WebApp -->|REST API| Backend[Backend Monolithe]
    Backend -->|SQL| DB[(PostgreSQL)]
    Backend -->|Events| Queue[RabbitMQ]
    Queue -->|Consume| Workers[Background Workers]
    Workers -->|Email| SMTP[Service Email]
    
    style Backend fill:#f9f,stroke:#333
    style DB fill:#bbf,stroke:#333

Généré automatiquement dans la CI :

bash
# .github/workflows/docs.yml
- name: Generate diagrams
  run: |
    npx @mermaid-js/mermaid-cli -i docs/**/*.mmd -o docs/generated/

Avantages :

  • Versionnés avec le code
  • Toujours synchronisés
  • Faciles à modifier (texte vs Visio)

Cas Concret : L'entropie en action

Projet e-commerce startup

Année 1 (2018) : MVP Rapide

Équipe : 2 devs
Codebase : 10K lignes PHP
Architecture : Monolithe simple
Vélocité : 20 story points/sprint
Déploiement : 1×/semaine (manuel, 2h)
Bugs prod : 2-3/mois
Satisfaction client : 85%

💡 Décisions rapides :
❌ "Pas le temps pour les tests"
❌ "On fera l'archi propre plus tard"
❌ "Copy/paste pour aller vite"

Année 3 (2020) : Croissance

Équipe : 5 devs
Codebase : 50K lignes
Architecture : Monolithe couplé
Vélocité : 15 story points/sprint (-25% !)
Déploiement : 1×/mois (risqué, 4h)
Bugs prod : 15-20/mois
Satisfaction client : 72%

⚠️ Symptômes entropie :
- 40% temps debug bugs récurrents
- Peur de toucher au code
- Déploiements terrifiants
- Nouveaux devs perdus (3 mois onboarding)

Année 5 (2022) : Crise

Équipe : 12 devs (turnover 50%/an !)
Codebase : 200K lignes
Architecture : Big Ball of Mud
Vélocité : 8 story points/sprint (-60% !)
Déploiement : 1×/trimestre (weekend, toute l'équipe)
Bugs prod : 40+/mois
Satisfaction client : 58%
Incidents majeurs : 1×/mois (downtime)

🔴 Point de rupture :
- Productivité dev : 8h/semaine utile (reste = dette)
- Perte clients : -15% due lenteur/bugs
- Concurrents plus agiles mangent parts marché
- Dette technique estimée : 450K€ (= 3× budget annuel dev)

💰 Décision : Refonte totale
Investissement : 1.5M€
Durée : 18 mois
Résultat : Nouveau SI, mais 5 ans perdus

Calcul du coût de l'entropie :

Coût opportunité (5 ans) :
─────────────────────────
Perte vélocité : -60% = 720 jours dev perdus
Coût : 720j × 600€ = 432K€

Bugs production :
40 bugs/mois × 4h/bug × 60 mois × 75€/h = 720K€

Turnover (50%/an) :
6 devs/an × (recrutement 20K€ + onboarding 3 mois) = 270K€

Incidents :
12 incidents/an × (downtime 4h × 10K€ CA/h) = 480K€

Refonte finale : 1 500K€

TOTAL : 3 402K€ sur 5 ans

Alternative (dette remboursée progressivement) :
20% temps refactoring dès An 1 : 350K€
Tests automatisés : 100K€
Archi propre initiale : 80K€

TOTAL : 530K€

ÉCONOMIE : 2 872K€ !!

Synthèse : Votre mission de Manager SI

Combat contre l'entropie = Combat quotidien

┌─────────────────────────────────────────────────┐
│  MANAGER SI = GARDIEN DE L'ORDRE                │
├─────────────────────────────────────────────────┤
│                                                 │
│  🎯 Objectifs :                                 │
│  1. Mesurer l'entropie (métriques dette)        │
│  2. Allouer ressources anti-entropie (20% temps)│
│  3. Architecture intentionnelle (ADR, revues)   │
│  4. Automatiser impitoyablement (CI/CD, IaC)    │
│  5. Culture qualité (tests, refactoring)        │
│                                                 │
│  ⚠️ Vigilance :                                 │
│  • Entropie est exponentielle (agir tôt !)      │
│  • Refonte = échec du combat contre entropie    │
│  • Quick wins court terme = dette long terme    │
│                                                 │
│  ✅ Indicateurs succès :                        │
│  • Vélocité stable ou ↑                         │
│  • Dette technique < 20% coût dev              │
│  • Déploiements fréquents sans stress           │
│  • Nouveaux devs productifs en < 1 mois         │
│                                                 │
└─────────────────────────────────────────────────┘