Comment refondre un legaCy sans cris ni larmes
-
Retour d'expérience et bonnes pratiques
Qui a déjà participé à une refonte ?
Qui considère que CETTE refonte est une totale réussite ?
Kevin Balicot
Lead développeur Akawaka
Un peu de contexte 🫠
Projet client BtoB
- Code vieux de 10 ans
- Pas de framework
- Pas de POO
- Pas de test...
PARTIE 1 : Pourquoi faire une refonte ?
Dette technique ?
⚠️ Problème de maintenabilité ⚠️
MisE à jour régulière ?
⚠️ Failles de sécurité, perte de performance ⚠️
Bonnes pratiques ?
⚠️ Retard sur l'écosystème PHP ⚠️
Outils qualité & CI/DI ?
⚠️ Bloque toute évolution ⚠️
Bus factor ?
⚠️ Perte de connaissance ⚠️
Tests ?
⚠️ Pas de couverture contre les régressions ⚠️
Bilan
💣 BOMBE à RETARDEMENT 💣
Mais avant de toucher au code ...
Fixer la stratégie
Refonte progressive vs refonte "one shot"
Vision progressive

Un pont entre le nouveau et l'ancien
Gérer le routage avec Apache

Gérer LA persistance de connexion
Coté legacy : Session PHP
Coté Symfony : Débrancher système par défaut
Workflow
Entry Point
ERP Authenticator
Legacy Session Bridge
Legacy Session Storage
PHP Session
Legacy
Symfony
Gérer les mots de passe

Documentation : https://symfony.com/blog/new-in-symfony-4-4-password-migrations
La stratégie finale
Tout nouveau code sur Symfony
Déprécier le legacy
Refondre petit à petit le legacy
Fixer des Objectifs de la refonte
- Page plus rapide
- Moins de connexions à la base de données
- Moins de consommation CPU / RAM
- ...
KPI pour le suivi d'avancement de la refonte pour l'équipe et la direction
Valider ces objectifs avec Blackfire

PARTIE 2 : InitiER la refonte
Faire un inventaire de l'application
Lister tous les fichiers et les catégoriser
Pré-nettoyage : fichier inutile et problème de directory structure

Lister toutes les URLs / Endpoints
Vision sur la charge de travail de la refonte

Mettre en place un golden master ...
Parcourir l'application et sauvegarder les rendus

... Pour se protéger
Mettre en place un filet de sécurité

Mise en place DU GOLDEN MASTER avec Behat
On ouvre une URL
On récupère le contenu de la requête
Si snapshot non existant, création de celui-ci
Si snapshot existant, génération d'un diff
Si diff alors test en erreur
Mise en place d'outils de qualité
Rector : Automatisation migration PHP
Php Stan : Analyse de code statique
Php cs fixer : Correction présentation de code
Intégration continue
Automatiser les outils
Analyse la qualité à chaque changement de code
PARTIE 3 : modèles et architectures
Specification
Encapsuler les règles métiers
Mutualiser les règles métiers
Composition de règles
Application
if A
if B
if A || B
...
IsA
IsB
IsA or IsB
Rule et Rule Engine
Ajouter du comportement sur les règles métiers
Chaîne de responsabilité avec plusieurs règles
Application
if A
then a
if B
then b
Rule Engine
IsARule
When IsA
Then a
IsBRule
When IsB
Then b
Instrumentation
Historiser les processus critiques
Logger l'entrée & sortie d'un processus
Retracer en cas d'erreur
Application
IsARule
When IsA
Then a
12-05-23 15:01:59 rule.a.start { "foo": "bar" }
12-05-23 15:02:00 rule.a.success
12-05-23 15:02:01 rule.b.start { "foo": "bar" }
12-05-23 15:02:05 rule.b.error { "reason": "because ..." }IsBRule
When IsB
Then b
Développement modulaire
Cloisonner la logique dans des contextes métiers
S'aider du métier pour définir les contextes critiques
ADR, Action Domain Responder
Action : Point d'entrée d'une requête
Domain : Logique métier
Responder : Traite le rendu de la réponse
CQRS, Command Query REsponsIbility Segregation
Distingue les opérations de lecture et d'écriture
Query pour la lecture, Command pour l'écriture
Approches techniques différentes
DDD, hexagonale, clean code ...
Cloisonner le code par contexte métier
Développement en couche : ADR et CQRS
Beaucoup d'abstraction pour les implémentations techniques
⚠️ Tout n'est pas applicable pour votre projet ⚠️
Assurer la continuité
Documentation ADR, Architecture Decision Records
Fixe une solution technique à un problème

Pair programming
Adhésion aux nouvelles pratiques, implémentation
Transmission des connaissances
Génération de code automatisé
Symfony Maker

Maintenir la qualité
Tester ! 💪
Développer c'est tester
Couverture sur les aspects critiques
Tests fonctionnels avec Behat
Test fonctionnel simplifié

Conclusion
Recette d'une refonte 👩🍳 ...
1 - Lister tous les problèmes de l'application
2 - Définir une stratégie et des objectifs
3 - Faire un inventaire de l'application
4 - Mettre en place un Golden Master
5 - Mettre des outils d'analyse de code
6 - Implémenter des Design Pattern et des architectures
7 - Consolider les choix avec des ADR et du Pair programming
8 - Tester !
... Mais pas une recette magique
Dépend du projet
Dépend de l'équipe
Besoin de stratégie qui répond au contexte
Comment refondre UN LEGACY sans cris ni larmes ?
Une volonté commune de corriger les problèmes
Des assurances et du suivi d'objectifs
l'implémentation D'outils et de bonnes pratiques
Vous faire aider 😘
Merci !
Kevin Balicot @kevinbalicot
Lead développeur Akawaka
Venez discuter avec nous :)

Vos retours par ici 🙏

Comment refondre un legacy sans cris ni larmes
By Kevin Balicot
Comment refondre un legacy sans cris ni larmes
- 110