# Travailler sur les bases de codes d’héritage (ou un entrepreneur'la vie de )

<!--category-- Legacy Code -->
<datetime class="hidden">2024-11-06T22:30</datetime>

# Introduction

En tant que développeur indépendant, l’une des compétences dont vous avez besoin pour apprendre rapidement est de travailler efficacement sur les bases de code existantes.

[TOC]

# Les défis

Les systèmes d’ancienneté présentent des défis considérables; particulièrement lorsque les principaux développeurs / architectes

## Documentation

Cela est souvent négligé, particulièrement dans les petites entreprises. En général, vous avez besoin de documents clés 4

1. **Guides pour les nouveaux développeurs** Comment gérer le projet? *à l'échelle locale* (pour en savoir plus dans un minuteM SK1 quelles considérations y ont-elles (si, par exemple, vous avez besoin d’un cadre différent de l’actuel
2. **Documents de déploiement** dans ces jours-là, lorsque la CI/CD est considérée comme l’or de déploiement -la norme de mise en place de ce système'est souvent négligé que vous devez savoir comment déployer le système manuellementM SK3 C’est particulièrement vrai si vousMST4 travaillez sur un système quiM ST5existe depuis quelque temps et comporte beaucoup d’étapes manuellesM st6
3. **Procédures de résolution des problèmes**; que faites-vous lorsque le système tombe en panne ? À qui appelez-vous? Quelles sont les principales choses à vérifierM SK3 C'est souvent négligé, mais est-il CRUCIAL dans un système de production?
4. **Architecture / Système-Docs de conception**; comment fonctionne le système? Quels sont les composantes clés ? Quelles sont la dépendance principaleM SK3 Pensez à cela comme à votre carte routière lorsqu’il s’agit d’apprendre un nouveau système. Il fournit une vue d’ensemble élevée de la façon dont le système fonctionne, ce qui peut être critique. Dans une application .NET Core, cela comprendrait un diagramme des services et de la façon dont ils interagissent les uns avec les autres.

La documentation est l’une des choses que nous, en tant que développeurs, avons souvent peur de faire (it's N’est pas le codeM SK2 mais c’est ce qu’il faut faire 's crucialMSC4 Comme vous pouvez le constater, J’aime le marquage de MarkdownMNK5 avec les likes de Mermaid et PlantUML, vous pouvez créer quelques diagrammes et cartes d’écoulement vraiment intéressants qui peuvent être inclus dans votre documentation.

Il doit être CURRENT; Les développeurs discutent souvent de bits-rotM SK2 où les dépendances d’un projet ' sont devenues obsolètes MSC4 risques de sécurité immédiatsMNK5 Cela vaut aussi pour la documentationMRK6 s’il ne fait pas l’objet d’une mise en œuvre courante.

Les niveaux de documentation varient, mais en général *chaque fois que vous modifiez le code qui est mentionné dans un document, vous devez mettre à jour ce document*.

## Faire fonctionner le système localement

C'est souvent un défi; particulièrement si le système est en place depuis quelque temps . Vous devez savoir quelle version de Node M SK2 M SK3NET etc., Quelle version de la base de donnéesMSC5 quelle version du cadre, etc\. Ce problème est souvent négligé mais il est CRUCIAL d'aller de l'avant et de fonctionner rapidement.

I' j’ai souvent vu des développeurs dire que cela n’est pas pertinent dans ces jours de systèmes nuisibles et de grandes applications distribuées, mais je ne suis pas d’accord avec , vous devez être en mesure de faire fonctionner le système localement pour débuger rapidement et efficacement les problèmes.

1. Profilage - il semble que ce soit devenu un ' développeur avancé seulement' habiletéM SK3 mais c’est ' crucial d’être en mesure de profiler votre code pour voir où se trouvent les créneaux d’étranglementMSC5 Cela est particulièrement vrai dans un système héréditaire où vous ne pourrez peut-être pas avoir le luxe de pouvoir réécrire le système à partir du bas. [La tracée des points](https://www.jetbrains.com/profiler/) et [Données de mémoire](https://www.jetbrains.com/dotmemory/)sont inestimables ici. Plus particulièrement dans les applications ASPM SK1NET ; les problèmes les plus importants sont généralement MSC3leaks' dans le systèmeMNK5 fuites de mémoireMRK6 fuite des connexions, etc.. Alors que votre application semble fonctionner FINE pendant un peu vous en trouvez soudainementMMK8s crashing / utilisant tout la mémoire sur le serveurMCK10
2. Trouver des problèmes dans le débugger - Vous aimez ou non les jours de `Response.Write` dans l'ASP classique sont sur. Pour une application encore modestement complexe (en particulier celles que vous n'avez pas writtenM SK2t écrire ) c'est important de ' passer par M' passez par le codeMNK6 MNK7 Suivre une demande depuis son entrée au service pour identifier ce qui pourrait se produireMRK8 quelles exceptions ne peuvent pas être capturées, etc.
3. Enregistrement - Encore une fois souvent négligée (sorry mais aucun filtre d'exception ASP.NET Core au sommet de la pile n'est pas suffisant [Postes précédents](/blog/onlogging), l'enregistrement est une partie essentielle du travail dans le code LOCALLY . Rappelez-vous que vous pouvez utiliser les types d'enregistrement des clients (par exemple en utilisant [Enregistrement des générateurs de sources](https://learn.microsoft.com/en-us/dotnet/core/extensions/logger-message-generator)) dans ASPM SK1NET Core. Vous pouvez ensuite spécifier les types d'événements qui devraient être enregistrés et ceux qui ne devraient pas. 't\. C'est crucial pour un système d'ancienneté où vous n'avez peut-être pas le luxe de pouvoir réécrire le système à partir du bas.
   Pour les Insights de l’application, vous pouvez vouloir des Journeys d’utilisateur et d’autres fonctionnalités; cependant être au courant *ce qui devient coûteux rapidement* si l'on utilise `LogInformation` pour chaque demande. Vous pouvez utiliser un procédé de télémétrie personnalisé pour filtrer les requêtes que vous ne souhaitez pas rejeter'dont vous ne voulez pas s'enregistrer
4. Essais - trop souvent je vois les développeurs 'essai dans le préproduit' ou pensant que l'unité de test puis vérification est ENOUGH en termes d'essaisM SK3 Son RARELY ISMSC4 il y aMNK5 une grande valeur à la fois en utilisant un outil comme Resharper / NCrunch pour exécuter automatiquement des essais d'unitésMska7 cependant, rappelez-vous que les tests d'une unité sont simplement ce qu'ils essaient M; ils essaient un m'unitMske10 du codeMMK11 Vous devez conserver la visibilité sur la façon dont le système fonctionne réellement en concertation avec d'autres composantsMRK12 C'est là où les essais de l'intégration entrent en jeuMST13 ils testent comment le système marche dans son ensembleMSP14 vous pouvez utiliser un outillage comme [SpecFlow](https://specflow.org/) pour écrire ces essais dans un ordinateur humain-format lisible. Encore une fois ; cruciale dans un système d’ancienneté où vous n’avez peut-être pas le luxe de pouvoir réécrire le système du tout

Dans TOUS les projets sur lesquels je travaille, la première étape consiste à faire fonctionner le système (ou une grande partie de celui-ci ) localement. En voyant le codeM SK3 exécutant le code~, en débugging le code vous pouvez avoir un aperçu de la façon dont le système fonctionne.

## La base de code

Dans chaque système, c’est votre *Source de la vérité*, peu importe ce que les docteurs disent , ce que vous disent d’autres au sujet de la façon dont il devrait fonctionner, c’est ainsi qu’il fonctionne.

### Naviger sur une base de codes d'héritage

C’est souvent difficile, c’est ce qu’il est' c'est comme trouver votre chemin dans une nouvelle ville sans carte routière . heureusement, dans les applications vous avez un point d’entrée M SK3 un chargement de page / un appel API à l’extrémité avant etcMSC5 choisissez un point et démarrez là-bas

Utilisez tout ce dont vous avez besoin pour y interagir, qu'il s'agisse de l'employé postal de ' ou d'un utilisateur du site Web d'Http.

### Réfactorisation

En règle générale, laissez-le là jusqu’à ce que vous comprenez le système. Il ' est toujours tentant de ' le jeter et de commencer de nouveauM SK3 cependant, résister à cette tentation. Plus particulièrement pour un système en cours *Il fonctionne.* reconstruction / même la réfactorisation d'un système est un risque énorme. Oui, c'est le FUN de ' mais pour chaque ligne de code que vous modifiez, vous risquez d'introduire de nouveaux bugs extrêmement intéressants

Comme tout autre (surtout lors de la passation d'un contrat) vous devez justifier le travail que vous exécutez sur un système . soit cette justification doit être axée sur l'un des éléments suivants

1. **Rendement** - le système est lent et il faut l'accélérer  soyez de nouveau attentif, ce que vous trouvez lente peut être la façon dont le système a été conçu pour fonctionnerM SK3 Faire fumer rapidement une partie risque d'entraîner des problèmes plus loin dans le systèmeMSC4 Pouvez-vous ' tuerMST6 le serveur de base de donnéesMst7 si vous faites trop de demandes, avez-vous un mécanisme qui va bien?
2. **Sécurité** - le système est insécuritaire et doit être rendu sécuritaire . Il s'agit d'un problème délicatM SK2 surtout dans un système legacy. Avec bitMSC4rot vous pouvez constater que le système utilise des versions anciennes de bibliothèques qui ont connu des problèmes de sécuritéMST5 C'est une bonne justification pour travaillerMSP6 cependant, soyez conscient que vous aurez peut-être besoin de réfactor un LOT du système pour le mettre à jourMSL7 de nouveau, ce qui mènera à la MST8 nouveaux bugsM ST9 issueM st10
3. **Maintenance** - le système est difficile à entretenir et doit être amélioré de façon à ce qu'il soit plus facile d'entretenir . En général, cela devient beaucoup de travail; la durée de vie actuelle de la base de code justifie-t-elle cette situationMSC3 Si vousM SK4 dépensez plus de temps en effectuant ces changements pour améliorer l'entretien que si vous' n'avez jamais économisé pour le client alors il ne vaut pas la peineMST6et encore une foisM ST8 code modifié MST9 nouveaux bugsM st10
4. **Expérience de l'utilisateur** - Je donne généralement la priorité à ces questions. *Utilisateur* Il n’y a pas de problème' si votre code est M SK1 meilleur; ils sont ceux qui paient pour le travail que vous faites en fin de compte . Si vous pouvez rendre leur expérience meilleure qu’elle ne l’estMSC4 c’est généralement la bonne choseMST5 Cependant MST6 Soyez conscients que cela peut être une Mst7 pente glissanteMst8 des changementsM st9 vous pourriez trouver que vousMstr10changez un LOT du système afin d’apporter un petit changement à l’utilisateurM str11

## Le travail sur les systèmes d'héritage

Cela est souvent négligé; particulièrement par les développeurs . Vous devez pouvoir justifier le travail que vous faites sur un systèmeM SK2 C'est particulièrement vrai dans un environnement de passation des marchés où vous' êtes rémunérés par heureMSC5 En fin de compteMST6 ilMst7 n'est pas votre code et non vos fondsM st8 Le POURQUOI vous MST9 faites une modification, c'est souvent plus important que la modification elle-mêmeMSt10

J’ai travaillé comme entrepreneur depuis plus d’une décennie.

En tant que développeurs, nous avons tendance à être des gens d’affaires piètres. Nous sommes axés sur la perfection à chaque tour.

Dans le cadre d’un engagement à plus long terme, cela INCLUE la garantie de *nouveau* code is maintainable and cost-efficient to run . In legacy systems this is MUCH HARDERM SK2 You often have to wade through a swamp, being anxious that as you learn the system you CANNOT offer much valueMSC4 `I'm not making any changes` vous pensez `I'm just learning the system`.
Il s’agit d’une fausse idée.

## Le peuple

Une fois de plus souvent négligée, beaucoup du temps que vous 're apporté en tant qu’entrepreneur parce qu’une personne clé a quitté (donnM SK3ne participe pas à la politique de ce projetMSC4 c’est-à-dire, 'ce n’est pas votre préoccupation). Vous devez pouvoir travailler avec les gens qui sont là pour réaliser les objectifs du projet
Dans un contrat, vous aurez généralement les modalités de votre engagement énoncées ( dans mon contrat actuel, c’est-à-dire 's 'accroître la fiabilité et réduire les coûts d’exploitationM SK4 concentrer sur cela. Si vous ne savez pas ce que cela signifie alors ASKMSC7

Gardez à l’esprit qui est votre contact direct; particulièrement au cours des premiers mois . Informez-les de ce que vous faites et de ce qu’ils trouvent.

Rappelez-vous, c'est la personne qui approuvera votre facture ; il ne devrait pas y avoir de surprises au moment de la facturation M SK2 Une fois que vous commencerez à vérifier le code régulièrement, cela est moins d'un problème ; vous avez un dossier exact de ce que vous avez fait et des répercussions qu'il a eues
**Ils doivent savoir ce que vous avez fait et pourquoi ils devraient vous payer pour cela.**

## La fiabilité

Encore une fois, retour au code legacy ; si vous faites un changement en général, vous devez le déployer. Même le meilleur d'entre nous le fera de temps à autreM SK3 surtout dans les systèmes de codage traditionnel il y aura quelque chose *Vous ne le savez pas.* lorsque vous déployez . Cela revient à l'enregistrement - si vous avez un serveur de staging et que celui-ci a un LOT d'enregistrement, mais qu'il est maintenu pendant une courte période, ) alors lorsque vous le déploiez à L'IS, vous pouvez recueillir plus d'information sur ce qui a échoué.

Quelle que soit la qualité de votre travail, combien d’essais locaux vous avez effectuésM SK1 nous sommes tous humains . Il s’agit là d’une partie clé du 'donMSC4t déploiement le vendrediRègle 'MST6 espérez qu’un déploiement causera un nouveau problème sur un systèmeMSP7 Soyez prêt à travailler jusqu’à ce qu’il soit résoluMSV8MSS9 Si vous n’êtes pas–MSV10t NOUVELLEZ pourquoi il a échouéM SV11 Ajouter davantage d’épreuves pour reproduire le problème et plus d’enregistrement afin de vous assurer que vous atteignez des problèmes semblables dans l’avenirM Sv12

En particulier pour les systèmes de production, votre système de mise en place ne peut pas être 1:1 (surtout lorsqu'il s'agit d'un chargement [k6](https://k6.io/) peut vous aider à simuler la charge (et mieux localement où vous pouvez effectuer le profilage approprié comme indiqué précédemment).

## Déploiement

Une fois de plus souvent négligée dans la fervour pour le CI/CD est le POURQUÊTE de cesM SK1 Simple; Vous serez en train d’épuiserMSC3 Ayant une façon très rapide et efficace de déployer un système signifie que lorsque vous le rompez, vous pouvez également le réparer plus rapidement . Si votre système d’examen des codes CI signifie qu’il faut MST5 jours pour obtenir une fusion PR alors queMSSK6 est le plus rapide que vous pouvez raisonnablement faire un systèmeMSL7 Si vos systèmes CD signifient que vous détruisez le système qui fonctionneMSR8 vous êtes habitués aux longues nuitsM SR9

Un mécanisme efficace pour corriger et mettre en place le code est essentiel à une conduite de développement efficace.

## 'Fixing Legacy Apps'

J’inscrit cela dans les citations car il s’agit d’une question.

- Patches en cours

Ce processus consiste simplement à réparer le code existant.
I won't lie ce type de développement est rarement FUN car vous êtes toujours susceptibles d’évacuer dans l’embleau de la base de code existante . Cependant, ilMSC3est un mal nécessaire dans bien des casM SK4

Comme d’habitude, vous devez s’assurer qu’il y a un certain formulaire de vérification pour extraire le code courant; idéalement il devrait aussi vérifier l’échec du problème que vous essayez de résoudre AVANT de procéder à la réparation.
.
Ils IDYLL pour cela est d'avoir un test unitaire qui cible étroitement la zone de code que vous devez corriger, mais ce n'est souvent pas dans le cadre du travail pour les grands systèmes distribués.

I'd utilisent généralement un système d’essais dans cet ordre de préférence

1. Tests d'unité - de nouveau, ils sont préférables car vous pouvez les cibler pour n'exercer que le code sur lequel vous travaillez . Cependant, dans un système antérieur, ces tests ne sont souvent pas présents
2. Essais d’intégration - C’est un terme trop chargé puisqu’il peut couvrir tout ce qui va de l’unité d’essai qui passe par plusieurs couches de code (ceux sont le mieux évités ) à utiliser les likes des excellentes [Vérifier](https://github.com/VerifyTests/Verify) de même que les tests de Selenium. En général, vous voulez tester le système dans son intégralité; cependant, soyez conscients que ces essais peuvent être lentes et fragilesM SK2 Utiliser la méthode Verify peut souvent être une excellente approche pour les systèmes d'ancienneté car vous pouvez au moins 'verifier
3. Essais manuels - EVERY developer should try and run manual tests for any code checkin. Ce n'est qu'à s'assurer que ce que vous attendez de l'utilisateur 'M SK3 \(ce qui peut être un utilisateur réel ou une autre composante du système interagissant avec votre code \ ) pour voir, c'est ce qu'ils voient en fait | . Cela peut être aussi simple que d'exécuter le système localement et de vérifier la sortie d'une page ou aussi complexe que de faire une série complète d'essais sur un serveur de staging

- Revêtement de l'oignon
  Pour travailler sur des systèmes d’ancienneté, vous obtiendrez généralement 'pas le luxe d’une révision complète . C’est là que j’utilise l’approche 'onion skinning

Pour vous permettre de mettre à niveau les PARTS d'un système, vous pouvez identifier des composants qui peuvent être séparés d'une monolith existante en un microservice (pour une valeur de 'micro'). Cela peut constituer un excellent moyen de commencer à moderniser un système sans risquer de recourir à un réaménagement completM SK3
Parmi les exemples communs, on peut citer la division des points de fin API en nouveaux projets qui utilisent davantage d'éléments mis à jour. Le terrore du DRY peut entrer en jeu ici cependantM SK1 Une solution mal structurée a souvent beaucoup de 'helperMSC3 ou 'service\' composantes qui devraient vraiment figurer dans différents projets |(ou même dans des paquets nuget pour une réutilisation plus globale | ).

J’aborderai cette approche plus loin dans un article ultérieur, car elle constitue un élément clé de la façon dont je travaille sur les systèmes d’ancienneté.

# Rémunération

Maintenant que nous avons tout cela à faire jusqu’à ce qu’il y ait le dur problème du paiement. J’ai une règle générale :

**Questions de paiement I'je veux aller plus loin**

Si vous payez tardivement, selon votre contrat mais au plus tôt dans les 30 jours, mais généralement plus près de la 7;, c’est un mauvais signe.

Donn't mess around with this ; if you've done your job you need to be paid in a timely fashionM SK3 It doesnMSC4 it matter how much you enjoy itMST5 if a bad customer CAN exploit you they willMst6 ItM st7s NEVER worth itm st8

Soyez honnête.

J’ai dirigé des équipes de développeurs et j’ai été un développeur. ;, I', je suis un entrepreneur et ', je viens d’être un client.., j’en ai vu tous les aspects et je peux vous dire, ;, si vous n’êtes pas payé à temps, alors il faut aller plus loin.

En ce qui concerne le taux, je charge plus pour les projets où j’ai davantage de responsabilités.

# En conclusion

C'est bien ce que je fais aujourd'hui et demain pour le funérail de ma grand-mère, '. Je panique un peu que j'ai un grand système d'héritage à apprendre.