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

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

Avoir une tendance de l'évolution

Problèmes 📉 = Qualité 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