Jeder Wissenschaftler muss etwas über Statistik wissen: Was Korrelation bedeutet, was ein Konfidenzintervall ist und so weiter. Ebenso sollte jeder Wissenschaftler ein bisschen über das Rechnen wissen: Die Frage ist, was? Was ist zu erwarten, dass jeder arbeitende Wissenschaftler über das Erstellen und Verwenden von Software Bescheid weiß? Unsere Liste der Kernkompetenzen - die Dinge, die die Leute wissen sollten, bevor sie etwas mit "Wolke" oder "Peta" im Namen angehen - lautet:
- Grundlegende Programmierung (Schleifen, Bedingungen, Listen, Funktionen und Datei-E / A)
- die Shell / Basic Shell Scripting
- Versionskontrolle
- wie viel Programme zu testen
- grundlegendes SQL
Es gibt eine Menge Dinge, die nicht in dieser Liste enthalten sind: Matrixprogrammierung (MATLAB, NumPy und dergleichen), Tabellenkalkulationen, die so leistungsfähig sind wie die meisten Programmiersprachen, Tools zur Aufgabenautomatisierung wie Make und so weiter.
Also: Was steht auf deiner Liste? Was halten Sie für angemessen, wenn Sie erwarten, dass jeder Wissenschaftler es heutzutage weiß? Und was würden Sie aus der obigen Liste herausnehmen, um Platz dafür zu schaffen? Niemand hat genug Zeit, um alles zu lernen.
Antworten:
"Computational Scientist" ist etwas breit gefächert, da es sich um Personen handelt, die numerische Analysen mit Paper / LaTeX- und Proof-of-Concept-Implementierungen durchführen, Personen, die Universalbibliotheken schreiben und Personen, die Anwendungen entwickeln, die bestimmte Problemklassen lösen, und Endbenutzer, die diese verwenden anwendungen. Die Fähigkeiten, die für diese Gruppen benötigt werden, sind unterschiedlich, aber es ist ein großer Vorteil, mit dem "vollen Stapel" vertraut zu sein. Ich werde beschreiben, was meiner Meinung nach die kritischen Teile dieses Stacks sind. Leute, die auf dieser Ebene arbeiten, sollten natürlich ein tieferes Wissen haben.
Domänenkenntnisse (z. B. Physik und technischer Hintergrund)
Jeder sollte die Grundlagen der Klasse von Problemen kennen, die er löst. Wenn Sie an PDEs arbeiten, bedeutet dies eine gewisse allgemeine Vertrautheit mit einigen PDE-Klassen (z. B. Poisson, Elastizität sowie inkompressiblen und komprimierbaren Navier-Stokes), insbesondere welche Eigenschaften "genau" erfasst werden müssen und was diskretisiert werden kann Fehler (dies informiert die Methodenauswahl in Bezug auf die lokale Erhaltung und symplektische Integratoren). Sie sollten einige Funktionen und Analysetypen kennen, die für Anwendungen von Interesse sind (Optimierung von Auftrieb und Widerstand, Vorhersage von Fehlern, Parameterinversion usw.).
Mathematik
Jeder sollte mit den Klassen von Methoden vertraut sein, die für seine Problemdomäne relevant sind. Dies beinhaltet grundlegende Eigenschaften der spärlichen versus dichten linearen Algebra, die Verfügbarkeit von "schnellen Methoden", Eigenschaften von räumlichen und zeitlichen Diskretisierungstechniken und wie zu bewerten ist, welche Eigenschaften eines physikalischen Problems erforderlich sind, damit eine Diskretisierungstechnik geeignet ist. Wenn Sie meistens ein Endbenutzer sind, kann dieses Wissen sehr hoch sein.
Softwareentwicklung und Bibliotheken
Eine gewisse Vertrautheit mit Abstraktionstechniken und Bibliotheksdesign ist für fast alle in der Computerwissenschaft nützlich. Wenn Sie an Proof-of-Concept-Methoden arbeiten, verbessert dies die Organisation Ihres Codes (was es für andere einfacher macht, ihn in eine robuste Implementierung zu "übersetzen"). Wenn Sie an wissenschaftlichen Anwendungen arbeiten, wird Ihre Software dadurch erweiterbarer und die Schnittstelle zu Bibliotheken wird einfacher. Seien Sie beim Entwickeln von Code defensiv, sodass Fehler so früh wie möglich erkannt werden und die Fehlermeldungen so informativ wie möglich sind.
Werkzeuge
Die Arbeit mit Software ist ein wichtiger Bestandteil der Computerwissenschaft. Kenntnisse in der von Ihnen gewählten Sprache, Editorunterstützung (z. B. Tags, statische Analyse) und Debugging-Tools (Debugger, Valgrind) verbessern Ihre Entwicklungseffizienz erheblich. Wenn Sie in Batch-Umgebungen arbeiten, sollten Sie wissen, wie Sie Aufträge senden und interaktive Sitzungen abrufen. Wenn Sie mit kompiliertem Code arbeiten, sparen Sie viel Zeit, wenn Sie sich mit Compilern, Linkern und Build-Tools wie Make auskennen. Die Versionskontrolle ist für jeden wichtig, auch wenn Sie alleine arbeiten. Lerne Git oder Mercurial und benutze es für jedes Projekt. Wenn Sie Bibliotheken entwickeln, sollten Sie die Sprachstandards einigermaßen vollständig kennen, damit Sie fast immer portablen Code zum ersten Mal schreiben. Andernfalls werden Sie in Benutzer-Support-Anfragen vergraben, wenn Ihr Code nicht in die unkonventionelle Umgebung passt.
Latex
LaTeX ist der De-facto-Standard für die wissenschaftliche Veröffentlichung und Zusammenarbeit. Kenntnisse in LaTeX sind wichtig, um Ihre Ergebnisse zu kommunizieren, an Vorschlägen mitzuarbeiten usw. Das Erstellen von Skripten für die Erstellung von Zahlen ist auch wichtig für die Reproduzierbarkeit und Datenpräsenz.
quelle
Mein eigener Hintergrund liegt in der Informatik, daher sind meine Meinungen möglicherweise etwas voreingenommen. Allerdings würde ich der Liste "grundlegende Algorithmen und Datenstrukturen" hinzufügen. Was ich mit Grundlagen meine, sind im Wesentlichen lineares Suchen und Sortieren sowie Datenstrukturen wie ausgeglichene Bäume, Haufen und oder Hash-Tabellen.
Warum? Nun, in den meisten Berechnungsalgorithmen verbringen Sie außerordentlich viel Zeit und Mühe damit, Daten zu verschieben und nichts zu berechnen. Implementieren Sie jemals einen Finite-Elemente-Code? Das sind ungefähr 90% der Datenorganisation. Der Unterschied zwischen der Erledigung und der Erledigung kann eine Größenordnung der Recheneffizienz sein.
Ein kleinerer, mit der Informatik zusammenhängender Punkt, den ich hinzufügen möchte, ist eine kurze Einführung darüber, wie ein Prozessor tatsächlich funktioniert und was er kann und was nicht. Zum Beispiel:
Das ist ziemlich langweilig, aber es dauert nur ein paar Minuten, um es zu erklären, und wenn Sie es bedenken, können Sie guten Code von Anfang an schreiben oder Algorithmen entwerfen, die nicht auf nicht vorhandenen Hardwarefunktionen beruhen.
Was aus der Liste zu entfernen ist, denke ich, dass SQL für Computational Scientists ein bisschen viel ist. Auch das Testen von Software ist wichtig, aber es ist eine Wissenschaft für sich. Unit-Tests und korrekte abstrakte Datentypen sollten in der Grundprogrammierung vermittelt werden und erfordern kein zweijähriges Masterstudium.
quelle
Ich könnte später hinzufügen, aber für den Anfang würde ich "Shell-Scripting" herausnehmen und es speziell durch "Python-Scripting" ersetzen. Python ist viel portabler als Shell-Skripte und lesbarer als vergleichbare Shell- und Skriptsprachen. Seine große Standardbibliothek und die Popularität in den Wissenschaften (mit der möglichen Ausnahme der Biologie, die auch verwendet Perl) macht es einen großen Rechen lingua franca , keine gute erste Sprache für das Lernen Programmierung zu erwähnen. Es ist jetzt die erste Sprache, die EECS-Majors am MIT unterrichtet wird, und sie ist auf dem Arbeitsmarkt sehr beliebt, insbesondere im Bereich des wissenschaftlichen Rechnens. Die Online-Dokumentation ist umfangreich und es gibt auch eine Reihe von Programmiertexten, die auf Python basieren.
Mit Python können Sie grundlegende Programmierkonstrukte sowie Skripte unterrichten. Darüber hinaus bietet Python eine hervorragende Unterstützung für Unit-Tests, sodass Python auch zum Unterrichten von Unit-Tests verwendet werden kann. Python verfügt auch über eine umfangreiche Datenbank-API (die SQL ersetzen oder erweitern kann) und einige Build-Dienstprogramme, die Make-like-Funktionen bieten. Ich persönlich bevorzuge SCons gegenüber Make, weil ich finde, dass Python einfacher zu dokumentieren und zu testen ist als Shell-Skripte.
Letztendlich ist das motivierende Prinzip hinter meinem krassen Schilling für Python die Effizienz. Es ist viel einfacher, Ihren Workflow zu optimieren, wenn Sie den größten Teil Ihrer Arbeit in einer Sprache oder einem Tool erledigen können, insbesondere wenn es sich bei diesem Tool um eine ausdrucksstarke Skriptsprache handelt. Klar, ich könnte alles in C machen, aber mein Programm wäre fünfmal so lang, und wahrscheinlich brauche ich die Geschwindigkeit nicht. Stattdessen kann ich mit Python Daten aus einer Textdatei importieren, sie plotten, Optimierungsroutinen aufrufen, Zufallsvariablen generieren, meine Ergebnisse plotten, Ergebnisse in eine Textdatei schreiben und meinen Code einem Komponententest unterziehen. Wenn Python zu langsam ist, können Sie Python in C-, C ++ - oder Fortran-Code einbinden, der rechenintensive Aufgaben erledigt. Python ist für mich eine zentrale Anlaufstelle für die meisten meiner wissenschaftlichen Computeranforderungen.
Python ist noch nicht genau MATLAB; In Sachen Funktionalität haben SciPy und NumPy noch einiges zu tun, aber was den allgemeinen Nutzen betrifft, verwende ich Python für eine größere Bandbreite von Aufgaben als MATLAB.
quelle
Gleitkomma-Mathematik. Die meisten wissenschaftlichen Arbeiten befassen sich mit Werten der realen Welt, und Werte der realen Welt werden in der Computerwelt häufig als Gleitkomma dargestellt. Es gibt viele potenzielle Fallstricke mit Schwimmern, die die Aussagekraft der Ergebnisse in Mitleidenschaft ziehen können.
Die bevorzugte Referenz für dieses Thema scheint "Was jeder Informatiker über Gleitkommaarithmetik wissen sollte (1991)" von David Goldberg zu sein. Http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768
quelle
Ein Informatiker muss über ausreichende Kenntnisse in Informatik, Mathematik und einem Anwendungsgebiet in Naturwissenschaften / Ingenieurwissenschaften verfügen. Ich würde Fähigkeiten in jedem der folgenden Bereiche einschließen:
Mathematik:
Computerwissenschaften:
Wissenschaft / Technik - hängt von der Anwendung ab, auf die Sie sich spezialisieren möchten. In meinem speziellen Fall (Technik) würde ich Dinge wie Kontinuumsmechanik, Wärmeübertragung, Fluiddynamik, Finite-Elemente-Methode usw. hinzufügen Sie haben mit mehreren Bereichen der Wissenschaft, je vielseitiger Sie als Informatiker sind.
quelle
Tolle Frage, gefolgt von faszinierenden Antworten! Ich möchte mit nur einem kleinen Zusatz einsteigen. Nach meiner Erfahrung (selbst und stellvertretend) ist ein All-in-One-Tool in der Regel wirklich gut zu wissen. Ein solches Tool könnte MATLAB, Octave oder sogar Python (mit Bibliotheken) sein. Wann immer Sie ein Problem in Ihrer "Komfortzone" haben, ist es (soweit ich weiß und denke) eine gute Idee, sich an einem All-in-One-Gerät zu versuchen. Sie können später versuchen, Ihre eigenen Codes zu schreiben. Das Schöne an solchen Paketen ist, dass die Programmierung das Verständnis dessen, was Sie tun, nicht beeinträchtigt.
Nehmen Sie ein Beispiel für Computergrafik. Das Schreiben eines Codes zum Übersetzen, Drehen oder Skalieren einer Figur besteht aus 10 Codezeilen in MATLAB (oben), kann jedoch für Seiten in C ausgeführt werden. Ich sage nicht, dass C nicht gut ist. Ich sage nur, wenn Sie keinen guten Grund haben, Codes in C zu schreiben, wäre MATLAB ein einfacher, besserer und intuitiverer Ausweg.
Einige mögen anderer Meinung sein und behaupten, dass C-ähnliche Programmierung eine großartige Methode ist, um Intuition aufzubauen. Vielleicht ist es. Aber wenn Sie sich nicht mehr als ein paar Mal mit einem Problem beschäftigen müssen, ist es kaum gerechtfertigt, in einer Sprache wie C zu sitzen und Ihre eigenen Codes zu schreiben.
quelle
Gesunder Menschenverstand und Bauchgefühl ... Letzteres kommt erst mit der Zeit und nachdem wir einige beschämende Erfahrungen in der großen schlechten Welt "überstanden" haben.
quelle