2009-02-23 7 views
8

Abbiamo un codice davvero scioccante propagandato come struttura di prossima generazione nella mia attuale sede di lavoro.C'è un punto in cui il costo del refactoring supera il costo della riscrittura?

Il fatto è che c'è solo una persona di questa opinione e questo è il ragazzo che ha scritto la maggior parte di esso. Il resto del dipartimento ha l'impressione che sia mal codificato, una pita per il debug e un po 'pacchiano in generale.

Il tizio che l'ha scritto ha una posizione piuttosto influente con il management, quindi sono da quella parte del campo.

Abbiamo evidenziato (genuino) preoccupazioni per la gestione, ma ovviamente non sono disposti a dedicare più tempo a un progetto che non contribuisce direttamente alla linea di fondo.

Esistono diverse applicazioni distribuite su questo framework, quindi qualsiasi refactoring dovrà includere tali applicazioni.

Il tutto è talmente intrecciato che non riusciamo a strappare un'implementazione di una classe particolare e la riscriviamo in questo modo, così anche le semplici modifiche a core api significano un grande progetto.

Ha comunque 3 anni di implementazione in tempo reale e molte correzioni di bug, casi angolari e condizioni limite soddisfatte.

Riscriviamo le parti e cerchiamo di fare il refactoring dato che ci sarebbero diversi progetti di grandi dimensioni, refactoring nel tempo che ci vorranno altri 3 anni per metterlo in forma o semplicemente riscriviamo i nostri requisiti specifici su cima a un quadro esistente?

+0

Domanda ben scritta ma dupes di un dupe di un dupe. http://stackoverflow.com/questions/151498/refactoring-vs-rewriting –

+0

Ci scusiamo per la somiglianza, tuttavia credo che il contesto aggiuntivo fornito con questa domanda possa aver prodotto risposte diverse rispetto a tutte le domande che ho trovato prima di porre la domanda. – Mike

risposta

5

Riscrivere qualcosa è quasi universalmente una cattiva idea: trascorri mesi a lavorare, senza nulla da mostrare finché non hai finito. E questo presuppone che tu non cada preda dell'effetto del secondo sistema, e che in realtà tu sia do fine.

Il refactoring è quasi certamente la risposta giusta. Non ho esperienza di refactoring di PHP (faccio C++ e C#), quindi non posso offrire alcun consiglio specifico. Devi procedere con piccoli passi.

  • Innanzitutto, identifica le parti del codice che ti offendono di più. Per me, in C++, questa è una variabile globale.
  • In secondo luogo, effettuare piccoli refactoring per rimuovere un problema alla volta. Per evitare di rompere i vecchi client di quel codice, potrebbe essere necessario mettere una facciata sul posto. O puoi mettere una nuova facciata sul vecchio codice, oppure puoi mettere una vecchia facciata sul nuovo codice.
  • Terzo, e la cosa più importante, a meno che tu non sia davvero sicuro di , assicurati di avere un solido set di test unitari per il codice che stai per refactoring.

Ma: non rilasciare tutto per riscrivere il codice. Refactor gradualmente. Ti rallenterà un po ', ma continuerai a dare valore mentre procedi.

Vedere this article che ti aiuterà a spiegare il debito tecnico alla tua gestione. Spiegherà anche perché a loro non sembra importare.

0

che è una vera e propria decisione difficile da prendere ...

problema che vedo qui è, che il quadro viene utilizzato e fissato per un lungo periodo di tempo per cui vi un sacco di conoscenze è andato in esso e la qualità per il funzionamento i progetti sono ovviamente accettabili.quindi se lo riscrivi da zero con tutti i requisiti che conosci, puoi essere certo di dimenticare qualcosa che ha già funzionato (difficile spiegarlo a un cliente o al tuo capo;))

refactoring it - it pensare - è anche un compito difficile poiché non v'è solo un ragazzo che sa davvero i collegamenti all'interno del codice - che non vuole cambiarlo ...

ci sono tre opzioni:

  • convivere con essa
  • convincere il tizio che è necessario il refactoring in modo che tutti possano usarlo/mantenerlo non solo
  • convincere la gestione che è necessaria una riscrittura, ma questo otterrà quello che è contro una riscrittura/refactoring veramente sconvolto

in entrambi i casi si è messo - è una brutta situazione per tutti ... dal momento che con il tempo passare dal responsabile del framework dovrà affrontarlo da solo e quindi probabilmente è troppo tardi.

1

Il vantaggio della riscrittura è che è possibile tenere conto di tutte le novità in fase di analisi, creare un modello più adatto alle esigenze attuali. D'altra parte, se solo codificato male, non progettato male, non ha senso fare una riscrittura completa. Basta disinfettare/rifattare il codice.

+0

Le interfacce sono davvero pessime e presentano problemi trasversali (ad esempio, auth è consapevole del suo contesto di invocazione). Alcuni metodi pubblici richiedono fino a 15 parametri e, poiché sono pubblici, non possiamo semplicemente cambiarli senza un'analisi completa dell'impatto sulla nostra base di 500Mb :( – Mike

0

Su un piccolo livello, sì: fornire una nuova versione di una funzione, verificare che funzioni sia con il nuovo che con il vecchio, rimuovere il vecchio. Questo è spesso abbastanza veloce rispetto al refactoring della stessa funzione. Ma a quel livello, è refactoring :)

Il costo di una riscrittura strategico di supera sempre il refactoring.

Non è possibile consegnare. Devi mantenere la vecchia versione mentre sviluppi il nuovo. Se le finanze dicono che devi uccidere il progetto di riscrittura, non hai ottenuto nulla - la tua base di codice funzionante è in cattive condizioni come se nulla fosse mai stato fatto. Probabilmente anche peggio, dal momento che tutte le modifiche sono state accettate perché "lo butteremo via quando la riscrittura finisce comunque".


Sì scenari in cui la riscrittura è più conveniente può essere costruito:

  • la base di codice originale è così spaghettied che le caratteristiche interruzioni modifica locale apparentemente non correlati.
  • Hai una squadra nuova, molto migliore dei vecchi, ma non hanno esperienza con la base di codice esistente, e la base di codice esistente è un disastro, o in una lingua che non conoscono, o qualcosa del genere come quello.

Eppure, l'esperienza dimostra che il codice è male per un motivo, e non è sempre i programmatori, e quando non si identificano e modificano le cause, la riscrittura sarà un esercizio di ripetere la storia.

0

La riscrittura è molto rischiosa. Sostituirai il vecchio codice well-debug con un nuovo codice che deve ancora essere sottoposto a debug. Questo introdurrà un sacco di bug e dovrai risolverli. È preferibile eseguire il refactoring gradualmente, in primo luogo comprendere dettagliatamente a cosa serve una parte, quindi ridefinirla. In questo modo si sostituisce meno codice e si riduce il rischio di introdurre troppi nuovi bug.

0

Per aggiungere a ciò che è già stato detto: Cerca di ottenere un buy-in di gestione. Lì sono i vantaggi per la linea di fondo quando si refactoring - ore uomo per la programmazione di nuove funzionalità andrà giù nel tempo piuttosto che su, portando a costi ridotti in salario e, eventualmente, i costi del server pure. Se nessuno dei dirigenti capisce perché il refactoring è utile e ti renderà più felice facendo il tuo lavoro, stai lavorando nel posto giusto?