Prioritäten für das Erlernen von Berechnungsmethoden: Wann sollte ich meinen eigenen Code schreiben, anstatt Bibliotheken als Anfänger zu verwenden?

10

Ich beginne mein Ingenieurstudium und werde an computerwissenschaftlichen Projekten arbeiten. Mir ist aufgefallen, dass hier einige Diskussionen über die Vor- und Nachteile der Implementierung eigener Algorithmen geführt wurden . Unterscheidet sich die Kosten-Nutzen-Analyse der Implementierung eigener Algorithmen von der Verwendung von Bibliotheken als Anfänger?

Godric Seer
quelle
2
Ich hatte eine lange Antwort, aber nach einigen Diskussionen mit einem anderen Mod habe ich beschlossen, sie zu löschen und um Klärung Ihrer Frage zu bitten. Was ist der Hauptpunkt Ihrer Frage? Ist es "Wo betone ich mein Lernen?", "Wie würden Sie empfehlen, das Lernen gegenüber dem Modellierungsfortschritt zu priorisieren?", "Würde die Auswahl von Bibliotheken gegenüber selbst implementierten Codes von den zu lösenden Problemen abhängen?" Oder "Was sind die Vorteile /? Nachteile der Codierung meiner eigenen Algorithmen zu einem viel früheren Zeitpunkt meiner Karriere? ". Meine Antwort war zu weit gefasst, und es wäre besser, Ihnen eine gezielte Antwort auf eine gezieltere Frage zu geben.
Geoff Oxberry
Ich fügte den fett gedruckten Abschnitt hinzu, um genau zu klären, was ich fragte, ließ aber den Rest intakt. Wenn Sie der Meinung sind, dass eines der anderen Teile entfernt werden sollte, fühlen Sie sich frei.
Godric Seer
Vielen Dank. Ich werde einige Änderungen vornehmen, um die Frage fokussiert zu machen, und dann eine Antwort veröffentlichen.
Geoff Oxberry

Antworten:

10

Meiner Meinung nach ändert die Antwort von David Ketcheson hier auf die Frage, die Sie in Ihrem Beitrag verlinkt haben , nichts, wenn Sie ein Anfänger sind .

Codieren Sie minimale Versionen von Algorithmen, die Sie lernen möchten. Dann legen Sie sie beiseite. Das Codieren eigener Algorithmen ist am nützlichsten für das Lernen, aber für Forschungs- (oder Produktions-) Code, es sei denn, Ihre Forschungsziele bestehen darin, Software zu schreiben, die die neuesten Bibliotheken verbessert (falls überhaupt vorhanden). Es ist besser, Bibliotheken zu benutzen. Bibliotheken sind wahrscheinlich besser dokumentiert, skalierbarer und robuster als das, was Sie selbst codieren, es sei denn, Sie können wirklich gut codieren (oder werden). Außerdem werden Bibliotheken wahrscheinlich für Sie getestet und getestet (obwohl dies natürlich davon abhängt, wer die Bibliothek geschrieben hat ...). Sie sind dafür verantwortlich, den Code, den Sie für Ihre Abschlussarbeit schreiben, zu unterstützen, zu debuggen und zu testen. Um Zeit zu sparen, können Sie die Menge an Code, die Sie schreiben müssen, minimieren.

Die einzigen anderen Szenarien, an die ich denken kann (dh es kann andere geben), sind:

  • Es gibt keine Bibliotheken, die die Funktionen bieten, die Sie benötigen. Erwägen Sie, einen Beitrag zu vorhandenen Open-Source-Bibliotheken zu leisten oder Ihre eigene Open-Source-Bibliothek zu schreiben, damit andere davon profitieren können.
  • Sie benötigen zusätzliche Leistung und können spezielle Problemstrukturen nutzen, um diese zu erhalten. Dokumentieren und ändern Sie dann eine vorhandene Bibliothek oder schreiben Sie selbst eine Implementierung mit höherer Leistung.
  • Ein Supervisor besteht darauf, dass Sie Ihre eigene Software rollen. Nun, Sie sind dort alleine, aber ich schlage vor, die obigen Punkte anzusprechen, um sie davon zu überzeugen, dass Sie besser dran sind, Bibliotheken zu verwenden (wenn dies in Ihrer Situation überhaupt möglich ist).
Geoff Oxberry
quelle
10

Ich möchte Geoffs nachdenklicher Antwort etwas mehr Breite geben . Insbesondere möchte ich Ihnen etwas mehr Einblick in den Wert Ihrer Programmierbemühungen geben als in Ihre Forschungsbemühungen in Ihrer frühen Karriere als Akademiker.

Sie werden feststellen, dass die Fähigkeit, Software zu schreiben, um Ihre wissenschaftliche Forschung zu erweitern, Sie zu einem wertvollen Mitglied fast jedes Forschungsteams macht. Diese Zeit wird jedoch von Ihren akademischen Kollegen oder denjenigen, die für akademische Positionen eingestellt werden, nicht unbedingt als "wertvoll" angesehen.

Aus einer 2011 in Princeton durchgeführten Forschungsumfrage "Ein Überblick über die Praxis der Computerwissenschaft" :

Wissenschaftler verbringen viel Zeit mit der Programmierung von Forschungszeit. Im Durchschnitt werden nach Schätzungen von Wissenschaftlern 35% ihrer Forschungszeit für die Programmierung / Entwicklung von Software aufgewendet. Während anfangs einige Zeit für das erneute Schreiben von Code aufgewendet wird, wird ein beträchtlicher Teil der Zeit für viele langwierige Aktivitäten aufgewendet. Zum Beispiel mussten Forscher in Politik und Soziologie, die R / Stata verwendeten, umfangreiche Programmierungen durchführen, um Volkszählungsdaten in Formate nachzurüsten, die einzelne Pakete in R / Stata verstanden. Einige Forscher der chemischen Verfahrenstechnik mussten undokumentierten Legacy-Code, der lange nach Abschluss der ursprünglichen Autoren eine Flammensimulation durchführte, rückentwickeln, um den Code an neuere Brennstoffe anzupassen ... Trotzdem war eine große Mehrheit dieser Forscher der Ansicht, dass "sie verbringen Sie mehr Zeit mit Programmieren als sie sollten "

Das bedeutet nicht, dass es keine gute Idee ist, eine Kernbibliothek oder Anwendungen zu implementieren oder neu zu gestalten. Wenn Sie jedoch ernsthafte Softwareentwicklungen durchführen möchten (mehr als 25% Ihrer Zeit mit Code arbeiten), behalten Sie diese drei bei Gedanken im Kopf.

  • Komplexität und Risiko wachsen exponentiell mit der Projektgröße und der Anzahl der Entwickler. Solange Sie nicht mit größeren Softwareteilen oder Entwicklerteams geschrieben oder gearbeitet haben, die über Ihr Labor hinausgehen, wird es für Sie schwierig sein, dies richtig einzuschätzen und den Aufwand richtig vorherzusagen.

  • Du musst gut sein. Sowohl als Programmierer als auch als Anwendungswissenschaftler ist eine gewisse Reife erforderlich, um nützliche Software zu schreiben. Sie müssen die wichtigen Merkmale kennen, wo die numerischen Risiken liegen, und in der Lage sein, den Programmieraufwand für einen bestimmten Satz von Merkmalen und die Robustheit vorherzusagen. Der einzige Weg, um gut zu werden, besteht natürlich darin, Zeit mit Projekten zu verbringen, bei denen Sie nicht die Führung übernehmen oder die sicher scheitern oder verzögert werden können, was mich zu meinem letzten Punkt bringt.

  • Obwohl viele Forschungslabors und Industriepositionen Wert auf Programmiererfahrung legen, kann wissenschaftliche Programmierung einen potenziellen Nachteil für Ihre akademische Karriere darstellen, selbst wenn Ihre Software der Wissenschaft mehr zugute kommt als Ihre Arbeiten. Die ganze Zeit verbringen Sie damit, zu lernen, wie man gut programmiert, programmiert, Ihren Code dokumentiert und ihn robust macht. Dies führt zu Papieren, die nicht geschrieben werden. Ein Berater wird hier nicht immer das Wohl seines Schülers berücksichtigen, da dies einer der Fälle ist, in denen der Schüler Arbeit leisten kann, die der Beratergruppe zugute kommt, ohne die Anzahl der Zitate des Schülers zu verbessern. Suchen Sie einen oder mehrere vertrauenswürdige Mentoren in dem Bereich auf, an dem Sie interessiert sind, und stellen Sie sicher, dass Sie ein klares Verständnis dafür haben, welche Beiträge als wertvoll angesehen werden. akademia.stackexchange.com ist ein ausgezeichneter Ort, um eine Folgefrage zu stellen.


Als Fußnote: Die Anzahl der Ein-Mann-Projekte, die jedes Rechenfeld erheblich voranbringen, nimmt stetig ab, sei es ein Anwendungsbereich oder etwas Technischeres wie die dichte lineare Algebra. Immer mehr Softwarepakete, die das "Brot und Butter" der Computerforschung bilden, sind 10 Jahre oder älter. Wissenschaftlicher Code, der diesen Reifegrad nicht erreicht hat, weist tendenziell mehr Fehler, weniger Funktionen und eine spärliche Dokumentation auf. Vermeiden Sie es, mit unreifem Code zu arbeiten, der nicht aktiv unterstützt wird, unabhängig davon, wie alt er ist.

Aron Ahmadia
quelle
Ich hatte mir schon Sorgen um meine Papierzählung gemacht. Da ich der Computerstudent für eine große Anzahl experimenteller Studenten sein werde, werde ich wahrscheinlich viele 2. und 3. Autoren haben. Es ist auch wahrscheinlich, dass ich zu Beginn nur verschiedene Programme kombiniere (0D-Code aus meinem Labor, 2D-Code von einer anderen Universität, Meshing-Software von einem anderen Labor in meiner Universität). Auf jeden Fall viel darüber nachzudenken.
Godric Seer
6

Ich denke, die Kosten-Nutzen-Analyse hängt von der gewünschten wissenschaftlichen Computerkenntnis ab, die Sie während Ihres Studiums erreichen möchten.

Für die meisten Wissenschaftler, die mit Computern arbeiten, die sich mit wissenschaftlichem Rechnen auskennen, ist dies ausreichend: ein umfassendes (abstraktes) Verständnis der verwendeten Hauptalgorithmen und Programmierkenntnisse, mit denen Sie Softwarebibliotheken effektiv nutzen können (Software erstellen, verknüpfen, verwenden) Mailinglisten).

Wenn Sie dagegen ein Experte auf dem Gebiet des wissenschaftlichen Rechnens werden möchten, benötigen Sie ein tiefes Verständnis der numerischen Methoden, der Gleitkomma-Arithmetik und der Computertechnologie. Sie können die Theorie dieser Themen aus Büchern lernen, jedoch sind Erfahrung durch Übung erforderlich, um fortgeschrittene Fähigkeiten aufzubauen und aufrechtzuerhalten. Daher ist es möglicherweise eine gute Idee, alles zu programmieren, was Sie während des Lernens verwenden (z. B. wenn Sie wie ein Koch kochen möchten: Sie lernen, indem Sie essen, was Sie kochen, und indem Sie häufig kochen!).

Was das richtige Niveau ist, hängt von Ihrer Karriere ab. Sehen Sie, welche Fähigkeiten von Arbeitern in Ihrem Bereich eingesetzt werden.

fcruz
quelle