Domanda

Il nostro codice fa schifo.In realtà, vorrei chiarirlo.Nostro vecchio il codice fa schifo.È difficile da eseguire il debug ed è pieno di astrazioni che poche persone capiscono o addirittura ricordano.Proprio ieri ho passato un'ora a eseguire il debug in un'area per la quale ho lavorato oltre un anno E mi sono ritrovato a pensare: "Wow, è davvero doloroso." Non è colpa di nessuno - sono sicuro che inizialmente tutto ha avuto perfettamente senso.La parte peggiore è che di solito funziona e basta... a patto che tu non gli chieda di fare nulla al di fuori della sua zona di comfort.

Il nostro nuovo codice è piuttosto buono.Penso che stiamo facendo molte cose buone lì.È chiaro, coerente e (si spera) mantenibile.Abbiamo un server Hudson in esecuzione per l'integrazione continua e disponiamo degli inizi di una suite di test unitari.Il problema è che il nostro management è concentrato sulla scrittura del Nuovo Codice.Non c'è tempo per dare al Vecchio Codice (o anche al vecchio Nuovo Codice) le cure amorevoli di cui ha così disperatamente bisogno.In ogni momento il nostro backlog di Scrum (per sei sviluppatori) conta circa 140 elementi e circa una dozzina di difetti.E quei numeri non stanno cambiando molto.Stiamo aggiungendo cose il più velocemente possibile per bruciarle.

Quindi cosa posso fare per evitare i grattacapi di maratone di sessioni di debug impantanate nelle profondità del vecchio codice?Ogni sprint è pieno fino all'orlo di nuovi sviluppi e di difetti evidenti.Nello specifico...

  • Cosa posso fare per fare in modo che le attività di manutenzione e refactoring ricevano una priorità sufficientemente elevata da essere eseguite?
  • Esistono strategie specifiche per C++ che utilizzi per evitare che il nuovo codice marcisca così rapidamente?
È stato utile?

Soluzione

La vostra gestione può essere focalizzata su come le caratteristiche che lavorano nel prodotto, e il loro mantenimento a lavorare. In questo caso, è necessario fare un business case per il refactoring la roba vecchia, nel senso che da X investimento di tempo e lo sforzo è possibile ridurre i tempi di manutenzione necessaria da Y lungo il periodo Z. Oppure la gestione potrebbe essere fondamentalmente incapaci (questo accade, ma meno spesso di quanto la maggior parte degli sviluppatori sembrano pensare), nel qual caso non si otterrà mai il permesso.

Hai bisogno di vedere il punto di vista del business. Non importa per l'utente finale se il codice è brutto o elegante, solo ciò che il software fa. Il costo del cattivo codice è potenziale inaffidabilità e difficoltà aggiuntiva in cambiarlo; il disagio emotivo che provoca al programmatore è raramente presa in considerazione.

Se non è possibile ottenere il permesso di entrare e refactoring, si può sempre provare da soli, un po 'alla volta. Ogni volta che si correggere un bug, fare un po 'di riscrittura per rendere le cose più chiare. Questo può rivelarsi più veloce rispetto alla possibile correzione minima, in particolare nel verificare che il codice funziona ora. Anche se non è, di solito è possibile prendere un po 'di tempo su una correzione di bug, senza mettersi nei guai. Basta non avere portato via.

Se è possibile lasciare il codice appena un po 'meglio ogni volta che si va in, vi sentirete molto meglio su di esso.

Altri suggerimenti

Stand Up Meetings

potrei andare al mio meccanico, e abbiamo un po 'incontro stand-up al mattino:

  

Gli dico che voglio che i miei ruote allineate,   le mie gomme ruotati, e il mio olio cambiato.   Ho già detto che "Oh, a proposito il mio   freni sentivano un po 'morbido sulla strada   in. Potrebbe [egli] dare un'occhiata a loro?   Dopo quanto tempo posso avere la mia schiena macchina perché   Ho bisogno di tornare al lavoro? "

     

Si apre la testa sotto la mia macchina, pop   eseguire il backup e dice i miei freni sono perdite   petrolio e di partenza per sicuro. Avrà bisogno   una parte che arriverà alle ore 10.30.   Il suo uomo non finirà pranzo prima, ma   Dovrei prendere la mia macchina indietro di 1:30 o   così. Ha prenotato solido in modo che non sarà   in grado di fare qualsiasi delle altre cose   oggi, e dovrò prenotare un altro   appuntamento.

     

chiedo se può fare le altre cose e   Torno per il freno. Lui mi dice   davvero non può farmi guidare fuori   lì senza fissa i freni   perché potrebbero causare un incidente,   ma se voglio andare in un altro   meccanico, si può chiamare per un rimorchio.

     

Dato che la vettura sarà fatto così poco   dopo pranzo, mi chiedo se il suo uomo può prendere   un pranzo tardi in modo da poter ottenere la mia macchina indietro   un'ora prima.

     

Mi dice ai suoi uomini entrano alle 8 del mattino e   spesso lavorano fino a sera.   Guadagnano ogni pausa che   ottenere, e il suo uomo merita di prendere la sua   pranzo con tutti gli altri.

Niente di tutto questo è quello che volevo sentire. Volevo sentire che vorrei guidare fuori di lì in una mezz'ora con le mie ruote, pneumatici e olio fatte.

Il mio meccanico era solo verso l'alto e onesto con me. verso l'alto e onesto con la vostra gestione? o si fa a evitare dicendo loro cose che non vogliono sentire?

Test delle unità

Non toccherebbe una riga di codice che non capivo, e non vorrei il check-in una nuova linea di codice non ho la prova a fondo. (Almeno, non intenzionalmente.)

La tua domanda sembra implicare che in qualche modo un grande corpus di codice scarsamente documentato reso recensione passato senza alcun test di unità. Forse avete partecipato in quanto, e forse non l'hai fatto. Tutte le persone coinvolte ha bisogno di accettare la responsabilità per questo - compresa la gestione. Indipendentemente da ciò, quel che è fatto è fatto. Non si può tornare indietro e cambiare.

Tuttavia, in questo momento, nel tempo presente, è responsabilità di tutti per fermare il comportamento che ha portato il problema in primo luogo. Tu dici che hai speso un anno di lavoro in codice che si trova difficile da comprendere e che non ha alcun test di unità. Nel corso dello stesso anno, come si è lavorato duramente per migliorare la vostra comprensione, il numero di test di unità hai scritto per documentare e verificare che la comprensione?

Come si lottato attraverso il codice lentamente guadagnando comprensione, quanti commenti hai fatto aggiungere in modo da non dover lottare la prossima volta?

Scrum Backlog

Personalmente, penso che il termine "Scrum backlog" è un termine improprio. Un elenco di cose da fare è solo una lista - una lista della spesa se si vuole. Ho avuto una lista quando sono andato al meccanico. Il mio stare in piedi l'incontro con il meccanico è stato davvero più di una riunione di pianificazione sprint.

Una volata riunione di pianificazione è una trattativa. Se la gestione è tempo di boxe, senza che il negoziato, non gestiscono nulla. Sono semplicemente cercando di stipare 10 libbre di merda in un sacco 5 libbre, ed è vostra responsabilità di dire loro così.

Quando si mostra fino a una riunione di pianificazione sprint, si sono tenuti a impegnarsi per un corpo di lavoro, ed è vostra responsabilità di prepararsi per questo. mezzi di preparazione che hanno qualche idea di ciò che si dovrà fare per completare ogni elemento della lista -. compreso il tempo necessario per capire il codice oscuro e il tempo necessario per test di unità di scrittura

Se qualcuno ti invita a una riunione di pianificazione in cui non avrete il tempo di preparare, rifiutare l'incontro e suggerire quando riprogrammare in modo da avere il tempo.

Se si dispone diun organismo già esistente di codice con nessun test di unità e una funzione potrebbe influenzare plausibilmente il funzionamento di tale codice, è necessario unit test di scrittura per la maggior quantità di vecchio codice come potrebbe essere influenzato. Quando si impegnano a scrivere la funzione, si sta commettendo a fare quel lavoro. Se che lascia il tempo troppo poco di impegnarsi per qualche altra caratteristica, basta dirlo. Non commettere l'altra caratteristica.

Quando si impegnano per risolvere un difetto, si impegnano a testare il vostro lavoro. Ovviamente, questo significa scrivere un test di unità per il difetto. Ma se si tratta di vecchio codice, senza test di unità, ma significa anche scrittura di unit test per le cose che non sono ancora rotto, ma potrebbe rompersi a causa della modifica. Come altro si testare la correzione?

Se l'elenco dei difetti rimane una dimensione costante, i tuoi regressi squadra tanto quanto fissa. Educatamente spiegare a chi deve capire che unit test impediscono le regressioni che attualmente mantenere la lista dei difetti da contrazione.

Se non si riesce a scrivere quelle unit test perché si impegnano a troppe funzioni, la cui responsabilità è che?

refactoring

Quando si refactoring del codice, è necessario verificare tutto questo, e questo significa scrittura di unit test per tutto. Se si dispone di un grande corpo di codice, senza test di unità, si dovrà scrivere tutti quei test di unità prima si refactoring.

vi consiglio di tenere fuori il refactoring fino a quando tali test di unità sono in atto. Nel frattempo, se ti ostini a inclusi test di unità nelle vostre stime per il lavoro che si impegnano a, alla fine tutti quei test di unità ci sarà. E poi si può refactoring.

L'unica eccezione a questo è refactoring per testabilità. Potreste scoprire che parte del codice non è stato progettato per il test e che si deve refactoring per cose come l'iniezione di dipendenza prima di poter creare i test di unità. Quando si impegnano a scrivere la funzione che richiede il test di unità, si impegnano a rendere il codice verificabile. Includi che nella vostra stima quando si impegnano alla funzione.

Impegno + Responsabilità = Power

Tu dici sei impotente. Quando si accetta la responsabilità e si impegnano a fare ciò che deve fare, credo che troverete di avere tutto il potere necessario.

P.S. Se qualcuno si lamenta nessuno "perdere tempo" a scrivere più test di unità nel fissare un solo difetto, mostrare loro questo video 80:20 sulla regola e libbra "cluster difetto" nei loro cervelli.

E 'difficile dire molto dalle informazioni date. Alcune domande che avrei è una ragione logica per essere scrivendo nuovo codice è quello di sostituire il vecchio codice. Se questo è ciò che si sta facendo, abbandonare il vecchio codice.

E 'anche vecchio codice che ha difetti Showstopper? Se sì dove sono provenienti da? Vecchio codice non ha difetti "Showstopper", solo macina sempre più vicino ad una fermata di solito. E 'vecchio codice, dopo tutto - dovrebbe avere gli stessi vecchi difetti e gli stessi vecchi limiti, non roba che deve essere guardato via a destra. difetti Showstopper sono nuovi difetti del codice. Sembra che ci sia sviluppo attivo in nel vecchio codice.

Se si sta scrivendo tutto questo nuovo codice sulla parte superiore del vecchio codice che fa schifo, senza piani per risolvere il problema una volta per tutte, mi dispiace, c'è solo così tanto si può fare quando si è troppo impegnati seppellire voi stessi a scavare da soli fuori.

Se quest'ultimo è il caso. si dovrebbe riconoscere dove siete diretti, e cercare di staccare un po '. E 'intenzione di tutte crollo alla fine, se si pensa di essere in giro per risparmiare le forze per una battaglia utile.

Nel frattempo prova a raccogliere alcuni modelli di progettazione. Ci sono diversi che può almeno aiutare scudo nuovo codice dalla roba vecchia, ma ancora, in ultima analisi, è solo difficile da codice di buona scrittura contro il cattivo codice.

e il vostro sprint suono forse confuso. Non c'è una direzione generale? Questo dovrebbe determinare la quantità di lavoro arretrato che hai, anche se le cose possono cambiare mese in mese, non c'è un chiaro senso di muoversi verso un certo obiettivo finale?

E nuovo codice in decomposizione? Il modo in cui si impedisce che è di avere un design espressivo, una direzione significativa, e una squadra di qualità che si impegna a sia la qualità del loro lavoro e la visione del design. Se si dispone che, la disciplina è ciò che mantiene la qualità. Se non si dispone di che mi dispiace, che, fondamentalmente, era la scrittura di codice con già senza scopo. E 'stato fondamentalmente marcio sulla vite.

Non essendo critica, solo cercando di essere onesti. Fai un respiro profondo. Rallenta. Sembri ne avete bisogno. Guardate quello che hai scritto qui. Si dice nulla. Lei parla di refactoring, mischie, Showstoppers, difetti, il vecchio codice, nuovo codice. Che cosa significa nulla di tutto ciò media? E 'tutto mescolate.

Che dire di "nuove iniziative contro i sistemi legacy"? "Necessità di refactoring del codice ciclo volata presto in termini di comprensione ultima etc." Sono Showstoppers in realtà "componenti precoci delle iniziative aziendali attuali sono stati rilasciati, ma sono problemi che vivono e nessun tempo è iscritto a bilancio a causa del nuovo sviluppo".

Questi sarebbero i concetti significativi. Hai dato a noi nulla. Capisco che è intenso. I miei scatti sono pazzi troppo, aggiungiamo un sacco di avanti; articoli pg perché non siamo riusciti a ottenere molti requisiti in attacco (un sacco di miei nuovi requisiti derivano da dover fare i conti anche con gli enti regolatori esterni, il processo di normale attività non è sempre disponibile ).

Ma allo stesso tempo sono frantumate dalla vastità di ciò che deve essere fatto e il tempo per farlo. Tutto ciò che viene aggiunto al mio portafoglio ha bisogno di essere lì. E 'pazzesco, ma allo stesso tempo ho un'idea molto chiara di dove sono stato, dove ho bisogno di andare, e perché la strada è più difficile getter.

Passo indietro, cancellare i vostri pensieri, a capire lo stesso - dove sei stato e dove si sta andando. Perché se si sa che, di sicuro non è ovvio. Se non è possibile comunicare qualsiasi cosa i vostri coetanei in grado di capire, quanto hai intenzione di ottenere con un business manager?

Il vecchio codice fa sempre schifo.Probabilmente ci sono alcune rare eccezioni scritte da persone con nomi come Kernighan o Thompson ma, per il tipico "codice scritto in un ufficio", col tempo puzzerà.Gli sviluppatori acquisiscono più esperienza.Le pratiche più recenti, come l’integrazione continua, cambiano le regole del gioco.Le cose vengono dimenticate.I nuovi manutentori non riescono a cogliere i progetti e desiderano riscriverli.Quindi è meglio accettarlo come normale.

Alcune cose a caso che potrebbero aiutare...

  • Parlane con la tua squadra.Condividi le tue esperienze e le tue preoccupazioni, evitando "amico, il tuo vecchio codice fa schifo" (per ovvie ragioni) e vedi qual è il consenso.Probabilmente non sei solo.
  • Dimentica i tuoi manager.Non esporli a questo livello di dettaglio: non hanno bisogno di pensare al nuovo e al nuovo.vecchio codice e probabilmente non capiranno se lo fanno.Questo è un problema che il tuo team deve affrontare e, se necessario, di cui deve essere informato il tuo PO
  • Sii aperto alla possibilità di poter buttare via le cose.Parte di quel vecchio codice probabilmente si riferisce a funzionalità che non vengono più utilizzate o che non sono state adottate dagli utenti in primo luogo.Per fare in modo che funzioni per te, devi davvero passare a un livello superiore e pensare in termini di dove il codice offre realmente valore all'utente o all'azienda rispetto a dove il codice offre realmente valore all'utente o all'azienda.dove è solo una palla di fango su cui nessuno ha il coraggio di prendere una decisione.Che osa vince.
  • Rilassa la tua visione della coerenza architettonica.C'è sempre un modo per attingere a un sistema funzionante con un nuovo codice da qualche parte, e questo potrebbe consentirti di migrare lentamente verso un approccio più nuovo e più intelligente, preservando il vecchio abbastanza a lungo da non rompere le cose esistenti.

Nel complesso, vincere in questo tipo di situazione dipende meno dalle capacità di programmazione e molto di più dalle scelte intelligenti e dalla gestione degli aspetti umani.

Spero che aiuti.

Mi consiglia di mantenere traccia di quanti bug e modifiche al codice coinvolgere il vostro "vecchio codice" e presentare questo sia il vostro manager o ai vostri compagni di sviluppatori alla vostra prossima riunione di squadra. Con questo in mano dovrebbe essere abbastanza semplice per convincerli che più deve essere fatto per refactoring del "vecchio codice" e portarlo alla pari con il vostro "nuovo codice".

Sarebbe anche opportuno documentare le parti del "vecchio codice" che sono più difficili da comprendere. Queste sono anche le parti del "vecchio codice" che si dovrebbe essere refactoring prima volta a ottenere l'approvazione.

qualcosa da provare: la classe in gruppo - per esempio - peggiore del 10%, meglio del 10%, e il resto. Consegnare le liste per la gestione, dicendo: "Prevedo la maggior parte dei bug oltre il prossimo trimestre sarà trovato nel primo set." Sulla base di lunghezza, ciclomatica complessità , copertura di test - qualunque strumenti sono a portata di mano e comodo a voi. Poi sedersi e guardare - e avere ragione. Ora hai un po 'di credibilità, un po' di leva quando si dice, "Mi piacerebbe investire alcune risorse nel rendere il nostro codice cattivo meglio, per ridurre i bug e costi di manutenzione - e io so dove investire quell'energia, vedi?"

Si potrebbe creare diagrammi e schizzi di come funziona il nuovo codice e come le classi e le funzioni sono legati l'uno all'altro. Si potrebbe utilizzare FreeMind o forse Dia. E sono assolutamente d'accordo con la documentazione e la commentando il codice. Una volta ho avuto un problema con questo. Ho scritto una classe per J2ME carattere per mia lingua. E 'stato terribile per queste ragioni che forse si potrebbe anche vedere nel codice.

  • Nessun commento o la documentazione
  • Meno orientata agli oggetti
  • Bad variabile / i nomi delle funzioni
  • ...

Ma dopo pochi mesi sono stato costretto a scrivere di nuovo il tutto. Ora ho imparato a usare nomi di variabili significative che sono a volte molto lunghi. commenti scrivere più di scrivere codici. E l'utilizzo di schemi per le classi del progetto e le loro relazioni.

Non so se è stata una vera risposta, ma sicuramente funzionato per me. e per i vecchi codici si potrebbe effettivamente avere rileggere il tutto e aggiungere commenti quando si ricorda le funzionalità.

La speranza ha aiutato.

Parlate con il vostro Product Owner ! Spiega che il tempo investito nel refactoring del vecchio codice porterà lui beneficiare di una maggiore velocità di squadra sulle nuove funzionalità una volta che questo ostacolo è stato rimosso.

A parte gli approcci di cui sopra, che sono buone, si può anche provare questi:

Per mantenere il codice futuro pulito

  • Prova pair programming, almeno per le parti che abbiano un senso. E 'un modo efficace per ottenere rivisto, codice di refactoring una pratica.
  • Cercare di ottenere il refactoring sulla definizione di "fatto". Allora sarà parte del processo di stima e assegnato di conseguenza. Così la definizione di fatto potrebbe includere:. Codificata, unità di test, funzionalmente testata, prestazioni testato, il codice rivisto, refactoring, ed integrato (o qualcosa di simile)

per ripulire il vecchio codice:

  • I test unitari sono grandi per aiutare il refactoring e capire come funzionano le cose.
  • Sono d'accordo con i commenti che un business case deve essere fatta per il refactoring su larga scala. Ma, refactoring su piccola scala potrebbe essere facilmente inclusi nella stima e fornirà ritorno immediato. cioè .: Spendo 2 ore riscrivere un pezzo, ma avrei speso quel tempo alla ricerca di insetti in ogni caso.

Si può anche prendere in considerazione ottenere il proprietario del prodotto e ScrumMaster per catturare una velocità separato per il vecchio codice contro il nuovo codice, e l'uso che di conseguenza.

Se c'è una nuova funzionalità desiderata e si può delineare un pezzo non schiacciante di codice che è nel modo in cui, allora si potrebbe essere in grado di ottenere la benedizione di gestione per sostituire il vecchio codice con il nuovo codice che ha la nuova funzione desiderata. Quando ho fatto questo, ho dovuto scrivere uno strato di spessore un po 'brutto per soddisfare le vecchie interfacce della parte del software non avevo intenzione di toccare. E un test harness che potrebbe esercitare il codice esistente ed esercitare il nuovo codice per assicurarsi che il nuovo codice, come si è visto attraverso lo strato di spessore, potrebbe ingannare il resto dell'applicazione a pensare nulla era cambiato. Rielaborando la parte che abbiamo rielaborato, siamo stati in grado di mostrare enormi vantaggi di prestazioni, la compatibilità con il nuovo hardware, la riduzione in ciascuna delle esigenze del nostro sito campo per competenza nella gestione spazio per l'applicazione desiderata - e il nuovo codice è risultato molto più gestibile. Questo ultimo punto non importava in nulla agli utenti, ma gli altri vantaggi dalla rilavorazione fosse abbastanza attraente per "vendere" gli utenti sul merito di una conversione di database un po 'doloroso.

Un altro caso di successo più modesto: abbiamo avuto un sistema di tracciamento problemi decente che aveva letteralmente anni di storia. C'era un sottosistema della nostra applicazione che è stata famosa per la velocità con cui si brucerebbe programmatori di manutenzione. Chiaramente (beh, chiaramente nella mia mente) che aveva bisogno di un grande ri-scrittura, ma la gestione non era entusiasta di questo. Siamo stati in grado di scavare attraverso la storia dei dati di monitoraggio di difficoltà per mostrare il livello di personale che era andato in mantenimento di questo modulo, e per tutto ciò che lo sforzo, i trouble ticket al mese contro quel modulo continuato ad arrivare ad una velocità costante. Di fronte a dati reali così, anche i gestori riluttanti che era stato a lungo avari circa di personale rielaborazione di quel sottosistema potrebbe vedere il merito di assegnazione di personale di rielaborare quel modulo.

L'approccio come prima era di lasciare l'ingresso e l'uscita di quel modulo solo. La buona notizia è che gettare la memoria virtuale al nuovo codice, con le sue nuove strutture di dati di fantasia ha fatto dare un notevole miglioramento delle prestazioni al modulo. La cattiva notizia è che siamo stati quasi fatto con la ri-applicazione, prima abbiamo davvero capito cosa era sbagliato nella realizzazione originale in modo tale che ha funzionato la maggior parte del tempo, ma siamo riusciti a fallire su alcune delle operazioni in alcuni giorni. Il primo taglio fedelmente riprodotto quegli insetti, ma gli insetti erano più facili da capire nel codice rielaborato in modo da noi ora avevamo un colpo davvero che fissa il vero problema. Col senno di poi, forse saremmo stati più intelligenti di aver catturato i dati che hanno prodotto i problemi e hanno avuto una migliore cura per assicurarsi che la versione rielaborata non riprodurre quel problema. Ma, la verità è che nessuno capiva il problema fino a quando siamo stati abbastanza lontano lungo per la ri-scrittura. Così, la ri-scrittura ha dato il miglioramento delle prestazioni per gli utenti e migliorato la comprensione ai programmatori attuali, in modo tale che il vero problema potrebbe davvero essere risolto alla fine.

un fail esempio: C'era ancora un altro modulo incredibilmente brutta che persistentemente era un punto dolente. Purtroppo, non ero abbastanza intelligente da essere in grado di comprendere le interfacce de facto a questo particolare alveare tremendo di feccia e malvagità, almeno non nei tempi del piano di rilascio nominale. Mi piacerebbe credere che, dato più tempo avremmo potuto trovato un adeguato piano per la ri-lavorare quel pezzo del sistema di troppo, e forse una volta abbiamo capito, abbiamo potuto anche individuare i miglioramenti dall'utente desiderato che noi potremmo andare bene in riscrivere. Ma non posso promettere che troverete un premio in ogni scatola. Se la casella è interamente oscurare a te, affettare via un pezzo di esso e sostituendo quel pezzo di codice pulito è difficile da fare. Il ragazzo che aveva incaricato di quel modulo è probabilmente quello che era nella posizione migliore per capire un piano d'attacco, ma ha visto i frequenti crash e chiamate from il campo di assistenza come "sicurezza del lavoro". Non credo che la gestione mai veramente riconosciuto che aveva bisogno di essere alleviato da parte di qualcuno con una fame di cambiamento, ma questo è quello che probabilmente era necessaria.

Drew

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top