Priorità per l'apprendimento dei metodi computazionali, quando dovrei scrivere il mio codice rispetto all'uso delle biblioteche come studente laureato?


10

Sto iniziando i miei studi universitari in ingegneria e lavorerò su progetti di scienze computazionali. Ho notato che c'è stata qualche discussione sui vantaggi e gli svantaggi dell'implementazione dei propri algoritmi qui . L'analisi costi-benefici dell'implementazione dei propri algoritmi rispetto all'utilizzo delle librerie è diversa quando sei uno studente laureato?


2
Ho avuto una lunga risposta, ma dopo alcune discussioni con un'altra mod, ho deciso di eliminarlo e chiedere chiarimenti sulla tua domanda. Qual è il punto principale della tua domanda? È "dove sottolineo il mio apprendimento?", "Come consiglieresti di dare priorità all'apprendimento rispetto al progresso della modellazione?", "La scelta delle biblioteche rispetto ai codici auto-implementati dipenderà dai problemi che vengono risolti?" O "Quali sono i vantaggi / svantaggi di codificare i miei algoritmi in una fase molto precedente della mia carriera? ". La mia risposta era eccessivamente ampia e sarebbe meglio darti una risposta mirata a una domanda più mirata.
Geoff Oxberry,

Ho aggiunto la sezione in grassetto per chiarire esattamente cosa stavo chiedendo, ma ho lasciato il resto intatto. Se ritieni che una delle altre parti debba essere rimossa, sentiti libero.
Godric Seer,

Grazie. Apporterò alcune modifiche per focalizzare la domanda, quindi pubblicherò una risposta.
Geoff Oxberry,

Risposte:


10

A mio avviso, essere uno studente laureato non cambia la risposta di David Ketcheson qui alla domanda che hai collegato nel tuo post.

Codifica le versioni minime degli algoritmi che vuoi imparare. Quindi metterli da parte. La codifica dei tuoi algoritmi è molto utile per l'apprendimento, ma per il codice di ricerca (o produzione), a meno che i tuoi obiettivi di ricerca non siano scrivere software che migliori le librerie all'avanguardia (se ce ne sono), tu " stai meglio usando le librerie. È probabile che le biblioteche siano meglio documentate, più scalabili e più solide di ciò che codifichi tu stesso, a meno che tu non sia (o diventi) veramente bravo a scrivere codice. Inoltre, è probabile che le librerie siano testate e messe a punto per te (anche se ovviamente dipende da chi ha scritto la libreria ...). Sarai responsabile per il supporto, il debug e il test di qualsiasi codice che scrivi per la tua tesi, e per risparmiare tempo, aiuta a ridurre al minimo la quantità di codice che devi scrivere.

Gli unici altri scenari a cui riesco a pensare (cioè, potrebbero essercene altri) sono:

  • Non ci sono librerie là fuori che forniscono le funzionalità di cui hai bisogno. Considera di contribuire alle librerie open source esistenti o di scrivere la tua libreria open source, in modo che altri possano trarne vantaggio.
  • Sono necessarie prestazioni aggiuntive e è possibile sfruttare la struttura di problemi speciali per ottenerlo. Quindi documenta e modifica una libreria esistente o scrivi tu stesso un'implementazione con prestazioni più elevate.
  • Un supervisore insiste sul fatto che esegui il rollup del tuo software. Bene, sei da solo lì, ma suggerisco di sollevare i punti sopra per cercare di convincerli che sarebbe meglio usare le librerie (se è possibile nella tua situazione).

10

Vorrei dare un po 'più di respiro alla risposta riflessiva di Geoff . In particolare, voglio darti un po 'più di prospettiva sul valore dei tuoi sforzi di programmazione rispetto ai tuoi sforzi di ricerca nella tua prima carriera come accademico.

Scoprirai che essere in grado di scrivere software per migliorare la tua ricerca scientifica ti renderà un membro prezioso di quasi tutti i team di ricerca. Tuttavia, questa volta non sarà necessariamente considerato "prezioso" dai colleghi accademici o da coloro che assumono posizioni accademiche.

Da un sondaggio di ricerca del 2011 condotto a Princeton, "A Survey of the Practice of Computational Science" :

Gli scienziati dedicano molto tempo alla programmazione della ricerca. In media, gli scienziati stimano che il 35% del loro tempo di ricerca è dedicato alla programmazione / allo sviluppo di software. Mentre inizialmente si dedica un po 'di tempo alla scrittura del codice, una parte considerevole del tempo viene impiegata in molte attività noiose. Ad esempio, i ricercatori in Politica e Sociologia che hanno utilizzato R / Stata hanno dovuto eseguire una notevole programmazione per aggiornare i dati del censimento in formati comprensibili per singoli pacchetti in R / Stata. Alcuni ricercatori di ingegneria chimica hanno dovuto decodificare il codice legacy non documentato che ha eseguito la simulazione della fiamma, molto tempo dopo la laurea degli autori originali, al fine di adattare il codice ai nuovi carburanti ... Nonostante ciò, la stragrande maggioranza di questi ricercatori ha ritenuto che "essi dedicare più tempo alla programmazione di quanto dovrebbero "

Ciò non significa che non sia una buona idea implementare o riprogettare una libreria o applicazioni core, ma se hai intenzione di impegnarti in un serio sviluppo di software (più del 25% del tuo tempo a lavorare con il codice), mantieni questi tre pensieri in mente.

  • Complessità e rischio crescono in modo esponenziale con la dimensione del progetto e il numero di sviluppatori. Fino a quando non avrai scritto o lavorato con software di grandi dimensioni o con team di sviluppatori che si estendono oltre il tuo laboratorio, ti sarà difficile ottenere un buon apprezzamento di questo e prevedere correttamente lo sforzo.

  • Devi essere bravo. Ci vuole una certa maturità, sia come programmatore che come scienziato applicativo, per scrivere software utili. Devi sapere quali sono le caratteristiche importanti, dove sono i rischi numerici ed essere in grado di prevedere lo sforzo di programmazione per un determinato set di funzionalità e robustezza. Ovviamente, l'unico modo per diventare bravi è passare del tempo in progetti su cui non sei il leader o che possono fallire in sicurezza o essere ritardati, il che mi porta al mio punto finale.

  • Sebbene molti laboratori di ricerca e posizioni industriali apprezzino molto l'esperienza di programmazione, la programmazione scientifica può rappresentare un potenziale pregiudizio per la tua carriera accademica, anche se il tuo software apporta benefici alla scienza più dei tuoi documenti. Tutto il tempo che passi per imparare a programmare bene, programmare, documentare il tuo codice e renderlo robusto si traduce in documenti che non vengono scritti. Un consulente non avrà sempre in mente i migliori interessi del proprio studente, in quanto questo è uno di quei casi in cui lo studente può fornire lavoro a beneficio del gruppo del consulente senza beneficiare del conteggio delle citazioni dello studente. Cerca uno o più mentori di fiducia nel settore che ti interessa e assicurati di avere una chiara comprensione di quali contributi sono considerati preziosi. academia.stackexchange.com è un posto eccellente per porre una domanda di follow-up su questo.


Come nota a piè di pagina: il numero di progetti di sforzo individuale che avanzano in modo significativo qualsiasi campo computazionale sta costantemente diminuendo, sia che si tratti di un'area di applicazione o di qualcosa di più tecnico come la densa algebra lineare. Un numero crescente di pacchetti software che formano il "pane e burro" della ricerca computazionale ha almeno 10 anni. Il codice scientifico che non ha raggiunto questo livello di maturità tende ad avere più bug, meno funzionalità e documentazione scarsa. Cerca di evitare di lavorare con codice immaturo che non è supportato attivamente, indipendentemente da quanti anni ha.


Ero già preoccupato per il mio conteggio di carta. Dal momento che sarò lo studente computazionale di una vasta serie di studenti sperimentali, è probabile che avrò molte seconde e terze opere. È anche probabile che inizierò a combinare solo programmi diversi all'inizio (codice 0D del mio laboratorio, codice 2D di un'altra università, software Meshing di un altro laboratorio della mia università). Sicuramente molto da pensare a questo.
Godric Seer,

6

Penso che l'analisi costi-benefici dipenda dall'alfabetizzazione scientifica desiderata che si desidera ottenere durante gli studi.

Per la maggior parte degli scienziati che lavorano con i computer che sono competenti nell'informatica scientifica è sufficiente, ciò richiede: una comprensione (astratta) di alto livello dei principali algoritmi utilizzati e abilità di programmazione che consentono di utilizzare in modo efficace le librerie di software (creazione di software, collegamento, utilizzo mailing list).

Al contrario, se hai intenzione di diventare un esperto nel campo dell'informatica scientifica, avrai bisogno di una profonda comprensione dei metodi numerici, dell'aritmetica in virgola mobile e della tecnologia informatica. Puoi imparare la teoria di questi argomenti dai libri, tuttavia è necessaria esperienza attraverso la pratica per costruire e mantenere competenze avanzate. Quindi, potrebbe essere una buona idea programmare tutto ciò che usi mentre impari (ad esempio se vuoi cucinare come uno Chef: impari mangiando ciò che cucini e cucinando spesso!)

Qual è il livello corretto di competenza dipende dalla tua carriera. Scopri quale livello di competenze vengono utilizzate dai lavoratori nel tuo campo.

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.