# Lavorare sulle basi di codici di eredità (o un operaioM SK1 la vita)

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

# Introduzione

Come sviluppatore freelance una delle capacità che dovete imparare in fretta è come lavorare efficacemente sulle basi di codice esistenti.I'Io ho avuto la fortuna di aver costruito un sacco di sistemi di scarico--;This is a JOY as an experienced developer however it's not always the case

[TOC]

# Le sfide

I sistemi di eredità hanno problemi significativi; specialmente quando i principali sviluppatori M SK1 architetti ( se voi' siete abbastanza fortunati da poterli avereMSC4 sono andati avantiMST5

## Documentazione

Questo è spesso trascurato, specialmente nelle piccole aziende. In generale, ci servono M SK2 tipi chiave di documentazione :

1. **Guide dei nuovi sviluppatori** Come si fa a gestire il progetto? *localmente.* (ciò di più in un minutoM SK1 quali considerazioni ci sono ( se per esempio avete bisogno di un sistema diverso dal presente, è particolarmente vero con Node purtroppoMSC4
2. **Docs di distribuzione** in questi giorni, quando la CI/CD è vista come l'oro-standard di deployment è spesso superato il fatto che bisogna sapere come deplonare il sistema manualmente . Questo è particolarmente vero se si lavora su un sistema che è stato in giro da un po' e che ha molti passaggi manuali.
3. **Procedure di risoluzione dei problemi**; cosa fate quando il sistema si abbassa? A chi chiamateM SK2 Quali sono le cose chiave da controllare ? Questo è spesso superato, ma è CRUCIAL in un sistema di produzione
4. **Architectural / System-Design Docs**; come funziona il sistema? Quali sono i componenti chiaveM SK2 quali sono le dipendenze chiave ? Pensate a questo come alla vostra mappa stradale quando imparate un nuovo sistema\. Offre un'idea di alto livello del funzionamento del sistema, che può essere critico |( specialmente in sistemi più grandi | , sistemi distribuiti | МSK8 Questo dovrebbe includere quali repositori di codice sorgente sono usati |, quali sistemi CI | / | CD sono usate |M, | quali database vengono usate per ogni elemento dell'applicazione |m. | Questo può includere qualsiasi cosa da un diagramma semplice ad un completo |МSK13 | blown UML diagramma di ogni componente del sistema |. | Ad esempio in una React Application questo tipicamente includerebbe un diagrammo dei componenti e di come interagiscono tra loro e con qualsiasi servizio di backend | In una .NET Core application questo includerebbe un diagramma dei servizi e di come interagiscono l'uno con l'altro | ( | e la frontend |& | altri sistemi di backend ♫ ) | ed possibilmente ASP ♫

La documentation è una delle cose che noi come sviluppatori spesso odiamo fare (it's NOT codeM SK2 but itMSC3s cruciale . Come potete vedere io amo il MarkdownMST5 con la Mermaid e PlantUML potete creare dei disegni e dei diagrammi di flusso molto carini che possono essere inclusi nella vostra documentation

Deve essere CURRENT; gli sviluppatori spesso parlano di bitM SK1rot; dove le dipendenze di un progetto ' diventano obsolete MSC4 rischi di sicurezza assolutiMNK5 Questo vale anche per la documentationMST6 se èMst7 non è attualeMSt8 non utileM st9

Ci sono vari livelli di documentation, ma in generale. *Ogni volta che cambiate il codice a cui si riferisce in un documento dovete aggiornarlo.*.

## Funzionare il sistema localmente

Questo è spesso una sfida; specialmente se il sistema è stato in giro per un po' di tempo. Dovete sapere quale versione del Node sia M SK2 .NET ecc.

I'ho spesso visto sviluppatori dire che questo non è ' rilevante in questi giorni di sistemi cloud e grandi applicazioni distribuite , ma io non sono d'accordoM SK3 dovete essere in grado di far funzionare il sistema localmente per debuggere problemi rapidamente ed efficacementeMSC4

1. Profilare - sembra che questo sia diventato un ' solo sviluppatore avanzatoM SK2 abilità, ma è ' cruciale essere in grado di profilare il vostro codice per vedere dove ci sono le bolle di bottigliaMSC5 Questo è particolarmente vero in un sistema di eredità dove non si può avere il lusso di poter riscrivere il sistema da zero. [DotTrace](https://www.jetbrains.com/profiler/) e [DotMemory](https://www.jetbrains.com/dotmemory/)sono invaluabili qui. Specialmente nelle applicazioni ASP.NETM SK2 i più grandi problemi sono generalmente MSC3leaksMST4 nel sistemaMSL5 leak di memoriaMSR6 leaking di connessione, ecceteraMsl7 Mentre la vostra app sembra funzionare FINE per un po' improvvisamente la trovateMSSL8s crashing MSL9 consumando tutta la memoria sul serverMLS10
2. Trovare problemi nel debugger - Ci piace o no i giorni di `Response.Write` in Classic ASP sono superiori. Per un'applicazione anche modestamente complessa (in particolare quelle che non avete scrittoM SK2non scrivete ) è cruciale per 'passare attraverso 'code'MST7 seguire una richiesta dall'inizio attraverso il servizio per identificare cosa potrebbe succedereMSC8 quali eccezioni potrebbero non essere catture, ecc.
3. Logging - Ancora spesso superato (scusate ma nessun filtro ASP.NET Core di escepzioni in cima alla mappa non è sufficiente. [precedente post](/blog/onlogging), l'archiviazione è una parte cruciale del lavoro nel codice LOCALmente. Ricordate che potete usare i tipi di archiviamento dei clienti ( per esempio usando [Registrare generatori di sorgenti](https://learn.microsoft.com/en-us/dotnet/core/extensions/logger-message-generator)) in ASPM SK1NET Core. Potete poi indicare quali tipi di evento dovrebbero essere registrati e quali non dovrebbero essere 'tMSC4 Questo è cruciale in un sistema di eredità dove forse non avete il lusso di essere in grado di riscrivere il sistema da zero.
   Per l'Applicazione Insights potreste volere Journey degli utenti e altre caratteristiche; se lo sapete. *Questo diventa costoso e veloce.* se usate `LogInformation` per ogni richiesta. Potreste voler usare un Telemetric Processor personalizzato per filtrare le richieste che non volete
4. Testing - Troppo spesso vedo sviluppatori 'testing in preprod' o pensando che l'unità di test dopo averlo controllato sia OK in termini di testM SK3 E' RARELY ISMSC4 c'è la ' ha un sacco di valore sia nell'uso di uno strumento come Resharper \/ NCrunch per eseguire automaticamente i test dell'unidad \; tuttavia ricordate che gli unità di testo sono solo quello \ ;\ che testano una \ '\ unità \'\ di codice \M.\ Dovete mantenere la visibilità su come il sistema funziona realmente in coordinazione con altri componenti \m.\ Qui è dove arrivano i test di integrazione \,;\ che controllano come funziona il sistema come intero | . \ Potete usare uno strumento tipo [SpecFlow](https://specflow.org/) per scrivere questi test in un sistema umano-formato legabile. Ancora una voltaM SK2 cruciale in un legacy system where you may not have the luxury of being able to rewrite the system from scratch

In ogni progetto che lavoro, il primo passo è far funzionare il sistema (o una grande parte di essoM SK1 funzionando localmente. Vedendo il codice , che fa funzionare l' codice \,\ debuggere il codice si può avere un'idea del funzionamento del sistema.

## La Codebase

In ogni sistema questo è il vostro. *la fonte della verità.*, a prescindere da quello che dicono i dottori, cosa vi dicono gli altri su come dovrebbe funzionare questo è come funziona.

### Navigare in una base di codici ereditaria

Questo spesso è impegnativo, lo è' è come trovare la strada in una nuova città senza una mappa stradaleM SK2 Fortunatamente nelle applicazioni c'è un punto di ingresso MSC3 una pagina di caricamento / un call API all'estremità anteriore, ecc.

Usate tutto quello di cui avete bisogno per interagire con lui, che sia PostMan, ' Rider, ' HttpClient o anche una pagina web.

### Refactoring

Generalmente lasciatelo finché non capisci il sistema. È sempre tentativo 'la gettare via e ricominciare da capoM SK3 ma resistere a questa tentazioneMSC4 In particolare per un sistema in funzione (di solitoMNK6 *Funziona.* ricostruire / anche ristrutturare un sistema è un rischio enorme. Sì, è una cosa divertente, ma per ogni linea di codice che si cambia c'è il rischio di introdurre nuovi errori eccitantiM SK3

Come ogni altra cosa (in particolare quando si passano contratti ) bisogna giustificare il lavoro che si fa su un sistemaM SK2 O questa giustificazione deve essere focalizzata su uno dei seguenti:

1. **La performance** - il sistema è lento e deve essere accelerato (di nuovo siate attentiM SK2 quello che trovate lento potrebbe essere come il sistema sia progettato per funzionare). Fare in modo che una parte fumi velocemente può portare problemi più avanti nel sistemaMSC4 Riuscite a ♫' uccidereMST6 il server di base di datiMst7 se fate troppe richieste avete un meccanismo che vi fa funzionare?
2. **Sicurezza** - il sistema è insicura e deve essere reso sicuroM SK1 Questo è un problema difficile ; specialmente in un sistema di vecchia data. Con bitMSC4rot si potrebbe scoprire che il sistema sta usando vecchie versioni di biblioteche che hanno problemi di sicurezza conosciutiMST5 Questa è una buona giustificazione per il lavoroMSSK6 tuttavia si sa che potreste aver bisogno di rifare un LOT del sistema per aggiornarloMSL7 ancora una volta portando a ' nuovi erroriMS' problemaM.
3. **Maintenibilità** - il sistema è difficile da mantenere e deve essere semplificato da mantenereM SK1 In generale questo diventa molto lavoro ; la vita attuale della base di codici lo giustifica? Se spendete più tempo a fare questi cambiamenti per migliorare la sostenibilità che voiMSC5 non risparmiate mai per il cliente, allora non vale la pena.
4. **L'esperienza dell'utente** - Di solito queste questioni sono prioritari. *l'utente* Non importa se il vostro codice è 1% miglioreM SK2 sono quelli che pagano per il lavoro che fate alla fine. Se potete rendere la loro esperienza migliore di cosìMSC4 in genere vale la pena . ComunqueMST6 fate attenzione che questo può essere un MST7 inclinazione inclinataMst8 di cambiamentiM st9 potreste scoprire che voiMSST10 state cambiando un LOT del sistema per fare un piccolo cambiamento per l'utenteMsST11

## Il business di lavorare su sistemi di eredità

Questo è spesso trascurato; specialmente da sviluppatori. Bisogna essere in grado di giustificare il lavoro che state facendo su un sistema ' Questo è particolarmente vero in un ambiente di contratti dove vi pagate all'oraMSC5 Alla fineM SK6 non è il vostro codice e non i vostri soldiMST8 Il motivo per cui state facendo un cambiamento è spesso più importante del cambiamento stessoMst10

Io'ho lavorato come imprenditore per più di un decennio ora,èM SK2non è facileMSC3come imprenditrice ogni ora del tuo tempo è un MST4costoMSV5 al clienteMSSK6 Dovete aggiungere un valore di movimento al sistema rispetto a quanto costa.

Come sviluppatori , abbiamo la tendenza ad essere persone d'affari cattive ' ci concentriamo su 'perfezione' a ogni voltaM SK4 In realtà , non c'è bisogno di creare un sistema M'non c'é bisogno di crearlo m'perfettoMST8 RMST9IMSMST10dobbiamo sostenere che questo non è una cosa del genere MST12 bisogna solo dare valore al clienteMTS13

Per un impegno a lungo termine questo Include assicurare ogni *nuova* Il codice è mantenibile e costoso-efficiente per funzionareM SK1 Nel sistema tradizionale questo è molto più difficile. Spesso si deve camminare attraverso una palude , preoccupandosi che imparando il sistema non si possa offrire molto valoreMSC4 `I'm not making any changes` Pensate? `I'm just learning the system`.
Questa è una fallazia; tu' stai imparando il sistema per renderlo migliore . tu+' stai studiando il sistema perché lo renda più efficienteM SK4 tu +' stai facendo sì che il sistema sia più mantenibileMSC6 Se un cliente non riesce a accettare questo passo–; allora devi essere molto attenti al modo in cui comunica questo ‐(o cercare un nuovo contratto–).

## Il popolo

Ancora una volta spesso trascurato, molto del tempo che lei' viene portata in qualità di contrattore perché una persona chiave è andata via (non lo faiM SK3 non ti coinvolti nella politica di questoMSC4 èMST5 non è la tua preoccupazioneMSP6 Devi essere in grado di lavorare con le persone che sono lì per raggiungere gli obiettivi del progettoMSV7
In un contratto voi'generalmente avete i termini del vostro contratto specificati (in il mio contratto attuale è 's 'aumentare la affidabilità e ridurre i costi di gestioneM SK4 concentrarsi su questoMSC5 Se non siete sicuri cosa significhi allora ASKMST7

Tenete a mente chi è il vostro contatto diretto; specialmente nei primi due mesiM SK1 Keep them informed (you likely won 't have new features to brag about as you get spun up on how the system worksMSC4 Io in genere mando un riassunto di email ogni settimana ♫/ due settimane al mio contatto diretto ♫ ; questo è un buon modo per tenerli informati di quello che state facendo ♫

Ricordate, questa è la persona che approverà la vostra bolletta ; non dovrebbero esserci sorprese al momento della bolletta\. una volta che iniziate a controllare il codice regolarmente questo è meno problematico; avete un resoconto esattamente di quello che avete fatto e dell'impatto che ha avutoM SK4 Fino ad alloraMSC5 dovete tenerli al correnteMST6
**Devono sapere cosa hai fatto e perché ti dovrebbero pagare.**

## La affidabilità

Ancora una volta, tornare al codice retribuito; se fate un cambiamento in generale dovete deplonarlo . Anche il migliore di noi lo spegnerà da tempo a tempoM SK3 specialmente nei sistemi di codici retribuiti ci sarà qualcosa *Non riuscivi a sapere.* quando si deploia. Questo ritorna all'archiviazione - se avete un server di staging lo avete registrato a LOT ( ma conservato per un breve periodoM SK3 allora quando vi deploiate su questo potete raccogliere più informazioni su ciò che è andato storto.

Non importa quanto siate bravi, quante test locali avete fattoM SK1 siamo tutti umani. Questa è una parte fondamentale del MSC3non' non lanciare un test il venerdìMST5 regolaMSSK6 aspettarsi che un deploiamento cause un nuovo problema su un sistemaMSP7 Siate pronti a lavorare fino a quando non sarà risoltoMSV8MSS9 Se non lo fateMSR10non sapete perché è fallitoMRS11 aggiungere più test per riprodurre il problema e più tracciamento per assicurarvi di trovare problemi simili in futuroMSSR12

Specialmente per i sistemi di produzione il sistema di montaggio non può essere 1:1 (in particolare quando si tratta di caricoM SK2 strumento come [k6](https://k6.io/) può aiutarvi a simulare la carica ( anche meglio localmente dove si può fare una profilazione corretta come menzionato prima).

## Dispiegamento

Ancora una volta spesso trascurata nella fervore per la CI/CD è il perché di questi. Semplice ; Facciamo il guastoM SK3 avere un modo molto veloce e efficiente di deplonare un sistema significa che quando lo rompete potete ripararlo anche più velocementeMSC4 Se il vostro sistema di revisione dei codici CI significa che ci vogliono 2 giorni per ottenere una fusione PR allora questoMNK6 è il più veloce in cui si può sistemare ragionevolmente un sistema\. Se i vostri sistemi CD significano che si abbassa il sistema in funzioneMRK8 si abituano alle lunghe notti\.

Un meccanismo efficiente per riparare e implementare il codice è essenziale per un flusso di sviluppo efficiente.

## 'Fixing Legacy Apps'

L'ho citato perché questo è un problema; per le applicazioni ereditarie (in particolare quando il riprogettamento su larga scala è fuori confineM SK2 ci sono due approcci principali.

- Pieghe in corso

Questo è il processo di semplice riparazione del codice esistente; assicuratevi ancora di fare un'analisi approfondita e di avere processi in place per ripristinare / ripristinare rapidamente ogni riparazione .
Io ho vinto'non mentire questo tipo di sviluppo è raramente FUN perché siete ancora probabili di vagare attraverso la palude della base di codici esistente . Comunque, èMSC3 un male necessario in molti casiM SK4

Come di solito, dovete assicurarvi di avere una qualche forma di test per escidere il codice attuale; idealmente dovrebbe anche testare l'errore del problema che state cercando di risolvere prima di fare la riparazione.
.
Per questo è necessario avere un test di unità che tenga stretto obiettivo l'area di codice che si deve riparare ma che spesso non è nella portata del lavoro per i grandi sistemi distribuiti.

I'd di solito usano un sistema di test in questo ordine di preferenza.

1. Test di unità - di nuovo questi sono preferiti perché si possono focalizzare su questi solo per esercitare il codice su cui state lavorando . Tuttavia, in un sistema tradizionale questi spesso non sono presenti |& estremamente difficili da ristrutturare | ( ad esempio in un systemo con molte chiamate esterne |
2. Test di integrazione - Questo è un termine sovraccaricato, perché può includere qualsiasi cosa da un test di unità che passa attraverso diverse strati di codice ( queste sono meglio evitate) per usare le cose del buon [Verify](https://github.com/VerifyTests/Verify) attraverso anche i test di Selenium. In generale volete testare il sistema come intero; tuttavia fate attenzione che questi test possono essere lenti e fragiliM SK2 L'uso di Verify può spesso essere un ottimo approccio per i sistemi ereditari, perché potete almeno 'verifyMスク4 voiMSC5non rompete la superficie API del sistemaMNK6
3. Test manuali - Tutti i sviluppatori dovrebbero provare a fare dei test manuali per qualsiasi verifica di codice. Questo è solo per assicurarsi che quello che si aspetta che l'utente 'M SK3 \( possa essere un vero utente o un altro componente del sistema che interagisce con il vostro codice ) veda sia ciò che realmente vedeMSC6 Potrebbe essere semplice come far funzionare il sistema localmente e controllare la fuoriuscita di una pagina o complesso come fare una serie completa di test su un server di staging

- Skinning di Cebolla
  Per lavorare su sistemi di vecchia data in genere si ottiene ' non c'è il lusso di una ristrutturazione completaM SK1 Qui uso l'approccio 'rivestimento a forma di onione'

Per poter aggiornare i PARTS di un sistema si possono identificare componenti che possono essere separati da un monolito esistente in un microservice (per un valore di 'micro'). Questo può essere un ottimo modo per cominciare a modernizzare un sistema senza il rischio di una ristrutturazione completa.
Esempi comuni potrebbero essere la divisione dei punti di fine dell'API in nuovi progetti che usano elementi più aggiornati. Il terrore del DRY può intervenire qui comunque. Una soluzione poco strutturata spesso ha molti M SK2helperMST3 o MST4serviceM ST5 componenti che dovrebbero essere realmente presenti in diversi progetti SST6o persino in package nuget per una maggiore riutilizzazione globaleSTS7

I' approfondirò questo approccio in un futuro articolo, perché è un elemento chiave di come lavoro sui sistemi tradizionali.

# Vengono pagati

Ora che abbiamo tutto questo e arriva il difficile problema del pagamento, ho una regola generale.

**Ogni problema di pagamento I'ho intenzione di andare avanti.**

Se ' pagano in ritardoM SK1 dipende dal vostro contratto ma al più tardare nei 30 giorni, ma di solito più vicino a 7; questo è un brutto segnale. Se c'èMSC5s fischi sulle vostre bollette (nickleMST7eMst8dimeingMSt9 pensate se l'azienda è in grado di pagare i vostri servizi in continuazioneMSST10

Non scherzate con questo.1 Se avete fatto il vostro lavoro dovete essere pagati in tempo.3 Non importa quanto vi piaccia.5 Se un cattivo cliente vi può sfruttare lo farà.6 Ma non vale mai la pena.8

Siate onesti; pagate solo per il tempo che avete lavorato in realtà; assicurateviM SK2 è chiaro cosa avete fatto e perché l'avete fatto .

I'ho guidato squadre di sviluppatori e I 'ho lavorato come sviluppatore;IM SK3ho fatto contrattatori e I+'ho avuto un cliente.I-'ho visto tutti i lati di questo e vi posso dire; se non vi pagano a tempo allora dovete andare avanti. Sul lato opposto,-se avete un contrattatore(o un FTE)che'non consegna allora dovrete affrontarlo rapidamente. Tutti hanno difficoltà personali ma soprattutto in un ambiente di contratti dovete portare valore o non pagare per il tempo quando siete't.

Per quanto riguarda il tasso; troverete il vostro livello; personalmente prendo più per progetti dove ho più responsabilità M SK2o che non mi sembrano divertentiMSC4 prendo meno per progetti in cui imparo una nuova tecnologia o per startups . IoMST7ho lavorato anche meno giorni ma ho mantenuto la mia tassa stabileMst8 Ma non prendo un tasso bassoM st10 tasso di calcioMSt11 tuMstr12 sei un professionista e dovresti essere pagato come taleMt13

# Conclusione

Beh, oggi e domani mi ritrovo al lavoro per il funerale della mia nonna e, francamente, sono un po' in panico che ho un enorme sistema da imparare, quindi ho pensato di vomitare i miei pensieri su come funzionare con questi sistemi.