Un po 'più di un anno fa ho avuto la fortuna di essere in grado di prendermi una pausa di 9 mesi dal lavoro. Ho deciso che in quel momento avrei perfezionato le mie abilità in C #. Ho iniziato a lavorare su un gruppo di progetti e mi sono imposto di seguire TDD.
È stato un processo abbastanza illuminante.
All'inizio è stato difficile, ma nel tempo ho imparato a scrivere più codice testabile (che, a quanto risulta, tende ad essere più codice SOLID) e nel processo ho anche affinato le mie capacità di progettazione OO.
Ora sono di nuovo nel mondo del lavoro e sto notando qualcosa di strano.
Preferisco non seguire TDD.
Trovo che TDD mi rallenti e in effetti rende più difficile progettare un'applicazione pulita.
Invece, ho adottato un approccio leggermente (massivamente) diverso:
- Scegli una porzione verticale di lavoro
- Sviluppa un prototipo funzionante
- Refactor fino a quando tutto è bello e ordinato
- Siediti e apprezza il codice splendidamente SOLID e verificabile che ho scritto.
Potresti aver notato che il passaggio 1 non era "definire la superficie pubblica del mio target di test" e il passaggio 2 non era "testare i bejesus fuori da detta superficie pubblica". Potresti aver anche notato che nessuno dei passaggi richiede test. Sto scrivendo un codice verificabile, ma non lo sto ancora testando ... ancora.
Ora vorrei chiarire che in realtà non ho rinunciato a nessun tipo di test. Il codice che sto scrivendo funziona . Funziona perché lo sto testando manualmente.
Vorrei anche chiarire che non ho rinunciato a tutti i test automatici. Questo è dove il mio processo è diverso. Ed è per questo che sto facendo questa domanda.
TDD in teoria. Non in pratica.
Il mio processo si è evoluto un po 'e ho trovato un equilibrio tra TDD e nessun test che trovo molto produttivo e anche ragionevolmente sicuro. Va come segue:
- Implementa una fetta di lavoro verticale funzionante con i test in mente, ma non scrivere test.
- Se in fondo alla strada (ad esempio, un mese più tardi) tale sezione deve essere modificata
- Scrivi test di unità, test di integrazione, test di comportamento, ecc. che garantiscano che la parte di lavoro sia corretta
- Modifica il codice
- Se quella fetta non ha bisogno di modifiche,
- Non fare nulla
Spostando semplicemente l'onere di scrivere i test prima di scrivere il codice prima di modificare il codice sono stato in grado di produrre molto più codice funzionante. E quando riesco a scrivere test, ne scrivo molti meno, ma copro quasi il terreno (un ROI più alto).
Mi piace questo processo, ma temo che potrebbe non adattarsi bene. Il suo successo dipende dal fatto che gli sviluppatori siano diligenti nello scrivere test prima di cambiare le cose. E questo sembra un grosso rischio. Ma, TDD ha lo stesso rischio.
Quindi, vado all'inferno [BT] DD o è una forma comune di codifica e test pragmatici?
Mi piacerebbe continuare a lavorare in questo modo. Cosa posso fare per rendere questo processo funzionante a lungo termine?
Nota:Sono l'unico sviluppatore dei miei progetti e sono responsabile di tutto: raccolta dei requisiti, progettazione, architettura, test, implementazione, ecc. Sospetto che questo sia il motivo per cui il mio processo funziona.