Perché manca lo sviluppo guidato dai test di Joel's Test?


23

Stavo leggendo questo blog di Joel Spolsky circa 12 passaggi per migliorare il codice . L'assenza di Test Driven Development mi ha davvero sorpreso. Quindi voglio rivolgere la domanda ai Guru. TDD non vale davvero la pena?


13
Quell'articolo è stato scritto mercoledì 9 agosto 2000 (circa 12 anni fa). Non che TDD non fosse in circolazione in quel momento, ma non credo che abbia goduto quasi il brusio che fa in questi giorni.
Mike

12
Il test Joel è solo un insieme di linee guida generiche. Non tutto ciò che "vale la pena" può adattarsi lì.
yannis

2
' Ho escogitato il mio test, altamente irresponsabile, sciatto per valutare la qualità di un team di software. La cosa grandiosa è che ci vogliono circa 3 minuti ... La cosa bella di The Joel Test è che è facile ottenere un rapido sì o no ad ogni domanda. Non devi capire le righe di codice al giorno o i bugs medi per punto di inflessione ... " - decidere se il tuo progetto trarrà beneficio dal TDD richiederebbe più di 3 minuti e, beh , potrebbe essere necessario calcolare il valore medio di bug per punto di flesso - ecco perché non è nella lista
moscerino

Sposta in Joel Stack plz. È un q interessante.
Erik Reppen,

Dovresti considerare di accettare la risposta che collega e cita direttamente da Joel, dal momento che non è più autorevole di così. Vedi programmers.stackexchange.com/a/189493/6586
Bryan Oakley

Risposte:


30

Lo sviluppo guidato dai test era praticamente sconosciuto prima della pubblicazione del libro di Kent Beck nel 2002, due anni dopo Joel aveva scritto quel post. La domanda diventa allora perché Joel non ha aggiornato il suo test o se TDD fosse stato meglio conosciuto nel 2000 l'avrebbe incluso tra i suoi criteri?

Credo che non avrebbe, per la semplice ragione che la cosa importante è che hai un processo ben definito, non i dettagli specifici di quel processo. È lo stesso motivo per cui raccomanda il controllo della versione senza specificare un sistema di controllo della versione specifico o consiglia di disporre di un database di bug senza raccomandare un marchio specifico. I buoni team migliorano e si adattano continuamente e utilizzano strumenti e processi che si adattano perfettamente alla loro situazione particolare in quel determinato momento. Per alcuni team, ciò significa sicuramente TDD. Per altre squadre, non così tanto. Se adotti il ​​TDD, assicurati che non provenga da una mentalità cult di cargo .


1
Inoltre ... oh hai un po 'colpito il TDD è Kool Aid punto vero?
Erik Reppen,


27

Joel l'ha affrontato in modo specifico in alcuni punti.

Ha spiegato che i test delle cose non sono in grado di rilevare molti problemi importanti, in particolare quelli soggettivi come "l'interfaccia utente di questo software fa schifo?" Secondo lui, l' eccessiva dipendenza dai test automatici di Microsoft è il modo in cui siamo finiti con Windows Vista.

Ha scritto come, nella sua esperienza, i tipi di bug che gli utenti trovano effettivamente tendono a cadere in due categorie: 1) quelli che si presentano nell'uso comune, che i programmatori si sarebbero trovati se avessero eseguito il proprio codice prima di usarlo o 2) casi limite così oscuri che nessuno avrebbe mai pensato di scrivere dei test per coprirli in primo luogo. Ha dichiarato che solo una percentuale molto piccola dei bug che lui e il suo team risolvono in FogBugz sono il tipo di cose che i test unitari avrebbero colto. (Non riesco a trovare quell'articolo ora, ma se qualcuno sa quale intendo, sentiti libero di modificare il link qui.)

E ha scritto come può essere più un problema che un problema, specialmente quando il tuo progetto diventa un progetto molto grande con molti test unitari, e poi cambi qualcosa (intenzionalmente) e finisci con un numero molto grande di test unitari rotti. Usa specificamente i problemi che il test unitario può causare come motivo per cui non l'ha aggiunto come 13 ° punto al Joel Test, anche quando le persone suggeriscono che dovrebbe farlo.


2
In realtà, hai ragione. Il solito MO di Joel è l'uomo di paglia. Come se TDD non avesse catturato alcun bug per me, quindi non può essere buono. Il che in qualche modo manca il punto che TDD non riguarda i test, ma il design. I test lasciati alle spalle sono un bonus. O per sostenere che un piccolo cambiamento interromperà molti test unitari, il che suggerisce che sta solo facendo male. O per riscrivere completamente un principio SOLIDO prima di attaccarlo. Quel genere di cose. In realtà sono i suoi sostenitori che usano la logica circolare, non lui.
pdr

7
Sono completamente d'accordo con questi commenti di Joel. Penso che un problema ancora più grande sia il linguaggio - con molti linguaggi dinamici che non riesco a immaginare di fare senza un test unitario - in quale altro modo puoi dire se un semplice errore di battitura causerà qualche problema che non vedrai fino a quando un critico momento? Nei linguaggi compilati staticamente, progettati per ridurre gli errori, si viene guidati da tutti gli errori più semplici e vengono lasciati principalmente con errori logici. Ciò riduce la necessità del tipo di copertura totale fornita da TDD.
Bill K

2
@MasonWheeler: Stai seriamente sostenendo che la sicurezza del compilatore / tipo elimina la necessità di test unitari? Stai anche ignorando intenzionalmente i vantaggi di progettazione di TDD ma, cosa ancora più importante, devi divertirti a refactoring. Piuttosto, è stato visto il contrario: ad esempio gli sviluppatori .NET che seguono una metodologia TDD si trovano improvvisamente frustrati dalla quantità di codice che devono scrivere per compiacere un compilatore che è sempre più inutile in cambio.
pdr

2
@pdr: Sto seriamente sostenendo che "la necessità di test unitari" è innanzitutto la mancanza di sicurezza del tipo. E, non essendo uno sviluppatore .NET, non posso davvero dire molto delle loro esperienze, ma nella mia esperienza ho scoperto che la difficoltà nel refactoring si basa interamente su due fattori: se ho scritto il codice nel primo luogo e se l'autore ha scritto bene il codice. (Nota: i punti 1 e 2 non sono necessariamente strettamente correlati tra loro!)
Mason Wheeler

3
I test di unità @Pdr non dimostrano il tuo codice, sono principalmente un controllo di sintassi, ma possono essere molto utili durante lo sviluppo. Tuttavia, i test di integrazione e di sistema hanno molto più senso. Inoltre, la maggior parte dei refactoring in linguaggi tipicamente statici può essere dimostrata sicura, in effetti è proprio questo un refactoring: un insieme di operazioni "sicure" note che trasformano il codice senza introdurre modifiche. In un linguaggio statico, l'IDE può spesso apportare queste modifiche per te e assicurarti che sono sicure, cosa spesso impossibile in linguaggi dinamici che richiedono quindi test unitari per aiutare con (non provare) la stessa sicurezza
Bill K

25

Lo stesso Joel Spolsky ha risposto a questa domanda nel 2009 :

Joel: C'è un dibattito sullo Test Driven Development ... dovresti avere unit test per tutto, quel genere di cose ... molte persone mi scrivono, dopo aver letto The Joel Test, per dire: "Dovresti avere un 13esimo cosa qui: Test unitari, test unitari al 100% di tutto il tuo codice. "

E questo mi sembra un po 'troppo dottrinario su qualcosa di cui potresti non aver bisogno. Ad esempio, l'idea di una programmazione agile non è quella di fare le cose prima che tu ne abbia bisogno, ma di sfogliarle come necessario. Sento che il test automatico di tutto, molte volte, non ti aiuterà. In altre parole, scriverai moltissimi test unitari per assicurarti che quel codice funzioni davvero e scoprirai sicuramente se non funziona [se non scrivere i test], funziona ancora, ... non lo so, riceverò una mail così per questo perché non lo sto esprimendo così bene. Ma mi sento come se una squadra avesse davvero una copertura del codice al 100% dei propri test unitari, ci sarebbero un paio di problemi. Uno, avrebbero trascorso molto tempo a scrivere test unitari e non sarebbero stati necessariamente in grado di pagare per quel tempo con una qualità migliore. Voglio dire, avrebbero un po 'di qualità migliorata e avrebbero la possibilità di cambiare le cose nel loro codice con la sicurezza che non rompono nulla, ma questo è tutto.

Ma il vero problema con i test unitari, come ho scoperto, è che il tipo di modifiche che tendi a fare man mano che il codice si evolve tende a interrompere una percentuale costante dei test unitari. A volte apporterai una modifica al tuo codice che, in qualche modo, interrompe il 10% dei test unitari. Intenzionalmente. Perché hai cambiato il design di qualcosa ... hai spostato un menu e ora tutto ciò che si basava sul fatto che quel menu fosse lì ... il menu è ora altrove. E così tutti questi test ora si rompono. E devi essere in grado di entrare e ricreare quei test per riflettere la nuova realtà del codice.

Quindi il risultato finale è che, man mano che il tuo progetto diventa sempre più grande, se hai davvero molti test unitari, la quantità di investimento che dovrai fare per mantenere quei test unitari, tenerli aggiornati e mantenere passando, inizia a diventare sproporzionato rispetto all'ammontare del beneficio che ne ricava.


2
Veramente? Downvotes sulla pubblicazione della risposta di Joel alla domanda del PO?
Ross Patterson,

1
Difficile da capire. Alcune persone usano il voto per indicare "approvo" anziché "questo è utile". Questa ovviamente dovrebbe essere la risposta accettata perché è definitiva.
Bryan Oakley

Non ho mai lavorato a un progetto con copertura del test al 100%. Ma se hai una copertura del test dello 0% ... ... è abbastanza interessante.
Kzqai,

Grazie! Penso che questo dovrebbe essere contrassegnato come risposta accettata.
Jalal,

5

Nessuno tranne Joel poteva rispondere di sicuro. Ma possiamo provare alcune ragioni / osservazioni.

Prima di tutto, i test non sono assenti dal Joel's Test

  • I test vengono citati due volte direttamente in 12 passaggi (10 e 12)
  • L'esistenza di una build è uno dei primi punti. L'idea di avere build è quella di ottenere la capacità di vedere se si rompono, quindi stiamo (anche) parlando di test qui.

In secondo luogo, l'idea del Joel Test (per quanto ne capisco) è di avere domande veloci, sì-no. "Fai TDD?" non si adatterà esattamente (la risposta potrebbe essere: "alcuni di noi", "per quella parte del codice" o "facciamo test unitari".

In terzo luogo, penso che nessuno abbia detto che (anche Joel) che quei punti in cui "gli unici valgono il tempo" (a proposito, "programmi" non è su di esso), solo che quelle sono buone domande veloci da porre quando arrivano in contatto con un team di software, sia come futuro membro del team o anche come cliente - questa è una lista che ho dato ad alcune persone non tecniche intorno a me che stavano cercando indizi su quanto fosse buono / cattivo il loro reparto IT. Non è tutto, ma è davvero brutto da battere in tre minuti.


3
"Fai TDD?" sicuramente si adatta come una domanda sì-no. E con questo intendo dire che è una domanda a cui tutti rispondono con un enfatico "sì", che in realtà significa "no".
yannis

2
@YannisRizos: Proprio come "Usi i migliori strumenti che il denaro può comprare?" (Sì ... bene ... entro limiti ragionevoli) e "I programmatori hanno condizioni di lavoro tranquille?" (Ohhhh sì ... beh ... dipende dal tuo punto di riferimento per il silenzio, immagino.)
pdr

@pdr Dipende dal fatto che il suono delle sirene che entra dalle finestre aperte sia silenzioso.
Robert Harvey,

Inoltre, "Sì, faccio un design top-down ." ;)
Izkata
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.