Welche Kernkompetenzen sollte jeder Informatiker haben? [geschlossen]


52

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.


1
Gute Frage! Aber eines ist mir nicht klar: Was meinen Sie mit Computerwissenschaftler? Irgendein Wissenschaftler, der rechnet? Oder die VIEL kleinere Gruppe von Menschen, die ihren Berufstitel als "Computerwissenschaftler" betrachten würden?
David Ketcheson

9
Stellen Sie eine Listenfrage, die im Stack Exchange-Format nicht gut ist . Müssen wir das wirklich auf jeder Seite durchmachen?
DMCKEE

4
Das @Dan Community Wiki ist keine Entschuldigung dafür, Fragen zuzulassen, die nicht zur Site gehören. Ich möchte auch diejenigen, die antworten, ermutigen, ein Beispiel von Jed zu nehmen und zumindest zu erklären, warum Sie bestimmte Fähigkeiten benötigen oder andere nicht benötigen
Ivo Flipse

5
@IvoFlipse: Dies ist eine Frage, die in irgendeiner Form auf die Site gehört. Vielleicht nicht wie aktuell angegeben; Vielleicht muss es in kleinere Fragen gehackt und umformuliert werden, aber das Problem des schlechten Software-Engineerings in den Computerwissenschaften ist äußerst wichtig, zumal sich die Computerwissenschaft als Disziplin noch in ihrer Entstehungsphase befindet. Dieser Artikel in Nature gibt an, warum. Greg leistet über seine Website einen großartigen Dienst für die Computerwissenschafts-Community.
Geoff Oxberry

5
Ich bin nicht damit einverstanden, dass diese Frage geschlossen wird. Bitte sehen Sie (und stimmen Sie ab) meta.scicomp.stackexchange.com/questions/179/…
David Ketcheson

Antworten:


46

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


7
Ich stimme Jed zu. LaTeX ist unbedingt erforderlich! :)
Paul

1
Ich würde "Physik und Ingenieurwesen" auf Fachkenntnisse umstellen. Schließlich sind wir nicht alle Physiker oder Ingenieure. Der Geist dieses Teils der Antwort ist am richtigen Ort, aber es gibt eine ziemlich krasse Annahme.
Fomite

Danke @EpiGrad, ich habe es in "Domänenwissen" mit diesen als Beispiele geändert.
Jed Brown

Gute Liste. Ein grundlegendes Verständnis von Leistungsproblemen sollte ebenfalls vorhanden sein. Ich habe zu viele Leute getroffen, die das einfache Konzept der Code-Profilerstellung nicht verstehen. Hinweis: Unter Leistung sind nicht nur Geschwindigkeitsprobleme, sondern auch die Speichernutzung zu verstehen.
Faheem Mitha

Tippfehler: "Probelms" und "Burried". SE ließ mich sie nicht reparieren - eine zu kleine Bearbeitung.
Faheem Mitha

26

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:

  • Addition und Multiplikation sind schnell, Division oder transzendentale Funktionen hingegen nicht. Ich habe gesehen, wie erwachsene Männer eine Quadratwurzeloperation durch etwas ersetzten, das drei Unterteilungen erforderte, und das sie für großartig hielten (Unterteilung und Quadratwurzel sind genauso teuer).
  • Level-3-Caches werden jedes Jahr größer, aber der Level-0-Cache, dh der wirklich schnelle, ist immer noch nur ein paar Kilobyte groß.
  • Compiler sind keine Zauberei. Sie können kleine Schleifen abrollen oder sehr einfache Vorgänge vektorisieren, aber sie werden diesen Bubblesort nicht in einen Quicksort verwandeln.
  • Das Aufrufen von Methoden für polymorphe Objekte mit mehrfacher Vererbung in Ihrer innersten Schleife ist zwar konzeptionell sehr nett, aber Ihre CPU möchte sich selbst töten.

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.


2
Gar nicht langweilig. Ich würde einen solchen Kurs belegen, wenn er angeboten würde. :-)
Faheem Mitha

18

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.


7
Ich kann nicht anders, als dem völlig zu widersprechen. Python bereitet Systembetreuern Kopfzerbrechen, da es sich um ein sich bewegendes Ziel handelt. Computerwissenschaftler sollten ein grundlegendes Verständnis von bash oder csh haben, um das rudimentärste Zusammenkleben von Dingen und Ausführen von Jobs auf den Systemen, die sie wahrscheinlich verwenden, zu ermöglichen. Python ist großartig, und ich unterstütze Sie dabei, dafür zu plädieren, dass die Leute es lernen, aber nicht auf Kosten einer rudimentären Shell.
Bill Barth

7
@BillBarth: Ich denke, jeder Informatiker muss Basic Bash oder CSH für sehr, sehr einfache Skripte lernen. Der Grund, warum ich die Verwendung von Python für Shell-Skripte über diese grundlegenden Aufgaben hinaus befürworte, ist, dass ich ein Bash-Skript mit tausend Zeilen geerbt habe, das im Wesentlichen ein Programm ausführt . Es übergibt Dateien als Semaphore hin und her, ruft wiederholt PBS auf, und es gibt überhaupt keine Möglichkeit, dies zu testen. Shell-Scripting eignet sich hervorragend für kleine, aber nicht für große Aufgaben, und dieser Alptraum aus Klebeband und Kaugummi hat mich ein paar Jahre meiner Diplomarbeit gekostet, weshalb ich darauf bestehe.
Geoff Oxberry

2
Wie gesagt, ich bin nicht anderer Meinung, dass "Python lernen" für die Liste geeignet sein könnte. Ich möchte es einfach nicht auf Kosten von "Shell Scripting" machen. Beides ist wichtig, und niemand lässt Sie ipython als Ihre Shell ausführen. Daher ist Shell-Scripting äußerst wichtig.
Bill Barth

3
@ BillBarth: Nirgendwo schlage ich vor, dass Python die Shell ersetzt. Ich schlage nur vor, dass Python Bash für die Skripterstellung ersetzt. Ich glaube, wenn Sie grundlegende Bash-Methoden erlernen, wissen Sie genug, um Skripte ohne Kontrollstrukturen zu schreiben, sodass Sie sich nicht eingehend mit Bash-Skripten befassen müssen. Sobald Sie eine Kontrollstruktur einbinden möchten, sollten Sie zu einer anderen Sprache wechseln, da die Programmierung in bash für Software- und Bibliotheksbetreuer problematisch ist.
Geoff Oxberry

1
+1. Python ist seit einiger Zeit meine Hauptprogrammiersprache. Es ist nicht perfekt, aber es wird funktionieren, bis jemand die perfekte Programmiersprache erfindet.
Faheem Mitha

14

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


1
Dieses Dokument wurde so oft in Online-Foren erwähnt. Aber es ist ein sehr langer und dichter Artikel, und ich bin mir nicht sicher, wie viele Leute tatsächlich in der Lage waren, etwas Nützliches daraus zu machen.
Johngreen

12

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:

  1. Numerische Analyse
  2. Lineare Algebra
  3. Gewöhnliche, partielle und / oder stochastische Differentialgleichungen
  4. Optimierung
  5. Statistik und / oder Wahrscheinlichkeit
  6. Inverse Theorie

Computerwissenschaften:

  1. Algorithmen
  2. Datenstrukturen
  3. Parallele Programmierung (MPI, OpenMP, CUDA usw.)
  4. Wissenschaftliche Visualisierung
  5. Rechnerarchitektur
  6. Verwenden einer Linux-Umgebung

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.


Können Sie "Inverse Theorie" näher erläutern?
Faheem Mitha

1
@FaheemMitha: Traditionell stellen wir zuerst die Parameter eines Modells ein (z. B. eine partielle Differentialgleichung) und beobachten dann das Verhalten des Systems. Ein "inverses Problem" ist das Gegenteil. Wir beginnen mit den Beobachtungen der Ausgabe des Systems und versuchen, die Parameter des Modells zu bestimmen, die diese Beobachtungen erzeugen. Inverse Theorie beschreibt Methoden zur Erfüllung dieser Aufgabe.
Paul

Danke für die Erklärung. Haben Sie einen guten Link / Verweis zu diesem Thema?
Faheem Mitha

2
en.wikipedia.org/wiki/Inverse_problem ist ein guter Anfang. space.fmi.fi/graduateschool/Lectures07/HK_inversion.pdf hat auch einen schönen Überblick. Aber für ein tieferes Verständnis würde ich ein Buch wie amazon.com/Parameter-Estimation-Inverse-Problems-Second/dp/…
Paul

4

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.


-1

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.


3
Ich weiß nicht, ob "Bauchgefühl" wirklich eine Fähigkeit ist. Es ist eher eine instinktive Reaktion auf frühere Erfahrungen.
naught101
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.