Quali competenze fondamentali dovrebbe avere ogni scienziato computazionale? [chiuso]


52

Ogni scienziato deve conoscere un po 'le statistiche: cosa significa correlazione, che cos'è un intervallo di confidenza e così via. Allo stesso modo, ogni scienziato dovrebbe sapere qualcosa sull'informatica: la domanda è: cosa? Cosa è ragionevole aspettarsi che ogni scienziato che lavora sappia della costruzione e dell'uso del software? Il nostro elenco di competenze di base --- le cose che le persone dovrebbero sapere prima di affrontare qualsiasi cosa con "cloud" o "peta" nel suo nome --- è:

  • programmazione di base (loop, condizionali, elenchi, funzioni e I / O dei file)
  • lo script shell / shell di base
  • controllo della versione
  • quanto testare i programmi
  • SQL di base

C'è molto che non è in questo elenco: programmazione a matrice (MATLAB, NumPy e simili), fogli di calcolo se usati bene, sono potenti come la maggior parte dei linguaggi di programmazione), strumenti di automazione delle attività come Make e così via.

Quindi: cosa c'è nella tua lista? Cosa pensi sia giusto aspettarsi che ogni scienziato sappia in questi giorni? E cosa toglieresti dall'elenco sopra per fare spazio? Nessuno ha abbastanza tempo per imparare tutto.


1
Ottima domanda! Ma non sono chiaro su una cosa: cosa intendi per scienziato computazionale? Qualche scienziato che usa il calcolo? O il gruppo di persone MOLTO più piccolo che considererebbe il loro titolo professionale di "scienziato computazionale"?
David Ketcheson,

9
Fare una domanda elenco non va bene nel formato Stack Exchange. Dobbiamo davvero passare attraverso questo su ogni sito?
dmckee,

4
@Dan Community Wiki non è una scusa per consentire domande che non appartengono al sito. Vorrei anche incoraggiare coloro che rispondono a prendere un esempio da Jed e almeno provare a spiegare perché avresti bisogno di certe abilità o non ne hai bisogno
Ivo Flipse,

5
@IvoFlipse: questa è una domanda che appartiene al sito in qualche modo. Forse non come attualmente dichiarato; forse deve essere ridotto a domande più piccole e riformulato, ma il problema della scarsa ingegneria del software nella scienza computazionale è estremamente importante, soprattutto perché la scienza computazionale come disciplina è ancora nelle sue fasi formative. Questo articolo su Nature indica perché. Greg sta facendo un ottimo servizio alla comunità scientifica computazionale attraverso il suo sito web.
Geoff Oxberry,

5
Non sono d'accordo con la chiusura di questa domanda. Vedi (e vota) meta.scicomp.stackexchange.com/questions/179/…
David Ketcheson,

Risposte:


46

"Scienziato computazionale" è piuttosto ampio perché include persone che eseguono analisi numeriche con paper / LaTeX e implementazioni di prove concettuali, persone che scrivono librerie di uso generale e persone che sviluppano applicazioni che risolvono determinate classi di problemi e utenti finali che utilizzano quelle applicazioni. Le competenze necessarie per questi gruppi sono diverse, ma c'è un grande vantaggio nell'avere una certa familiarità con lo "stack completo". Descriverò quali sono le parti critiche di questo stack, le persone che lavorano a quel livello dovrebbero ovviamente avere una conoscenza più profonda.

Conoscenza del dominio (ad es. Background fisico e ingegneristico)

Tutti dovrebbero conoscere le basi della classe di problemi che stanno risolvendo. Se lavori sui PDE, ciò significherebbe una certa familiarità generale con alcune classi di PDE (ad esempio Poisson, elasticità e Navier-Stokes incomprimibili e comprimibili), in particolare quali proprietà sono importanti per catturare "esattamente" e quali possono essere fino alla discretizzazione errore (informa la selezione del metodo per quanto riguarda la conservazione locale e gli integratori simplettici). È necessario conoscere alcuni funzionali e tipi di analisi di interesse per le applicazioni (ottimizzazione di portanza e resistenza, previsione del guasto, inversione dei parametri, ecc.).

Matematica

Tutti dovrebbero avere una certa familiarità generale con le classi di metodi rilevanti per il loro dominio problematico. Ciò include le caratteristiche di base dell'algebra lineare sparsa rispetto a quella densa, la disponibilità di "metodi veloci", le proprietà delle tecniche di discretizzazione spaziale e temporale e il modo in cui valutare quali proprietà di un problema fisico sono necessarie affinché una tecnica di discretizzazione sia adatta. Se sei principalmente un utente finale, questa conoscenza può essere di altissimo livello.

Ingegneria del software e biblioteche

Una certa familiarità con le tecniche di astrazione e la progettazione di biblioteche è utile per quasi tutti nella scienza computazionale. Se lavori su metodi di prova, questo migliorerà l'organizzazione del tuo codice (rendendo più semplice per qualcun altro "tradurlo" in una solida implementazione). Se lavori su applicazioni scientifiche, questo renderà il tuo software più estensibile e faciliterà l'interfaccia con le librerie. Sii difensivo quando sviluppi il codice, in modo tale che gli errori vengano rilevati il ​​prima possibile e che i messaggi di errore siano il più informativi possibile.

Utensili

Lavorare con il software è una parte importante della scienza computazionale. Competenza con la lingua scelta, supporto dell'editor (ad es. Tag, analisi statica) e strumenti di debug (debugger, valgrind) migliorano notevolmente l'efficienza dello sviluppo. Se lavori in ambienti batch, dovresti sapere come inviare lavori e ottenere sessioni interattive. Se lavori con il codice compilato, una conoscenza pratica di compilatori, linker e strumenti di creazione come Make ti farà risparmiare molto tempo. Il controllo della versione è essenziale per tutti, anche se lavori da solo. Impara Git o Mercurial e usalo per ogni progetto. Se sviluppi librerie, dovresti conoscere gli standard linguistici ragionevolmente completamente in modo da scrivere quasi sempre il codice portatile la prima volta, altrimenti verrai seppellito nelle richieste di supporto dell'utente quando il tuo codice non si sviluppa nel loro ambiente funky.

LaTeX

LaTeX è lo standard di fatto per la pubblicazione e la collaborazione scientifica. La competenza con LaTeX è importante per poter comunicare i risultati, collaborare su proposte, ecc. Scrivere script per la creazione di figure è importante anche per la riproducibilità e la provenienza dei dati.


7
Sono d'accordo con Jed. LaTeX è assolutamente necessario! :)
Paul

1
Vorrei cambiare "Fisica e ingegneria" per competenza in materia. Dopotutto, non siamo tutti fisici o ingegneri. Lo spirito di quella parte della risposta è nel posto giusto, ma c'è un'ipotesi piuttosto lampante.
Fomite

Grazie @EpiGrad, l'ho cambiato in "conoscenza del dominio" con quelli come esempi.
Jed Brown,

Buona lista. Dovrebbe essere presente anche una comprensione di base dei problemi di prestazione. Ho incontrato troppe persone che non capiscono il semplice concetto di codice di profilazione. NB: le prestazioni dovrebbero essere intese non solo per problemi di velocità ma anche per l'utilizzo della memoria.
Faheem Mitha,

Typos: "probelms" e "sepolto". SE non mi permetterebbe di risolverli - una modifica troppo piccola.
Faheem Mitha,

26

Il mio background è in Informatica, quindi le mie opinioni potrebbero essere un po 'distorte. Detto questo, aggiungerei "algoritmi di base e strutture dati" all'elenco. Quello che intendo con nozioni di base sono essenzialmente la ricerca e l'ordinamento lineari e strutture di dati come alberi bilanciati, heap e o tabelle hash.

Perché? Bene, nella maggior parte degli algoritmi computazionali, finisci per spendere una straordinaria quantità di tempo e sforzi per spostare i dati e non calcolare nulla. Hai mai implementato un codice agli elementi finiti? È circa il 90% di organizzazione dei dati. La differenza tra fare questo e farlo bene può essere un ordine di grandezza nell'efficienza computazionale.

Un piccolo punto relativo all'informatica che vorrei aggiungere è una breve introduzione su come funziona effettivamente un processore e su cosa è bravo e cosa non lo è. Per esempio:

  • L'aggiunta e la moltiplicazione sono veloci, le funzioni di divisione o trascendentale no. Ho visto uomini adulti sostituire un'operazione con radice quadrata con qualcosa che ha richiesto tre divisioni e penso che abbiano fatto qualcosa di eccezionale (divisione e radice quadrata sono altrettanto costose).
  • Le cache di livello 3 stanno diventando più grandi ogni anno, sì, ma la cache di livello 0, ovvero quella veramente veloce, è ancora solo di pochi kilobyte.
  • I compilatori non sono magici. Potrebbero srotolare piccoli anelli o vettorializzare operazioni estremamente dirette, ma non trasformeranno quella bolla in un quicksort.
  • Chiamare metodi su oggetti polimorfici con eredità multipla nel tuo ciclo più interno può essere concettualmente dolce, ma farà sì che la tua CPU voglia uccidersi.

Questa è roba noiosa, ma ci vogliono solo pochi minuti per spiegare, e tenerlo a mente ti permetterà di scrivere un buon codice fin dall'inizio, o algoritmi di progettazione che non si basano su caratteristiche hardware inesistenti.

Per quanto riguarda cosa rimuovere dall'elenco, penso che SQL sia un po 'troppo per gli scienziati computazionali. Inoltre, il test del software è importante, ma è una scienza in sé. I test unitari e i tipi di dati astratti corretti sono qualcosa che dovrebbe essere insegnato con la programmazione di base e non richiede un programma di master di due anni.


2
Per niente noioso. Farei un corso del genere, se fosse offerto. :-)
Faheem Mitha

18

Potrei aggiungere a questo in seguito, ma per cominciare, eliminerei "shell scripting" e lo sostituirò specificamente con "Python scripting". Python è molto più portatile degli script di shell e più leggibile rispetto a linguaggi di shell e script simili. La sua grande biblioteca standard e la sua popolarità nelle scienze (con la possibile eccezione della biologia, che usa anche il Perl) la rendono un'ottima lingua computazionale , per non parlare di una buona prima lingua per l'apprendimento della programmazione. Ora è la prima lingua insegnata alle major EECS al MIT ed è popolare nel mercato del lavoro, in particolare nell'informatica scientifica. La sua documentazione online è ampia e ci sono anche numerosi testi di programmazione basati su Python disponibili online.

Usando Python, potresti insegnare costrutti di programmazione di base, nonché script. Inoltre, Python offre un eccellente supporto per i test unitari, quindi Python potrebbe essere utilizzato anche per insegnare i test unitari. Python ha anche una vasta API di database (che potrebbe sostituire o aumentare la necessità di apprendere SQL) e un paio di utility di build che offrono funzionalità simili a Make. Personalmente preferisco SCons rispetto a Make, perché trovo Python più facile da documentare e testare rispetto agli script di shell.

In definitiva, il principio motivante alla base del mio evidente scellino per Python è l'efficienza. È molto più semplice ottimizzare il flusso di lavoro se riesci a svolgere la maggior parte del tuo lavoro in una lingua o in uno strumento, soprattutto quando quello strumento è un linguaggio di scripting espressivo. Certo, potrei fare tutto in C, ma il mio programma sarebbe 5 volte più lungo, e probabilmente non ho bisogno della velocità. Invece, posso usare Python per importare dati da un file di testo, tracciarli, chiamare routine di ottimizzazione, generare variate casuali, tracciare i miei risultati, scrivere risultati in un file di testo e testare il mio codice. Se Python è troppo lento, è possibile racchiudere Python attorno al codice C, C ++ o Fortran che si occupa di compiti intensivamente computazionali. Python è, per me, uno sportello unico per la maggior parte delle mie esigenze di elaborazione scientifica.

Python non è ancora esattamente MATLAB; SciPy e NumPy hanno ancora molta strada da fare in termini di funzionalità, ma in termini di utilità generale, utilizzo Python per una più ampia varietà di attività rispetto a MATLAB.


7
Non posso fare a meno di non essere completamente d'accordo. Python è un mal di testa per i manutentori dei sistemi poiché è un po 'un bersaglio mobile. Gli scienziati computazionali dovrebbero avere una conoscenza di base di bash o csh per l'incollaggio più rudimentale di cose insieme e l'esecuzione di lavori sui sistemi che probabilmente useranno. Python è fantastico e ti sostengo sostenendo che le persone di calcolo lo imparino, ma non a scapito di qualche involucro rudimentale.
Bill Barth,

7
@BillBarth: Penso che ogni scienziato computazionale debba imparare bash o csh di base per script molto, molto basilari. Il motivo per cui sostengo l'uso di Python per lo scripting di shell oltre quelle attività di base è perché ho ereditato uno script bash di mille righe che essenzialmente esegue un programma . Passa i file avanti e indietro come semafori, invoca ripetutamente PBS e non c'è modo di provarlo affatto. Lo scripting della shell è ottimo per piccoli compiti, ma non per compiti di grandi dimensioni, e questo incubo di nastro adesivo e gomma da masticare mi è costato un paio d'anni della mia tesi, motivo per cui insisto.
Geoff Oxberry,

2
Come ho detto, non sono d'accordo sul fatto che "imparare il pitone" potrebbe essere appropriato per l'elenco. Non voglio farlo a spese dello "scripting di shell". Entrambi sono importanti e nessuno ti consentirà di eseguire ipython come shell, quindi lo scripting della shell è estremamente importante.
Bill Barth,

3
@BillBarth: da nessuna parte sto suggerendo che Python sostituisca la shell. Sto solo suggerendo che Python sostituisca bash per gli script; Credo che se impari bash di base, sai abbastanza per scrivere script senza strutture di controllo, quindi non c'è bisogno di approfondire lo "scripting bash". Non appena si desidera includere una struttura di controllo, è necessario passare a una lingua diversa, poiché la programmazione in bash è un mal di testa per i manutentori di software e librerie.
Geoff Oxberry,

1
+1. Python è stato il mio linguaggio di programmazione principale per qualche tempo. Non è perfetto, ma lo farà fino a quando qualcuno inventa il linguaggio di programmazione perfetto.
Faheem Mitha,

14

Matematica a virgola mobile. La maggior parte della scienza si occupa dei valori del mondo reale e i valori del mondo reale sono spesso rappresentati come punti fluttuanti nel mondo dei computer. Ci sono molti potenziali gotcha con float che possono rovinare la significatività dei risultati.

Il riferimento preferito per questo argomento sembra essere "Ciò che ogni scienziato informatico dovrebbe sapere sull'aritmetica in virgola mobile (1991)" di David Goldberg http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768


1
Questo documento è stato menzionato tante volte nei forum online. Ma è un articolo molto lungo e denso, e non sono sicuro di quante persone siano state effettivamente in grado di portare via qualcosa di utile da questo.
johngreen,

12

Uno scienziato computazionale deve avere sufficiente familiarità con l'informatica, la matematica e un campo di applicazione in scienze / ingegneria. Includerei le competenze in ciascuna delle seguenti aree:

Matematica:

  1. Analisi numerica
  2. Algebra lineare
  3. Equazioni differenziali ordinarie, parziali e / o stocastiche
  4. Ottimizzazione
  5. Statistiche e / o probabilità
  6. Teoria inversa

Informatica:

  1. algoritmi
  2. Strutture dati
  3. Programmazione parallela (MPI, OpenMP, CUDA, ecc.)
  4. Visualizzazione scientifica
  5. Architettura del computer
  6. Utilizzando un ambiente Linux

Scienza / Ingegneria - dipende dall'applicazione in cui vuoi specializzarti. Nel mio caso particolare (ingegneria), aggiungerei cose come la meccanica del continuo, il trasferimento di calore, la fluidodinamica, il metodo degli elementi finiti, ecc. Direi che più familiarità hai con più campi della scienza, più versatile sei come scienziato computazionale.


Puoi approfondire la "teoria inversa"?
Faheem Mitha,

1
@FaheemMitha: tradizionalmente, impostiamo prima i parametri di un modello (ad esempio un'equazione differenziale parziale), quindi osserviamo il comportamento del sistema. Un "problema inverso" sta facendo il contrario. Iniziamo con le osservazioni dell'output del sistema e proviamo a determinare i parametri del modello che producono queste osservazioni. La teoria inversa descrive i metodi per eseguire questo compito.
Paul

Grazie per la spiegazione. Hai un buon link / riferimento per questo argomento?
Faheem Mitha,

2
en.wikipedia.org/wiki/Inverse_problem è un buon punto di partenza. space.fmi.fi/graduateschool/Lectures07/HK_inversion.pdf ha anche una bella panoramica. Ma per una comprensione più approfondita, consiglierei un libro come amazon.com/Parameter-Estimation-Inverse-Problems-Second/dp/…
Paul

4

Grande domanda seguita da risposte affascinanti! Vorrei collegarmi con una piccola aggiunta. Per quanto ne ho sperimentato (io stesso e per procura), uno strumento All-in-One di solito è veramente buono da sapere. Tale strumento potrebbe essere MATLAB, Octave o persino Python (con librerie). Ogni volta che hai un problema nella tua "zona di comfort", una buona idea (per quanto ne so e penso) sarebbe quella di cimentarti in uno strumento All-in-One. Puoi provare a scrivere i tuoi codici in seguito. Il bello di questi pacchetti è che la programmazione non interferisce con la comprensione di ciò che stai facendo.

Prendi un esempio di Computer Graphics. Scrivere un codice per la traduzione, rotazione o ridimensionamento di una figura è 10 righe di codice in MATLAB (in alto) ma può essere eseguito per pagine in C. Non sto dicendo che C non è buono. Tutto quello che sto dicendo è che se non hai una buona ragione per scrivere codici in C, MATLAB sarebbe una via d'uscita più semplice, migliore e più intuitiva.

Alcuni potrebbero non essere d'accordo e affermare che la programmazione simil-C è un ottimo modo per costruire l'intuizione. Forse lo è. Ma quando non devi affrontare un problema per più di un paio di volte, è quasi impossibile sedersi e scrivere i tuoi codici in una lingua come C.


-1

Senso comune e sensazione di intestino ... Quest'ultimo arriva solo con il tempo e dopo aver "sopravvissuto" a un paio di esperienze vergognose nel grande mondo cattivo.


3
Non so se la "sensazione viscerale" sia davvero un'abilità. È più solo una reazione istintiva all'esperienza precedente.
nulla101
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.