Risposta
Quanto più vicino ti avvicini a unapplicazione priva di bug, il diventa più costoso. È come indirizzare la copertura del codice al 100%: spendi la stessa quantità di tempo e denaro passando dallo 0% al 95%, dal 95% al 99% e dal 99% al 99,9%.
Ti serve questo 0,1% in più di copertura o qualità del codice? Probabilmente sì, se stai lavorando su un prodotto software che controlla il sistema di raffreddamento di un reattore nucleare. Probabilmente no, se stai lavorando a unapplicazione aziendale.
Inoltre, la creazione di software di alta qualità richiede un approccio molto diverso . Non puoi semplicemente chiedere a un team di sviluppatori che hanno passato la vita a scrivere app aziendali di creare unapplicazione quasi priva di bug. Il software di alta qualità richiede tecniche diverse, come prova formale , qualcosa che certamente non vorresti usare in unapp aziendale, a causa del costo estremamente elevato che rappresenta.
Come ho spiegato in uno dei i miei articoli :
-
Le app aziendali non dovrebbero mirare alla qualità richiesta per il software critico per la vita, perché se di tanto in tanto queste app aziendali falliscono, semplicemente non funziona ” Non importa. Ho visto bug e tempi di inattività nei siti Web di probabilmente tutte le grandi aziende, lunica eccezione è Amazon. Questi tempi di inattività e questi bug sono fastidiosi e forse costano allazienda alcune migliaia di dollari al mese, ma risolverli sarebbe molto più costoso.
-
Il costo dovrebbe essere lobiettivo principale, e dovrebbe essere studiato pragmaticamente. Immaginiamo un bug che colpisce 5000 clienti ed è così importante che questi clienti se ne andranno per sempre. È importante? Sì? Pensaci di più. E se dicessi che ciascuno di questi clienti paga $ 10 allanno e che lo farà costa quasi $ 100.000 per correggere il bug? La correzione dei bug ora sembra molto meno interessante.
Ora per rispondere in modo specifico alle tue domande:
perché i bug vengono segnalati anche dopo aver superato così tanti test? È il nostro problema con i requisiti? Il nostro cliente non sembra soddisfatto di ciò che forniamo? stiamo facendo qualcosa di sbagliato?
Molte cose possono andare storte. Con test, intendi test automatizzati effettivi? In caso contrario, questo è un enorme problema di per sé. I tester capiscono i requisiti? Comunica regolarmente con il cliente, almeno una volta per iterazione, nella migliore delle ipotesi il rappresentante del cliente è immediatamente raggiungibile in loco da qualsiasi membro del tuo team ? Le tue iterazioni sono abbastanza brevi? Gli sviluppatori stanno testando il proprio codice?
Analogamente allarticolo Scrivono le cose giuste collegato sopra, prendi una segnalazione di bug e studia perché questo bug è apparso in primo luogo e perché è stato perso da ogni tester . Questo potrebbe darti alcune idee sulle lacune nel processo del tuo team.
Un punto importante da considerare: il tuo cliente sta pagando per la correzione dei bug? In caso contrario, potrebbe essere incoraggiato a prendere in considerazione molte cose da considerare essere un bug. Farlo pagare per il tempo che dedichi ai bug ridurrà notevolmente il numero di segnalazioni di bug.
Qualcuno ha sviluppato unapplicazione che è stata totalmente privo di bug? Qual è il processo? Perché non possiamo distribuire lapplicazione con bug minori? Dovremmo essere perfezionisti?
Io. Ho scritto unapp per me stesso lo scorso fine settimana e finora non ho trovato alcun bug.
I bug sono bug solo quando vengono segnalati. Quindi, in teoria, avere unapplicazione priva di bug è del tutto possibile: se non viene utilizzata da nessuno, non ci sarà nessuno a segnalare i bug.
Ora, scrivendo unapplicazione su larga scala che corrisponda perfettamente al e si è dimostrato corretto (vedi la prova formale menzionata sopra) è una storia diversa. Se questo è un progetto critico per la vita, questo dovrebbe essere il tuo obiettivo (che non significa che la tua applicazione sarà privo di bug).
Lo scenario attuale è il corretto processo di sviluppo e test? In caso contrario, qual è un modo efficiente in cui sviluppatori, tester e client ottengono il massimo vantaggio insieme?
-
Per capirsi a vicenda , dovrebbero comunicare. Questo non è ciò che accade nella maggior parte delle aziende che ho visto. Nella maggior parte delle aziende, il project manager è lunico che parla con il cliente (a volte con un rappresentante).Quindi, condivide (a volte parzialmente) la sua comprensione dei requisiti con sviluppatori, designer dellinterazione, architetti, amministratori di database e tester.
Questo è il motivo per cui è essenziale che il cliente (o il rappresentante del cliente) essere raggiungibile da chiunque nel team (approccio Agile) o disporre di mezzi di comunicazione formale che autorizzino una persona a comunicare solo con poche altre persone in un team e di farlo in modo che le informazioni possano essere condivise con tutto il team, assicurando che tutti abbiano le stesse informazioni.
-
Ci sono molti processi per eseguire sviluppo e test. Senza conoscere con precisione lazienda e il team, non cè modo di determinare quale dovrebbe essere applicato nel tuo caso. Prendi in considerazione lassunzione di un consulente o di un project manager sufficientemente abile.
Commenti
- +1. Prima ancora di iniziare un progetto, devi avere una comprensione di ciò che è " abbastanza buono per il rilascio " e crea di conseguenza.
- @JuliaHayward non potrebbe ' essere più daccordo. Il gioco finale qui non è ' t zero difetti: sta producendo software funzionale che aggiunge valore in modo tempestivo.
Risposta
Non tutti i bug sono uguali, quindi è necessario separare il grano dalla pula.
Aspettative
Molti bug vengono sollevati semplicemente a causa di una carenza di ciò che fa il software e di ciò che lutente finale si aspetta. Questa aspettativa deriva da molte aree: utilizzo di altro software, documentazione errata, personale di vendita troppo zelante, come funzionava il software ecc. Ecc.
Scope creep
Inutile dire che più fornisci, maggiore è il potenziale di bug. Molti bug vengono semplicemente sollevati grazie alle nuove funzionalità. Fornisci X & Y, ma il cliente afferma che dietro a questo ora dovrebbe anche fare Z.
Comprendere il dominio problematico
Molti bug si verificano per il semplice motivo che il dominio problematico è stato capito male. Ogni cliente ha le proprie regole aziendali, il proprio gergo e il proprio modo di fare le cose. Gran parte di questo non sarà documentato da nessuna parte – sarà solo nella testa delle persone. Con la migliore volontà del mondo, non puoi sperare di catturare tutto questo in un solo passaggio.
Allora … cosa fare al riguardo.
Unit test automatizzati
Molti bug vengono introdotti come effetto collaterale inaspettato di qualche modifica al codice o altro. Se tu dispongono di unit test automatizzati, puoi evitare molti di questi problemi e produrre un codice migliore fin dallinizio.
I test sono validi solo quanto i dati forniti, quindi assicurati di comprendere appieno il dominio del problema.
Copertura del codice
Questo va di pari passo con i test automatici delle unità. Dovresti assicurati che venga testato tanto codice quanto è pratico.
Impara le lezioni
Follia sta facendo la stessa cosa ancora e ancora e ancora e si aspetta risultati diversi
Capisci le cause dellultimo fallimento? Davvero? Davvero? Potresti aver smesso il problema ma qual era la vera fonte principale? Dati errati? Errore dellutente? Corruzione del disco? Interruzione della rete?
Niente infastidisce i clienti più che incontrare ripetutamente gli stessi problemi senza progressi verso una qualche forma di risoluzione.
Risposta
I difetti sono esistiti dallinizio dello sviluppo del software. È difficile dire dalla tua domanda in che misura e con quale gravità i difetti influiscono sullusabilità o sulla funzionalità.
Esistono programmi privi di difetti, ma quasi tutti i sistemi non banali avranno difetti.
Dovrai decidere una sorta di prioritizzazione e probabilmente dovrai studiare la causa dei difetti – dove sono stati introdotti. Cè troppo da discutere su queste cose in un semplice Q & Un post.
Sono stati scritti interi libri sullanalisi causale e sul processo di risoluzione per unorganizzazione che ha problemi di qualità.
Quindi la mia raccomandazione è quello di: (in nessun ordine particolare)
- Implementare un sistema di tracciamento dei difetti se non ne hai già trovato uno
- Determinare un modo per classificare la gravità dei difetti
- Scopri perché non stai soddisfacendo le aspettative dei clienti (sono gli sviluppatori, il QA, il cliente, ecc.)
- Scopri alcuni esercizi come i “Cinque perché” e fai indagini simili azione su alcune delle cause dei tuoi difetti.
Risposta
Dipende da come si chiama unapplicazione.
Se intendi un programma interattivo in cui devi essere certo che il comportamento in tempo reale sia esattamente tale e tale in qualsiasi circostanza, allora è praticamente impossibile dimostrare che non ci sono bug dentro. Suppongo che sarebbe possibile se potessi risolvere il problema di arresto , ma puoi “t.
Tuttavia, se ti limiti a una dichiarazione di “tale e tale input alla fine produrrà questo e quel tale stato finale”, quindi le tue possibilità di una “prova senza bug” sono migliori, perché puoi usare invarianti . Questo, e solo quello, consente di suddividere una prova di correttezza in sottoproblemi, ognuno dei quali può essere relativamente facile dimostrato di funzionare correttamente in tutte le circostanze del programma rimanente (anche se generalmente non si può essere molto accurati su quanto tempo & potrebbe richiedere).
Tali tecniche sono fondamentalmente possibili in qualsiasi linguaggio di programmazione (anche se alcuni esoterici come Malbolge cercano di smentire quello !), ma in tutti i linguaggi imperativi diventa disordinato molto rapidamente, perché devi tenere meticolosamente traccia di un sacco di stato del programma implicito. Nei linguaggi funzionali 1 , le dimostrazioni tendono ad avere un aspetto molto più gradevole ( linguaggi puri , o il sottoinsieme puramente funzionale di un linguaggio). Tuttavia, in particolare con i tipi dinamici, sarà necessario scrivere molti requisiti su quali input sono consentiti. Questo è ovviamente uno dei principali vantaggi di sistemi di tipo statico forti: i requisiti sono proprio lì nel codice!
Beh, idealmente, cioè. In pratica, i programmi O “Caml o anche Haskell tendono a contenere funzioni non totali , ovvero funzioni che si bloccheranno / si bloccheranno / genereranno determinati input, nonostante il tipo corretto 2 . Perché anche se questi linguaggi hanno sistemi di tipi molto flessibili, a volte non è ancora possibile usarli per limitare completamente qualcosa.
Immettere linguaggi di tipizzazione dipendenti ! Questi possono “calcolare” i tipi esattamente come necessario, quindi tutto ciò che definisci può avere esattamente la firma del tipo che dimostra tutto ciò di cui hai bisogno. E in effetti, i linguaggi tipizzati in modo dipendente sono principalmente insegnati come ambienti di prova . Sfortunatamente, penso che nessuno di loro sia davvero allaltezza della scrittura di software di produzione. Per applicazioni pratiche, penso che il massimo che puoi ottenere completamente a prova di bug sia scrivere in Haskell con funzioni così complete come possibile. Questo ti porta abbastanza vicino a a prova di bug – anche se, ancora una volta, solo per quanto riguarda la descrizione funzionale. Haskell Il modo unico di gestire lIO con le monadi fornisce anche alcune prove molto utili, ma generalmente non ti dice nulla su quanto tempo ci vorrà per qualcosa finire. Molto probabilmente, qualcosa potrebbe richiedere tempo esponenziale in circostanze particolari – dal punto di vista dellutente, che sarebbe probabilmente un bug grave come se il programma si bloccasse completamente.
1 O più in generale, linguaggi descrittivi . Non ho molta esperienza con i linguaggi logici, ma suppongo che possano essere altrettanto simpatici nella dimostrazione saluti.
2 Se non è il tipo corretto, il compilatore non lo consentirà mai in quei linguaggi; questo elimina già molti bug. (E, grazie allinferenza del tipo Hindley-Milner, in realtà rende anche i programmi più concisi!)
Commenti
- " Se intendi un programma interattivo in cui devi essere certo che il comportamento in tempo reale sia esattamente tale e tale in qualsiasi circostanza, allora ' è praticamente impossibile dimostrare che non ci sono ' nessun bug dentro. Suppongo che sarebbe possibile se tu potessi risolvere il problema di arresto, ma puoi ' t. ": non sono sicuro che questo laffermazione è corretta. È impossibile verificare un programma arbitrario , ma per quanto riguarda un programma che hai scritto in un modo che consente tale verifica?
- Vedi ad es. cs.cmu.edu/~rwh/smlbook/book.pdf , allinizio della pagina 198: " Infine, è importante notare che specifica, implementazione e verifica vanno di pari passo. Non è realistico proporre di verificare che un pezzo di codice arbitrario soddisfi una specifica arbitraria. La computabilità fondamentale e i risultati della complessità chiariscono che non potremo mai avere successo in unimpresa del genere. Fortunatamente, è anche completamente artificiale. In pratica specifichiamo, codifichiamo e verifichiamo simultaneamente, con ogni attività che informa laltra."
- @Giorgio: certo che puoi scrivere alcuni programmi in un modo che consenta tale verifica , ma questo ti limita abbastanza Un sacco. In un grande programma, ' dovrai quasi sempre sfruttare la completezza di Turing da qualche parte. – Sì, in pratica specifichi, codifichi e " verifichi " simultaneamente, ma questa verifica è spesso abbastanza euristica (basata ad esempio su unit test , non prove reali).
- Cosa intendi per " sfruttamento della completezza di Turing "?
- " … ma questa verifica è spesso abbastanza euristica (basata ad esempio su unit test, non su prove reali) ": No , se leggi attentamente le note, si parla di dimostrare la correttezza per mezzo di metodi formali (es. utilizzando linduzione), non si parla di unit test. Vedi anche compcert.inria.fr/doc .