Refactoring in un sistema legacy: buono o cattivo respingimento tecnico

2

Sto notando una strana mentalità, quando si tratta del codice di refactoring, e non sono troppo sicuro di come lo sto percependo.

Panoramica del progetto corrente:

Un'applicazione Web utilizzata come estensione di un'applicazione Web di terze parti esistente. L'applicazione di terze parti mantiene gli orari tra clienti e fornitori. L'estensione consente di modificare giorni / orari che il cliente richiede di riprogrammare, modificare l'attuale serie di programmi in caso di emergenza, modificare un fornitore se non possono più essere contrattati e creare i file di fatturazione appropriati. Per quanto riguarda lo sviluppo, il team è impostato per seguire la maggior parte delle idee di Scrum.

Il sistema è stato costruito in base a numerosi criteri una tantum, principalmente a causa del fatto che i clienti del progetto non hanno pienamente compreso i loro processi interni (a causa di allenamenti interni / fatturati). Abbiamo visto molte aree, dove ci sono controlli basati sul contenere alcune stringhe hard-coded.

Questo ci porta al problema. C'è un controllo per un fornitore specifico (possiamo chiamarlo SomeVendor), e il controllo è impostato per se il nome ne contiene Alcuni. Successivamente, quando guadagniamo e perdiamo fornitori, un altro fornitore viene aggiunto come SomeOtherVendor. Il problema con questo è ovviamente il controllo basato sul contenere alcuni. SomeVendor è un caso specifico che deve essere controllato e sono altri fornitori che devono essere controllati in modo simile e filiali nel proprio insieme di funzionalità. Nel trovare questi controlli, vediamo che è stato sviluppato rispetto a un programma può essere correlato a un fornitore, ma non è sempre assegnato a loro. Gli utenti dovrebbero associarlo durante l'esecuzione.

Il cliente si rende conto che c'è un problema con SomeVendor e ha chiesto che un difetto sia inserito nel backlog e lo abbia assegnato la priorità al proprietario del prodotto. Ho rilevato il difetto e sviluppato una tabella di ricerca per i venditori di SomeVendor validi (nel caso in cui più di uno fosse mai valido in base all'Id).

È in arrivo una distribuzione mid-sprint, quindi sono andato a discutere se sarebbe stato necessario aggiungerlo alla distribuzione con il mio esempio. Ha espresso che gli è piaciuta la soluzione, ma ha chiesto se potevo farlo in un modo che includesse la mappatura di tutti i fornitori che devono essere controllati. Ha anche dichiarato di farlo esclusivamente per il problema attuale.

Il giorno seguente lo sviluppatore senior chiede di collaborare con me alla progettazione e procede discutendo la configurazione di tutti i fornitori e incorporandolo nella base di codici. Come detto sopra, il sistema rappresenta alcuni fornitori come "possono essere" di alcuni tipi, ma non è sempre il caso.

Abbiamo discusso sul punto che il sistema può considerarlo solo come possibile, ma non è determinato fino a quando non risparmiano in fase di esecuzione. Il suggerimento è di portare questo al proprietario del prodotto e ottenere i criteri dai clienti del progetto.

Vedo il punto nel refactoring in un punto in cui il codebase lo userebbe correttamente, ma a questo punto mi sembra che stia entrando nel regno dell'ingegneria. Quel sentimento è dovuto principalmente a una storia / difetto già determinato e priorizzato con il cliente, e abbiamo dato quello che abbiamo detto che avremmo fatto dalla pianificazione Sprint. Questo sembra che ci stiamo intrufolando in un deliverable che non sanno di aver bisogno (che è stato discusso di recente tra noi e il cliente).

Questo tipo di refactoring è qualcosa che dovrebbe accadere, o è un segnale di cattiva spinta tecnica? In realtà, non mi importa se la risposta riguarda specificamente l'agile. Mi sembra strano, nel senso che la squadra abbia qualche lavoro richiesto, quindi consegna qualcosa che non è stato concordato.

    
posta eparham7861 17.09.2017 - 16:15
fonte

1 risposta

4

Non capisco il problema specifico che hai, ma ho notato alcune idee generali nella tua domanda.

Se le modifiche che stai implementando non influenzano il comportamento percepito dall'utente del prodotto, non è necessario coinvolgere il proprietario del prodotto. È tua responsabilità, in qualità di esperto tecnico qui, decidere se questo cambiamento è importante per te nel lungo periodo. Se trascorrere qualche giorno in questo momento ti farà risparmiare settimane di debug e correzione dei bug in futuro, provaci. Non ci dovrebbe essere bisogno di spiegarlo al proprietario del tuo prodotto.

Un'altra cosa è chiamare ciò che stai facendo un refactoring. Un refactoring è un cambiamento breve e rapido, che può essere immediatamente trasferito nel prodotto, senza alcun cambiamento tangibile per l'utente finale. E molti di questi piccoli refactoring potrebbero cambiare drasticamente il funzionamento interno del software per lunghi periodi di tempo. Quello che stai facendo sembra più, come lo chiamo, un reingegnerizzazione. Tuttavia, questa modifica non dovrebbe essere vista dall'utente finale.

Sono sicuro che il tuo cambiamento PU CAN essere suddiviso in molte piccole modifiche, che possono essere implementate lentamente nel tempo. Questo ti permetterà di controllare se qualcuno dei cambiamenti rompe qualcosa. Offre inoltre ad altri sviluppatori la possibilità di assorbire meglio le modifiche e fornire un feedback.

mid-Sprint deployment

Che cos'è questo? Non ci dovrebbero essere distribuzioni durante lo sprint. Alla fine dello sprint vengono creati solo artefatti potenzialmente utilizzabili. Tutto il resto dovrebbe essere trattato come work-in-progress. Se stai facendo delle implementazioni durante lo sprint, allora mi chiedo perché stai usando gli sprint, e non qualcosa di continuo, come Kanban.

    
risposta data 17.09.2017 - 16:48
fonte

Leggi altre domande sui tag