L'efficienza relativa dei costi dello sviluppo guidato dai test (di accettazione)


15

Vorrei sapere qual è l'impatto complessivo della pianificazione delle risorse su un progetto software, in cui i requisiti e la progettazione del progetto sono guidati da test di accettazione automatizzati e unit test, in contrasto con un approccio più "tradizionale" allo sviluppo del software.

inserisci qui la descrizione dell'immagine

Qual è, secondo la tua esperienza, l'effetto complessivo sui requisiti delle risorse per il completamento di un progetto software sotto TDD, al contrario di metodologie di sviluppo più "tradizionali"? Mi sembra evidente che la qualità aumenterebbe e la quantità di incertezza diminuisce perché i test vengono eseguiti prima, ma richiedere test in anticipo sembra che richiederebbero più ore di sviluppo per essere realizzati. Quanto aumenta lo sforzo di sviluppo o diminuisce effettivamente a causa dell'eliminazione anticipata dei bug?

Quanto più impegno è richiesto dal cliente? Devono cambiare il modo in cui si relazionano al progetto, specialmente se sono abituati alla progettazione di grandi dimensioni in anticipo? Il numero di ore richieste per il cliente aumenta complessivamente o diminuisce effettivamente?

Immagino che le stime temporali sarebbero molto vaghe in un processo TDD iterativo all'inizio di un progetto TDD (poiché non esiste un piano di sviluppo software). C'è un punto, diciamo, il 20% in un progetto, in cui la fiducia aumenta abbastanza da poter eventualmente fornire al cliente una stima di tempo e denaro più o meno stabile?

Nota: non sto cercando opinioni o teorie soggettive qui, quindi per favore non speculare. Sto cercando di più per l'esperienza del mondo reale in TDD.


Sono sicuro che non ci sono dati sul mondo reale. Ottieni solo opinioni e teorie soggettive basate sull'esperienza del mondo reale delle persone.
Euforico,

1
@Euforico: sto cercando osservazioni oggettive e realtà basate sull'esperienza del mondo reale. Mi dispiace non averlo chiarito. Tuttavia, non ho bisogno di numeri concreti; Accetterò impressioni generali come: "mentre il nostro tempo di sviluppo è aumentato in modo sostanziale, i nostri costi di manutenzione sono diminuiti perché il software era più affidabile e il cliente lo ha compreso meglio perché ha preso parte alla progettazione durante lo sforzo di sviluppo".
Robert Harvey,

2
Quindi, questa è una domanda basata sull'opinione? Sembra certamente uno di loro
BЈовић


@ BЈовић: vedi l'ultimo paragrafo nel mio corpo di domanda.
Robert Harvey,

Risposte:


11

La prima cosa che deve essere dichiarata è che TDD non lo fa necessariamente aumenta la qualità del software (dal punto di vista dell'utente). Non è un proiettile d'argento. Non è una panacea. Ridurre il numero di bug non è il motivo per cui facciamo TDD.

TDD è fatto principalmente perché si traduce in un codice migliore. Più specificamente, TDD risulta in un codice più facile da modificare .

Il fatto che tu voglia utilizzare TDD dipende più dai tuoi obiettivi per il progetto. Sarà un progetto di consulenza a breve termine? Ti viene richiesto di supportare il progetto dopo il go-live? È un progetto banale? In questi casi l'overhead aggiunto potrebbe non valerne la pena.

Tuttavia, è mia esperienza che la proposta di valore per TDD cresce esponenzialmente man mano che il tempo e le risorse coinvolte in un progetto crescono in modo lineare.

Buoni test unitari offrono i seguenti vantaggi:

  1. I test unitari avvertono gli sviluppatori di effetti collaterali indesiderati.
  2. I test unitari consentono lo sviluppo rapido di nuove funzionalità su sistemi vecchi e maturi.
  3. I test unitari offrono ai nuovi sviluppatori una comprensione più rapida e accurata del codice.

Un effetto collaterale del TDD potrebbe essere meno bug, ma sfortunatamente è la mia esperienza che la maggior parte dei bug (in particolare quelli più cattivi) sono generalmente causati da requisiti poco chiari o scarsi o non sarebbero necessariamente coperti dal primo ciclo di test unitari.

Riassumere:

Lo sviluppo sulla versione 1 potrebbe essere più lento. Lo sviluppo sulla versione 2-10 sarà più veloce.


1
Mi piace che la giustapposizione esplicita di "codice migliore" sia diversa dall'aumentare "la qualità del software", vale a dire che le cose che i programmatori apprezzano nel codice non sono necessariamente quelle che fanno ciò che il cliente desidera.

1
Non sono previsti test di accettazione e test unitari per chiarire i requisiti?
Robert Harvey,

@RobertHarvey Dovrebbero essere ma non sono necessariamente . I test unitari e i test di collaudo rifletteranno la comprensione da parte dello sviluppatore dei requisiti quando vengono scritti. Gli sviluppatori possono avere qualsiasi cosa, da una comprensione completa a nessuna comprensione dei requisiti quando iniziano a scrivere il software. Quella parte dell'equazione dipende molto più dal cliente e dal product manager che da qualsiasi altra cosa. Teoricamente, i test dovrebbero aiutare molto. In pratica, beh, "dipende".
Stephen,

1
Dovrei chiarire, stiamo parlando di TDD in isolamento qui, non di un'implementazione SCRUM che incorpora TDD. In isolamento, TDD è tutto sulla scrittura di test in modo da scrivere codice migliore e poter refactoring più velocemente e in modo più sicuro in seguito.
Stephen,

1
@Stephen: forse avrei dovuto chiarire che sto parlando del sapore del TDD che incorpora i test di accettazione come parte del processo di raccolta dei requisiti. Ho aggiunto un grafico alla domanda per renderlo più chiaro.
Robert Harvey,

6

C'è un capitolo nella creazione di software sullo sviluppo guidato dai test, che cita l'articolo discusso qui .

Sono stati condotti casi di studio con tre team di sviluppo di Microsoft e uno di IBM che hanno adottato TDD. I risultati dei casi studio indicano che la densità del difetto di pre-rilascio dei quattro prodotti è diminuita tra il 40% e il 90% rispetto a progetti simili che non hanno utilizzato la pratica TDD. Soggettivamente, i team hanno registrato un aumento del 15–35% nei tempi di sviluppo iniziale dopo l'adozione del TDD.

Se questi risultati siano generalizzabili nel tuo caso è, ovviamente, qualcosa che i sostenitori della TDD sosterranno è ovvio e i detrattori della TDD sosterranno che è falso.


4
Il problema con quello studio è che non hanno testato il codice prima di adattare TDD. TDD non è uno strumento magico che riduce il numero di difetti del 40-90% semplicemente adottandolo
BЈовић

1
@ BЈовић Non credo che reclamino "magia" da nessuna parte in quel documento. Sostengono che alcuni team hanno adottato TDD, altri no, hanno ricevuto un lavoro "simile" e sono state registrate densità di difetti e tempi di sviluppo. Se avessero costretto i team non TDD a scrivere unit test comunque solo per fare in modo che tutti avessero test unitari, non sarebbe uno studio ecologicamente valido.

Uno studio ecologicamente valido? La sorta dipende da cosa stai misurando. Se vuoi sapere se scrivere i tuoi test in anticipo è importante, allora tutti devono scrivere unit test, non solo il gruppo TDD.
Robert Harvey,

1
@robert Harvey è una questione di variabili confuse, non di validità ecologica. Progettare un buon esperimento comporta sfumare quelli fuori. Ad esempio, se il gruppo di controllo stava scrivendo test unit post post hoc, la gente direbbe che l'esperimento non era corretto perché il gruppo di controllo stava lavorando in un modo insolito trovato in natura.

2
Fortunatamente non ho detto che lo fossero.

5

Non ho documenti di ricerca o statistiche da darti, ma riferirò la mia esperienza lavorando in un team / organizzazione che storicamente aveva una copertura unitaria medio-bassa e nessun test end-to-end, e gradualmente spostando la barra dove siamo ora, con più di un approccio ATDD (ma, ironicamente, non tradizionale TDD).

In particolare, questo è il modo in cui le tempistiche del progetto venivano utilizzate (e continuano a giocare su altri team / prodotti nella stessa organizzazione):

  • Fino a 4 settimane di analisi e implementazione
  • 2 settimane di test di regressione, correzione di errori, stabilizzazione e preparazione del rilascio
  • 1-2 settimane per la correzione di difetti noti
  • 2-3 settimane di pulizia del codice e problemi / supporto post-produzione (difetti sconosciuti / interruzioni non pianificate)

Sembra un ridicolo sovraccarico, ma in realtà è molto comune, è spesso mascherato in molte organizzazioni da un QA mancante o inefficace. Abbiamo buoni tester e una cultura di test intensivi, quindi questi problemi vengono risolti in anticipo e risolti in anticipo (la maggior parte del tempo), anziché essere autorizzati a giocare lentamente nel corso di molti mesi / anni. Il 55-65% dei costi di manutenzione è inferiore alla norma comunemente accettata dell'80% del tempo impiegato per il debug - il che sembra ragionevole, perché abbiamo avuto alcuni test unitari e team interfunzionali (incluso il QA).

Durante la prima versione del nostro ultimo prodotto da parte del nostro team, avevamo iniziato a eseguire il retrofit dei test di accettazione, ma non erano all'altezza e abbiamo dovuto fare affidamento su molti test manuali. Il rilascio è stato in qualche modo meno doloroso di altri, IMO in parte a causa dei nostri test di accettazione casuali e anche in parte a causa della nostra altissima copertura di test unitari rispetto ad altri progetti. Tuttavia, abbiamo trascorso quasi 2 settimane in regressione / stabilizzazione e 2 settimane in problemi di post-produzione.

Al contrario, ogni versione successiva a quella iniziale ha avuto criteri di accettazione precoce e test di accettazione e le nostre attuali iterazioni si presentano così:

  • 8 giorni di analisi e implementazione
  • 2 giorni di stabilizzazione
  • 0-2 giorni combinati di supporto post-produzione e pulizia

In altre parole, siamo passati dal 55-65% delle spese generali di manutenzione al 20-30% delle spese generali di manutenzione. Stesso team, stesso prodotto, la differenza principale sta nel progressivo miglioramento e razionalizzazione dei nostri test di accettazione.

Il costo per mantenerli è, per sprint, 3-5 giorni per un analista di controllo qualità e 1-2 giorni per uno sviluppatore. Il nostro team ha 4 sviluppatori e 2 analisti di QA, quindi (senza contare UX, gestione dei progetti, ecc.) Questo è un massimo di 7 giorni-uomo su 60, che completerò con un overhead di implementazione del 15% solo per essere attivo il lato sicuro.

Dedichiamo il 15% di ogni periodo di rilascio allo sviluppo di test di accettazione automatizzati e nel processo siamo in grado di tagliare il 70% di ciascun rilascio facendo test di regressione e correggendo bug di pre-produzione e post-produzione.

Potresti aver notato che la seconda sequenza temporale è molto più precisa e anche molto più breve della prima. È qualcosa che è stato reso possibile dai criteri di accettazione e dai test di accettazione anticipati, perché semplifica enormemente la "definizione di fatto" e ci consente di essere molto più fiduciosi nella stabilità di un rilascio. Nessun altro team è riuscito (finora) con un programma di rilascio bisettimanale, tranne forse quando ha fatto rilasci di manutenzione abbastanza banali (solo correzione di errori, ecc.).

Un altro interessante effetto collaterale è che siamo stati in grado di adattare il nostro programma di rilascio alle esigenze aziendali. Una volta, abbiamo dovuto allungarlo a circa 3 settimane per coincidere con un'altra versione, e siamo stati in grado di farlo mentre offrivamo più funzionalità ma senza spendere altro tempo in test o stabilizzazione. Un'altra volta, abbiamo dovuto accorciarlo a circa 1½ settimane, a causa di festività e conflitti di risorse; abbiamo dovuto assumere meno lavoro di sviluppo, ma, come previsto, siamo stati in grado di dedicare di conseguenza meno tempo ai test e alla stabilizzazione senza introdurre nuovi difetti.

Quindi, nella mia esperienza, i test di accettazione, specialmente se eseguiti molto presto in un progetto o in uno sprint, e se ben mantenuti con i criteri di accettazione scritti dal Product Owner, sono uno dei migliori investimenti che puoi fare. A differenza del TDD tradizionale, che le altre persone sottolineano correttamente è focalizzato più sulla creazione di codice testabile che su codice privo di difetti - ATDD aiuta davvero a rilevare i difetti molto più velocemente; è l'equivalente organizzativo di avere un esercito di tester che eseguono ogni giorno un test di regressione completo, ma molto più economico.

ATDD ti aiuterà in progetti a lungo termine realizzati in stile RUP o (ugh) Waterfall, progetti della durata di 3 mesi o più? Penso che la giuria sia ancora fuori per quello. Nella mia esperienza, i rischi maggiori e più brutti in progetti di lunga durata sono scadenze non realistiche e requisiti in evoluzione. Le scadenze non realistiche indurranno le persone a prendere scorciatoie, comprese le scorciatoie di test, e le modifiche significative ai requisiti probabilmente invalideranno un gran numero di test, richiedendo che vengano riscritti e potenzialmente gonfiando il sovraccarico di implementazione.

Sono abbastanza sicuro che ATDD abbia un fantastico guadagno per i modelli Agile o per i team che non sono ufficialmente Agile ma hanno programmi di rilascio molto frequenti. Non l'ho mai provato su un progetto a lungo termine, principalmente perché non sono mai stato o ho mai sentito parlare di un'organizzazione disposta a provarlo su quel tipo di progetto, quindi inserisci qui la dichiarazione di non responsabilità standard. YMMV e tutto il resto.

PS Nel nostro caso, non è necessario un ulteriore sforzo da parte del "cliente", ma abbiamo un Product Owner dedicato a tempo pieno che scrive effettivamente i criteri di accettazione. Se sei nel settore dei "software di consulenza", sospetto che potrebbe essere molto più difficile indurre gli utenti finali a scrivere utili criteri di accettazione. Un Product Owner / Product Manager sembra un elemento piuttosto essenziale per fare ATDD e anche se posso ancora una volta parlare solo della mia esperienza, non ho mai sentito parlare di ATDD che viene praticato con successo senza che qualcuno adempia a quel ruolo.


Questo è molto utile, grazie. Non mi è venuto in mente che ATTD potrebbe cambiare il carattere dello sforzo TDD, ma ha senso, soprattutto quando si sente parlare di persone in grado di distribuire software ben scritto, relativamente privo di bug in tempo e in budget senza utilizzando necessariamente test di unità ampiamente.
Robert Harvey,

@RobertHarvey: dovrei chiarire - creiamo ancora unit test, ma non come parte di un processo TDD. In genere i test di accettazione vengono prima o in parallelo con lo sviluppo iniziale, quindi il codice è completo, quindi i test unitari e il refactoring. A volte ho pensato che TDD avrebbe aiutato alcuni sviluppatori a scrivere codice migliore, ma non posso ancora eseguirne il backup. Anche se posso parlare da solo, spesso durante il processo di scrittura dei test unitari rilevo molti bug e difetti di progettazione nel mio codice.
Aaronaught,

1

Requisiti di risorse

Qual è, secondo la tua esperienza, l'effetto complessivo sui requisiti delle risorse per il completamento di un progetto software sotto TDD, al contrario di metodologie di sviluppo più "tradizionali"?

Nella mia esperienza il costo di richiedere test iniziali è immediatamente mitigato sia definendo in un chiaro criterio di accettazione, sia scrivendo al test. Non solo è mitigato il costo dei test frontali, ma ho anche scoperto che generalmente accelera lo sviluppo generale. Sebbene tali miglioramenti della velocità possano essere annullati dalla scarsa definizione del progetto o dalla modifica dei requisiti. Tuttavia, siamo ancora in grado di rispondere abbastanza bene a questi tipi di modifiche senza gravi conseguenze. ATDD riduce inoltre significativamente lo sforzo degli sviluppatori nel verificare il corretto comportamento del sistema attraverso la sua suite di test automatizzata nei seguenti casi:

  • grandi refattori
  • aggiornamenti piattaforma / pacchetto
  • migrazione della piattaforma
  • aggiornamenti della toolchain

Ciò presuppone una squadra che abbia familiarità con il processo e le pratiche coinvolte.

Coinvolgimento del cliente

Quanto più impegno è richiesto dal cliente?

Devono essere molto più coinvolti su base continuativa. Ho visto un'enorme riduzione degli investimenti anticipati, ma una domanda molto maggiore è in corso. Non ho misurato, ma sono abbastanza certo che è un investimento di tempo maggiore per il cliente.

Tuttavia, ho scoperto che la relazione con il cliente migliora notevolmente dopo circa 5 demo in cui stanno lentamente prendendo forma il loro software. L'impegno nel tempo da parte del cliente diminuisce nel tempo man mano che viene sviluppato un rapporto, tutti si abituano al processo e alle aspettative.

Stima del progetto

Immagino che le stime dei tempi sarebbero molto vaghe in un processo iterativo TDD all'inizio di un progetto TDD (poiché non esiste un piano di sviluppo software).

Ho scoperto che di solito si tratta di quanto sia ben definita la domanda e se i lead tecnici sono in grado di estrapolare (compresa la stima delle carte) il progetto. Supponendo che il progetto sia ben cardato e che abbiate una media di velocità ragionevole e una deviazione standard, abbiamo scoperto che è facile ottenere una stima decente. Ovviamente più grande è il progetto, maggiore è l'incertezza, motivo per cui generalmente divido un grande progetto in un piccolo progetto con la promessa di continuare più tardi. Questo è molto più facile da fare dopo aver stabilito un rapporto con il cliente.

Per esempio:

Gli "sprint" della mia squadra durano una settimana e abbiamo una media corrente e std. deviazione delle ultime 14 settimane. Se il progetto è di 120 punti, abbiamo una media di 25 e uno standard. la deviazione di 6 quindi stimando il completamento di un progetto è:

Project Total / (Mean Velocity - (2 * Std. Deviation) = 95% Time Estimate
120           / (25            - (2 * 6             ) = 9.2 weeks

Usiamo il 2 Std. Regola empirica di deviazione per la nostra stima della fiducia del 95%. In pratica di solito completiamo il progetto con il primo standard. deviazione, ma oltre la nostra media. Ciò è generalmente dovuto a perfezionamenti, modifiche, ecc.


Quindi in sostanza quello che stai dicendo è che TDD migliora lo sforzo di sviluppo incoraggiando le parti interessate a fare quelle cose che dovrebbero comunque fare, come fornire requisiti chiari e attuabili e criteri di accettazione.
Robert Harvey,

1
Bene, non solo quello. Man mano che il progetto avanza, una maggiore partecipazione consente una migliore conversazione tra gli sviluppatori e le parti interessate. Permette cose come gli sviluppatori che offrono alternative meno costose poiché la loro comprensione di ciò che le parti interessate vogliono perfezionare ulteriormente. Permette alle parti interessate di cambiare i requisiti prima che si rendano conto che mancano le cose o che non funzioneranno senza una risposta così antagonistica da parte degli sviluppatori; e senza molte delle aspettative irragionevoli che di solito provengono dalle parti interessate.
dietbuddha,

-1

richiedere test in anticipo sembra che richiederebbero più ore di sviluppo da realizzare. Quanto aumenta lo sforzo di sviluppo o diminuisce effettivamente a causa dell'eliminazione anticipata dei bug?

Questo in realtà non è vero. Se i tuoi sviluppatori stanno scrivendo unit test (e dovrebbero), allora il tempo dovrebbe essere approssimativamente lo stesso, o meglio. Ho detto meglio, poiché il tuo codice sarà completamente testato e dovranno scrivere solo il codice per soddisfare i requisiti.

Il problema con gli sviluppatori è che tendono a implementare anche cose che non sono necessarie per rendere il software il più generico possibile.

Quanto più impegno è richiesto dal cliente? Devono cambiare il modo in cui si relazionano al progetto, specialmente se sono abituati alla progettazione di grandi dimensioni in anticipo? Il numero di ore richieste per il cliente aumenta complessivamente o diminuisce effettivamente?

Non dovrebbe importare. Chiunque faccia i requisiti dovrebbe farlo nel miglior modo possibile.

Se fai un modo di sviluppo agile, allora questo non significa un grande design in anticipo. Tuttavia, migliori sono i requisiti, l'architettura e il design: la qualità del codice aumenterà e il tempo necessario per terminare il software diminuirà.

Pertanto, se a loro piace fare BDUF, lasciatelo fare. Ti semplificherà la vita come sviluppatore.


1
A quanto ho capito, TDD e BDUF non sono generalmente compatibili tra loro.
Robert Harvey,

3
BDUF non è generalmente compatibile con nessuna buona pratica di gestione dello sviluppo. Ma sarebbe possibile realizzare un progetto BDUF in modo TDD. TDD è una tecnica per creare software di qualità migliore, mentre BDUF è una tecnica per la richiesta di requisiti. Una cattiva tecnica, ma comunque una tecnica.
Stephen,

@RobertHarvey Giusto, ma se vogliono fare BDUF - è la loro scelta. Se stai davvero agile, allora sei libero di migliorare il loro design e continuare a fare TDD.
BЈовић,

quindi dici che se scrivo unit test il mio codice sarà completamente testato e se tutti i test superano, ciò ovviamente significa che il software è privo di bug (o almeno migliore). Quindi ho solo bisogno di testare ogni metodo del mio software, ad esempio "function testSqr () {int a = 3; assertTrue (mySqr (a) == 9);} function mySqr (int a) {return 9;}"
Dainius

@Dainius No, leggi di nuovo. La copertura del codice al 100% non è esente da bug. Sì, devi testare l'unità di ogni metodo. Naturalmente, l'accesso alla base di dati di unit test, la GUI, ecc. Non ha senso. I test unitari non sono per quelli.
BЈовић,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.