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         │
│                                                 │
└─────────────────────────────────────────────────┘