The "write test + refactor till pass"
approach looks incredibly
anti-engineering.
Sembra che tu abbia un equivoco sia sul refactoring che sul TDD.
Code refactoring is the process of
changing a computer program's source
code without modifying its external
functional behavior in order to
improve some of the nonfunctional
attributes of the software.
Quindi non puoi refactare codice fino a quando non passa.
E il TDD, in particolare il test delle unità (che considero il miglioramento principale, dal momento che altri test mi sembrano piuttosto plausibili), non riguarda la riprogettazione di un componente finché non funziona. Si tratta di progettare un componente e di lavorare sull'implementazione fino a quando il componente non funziona come progettato.
Inoltre, è importante comprendere bene che il test dell'unità riguarda il test delle unità . A causa della tendenza a scrivere sempre molte cose da zero, è importante testare tali unità. Un ingegnere civile conosce già le specifiche delle unità che usa (i diversi materiali) e può aspettarsi che funzionino. Queste sono due cose che spesso non si applicano agli ingegneri del software, ed è molto pro-ingegneristico testare le unità prima di usarle, perché significa utilizzare componenti testati e di alta qualità.
Se un ingegnere civile aveva l'idea di usare del nuovo tessuto in fibra per fare un tetto per coprire un
stadio, ti aspetteresti che provi come unità, cioè definisci le specifiche necessarie (ad esempio peso, permeabilità, stabilità, ecc.) e successivamente prova e raffina fino a quando non le incontra.
Ecco perché TDD funziona. Perché se costruisci software di unità testate, è molto meglio che funzioni, quando le colleghi e se non ci si può aspettare che il problema sia nel codice della colla, supponendo che i tuoi test abbiano una buona copertura.
modifica
Refactoring significa: no modifica delle funzionalità. Un punto di test dell'unità di scrittura è garantire che il refactoring non infranga il codice. Quindi TDD ha lo scopo di assicurare che il refactoring non ha effetti collaterali.
La granularità non è un argomento di prospettiva, perché come ho detto, unit test prova unità e non sistemi, per cui la granularità è esattamente definita.
TDD incoraggia una buona architettura. Ti richiede di definire e implementare le specifiche per tutte le tue unità, costringendoti a progettarle prima dell'implementazione, il che è esattamente il contrario di ciò che sembri pensare. TDD detta la creazione di unità, che possono essere testate individualmente e quindi completamente disaccoppiate.
TDD non significa che lancio un test del software con spaghetti code e mescolo la pasta fino a quando non passa.
In contraddizione con l'ingegneria civile, nell'ingegneria del software un progetto di solito si evolve costantemente. Nell'ingegneria civile, hai l'obbligo di costruire un ponte in posizione A, che può trasportare tonnellate di tonnellate ed è abbastanza largo per n veicoli all'ora.
Nell'ingegneria del software, il cliente può decidere in qualsiasi momento (eventualmente dopo il completamento), vuole un ponte a due corsie, e che lo vuole collegato all'autostrada più vicina e che gli piacerebbe che fosse un ponte di sollevamento, perché la sua azienda recentemente ha iniziato a usare le navi a vela.
I tecnici del software sono incaricati di modificare i progetti. Non perché i loro disegni sono difettosi, ma perché questo è il modus operandi. Se il software è ben progettato, può essere riprogettato ad alto livello, senza dover riscrivere tutti i componenti di basso livello.
TDD riguarda la creazione di software con componenti testati singolarmente e strongmente disaccoppiati. Ben eseguito, ti aiuterà a rispondere ai cambiamenti dei requisiti significativamente più veloci e sicuri, che senza.
TDD aggiunge requisiti al processo di sviluppo, ma non vieta altri metodi di assicurazione della qualità. Certo, TDD non fornisce la stessa sicurezza della verifica formale, ma poi di nuovo, la verifica formale è estremamente costosa e impossibile da usare a livello di sistema. Eppure, se lo si desidera, è possibile combinare entrambi.
TDD comprende anche test diversi dai test unitari, che vengono eseguiti a livello di sistema. Trovo che siano facili da spiegare ma difficili da eseguire e difficili da misurare. Inoltre, sono abbastanza plausibili. Mentre vedo assolutamente la loro necessità, non li considero davvero come idee.
Alla fine, nessuno strumento in realtà risolve un problema. Gli strumenti rendono solo la soluzione di un problema più semplice. Puoi chiedere: in che modo uno scalpello mi può aiutare con una grande architettura? Beh, se hai intenzione di fare muri dritti, i mattoni dritti sono di aiuto. E sì, scontato, se dai a quell'idiota quello strumento, probabilmente lo sbatterà al piede, ma non è colpa dello scalpello, per quanto non sia un difetto del TDD che dia sicurezza ai novizi, chi non scrive buoni test.
Quindi, alla fine, si può dire che TDD funziona molto meglio di nessun TDD.