Test Driven Development in Research

0

Trascorro la maggior parte del mio tempo analizzando i dati e sviluppando algoritmi di apprendimento automatico con i dati. Di conseguenza, passo la maggior parte del mio tempo a programmare ma non ho mai fissato specifiche. Piuttosto, comincio con una domanda a cui voglio rispondere che mi porta alla domanda successiva, e così via.

Per il codice che non cambierà, generalmente inizio scrivendo i test e ho apprezzato questo approccio. Tuttavia, non so come usare TDD in un ambiente di ricerca.

C'è un modo di usare TDD per il codice che viene eseguito solo una volta prima di essere ulteriormente modificato? (Probabilmente non giudicando da questo: Q1 Q2 )

Quello che mi piace di TDD è che mi aiuta a scrivere codice modulare che rende più facile il riutilizzo del codice.
Esistono approcci che migliorano la qualità del codice nell'impostazione descritta con le specifiche modificate?

    
posta Edgar H 27.07.2017 - 16:33
fonte

2 risposte

3

Ho trovato quando sviluppavo il codice di ricerca (algoritmi di grafi e algebra lineare sparsa per il lavoro di laurea e in un laboratorio di ricerca aziendale), i test unitari finiscono per essere inestimabili. Quando il tuo algoritmo ha prestazioni peggiori del previsto, devi essere in grado di determinare con certezza che si tratta di un problema con l'algoritmo e non l'implementazione . Se non lo fai, potresti finire di scartare una ricerca promettente o pubblicare risultati errati.

Lo sviluppo orientato ai test prevede specifiche continuamente mutevoli e incomplete. Assicurandoti che il tuo codice funzioni a livelli bassi, puoi riorganizzarlo, cambiarlo e riutilizzarlo. Ho visto molti studenti laureati buttare via molti mesi di lavoro perché hanno cercato di risparmiare tempo non verificando che il loro codice funzioni.

Ogni volta che identifichi una funzione che vuoi scrivere con un comportamento definito (ad es., norm2() , calculateHitRate() , calculateResidual , ecc.), scrivi un test unitario per questo. Alcuni dei vostri test unitari possono essere sotto forma di controlli di sanità mentale piuttosto che di validazione dell'output reale, ad esempio per garantire che una matrice sia definita simmetrica o semi-positiva. Fondamentalmente assicurati in ogni fase dell'algoritmo, che i tuoi dati abbiano le proprietà che ti aspetti. Ricorda che in TDD, scrivere il codice minimo per passare il test non implica scrivere codice errato che supera il test, ma piuttosto non scrivere funzionalità che non sono testate.

Nella ricerca, ritengo che i test di accettazione automatizzati abbiano un valore molto inferiore, poiché in molti casi eseguirai un'analisi qualitativa dei risultati (capendo perché il tuo algoritmo si è rivelato peggiore o migliore). Se il tuo algoritmo si traduce in un tasso di successo di 0,21 anziché di 0,24, come saprai che è dovuto a un bug, o solo che il tuo algoritmo non è così buono su quel set di dati come speravi?

    
risposta data 28.07.2017 - 00:44
fonte
1

Puoi applicare TDD a livelli più alti rispetto ai test unitari. Nello specifico, puoi formulare le tue domande di ricerca nei test di accettazione di alto livello. Questi test descriveranno come sarà la ricerca di successo. Scrivi un test di accettazione non soddisfacente, quindi esegui un'iterazione su ricerche e cicli TDD più piccoli finché non supera il test di accettazione. Quindi scrivi un altro test di accettazione fallito.

Non devi necessariamente usare TDD a un livello inferiore (o del tutto). Analizza i vantaggi del TDD e decidi se bilanciare i costi. Se il tuo codice di ricerca non verrà incorporato nel software di produzione senza essere riscritto, potrebbe essere uno sforzo sprecato per scrivere test di unità. La tua organizzazione può valutare la velocità di cambiamento rispetto alla stabilità, nel qual caso il numero di test unitari ti limiterà.

    
risposta data 27.07.2017 - 22:24
fonte

Leggi altre domande sui tag