Correggi bug o attendi che il cliente li trovi?

34

Le altre persone correggono i bug quando li vedono, o aspettano fino a quando non ci sono crash / perdita di dati / persone che muoiono prima di risolverlo?

Esempio 1

 Customer customer = null;
 ...
 customer.Save();

Il codice è chiaramente sbagliato e non c'è modo di aggirarlo: chiama un metodo su un riferimento null. Capita di non bloccarsi perché Save capita di non accedere a nessun dato di istanza; quindi è come chiamare una funzione statica. Ma qualsiasi piccola modifica da qualche parte può improvvisamente causare un codice rotto che non si arresta in modo anomalo: per iniziare a bloccarsi.

Ma , non è neanche inconcepibile che corregge il codice:

Customer customer = null;
...
customer = new Customer();
try
   ...
   customer.Save();
   ...
finally
   customer.Free();
end;

potrebbe introdurre un arresto anomalo; uno non rilevato tramite test unitari con copertura completa e test manuale dell'utente.

Esempio 2

float speed = 0.5 * ((G * mass1 * mass2) / R) * Pow(time, 2);

Le persone che conoscono la fisica riconosceranno che dovrebbe essere R 2 nel denominatore.

Il codice è sbagliato, è assolutamente sbagliato. E sopravvalutare la velocità farà esplodere troppo presto i razzi-retro, uccidendo tutti gli occupanti del veicolo spaziale.

Ma è anche possibile che forse sopravvaluti la velocità mascherino un altro problema: gli airbag non possono essere posizionati mentre la navetta si muove troppo velocemente. Se improvvisamente aggiustiamo il codice:

float speed = 0.5 * ((G * mass1 * mass2) / Pow(R, 2)) * Pow(time, 2);

Ora la velocità è precisa e improvvisamente gli airbag si stanno dispiegando quando non dovrebbero.

Esempio 3

Ecco un esempio che ho avuto di recente, controllando se una stringa contiene caratteri non validi:

if (StrPos(Address, "PO BOX") >= 0)
{
   //Do something
}

Che cosa succede se viene rilevato un errore nel ramo Do something ? Correggere il codice ovviamente errato:

if (StrPos("PO BOX", Address) >= 0)
{
   //Do something
}

Corregge il codice, ma introduce un bug.

Per come la vedo ci sono due possibilità:

  • correggi il codice e incolpati di averlo infranto
  • attendi che il codice si blocchi e venga incolpato di avere un bug

Che cosa tu fai politicamente?

Esempio 4 - Bug del mondo reale di oggi

Sto costruendo un oggetto, ma chiamando il costruttore sbagliato:

Customer customer = new Customer();

Si scopre che il costruttore "parameterless" è in realtà un costruttore parametrizzato da un altro punto indietro nella catena di ereditarietà:

public Customer(SomeObjectThatNobodyShouldBeUsingDirectly thingy = null)
public Customer(InjectedDependancy depends)

Chiamarlo è un errore, poiché ignora tutti i costruttori successivi.

Potrei cambiare il lignaggio dell'oggetto per non esporre un costruttore così pericoloso, ma ora devo cambiare il codice in:

Customer customer = new Customer(depends);

Ma non posso garantire che questo cambiamento non rompere nulla. Come il mio Esempio 1 sopra, forse qualcuno, da qualche parte, in qualche modo, in alcune condizioni esoteriche, dipende dal Customer costruito per essere non valido e pieno di junk.

Forse l'oggetto Customer , ora che è correttamente costruito consentirà l'esecuzione di un codice che in precedenza non è mai stato eseguito e ora posso ottenere un arresto anomalo.

Non posso scommettere la vita di tua moglie.

E posso testarlo da qui a martedì, non posso giurare sulla vita di tua figlia che non ho introdotto una regressione.

I I:

  • Risolvete il codice e vieni accusato di averlo infranto? o
  • Lasciare il bug e incolpare quando il cliente lo trova?
posta Ian Boyd 28.10.2010 - 19:54
fonte

14 risposte

33

Ciò dipende in modo selvaggio dalla situazione, dall'errore, dal cliente e dall'azienda. C'è sempre un compromesso da considerare tra correggere l'implementazione e potenzialmente introdurre nuovi bug.

Se dovessi dare una linea guida generale per determinare cosa fare, penso che sarebbe qualcosa di simile a questo:

  1. registra il difetto nel sistema di tracciamento di scelta. Discutere con la direzione / i colleghi, se necessario.
  2. Se si tratta di un difetto con conseguenze potenzialmente disastrose (ad esempio il tuo esempio n. 2), corri, urla, salta su e giù fino a quando qualcuno con avvisi di autorità e determina una linea di condotta appropriata che mitigherà i rischi associati alla correzione del bug. Questo potrebbe spingere indietro la data di uscita, salvare vite umane, lavare le finestre, ecc.
  3. Se si tratta di un difetto senza interruzione o esiste una soluzione alternativa, valutare se il rischio di risolverlo è superiore al beneficio della correzione. In alcune situazioni è meglio aspettare che il cliente lo porti su, dal momento che sai che non stai spendendo tempo a sistemare / ritestare le cose quando non è richiesto al 100%.

Attenzione, questo si applica solo quando sei vicino a un rilascio. Se sei in modalità di sviluppo completo, mi limiterò a registrare il difetto in modo che possa essere monitorato, correggerlo e richiamarlo. Se è qualcosa che richiede più di mezz'ora per risolvere e verificare, andrei dal responsabile / responsabile del team e vedrò se il difetto debba essere inserito nel ciclo di rilascio corrente o programmato per un secondo momento.

    
risposta data 28.10.2010 - 20:03
fonte
34

I clienti troveranno SEMPRE bug . Non ci sono mai bug nascosti dai clienti. Alla fine i bug che introduci torneranno sempre da te. Non risolverli è semplicemente una cattiva pratica professionale. I professionisti non lo fanno.

Quando i clienti trovano bug, la società sembra in cattive condizioni, non uno sviluppatore individuale. Questo è molto peggio per l'azienda, quindi c'è il tuo caso per fare il cambiamento. Se non si è sicuri di apportare questo cambiamento nel timore di introdurre altri bug, parlare con uno sviluppatore più anziano, responsabile tecnico del progetto o chiunque altro sia in grado di prendere una decisione su tale cambiamento e successivamente gestire le conseguenze.

    
risposta data 28.10.2010 - 20:06
fonte
23

Correggi il bug

Siamo professionisti qui. Se trovi un percorso in errore nel codice che causerà un arresto anomalo o un comportamento errato, dovrai risolverlo. A seconda delle procedure del tuo team, è probabile che tu debba presentare un difetto, magari scrivere un test di regressione e controllare la correzione al momento giusto del ciclo della nave. Se si tratta di un bug a bassa priorità, il check-in della correzione vicino all'inizio di una milestone è sempre un buon momento perché se si causa una regressione non si influirà sul ciclo di rilascio del milestone.

Non confondere questo con refactoring o apportare miglioramenti delle prestazioni che non sono correlati a un bug delle prestazioni.

Un sistema di controllo del codice sorgente distribuito in cui è possibile mantenere un repository separato di "piccole correzioni di bug" e quindi unire facilmente all'inizio di una pietra miliare è di grande aiuto qui.

    
risposta data 28.10.2010 - 20:22
fonte
20

Che cosa direbbe il cliente?

Ecco come immagino questo gioco:

Customer: It crashes when I do x.

Programmer: Oh yeah! I remember I saw that a while back. I figured it wasn't a big deal yet, so I left it in there.

Customer: [reaches for blunt object]

Sì. Risolvi il bug. Salverai il cliente da un'esperienza aggravante e riuscirai a risolverlo prima che diventi un'emergenza.

E se pensi che la tua correzione possa effettivamente causare un arresto anomalo, non hai ancora trovato una soluzione.

    
risposta data 28.10.2010 - 20:53
fonte
8

Tutti gli esempi che hai dato sembrano avere una discussione comune. Sembra che tu voglia correggere un bug che non capisci completamente. Dico questo perché noti la possibilità di conseguenze non intenzionali su ciascuno di essi.

Direi che è probabilmente un grosso errore e come Ben Laurie scrive non aggiustare un bug non capisci . In questo famoso esempio il team di Debian ha rotto la crittografia per OpenSSL per Debian e derivati come Ubuntu quando hanno seguito i risultati di uno strumento di analisi.

Se ritieni che ci sia un difetto osservando il codice, assicurati di poter riprodurre il difetto in modo che il cliente possa vedere. Se non puoi perché non spendi le tue risorse per aggiustare qualcos'altro.

    
risposta data 29.10.2010 - 05:02
fonte
7

Inizia a ridurre il debito tecnico non appena possibile .

I tuoi esempi assomigliano sicuramente a codice precedente , hanno molti debiti tecnici e sento che il timore del cambiamento (BTW, questo è non una critica o un giudizio). Il tuo intero team deve riconoscere che hai questo debito tecnico (quindi non sei da solo incolpato per questo) e poi puoi decidere come affrontarlo.

Nell'Esempio 1, se Save() non accede a nessun dato di istanza, quali dati del cliente salvano esattamente? Inizia a risolverlo e testarlo.

Nell'esempio 2, è facile coprire il calcolatore della velocità con i test e assicurarsi che calcoli il risultato corretto in tutti gli esempi chiave.

Nell'Esempio 3, c'è il pericolo di riportare in vita il codice morto. Questo codice dovrebbe essere eliminato del tutto? Qual è l'intento della condizione booleana sotto che se? È per garantire che la stringa non contenga caratteri non validi? O per assicurarsi che abbia "PO BOX" al suo interno? Prima inizi a rispondere a queste domande, meglio è.

Dopo aver risolto un certo numero di tali problemi, fai una specie di retrospettiva / autopsia con la tua squadra. È importante imparare dall'esperienza in modo da poter ridurre la frequenza di iniezione dei difetti in futuro.

    
risposta data 28.10.2010 - 20:57
fonte
5

Hai già buone risposte. Aggiungerò solo qualcosa sul problema di aver paura che qualcosa si blocchi.

In primo luogo, nella situazione ideale il software è modulare, è architettato correttamente e vi è una buona separazione delle preoccupazioni. In questo caso, è altamente improbabile che le modifiche apportate si interrompano, poiché avrai il controllo di tutto il codice correlato e non ci sono sorprese nascoste.

Sfortunatamente, la situazione ideale è fittizia. Indipendentemente dalla misura in cui l'accoppiamento è libero, ci sarà l'accoppiamento e quindi la possibilità di rompere qualcos'altro.

La soluzione a questo è duplice:

  1. Rendi il codice il più strutturato possibile
  2. Quando il codice è isolato abbastanza da sapere che nessun altro si interromperà, correggilo.

Rendere il codice ben strutturato è non fatto riscrivendo l'intero codice in una nuova progettazione architettonica. Piuttosto, refactoring guidato dai test è tuo amico qui. In questo passaggio, non modifichi la funzionalità.

Il secondo passo è che correggi il bug.

Alcuni punti sono rilevanti:

  1. Controllo versione è assolutamente necessario per questo processo.
  2. La fase di refactoring e la fase di bug fixing si impegnano meglio nel controllo della versione come commit separati, quindi ognuno ha una funzionalità storica ben definita.
  3. Non fissarti sulla possibilità di fare un altro bug, non otterrai nulla. Piuttosto, pensa di migliorare il tuo codice. In altre parole, a meno che tu non sappia che stai aumentando gli errori piuttosto che diminuirli, dovresti farlo.
  4. Relativo all'ultimo punto: non cercare di prevedere il futuro. Gli umani sono prevenuti nel pensare di essere molto bravi nelle previsioni. In realtà i nostri poteri di previsione sono a breve termine. Quindi non preoccuparti di un vago bug indefinito futuro. Questo è anche il principio alla base di YAGNI .
  5. Lo strumento corrispondente al controllo della versione nel mondo dei bug è il bug tracker . Ne avrai bisogno anche.
  6. È necessario correggere i bug per due motivi: per soddisfare il cliente; e per poter progredire nel tuo sviluppo. Per usare l'esempio 3 (quello della fisica): se il programma soddisfa il cliente con un'equazione così spezzata, allora ci sono molte altre parti del software che sono state sviluppate in modo errato per mitigare questo bug (ad esempio l'implementazione dell'airbag). Se per questo software è richiesta una versione 2 (o 1.1), allora sarà sempre più difficile sviluppare codice corretto in base a quello difettoso. Allora stai andando verso la grande riscrittura, o per il grande fallimento. Entrambe le cose da evitare.

Questi sono già più di alcuni punti, quindi suppongo che mi fermerò qui.

    
risposta data 29.10.2010 - 01:19
fonte
3

Devi prima considerare la definizione di un bug:

  1. Il codice letto non corrisponde a ciò che ritieni corretto
  2. Il software non esegue correttamente i suoi compiti

Sembra che ti concentri sulla # 1, dove # 2 è il posto migliore dove sederti. Certo, noi programmatori vogliamo che il nostro codice sia giusto (# 1), ma le persone ci pagano per farlo lavorare (# 2).

Ciò che potresti o non potresti fare al codice base che potrebbe accidentalmente introdurre nuovi bug è irrilevante per la visione n. 2 del software attuale. Tuttavia, # 1 è importante per te o per il programmatore di manutenzione che segue. A volte è difficile decidere, ma quando i conflitti n. 2 e n. 1, devi sapere che il n. 2 è chiaramente più importante.

    
risposta data 28.10.2010 - 20:10
fonte
2

Nessuno dei due. C'è una terza via: trovare un modo per dimostrare che "il codice problematico" sta effettivamente causando problemi dal punto di vista del business. Conferma ciò che trovi con BA / QA o almeno il tuo manager. Quindi pianifica la correzione quando tutti sono a conoscenza del problema.

Ci sono più scenari possibili diversi da un bug valido nei casi che hai menzionato:

  1. Il codice che stai guardando è un codice morto. Forse perché come ha detto ysolik: i clienti trovano sempre bug. In caso contrario, forse il codice non viene mai eseguito.
  2. C'era una situazione WTF in cui l'errore evidente aveva il suo scopo. (Stiamo parlando di codice di produzione, tutto potrebbe essere successo, giusto?)
  3. Business / clienti già conoscevano il problema ma non sentono la necessità di risolvere il problema.
  4. Forse di più ...

In ogni caso sopra, se sono un manager, non voglio che gli sviluppatori utilizzino il suo giudizio e correggano l'errore in atto. La correzione dell'errore può essere d'aiuto nella maggior parte delle volte, ma quando va male, può causare più problemi rispetto alle sue buone intenzioni.

    
risposta data 28.10.2010 - 21:36
fonte
2

Do i:

  • fix the code and get blamed for breaking it? or
  • leave the bug, and get blamed when the customer finds it?

Correggi il bug, avvia i test delle unità e quando hanno successo, controlli la tua correzione.

(Oppure, se i tuoi test unitari impiegano molto tempo, prima controlla la tua correzione e poi attendi se lo strumento CI ti manda una mail perché il tuo commit ha rotto qualcosa.)

    
risposta data 28.10.2010 - 21:50
fonte
1

Risolvi i problemi in caso di crash / perdita di dati. Spedire un programma con un bug noto per la perdita di dati è decisamente dannoso e imperdonabile.

Se il bug è cosmetico o non critico (può essere evitato), allora dovrebbe essere documentato e dovrebbe essere fornita una soluzione alternativa. Idealmente dovrebbe essere corretto, ma a volte è troppo costoso risolverlo per la versione corrente.

Nota come ogni progetto software più grande ha una sezione "Problemi noti" nel file Leggimi che di solito elenca esattamente questo: Bug conosciuti.

Conoscere i bug e NON comunicarli è IMHO accettabile solo per bachi veramente minori / estetici.

    
risposta data 29.10.2010 - 02:23
fonte
1

Risolvilo e testalo. Se decidi di tenere noti i bug solo perché hai paura di trovare altri bug, il tuo programma diventa un campo minato dalle bombe a orologeria così veloce da renderlo irreparabile prima di quanto pensi.

Dato che sei il comandante e il codice è subordinato, potresti non aver paura di cambiarlo quando vedi che è sbagliato. La paura del codice ("potrebbe vendicarsi rompendo da qualche altra parte") è semplicemente inaccettabile.

    
risposta data 29.10.2010 - 11:00
fonte
0

Se c'è chiaramente un crasher, o qualcosa di sbagliato , dovresti correggerlo. Se c'è un'ambiguità nelle specifiche, cioè se ti trovi a pensare "beh, il cliente potrebbe aspettarsi questo, ma poi sembra che potrebbe essere un bug" o un problema nelle specifiche, ad esempio "ci è stato chiesto di farlo ma fa schifo", quindi è necessario scoprire cosa fare. Lanciare il codice oltre il muro e attendere che il feedback dei clienti sia negativo: potresti chiedere a un product manager se ne hai uno o chiedere al cliente prima di distribuire il prodotto.

Ricorda che "sappiamo di questo problema e lo risolviamo in una versione futura" è sinonimo di "sappiamo di quel problema, ma non ti importa abbastanza di te per evitare che tu ti occupi di esso".

    
risposta data 28.10.2010 - 21:41
fonte
0

La giusta linea di condotta è non ignorare il bug, né "ripararlo" sul posto; proprio per le ragioni che hai identificato nella tua domanda.

Penso che dovresti provare a capire prima il codice. Se il codice che stai vedendo ha una certa età e nessuno ha ancora notato il "bug", probabilmente c'è una ragione per questo. Prova a trovare questo motivo. Ecco cosa vorrei vedere prima di prendere una decisione:

  • Cronologia : utilizza il software di controllo della versione per rispondere alle domande: chi ha toccato il codice? Cosa hanno cambiato? E con quali messaggi di commit l'hanno verificato? Puoi inferire un motivo per cui il codice sembra come fa?

  • Utilizza : quale codice utilizza il codice difettoso? E come? Il codice è morto? Esiste un altro codice che si basa sul comportamento errato?

  • Autore : se non riesci a raggiungere una conclusione rapidamente utilizzando le informazioni di cui sopra, chiedi all'autore del codice (almeno se è possibile) perché il codice assomiglia al suo lo fa. Di solito avrai o un "Oups, che dovrebbe essere risolto!" o "No! Non cambiarlo !!! È necessario in questo modo!" subito.

risposta data 17.09.2015 - 20:36
fonte

Leggi altre domande sui tag