Il presente articolo è stato tradotto automaticamente.

Pulitura codice

9 strategie utili per ripagare un debito tecnico

David Laribee

In problema 2009 dicembre di MSDN Magazine assegnato automaticamente suggerimenti per l'identificazione e la creazione di un caso per affrontare i debiti tecnici. In sintesi, credo che sia importante identificare il debito è probabile che si danneggiare nell'immediato futuro. Introduzione alle tecnica eccellenza raramente toccati parti di base di codici non utili per comprendere vantaggi in termini di produttività domani.

Inoltre, spero di comprendere l'importanza di ottenere la licenza e acquistare aggiuntivo dalla gestione l'importanza di nuovamente estinguere debiti e dispone di alcuni strumenti di base per avviare la creazione di un caso rock a tinta unita per lo stesso.

A questo punto attivare let’s l'attenzione a tattiche che possono essere utili per pagare nuovamente debito tecnici interesse elevato. Nella gestione di un debito tecnica sono presenti molte strategie comprovate. Un catalogo completo di modelli, strumenti e tecniche per il codice difficile wrangling esula dall'ambito di questo articolo. Verrà invece fornire alcune i trucchi più applicabile che è stato aggiunto al mio repertorio nel corso degli anni.

Ulteriori informazioni, informazioni, informazioni

Se si è certi di problemi, ma non si è certi della come risolverli, potrebbe essere tempo per acquisire nuove conoscenze e competenze che consentono di generare codice esaurito il muck. Apprendere come si dice, è fondamentale.

Formazione può assumere molte forme. Potrebbe essere necessario all'esterno della Guida in linea sotto forma di consulenti o formazione in aula. È possibile ottenere per libri con.

Provare a coinvolgere il team nel processo di apprendimento. Forse potrebbe avviare un club libro all'interno del proprio team. Forse è possibile trasferire nuovamente i vantaggi di un corso o di una conferenza in forma di una presentazione istruttivo.

Una tecnica di collaborazione e pratica per che coinvolgono l'intero team è Dojo codifica. Una base Dojo codifica implica una sfida di programmazione di prelievo e affrontare che come gruppo. Ho sperimentato con una coppia di rotazione controllata da una raccolta Limatura. Questo metodo, i due membri del team di collaborano a un'attività di programmazione, con intervalli “ tag ” altri membri del team in cui immettere il dojo quando un altro utente lo lascia.

Se si apprendere meglio i propri ritmi o avviare un club libro, esistono un paio di testi ottimo che consiglio è possibile in base all'oggetto di migliorare la gestibilità del codice preesistente.

Volume appropriatamente intitolato ’ Michael Feathers, Working Effectively con codice legacy (Prentice Hall 2004), fornisce un approccio basato su modelli per teasing codice legacy. L'autore rende l'istruzione che codice legacy è codice non testati. È difficile da modificare e non si avrà la certezza che le modifiche non sono l'introduzione di difetti di regressione. In questo manuale troverete numerosi concentrate strategie e tattiche di riduzione accoppiamento nel codice e renderlo più verificabili.

Kyle Baley e Donald Belcham dispongono di uno dei libri più recenti sulla scena T Brownfield sviluppo di applicazioni in .NET (Manning pubblicazioni 2010). Essi adottare un approccio sistemici verso miglioramento cosiddetti brownfield (e lo sviluppo di nuovo. o greenfield) le basi di codice. Uno dei vantaggi di questa Guida è che, sebbene siano ampiamente applicabili approcci consigliato, i relativi esempi di codice sono progettati attorno a Microsoft .NET Framework, un vantaggio probabile ai lettori di questo articolo. Mi piace molto come accettino anche un approccio di procedure consigliate di team. Mentre si apportano modifiche in un attributo codebase wild, ovvero la fiducia si ottengono dall'implementazione alcune nozioni di base, ad esempio continuous integration e controllo della versione vale la pena relativo peso in oro.

Diplomacy

Non vi è una probabilità alta, sarà necessario gestire con il codice disordinato è stato scritto da un utente attualmente del team. È importante adottare questo in considerazione quando reasoning sul codice nello stato corrente. Emozioni ferisce causare defensiveness che a sua volta conduce a rallentare treno miglioramento in corso.

Provare la situazione con anecdotes apportate in passato gli errori di blocco. Rimani professionale, impedire attacchi di personali e incoraggiare l'autore del codice originale per suggerimenti su come può passare informazioni sul miglioramento.

Nuovo, è molto probabile sei uno degli sviluppatori ha contribuito al disordine. Si desidera ripetere dopo me: “ Si desidera il mio codice. Si sta formazione ogni giorno e si è dedicato alla ricerca di un metodo migliore spostandosi in avanti. È possibile non sarà possibile critiques ’ miei colleghi o personale ego trovarsi nel mezzo di sforzo del mio team per migliorare. ”

In verità, richiede tempo per ottenere su questi problemi. È possibile trovare il modo migliore per il motivo e parlare sui miglioramenti apportati consiste nel concentrarsi sulla presenti e future anziché passato quasi. Quale potrebbe essere questo codice? Che cosa si desidera visualizzarlo di evolversi in

Un po' diplomacy e prendere in considerazione per emotional investimento altre persone nel lavoro che è già stato eseguito il commit verranno passare una lunga modo verso spostandosi in avanti.

Introdurre una forma

È così horrendous che è difficile capire cosa sta succedendo in qualsiasi parte del codice. Tutte le classi sono probabilmente in un unico spazio dei nomi. La base di codice è probabilmente tali tangled web delle dipendenze che segue lo stack notevolmente supera possibilità della memoria a breve termine di mantenere la posizione corrente.

Questi sintomi implicano spesso una diagnosi del debito con l'architettura e i livelli di struttura piuttosto che a livello di implementazione. Dal punto di vista a come si è interessato, è il tipo più pericolosa di debiti e, in genere comporta costi maggiori di modifica.

Brian Foote e Joseph Yoder chiamare architetture con nessuna forma individuabile in cui tutti gli elementi dipende tutto il resto, “ grande pallina di mud ” (laputan.org/mud ):

“ È un grande pallino di mud un'in modo casuale, persino haphazardly sistema strutturato. L'organizzazione, se una possibile chiamare questo metodo, che dipende più dalla convenienza di progettazione. Non ancora, la popolarità di durata può semplicemente essere indicativa di un spudorato per architettura generale. ”

Sarebbe scommetto mio ultimo dollaro che la maggior parte delle applicazioni software nella produzione oggi sono grande palle di mud. Non è necessariamente un giudizio di valore. Esistono miliardi di righe di codice terribile disponibili in tutto il mondo rendendo persone lotti e grandi quantità di denaro. Sta per motivo che grande palle di mud sono soddisfare il sogni grandiosi e caviar auguri di molte un titolare dell'azienda e patrimonio.

Il problema è che applicazioni pallina di mud diventano sempre più costose da modificare. Mentre l'ambiente aziendale rimane dinamico, il software diventa non flessibile. La strategia più comune per la gestione di questo è il software equivalente di un bomb nucleari: la riscrittura grande. Esistono molti rischi associati alla riscrittura grande e spesso è preferibile provare a migliorare la progettazione del sistema maggiori.

Prima di iniziare a utilizzare alcune delle tecniche di livello inferiore, è spesso utile per introdurre una forma nel sistema. L'esempio tipico è quello di un'architettura a più livelli. Ciò significa genere discussioni UI per servizi e comunicare con un tipo di modello e il modello comunica a sua volta, con il livello di persistenza.

Modulazione di codice in livelli può essere un'attività molto bassa e accurato. Avviare l'organizzazione di codice in spazi dei nomi denominato dopo i livelli dell'architettura.

A questo punto si dispone degli ordini marching: applicare la regola che i livelli di livello più alto (livello dell'interfaccia utente) possono dipendere solo dal successivo livello alto (livello di servizi). Come semplice metodo di applicare la regola è necessario spostare i livelli in diversi progetti di Visual Studio. La soluzione non verrà compilato se violano la regola.

Rendendo il passaggio di regola, hanno diminuito accoppiamento. Il modello non è collegato a visualizzazioni dell'applicazione. L'introduzione di una forma è stato aumentato coesione. Classi all'interno del livello di tutte le utilizza per lo stesso scopo siano che per visualizzare i dati a un utente finale o per incapsulare il comportamento di business.

Presentare aspetti tra livelli e rendere i livelli di livelli superiori, ad esempio l'interfaccia utente dipendono aspetti forniti dal livelli livelli inferiori rispetto a classi granulari all'interno i livelli. È possibile applicare questa tecnica il processo in modo incrementale e opportunistico.

La potenza di un imporre una forma sulla pallina grande monolitico di mud è a questo punto è possibile iniziare a individuare più mirata opportunità per pagare nuovamente debito tecnico. Vale a dire se si sta eseguendo grandi quantità di lavoro, ad esempio, CompanyX.ProductY.Model, potrebbe drill-down con uno strumento di analisi statica per trovare il massimo con accoppiamento ridotto o complicata classi.

Chiudere Air supporto test

Il processo di apportare modifiche senza modificare il comportamento del sistema è denominato refactoring. Esistono intero refactoring dedicati sia orientato a oggetti per schema di lingue (refactoring.com ) e il codice di database relazionali (agiledata.org/essays/databaseRefactoringCatalog.html ): Estrazione metodo, Dividi tabella e così via. Il fatto della questione è è difficile applicare questi metodi granulari e sicuri quando la base di codice completamente sconosciute.

In che modo è possibile avviare apportare modifiche in un progetto legacy? La prima cosa da notare è che, dato una scelta, è sempre preferibile disporre di test intorno alle modifiche apportate. Quando si modifica il codice, è possibile introdurre errori. Ma quando si copertina il codice con i test prima di modificare il codice, si è più probabile intercettare eventuali errori.

La pratica di eventi intervento chirurgico, plunging headlong nel codice senza alcuna fiducia reale sta introdurre le modifiche non sono inoltre introdurre difetti pericolosi, non è l'unico modo per imporre una modifica.

Prima di iniziare a modificare il codice, determinare se esiste un'interfaccia di disco rigido del sistema rispetto al quale è possibile scrivere i test. Questi test sono dei vari scatola nera. Ovvero, sta a un sistema di input e gli output di analisi. Quando si apportano modifiche, eseguire continuamente i test per verificare le modifiche apportate non sono stati interrotti comportamento esistente.

Applicazione di questa strategia può essere difficoltosa quando si desidera affrontare parti del sistema strettamente collegate. Il costo di testing molto bene può superare il vantaggio della rimozione di debito. Questa analisi dei costi-benefici costante permeates il processo di attivazione di un attributo codebase e, in alcuni casi, è più conveniente per ricompilare un'applicazione o di grandi dimensioni sezione della base di codice dell'applicazione verso l'alto.

Effetti Observable misura

Le misurazioni intorno all'area di codice che sta miglioramento di generazione. Per ragioni di argomento, pronunciare let’s che si sta tentando di organizzare meglio la logica di business di base dell'applicazione. Esistono numerosi percorsi attraverso i membri dei tipi di questo spazio dei nomi: passare istruzioni nidificate Se le istruzioni e così via. Una misura, ad esempio complessità ciclomatica forniscono un'idea approssimativa di fatto miglioramento sforzi sono semplificazione del codice.

È possibile ottenere misure estremamente specifiche di parti specifiche della base di codice con lo strumento di analisi del codice NDepend (ndepend.com ). NDepend fornisce un potente CQL (codice Query Language) su spazi dei nomi, tipi e membri negli assembly .NET.

Considerare le istruzioni CQL in Figura 1. Si noti che sto probe misure quali accoppiamento e complessità (solo alcune delle metriche NDepend rende disponibili numerosi) all'interno di un determinato spazio dei nomi. In questo caso ho già ho presentato una forma in modo che è possibile concentrare definibili aree del mio codice. Se si riesce a introdurre modifiche positive, è consigliabile visualizzare le misure quali accoppiamento e complessità diminuzione nel tempo.

Figura 1 NDepend CQL

-- Efferent coupling outside a namespace
SELECT TYPES 
WHERE TypeCe > 0 
      AND (FullNameLike "MyCompany.MyProduct.Web")

-- Afferent coupling inside a namespace
SELECT TYPES 
WHERE TypeCa > 0 
      AND (FullNameLike "MyCompany.MyProduct.Web") 

-- Top 20 most complicated methods
SELECT TOP 20 METHODS 
WHERE CyclomaticComplexity > 4 
      AND FullNameLike "MyCompany.MyProduct.Web"

Un effetto collaterale utile di questa strategia è che le misure consentono di tenere la riga e mantenere disciplina dopo la rimozione di debito.Fornirà un sistema di avviso tempestivo verso reintroduction del nuovo debito in base a un'area già migliorata.

Stream Improvement dedicato

Si Don ’t risiedono in un depressione.È molto probabile, durante gli sforzi di miglioramento, verrà richiesto di continuare a fornire nuove funzionalità e modifiche alle funzionalità esistenti.Recapito pressione causa emozioni di essere sotto la pistola.Ma la manutenzione è un fatto della vita che devono abbracciare anziché tentare di ignorare.

Un modo per affrontare questo consiste nel proteggere approvazione da parte dell'azienda e dedicare risorse, ovvero un singolo utente, una coppia o un intero team, per migliorare gli elementi di debito contemporanea con le nuove funzionalità di recapito.

Questo può essere una strategia estremamente efficace ma è particolarmente utile nelle situazioni in cui l'intero team (tutti gli sviluppatori e tester che hanno apportare modifiche alla base di codici) prende i miglioramenti apportati da una parte.Provare a regolare la rotazione individui come coppie.Lo sviluppatore è stato nel flusso di miglioramento più lunga la rotazione, lasciando lo sviluppatore breve la nuova coppia di ciò che accade.

Suddividendo le conoscenze avvicina per la proprietà collettiva con una conseguente riduzione dei rischi e migliorare progettazioni.A volte si trovano le opportunità di miglioramento che si trovano direttamente nel mezzo di alcune nuove funzionalità che si sta tentando di inviare.Ogni volta che si avvia il lavoro su una caratteristica nuova o modificata, è buona norma per esaminare l'elenco per determinare se il team non è già identificato un'area di miglioramento si interseca con sta per eseguire il lavoro.

Opportunità di miglioramento si verificano il tempo, spesso identificati nel rapidamente e con poche semplici refactoring che rendono la prossima volta che una differenza incontra un collega il codice.

Non c'è una costante analisi dei costi-benefici che dello quando si stanno migliorando offrendo nuove funzionalità di base di codice esistente.Se il miglioramento sembra troppo costoso, aggiungere all'elenco e illustrare nella pianificazione di miglioramento.

Eseguire un'iterazione, eseguire un'iterazione, eseguire un'iterazione

È stato pagato back alcuni debito.Tempo per tornare al passaggio 1 e identificare, assegnare una priorità e costruire il consenso sull'elemento successivo è necessario correggere, a destra?

Sì, ma non vi è un po' più ad esso più mindlessly plowing l'elenco.È necessario assicurarsi che non sta incorrere debito ulteriori rispetto alla correzione.È necessario anche regolarmente incorporare il 
learnings futuri sforzi nello sviluppo di nuovo e miglioramento sforzi uguali.

Opportunità per migliorare una base di codice modificare regolarmente.Emergono e loro importanza ebbs e flussi.Motivi per cui la natura dinamica del debito d'interesse elevata modificare versioni diverse.

Che cos'è funzionava bene per me pianifica un breve riunione settimanale con gli sviluppatori per esaminare nuovi elementi di debiti e definizione delle priorità il backlog degli elementi di debito esistente.In questo modo viene mantenuta consenso avere generato attivo e l'elenco aggiornato.Nuovamente, che sarebbe necessario dare priorità alla risoluzione del debito è probabile che rallentare la versione corrente o il progetto.

Inizia la riunione revisionando nuovi elementi.È l'identificatore pitch maiuscole e minuscole e inserirla di voto: meritano l'inclusione nel backlog o non?Dopo che sono stati passati tramite i nuovi elementi, esaminare gli elementi meno recenti.Esiste lavoro non è più valido?Saranno disponibili valore immediato completamento questo lavoro, ovvero, rimuoverà ostacoli quotidiane?Ultimo, assegnare priorità alle opportunità con altri utenti, ovvero numero di dimensioni Ri all'elenco.Il primo elemento dell'elenco deve essere il miglioramento per rendere molto successivo.

Tenere la linea

Mentre il responsabile e i componenti del team sono via prestando debito tecnico elevato tasso di interesse verso il basso, si sarà probabilmente anche essere recapito nuovo software.Informazioni sulle tecniche di programmazione a tinta unita e introducono nuovi modelli nel codice, applicare questa conoscenza in futuro.È possibile che sul debito tecnica esistente creando un a inerzia inescapable verrà pila lavoro additiva.

È importante aspettative per i cointeressati aziendali per il nuovo lavoro.Una qualità più elevata richiede più tempo per conseguire quanto rushed get it-eseguita-stile codice.Questo fatto riporta me nel concetto di pensiero sistemi introdotto nel mio articolo di dicembre 2009.Per me si tratta di un attributo culturale.Le organizzazioni possono sustainably pensare di lungo termine o continuare a questo punto, con un acquisto pagare mentality successiva, ovvero il oh così fertile terreno breeding del debito tecnico.Non dimenticare la domanda centrale come abbiamo terminare qui in primo luogo?

Mentre sei apprendere informazioni su come migliorare un attributo codebase, molto probabilmente lo sviluppo alcune norme team applicabili al nuovo codice.Suggerisco di acquisizione in uno strumento come un wiki e tenendo premuto piccole dimensioni, informali sessioni di formazione in cui è possibile condividere le proprie scoperte con il team.Inoltre sviluppare tecniche per la gestione di elementi simili di miglioramento.Quando si verificano modifiche apportate la stessa operazione per correggere una progettazione difettosa o pulire implementazione tre o quattro volte codify in doctrine del team.Ovvero, prenderne nota in un luogo conosciuto e molto semplicemente, informare gli altri che è presente.

Lavorare insieme

Debito tecnico è un problema di persone.Persone tramite mancanza di conoscenze o le aspettative non realistici, creato il disordine e ora affrontare le conseguenze.E verrà fornita agli utenti di un gruppo di lavoro per risolvere il problema.

Fornendo consigli come questo è tutto ben e buona e sarebbe sorprendere se non è un software professionale e probabilmente quello che è appassionato loro artigianale erano nel contratto completato.

Una corretta realizzazione richiede modifiche fondamentali nel sistema di valore di tutte le persone coinvolte, ovvero l'intero team.Economia di qualità viene dimostrate pagare nuovamente alla fine, ma sarà necessario richiedere tale passaggio di fiducia a breve termine.Si dispone di vincere cuori e talenti per modificare una lingua e che può essere infatti un processo difficile.È il più utile suggerimento che è possibile effettuare: non passare da solo.Team dietro lo sforzo e assicurarsi che tutti gli utenti hanno interessati nei risultati.

L'impostazione di un obiettivo come “ desideriamo copertura del 90 % ” o “ desideriamo eseguire basato su Test Development (TDD) il tempo ” è relativamente inutile.Affrontare le aree problema siano rallentando è al momento e nel prossimo futuro.Che può significare TDD l'introduzione e che risiedono nel report di copertura, o potrebbe essere non.Potrebbe essere un valore primitivo più simile a assicurandosi che il team conosce le nozioni fondamentali della progettazione e analisi orientati a oggetti.

Avviare la creazione di una differenza

Mentre mi auguro ho fornito alcuni strumenti e tecniche per affrontare debito o, almeno, apportate alcune delle idee implicite e già avuto esperienze esplicite, è importante tenere presente che Gestione tecnica del debito è molto simile un problema di prodotto a prodotto.Potrebbe, ad esempio, essere in un ambiente in cui non è una grande quantità di trust tra la ricerca hanno pitch del caso con la preparazione di un avvocato di valutazione e lo sviluppo e business parti.

Non è presente alcun processo-box verrà indicato come a per driving debiti verso il basso, ma di quando e il dove oggi è un giorno di fine per avviare la creazione di una differenza.Marzo verso eccellenza tecnica può essere lento e approssimativa in all'inizio.È solo tramite sforzo sostenuto, costante learning e, di sopra di tutti, un atteggiamento earnest verrà pull tramite tough volte inserisce codice crippled debito nuovamente nel nero.Ti suggeriamo di utilizzare il programma.Non solo verrà si aumenta il valore per i clienti, espanderà notevolmente casella degli strumenti del progettista.

David Laribeecoaches il team di sviluppo del prodotto VersionOne Inc. È spesso come relatore a eventi per sviluppatori locali e nazionali e possiede è stato assegnato unarchitettura Microsoft MVP per 2007 e 2008. Scrive nella rete CodeBetter blog all'indirizzo thebeelog.com.