Pour avoir passé environ deux ans à plein temps à faire ce genre de boulot (améliorer du vieux code), voici ce que je peux en tirer.
Le point le plus important, et de très loin, pour améliorer le code, est le facteur humain. Si les équipes en place n’ont pas une volonté réelle d’améliorer les choses (développeurs, décideurs pour financer les modifications « non immédiatement rentables » et les outils), alors tu n’arriveras à rien, si ce n’est générer de la frustration.
Pour ça, tu dois présenter clairement à toutes les personnes concernées ce que vont impliquer les changements, contraintes et surtout avantages. En particulier, c’est primordial de présenter des avantages personnalisés à chaque acteur, ceux qui les touchent directement : amélioration de la satisfaction client et des couts à moyen terme par réduction des bugs et de la durée de maintenance aux décideurs, propreté du code aux devs sérieux, simplicité de développement et moins de bugs aux devs moins sérieux, etc.
D’autre part, il faut accepter que le nettoyage de code, c’est un travail long et sans réelle fin (vu qu’il faut conserver le nouveau code propre).
Ensuite, je rejoins plutôt bien ce qui a déjà été dit.
La technique du « figuier étrangleur » fonctionne bien, et a le gros avantage de permettre de ne pas imposer de toucher à du code qui n’a pas besoin d’évolution. Sur du vieux code, tu as souvent des pans entiers de code qui n’a plus besoin d’évolution et qui fonctionne très bien en l’état, autant ne pas y toucher tant que ça n’est pas nécessaire.
Concernant les tests (unitaires / d’intégration), ça dépend beaucoup de l’état actuel. S’il y en a peu, c’est pas la peine d’espérer une forte couverture de tests à court terme. Une bonne technique est d’en ajouter systématiquement à chaque modification (nouveau code, correction de bug), et d’ajouter un contrôle pour empêcher la diminution de la couverture de code
Souvent un problème du vieux code c’est le formatage qui est devenu complètement incohérent, ce qui rends le code difficile à lire. Ce que je fais dans ce cas, c’est ajouter un outil de formatage automatique avec interdiction (automatique) de merge de code mal formaté (et éventuellement, selon le projet, un reformatage global du projet). Par contre attention, j’ai eu des problèmes avec des reformatages de JS qui cassaient certains codes qui se basaient sur des fonctionnalités antiques de JS non-strict !
Enfin, un outil d’analyse statique (comme Sonar ou un linter quelconque) donne beaucoup de bons conseils pour améliorer le code et éviter d’introduire des mauvais comportements. Ces outils ont souvent besoin d’un peu de configuration, surtout pour éviter de hurler à chaque ligne sur les vieux projets
Mais au final tout ça c’est des outils pour aider les développeurs de (plus ou moins) bonne volonté à améliorer le code de la façon la plus confortable et efficace possible. Si cette bonne volonté n’est pas là, le projet ne pourra pas être amélioré.