"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.