Tra un paio di mesi un collega passerà a un nuovo progetto e erediterò uno dei suoi progetti. Per prepararmi, ho già ordinato a Michael Feathers di lavorare in modo efficace con il codice legacy .
Ma questi libri e la maggior parte delle domande sul codice legacy che ho trovato finora riguardano il caso di ereditare il codice così com'è. Ma in questo caso ho effettivamente accesso allo sviluppatore originale e abbiamo un po 'di tempo per una consegna ordinata.
Alcuni retroscena sul pezzo di codice che erediterò:
- Funziona: non ci sono bug noti, ma poiché i requisiti di prestazione continuano ad aumentare, alcune ottimizzazioni diventeranno necessarie in un futuro non troppo lontano.
- Non documentato: c'è praticamente zero documentazione a livello di metodo e classe. Ciò che il codice dovrebbe fare a un livello superiore, tuttavia, è ben compreso, perché scrivo da anni contro la sua API (come una scatola nera).
- Solo test di integrazione di livello superiore: esistono solo test di integrazione che testano la corretta interazione con altri componenti tramite l'API (di nuovo, scatola nera).
- Livello molto basso, ottimizzato per la velocità: poiché questo codice è fondamentale per un intero sistema di applicazioni, molti di questi sono stati ottimizzati più volte nel corso degli anni ed è estremamente basso livello (una parte ha il proprio gestore di memoria per determinate strutture / record).
- Concorrente e senza blocco: anche se ho molta familiarità con la programmazione concorrente e senza blocco e ho effettivamente contribuito con alcuni pezzi a questo codice, questo aggiunge un altro livello di complessità.
- Base di codice estesa: questo particolare progetto è composto da più di diecimila righe di codice, quindi non potrò farmi spiegare tutto.
- Scritto in Delphi: Sto solo per pubblicarlo, anche se non credo che la lingua sia pertinente alla domanda, poiché credo che questo tipo di problema sia indipendente dalla lingua.
Mi chiedevo come sarebbe meglio trascorrere il tempo fino alla sua partenza. Ecco un paio di idee:
- Ottieni tutto da costruire sulla mia macchina: anche se tutto dovrebbe essere controllato nel controllo del codice sorgente, che non ha dimenticato di archiviare un file di tanto in tanto, quindi questo dovrebbe probabilmente essere il primo ordine del giorno.
- Altri test: mentre vorrei più test unitari a livello di classe in modo che quando apporterò modifiche, qualsiasi bug che introduco possa essere colto all'inizio, il codice come è ora non è testabile (classi enormi, metodi lunghi, troppi mutue dipendenze).
- Cosa documentare: penso che per i principianti sarebbe meglio concentrare la documentazione su quelle aree del codice che sarebbero altrimenti difficili da capire, ad esempio a causa della loro natura di basso livello / altamente ottimizzata. Temo che ci siano un paio di cose che potrebbero sembrare brutte e bisognose di refactoring / riscrittura, ma in realtà sono ottimizzazioni che sono state là fuori per una buona ragione che potrei perdere (cfr. Joel Spolsky, Cose che dovresti Never Do, Part I )
- Come documentare: penso che alcuni diagrammi di classe dell'architettura e diagrammi di sequenza di funzioni critiche accompagnati da una certa prosa sarebbero i migliori.
- Chi documentare: mi chiedevo cosa sarebbe stato meglio, fargli scrivere la documentazione o farmelo spiegare, così posso scrivere la documentazione. Temo che le cose che sono ovvie per lui, ma non per me, non sarebbero altrimenti coperte adeguatamente.
- Rifattorizzare usando la programmazione in coppia: questo potrebbe non essere possibile a causa di vincoli di tempo, ma forse potrei refactificare parte del suo codice per renderlo più mantenibile mentre era ancora in giro per fornire input sul perché le cose sono come sono.
Si prega di commentare e aggiungere a questo. Dal momento che non c'è abbastanza tempo per fare tutto questo, sono particolarmente interessato a come dare la priorità.
Aggiornamento: al termine del progetto di consegna ho ampliato questo elenco con le mie esperienze personali in questa risposta di seguito .