Welche Softwaremethode sollte ich bei der Recherche befolgen?

9

Normalerweise analysiere ich Daten von Experimenten und obwohl ich ein allgemeines Schema von Schritten habe, die ich ausführen muss, muss ich es möglicherweise an die Besonderheiten der Experimente oder die dahinter stehenden Fragen anpassen. Ich bin normalerweise die einzige Codierung.

Ich habe mir Wikipedia angesehen , bin mir aber nicht sicher, welche Methode ich verwenden kann, teilweise, weil ich noch nie einer gefolgt bin, und teilweise, weil ich manchmal nur die Daten untersuche, um zu sehen, wie sie aussehen, und manchmal möchte ich nur eine Antwort. (Und weil von mir nicht viel erwartet wird, dass ich meinen Code teste oder eine bestimmte Qualität habe)

Nach ein oder zwei Stunden wurde ich aufgefordert, diese Frage zu stellen. Dabei stellte ich fest, dass die r-Funktion tablevon der Reihenfolge der Vektoren und nicht vom Namen der Elemente abhängt, mit denen sie verglichen werden sollen. Dann hätte ich das Verhalten und die Funktionen, die ich mit einigen Scheindaten verwendet habe, testen sollen. Aber ich habe die Tabelle verwendet, nachdem andere Analysen zu Informationsmangel geführt hatten, sodass ich der testgetriebenen Entwicklungsmethode nicht folgen konnte (wenn ich sie richtig verstanden hätte). Ich bin jedoch der Meinung, dass ich mit einer gewissen Verbesserung der Art und Weise, wie ich mit dem Projekt umgehe, effizienter sein könnte, abgesehen davon, dass ich Fehler früher erkenne, aber auch, wie und wonach ich suchen muss, falls ich an einem Ergebnis zweifle. Konzentrieren Sie sich also bitte nicht nur darauf Dieser Beispielfehler.

Welche Softwaremethode passt am besten in die Forschung?

Ich frage mich im Grunde, wie man Qualität und zeitgesteuerten Fortschritt sicherstellt und die Spezifität der Forschung beibehält.

Beispiel meiner Arbeitsweise:

Ein Biologe hat eine Frage im Sinn und weiß, dass die Durchführung eines Experiments zu interessierenden Daten führt (dh zu Genexpressionsniveaus unter zwei Bedingungen). Dann setzt er das Experiment und sammelt Proben von 10 Personen / Mäusen / Ratten. Jetzt muss ich diese Daten für diese 10 Proben unter Verwendung vorhandener Bibliotheken und Tests analysieren (oder neue Tests implementieren), aber die Frage berücksichtigen, die der Biologe im Auge hatte (dh welche Gene in einer Bedingung stärker exprimiert werden als in einer anderen). Die Struktur ist dieselbe wie in früheren Experimenten (an denen 6 Bedingungen und ein anderes Tier beteiligt waren), aber der statistische Test, die Normalisierungen und die Datenstruktur können sich ändern. Daher kopiere ich normalerweise eine frühere Version und passe sie an die aktuellen Anforderungen an.

llrs
quelle
7
Was du jetzt bist, ist in Ordnung. Keine Methode wird Sie davon abhalten, Fehler zu machen! Stellen Sie einfach sicher, dass Sie ein Versionskontrollsystem verwenden, und halten Sie Ihre Codebasen gut organisiert.
Gbjbaanb
Keine Methode wird Fehler aufhalten. Aber einige werden die Fehler früher erkennen! Design by Contract oder vertragsbasiertes Design.
Frank Hileman
Könnten Sie bitte Ihren letzten Satz ausarbeiten? Ich habe es überhaupt nicht verstanden.
11.
Vielleicht en.wikipedia.org/wiki/Test-driven_development mit einer Art automatisiertem Test-Framework - kleine Tests sind nützlich, um Fehler zu erkennen, und größere Tests können (ungefähr) auf Ihre Hypothesen
abgebildet werden
1
@Llopis Idealerweise schreiben Sie zuerst einen Test, er schlägt fehl, dann schreiben Sie den Code, der Test besteht, dann schreiben Sie Ihren Code fest. Wenn Sie später einen Fehler entdecken, schreiben Sie den Test, der den Fehler aufgefangen hätte , er schlägt fehl , korrigieren Sie den Code, der Test besteht, dann schreiben Sie Ihren Code fest - Sie können nicht alles vorhersehen, aber Sie können sicherstellen, dass dasselbe nicht noch einmal passiert
david.libremone

Antworten:

6

Was benötigt wird, ist vielleicht keine Softwaremethodik, sondern ein politischer Wandel in der Wissenschaft, der das Problem der mangelnden Anerkennung der Rolle der Softwareentwicklung in der Wissenschaft behebt.

Das Software Sustainability Institute (UK) ist die Organisation, die dem am nächsten kommt, wonach Sie suchen: wie Sie sich für einen gewissenhafteren Einsatz von Computerprogrammierung in der wissenschaftlichen Forschung einsetzen können.

Es bietet auch Informationshinweise für diejenigen, die an Softwareentwicklungsmethoden interessiert sind.

Ich muss jedoch darauf hinweisen, dass Methoden in der Regel Teams von Softwareprogrammierern mit Iterationen und schrittweiser Verfeinerung der Projektziele steuern und mit stabilen Codebasen arbeiten, die lange halten. Sie sind für Projekte gedacht, die um Größenordnungen komplexer sind als das, was Sie tun.


Hier ist die unbequeme Wahrheit, warum diese sehr offensichtlich korrekte Sache (gewissenhafterer Einsatz von Computerprogrammierung in der wissenschaftlichen Forschung) nicht erreicht und immer bestätigt wurde: In akademischen Verwaltungsumgebungen kann man sehen, dass Wissenschaftler die Bedeutung des Computers herabsetzen Programmierung. Manchmal kann man sehen, dass sie sich zusammenschließen, um die Anerkennung von Beiträgen von Personen zu verweigern, die an der Software beteiligt sind, selbst wenn die Art dieses Beitrags in die wissenschaftliche Disziplin passt.


An Ihrem Arbeitsplatz fehlten Dinge und Dinge, die Sie tun können.

Dinge, die fehlten:

  • Fehlende Richtlinien
  • Mangel an Aufsicht oder Person, um Fragen zu stellen
  • Mangel an Mentoren oder Computerprogrammierern, die mit den von Ihnen verwendeten Tools vertraut sind (z. B. R)
  • Fehlende Wiederverwendung, Archivierung, Versionskontrolle oder Dokumentation zuvor entwickelter Software aus Gründen der Wiederholbarkeit und des Lernens

Kurz gesagt, die allgemeine Kultur ist, dass die beteiligten Personen nicht wirklich an ... Sie haben es erraten ... einem gewissenhafteren Einsatz von Computerprogrammierung in der wissenschaftlichen Forschung interessiert sind.


Dinge die du tun kannst:

  • Nehmen Sie sich mehr Zeit für das Erlernen Ihrer Werkzeuge.
    • Verbringen Sie mehr Zeit mit dem Lesen der Dokumentation und der Codebeispiele für Ihre Programmiersprachen
    • Sie müssen lernen, die Werkzeuge zu lieben, die Sie verwenden.
  • Versuchen Sie, etwas aufzuschreiben, zum Nutzen des nächsten Computerprogrammierers, der in den nächsten Jahren derselben Gruppe von Menschen versklavt wird
    • Ein Wiki wird ausgezeichnet sein.
  • Versuchen Sie, die Versionskontrolle der Quelle einzurichten
    • In der Lage sein, häufig wiederverwendete Codefragmente abzurufen
    • Sie können einen Schnappschuss des in einem bestimmten Experiment verwendeten Codes speichern

Für Entwickler von Karrieresoftware finden sich Richtlinien dieser Art in:

Dies sind die Grundvoraussetzungen für die Führung eines Softwareentwicklungsunternehmens. Wenn Sie jedoch allein einen Krieg der Apathie führen, müssen Sie Prioritäten setzen. Mit den Tools besser zu werden, Informationen aufzuschreiben und zu pflegen sowie Versionen des Quellcodes beizubehalten, ist das absolute Minimum für eine einzige Umgebung.

rwong
quelle
Interessante Ressource zum Software Sustainability Institute danke! Ich werde meine eigenen Richtlinien für die Code- und Datenverwaltung schreiben, ich habe einen Supervisor, aber er scheint nicht "mit den Tools
vertraut zu sein
ha ja, ein Wiki ... für ein paar Versuche würde ich dokuwiki.org/dokuwiki# hier empfehlen . Einfach einzurichten und die Dokumente als Textdateien und nicht in einer Datenbank zu speichern. Ich fand, dass dies die beste Balance zwischen einfacher Einrichtung, Benutzerfreundlichkeit und Nachhaltigkeit der Daten war.
Newtopian
Die Probleme in der computergestützten Wissenschaft, die @rwong beschreibt, sind in den meisten Instituten vorhanden, an denen ich gearbeitet habe (Physik und Astronomie)
steffen
2

Kümmern Sie sich nicht so sehr um die Methodik, sondern konzentrieren Sie sich mehr auf das, was Sie benötigen, um Ihre Anforderungen für die Softwareentwicklung selbst im Auge zu behalten.

Nach einem kurzen Aufenthalt in einer Position, die Ihrer hier relativ ähnlich ist, kann ich aus meiner persönlichen Erfahrung extrahieren.

Algorithmische Genauigkeit

Der wahrscheinlich wichtigste Aspekt ist, dass Sie nachweisen können, dass Ihre Software das tut, wofür sie entwickelt wurde. Hier ist das automatisierte Testen Ihr bester Verbündeter. Mir ist klar, dass es schwierig sein kann, auf einen richtigen Datensatz zu verzichten, aber eigentlich sollten Sie es sich zur Gewohnheit machen, Ihre eigenen Datensätze zu erstellen. Ihr Zweck ist jedoch etwas anders. Sie versuchen nicht, Trends aus den Daten zu extrahieren, sondern stellen sicher, dass die Software aus einem bekannten Datensatz vorhersehbare und korrekte Ergebnisse liefert. Für die Mustererkennung benötigen Sie beispielsweise kein Multi-Gig-Erbgut. Nur ein paar Textzeilen können ausreichen, um sicherzustellen, dass der Algorithmus das Muster erkennt.

Ich habe meine Daten so gestaltet, dass sie Eckfälle darstellen, unmögliche Fälle. Ich konzentrierte mich eher auf die Extreme als auf die erwartete Norm. Oft kann ich mich daran erinnern, auf etwas Unmögliches getestet zu haben, nur um zu sehen, dass diese Situation im tatsächlichen Datensatz auftritt. Hätte ich nicht darauf getestet, hätte ich nicht die Fehlererkennung und Protokollierung eingerichtet, die erforderlich sind, um mögliche Beschädigungen oder Fehler im Datensatz zu identifizieren. TDD passt gut zu diesem Teil, obwohl das Erstellen eines guten Testsatzes meiner Meinung nach wichtiger ist, unabhängig davon, ob Sie dies vor oder nach dem eigentlichen Code tun.

Versionierung

Zu oft wird dieser Teil weggelassen. Ein gutes Versionsschema für Ihren Code und die erstellten Pakete / ausführbaren Dateien hilft immens dabei, Ihren Fortschritt in Ordnung zu halten. Die genaue Wiederherstellung des Codes, der zum Erstellen der zuvor erhaltenen Ergebnisse verwendet wurde, kann beim Aufspüren von Fehlern oder Diskrepanzen hilfreich sein. Verzweigungen können auch beim Experimentieren mit verschiedenen Ansätzen oder Algorithmen hilfreich sein.

Stellen Sie sicher, dass Sie den in den tatsächlichen Berechnungen verwendeten Code mit Tags versehen. Überprüfen Sie die semantische Versionierung, wenn Sie Hilfe bei der Benennung der Versionen benötigen.

Automatisierter Build

Eine Folge des obigen Punktes. Stellen Sie sicher, dass Sie den Prozess des Erstellens und Packens Ihrer Software so weit wie möglich automatisieren. Sie müssen nicht vollständig arbeiten, gerade genug, um das endgültige System aus Quelle und Abhängigkeiten zu erstellen. Das Ziel hier ist es, Ihnen Zeit zu sparen, aber auch ein reproduzierbares Mittel zu haben, um die Software aus dem Quellcode neu zu erstellen, einschließlich Abhängigkeiten und anderer externer Funktionen. Groovy, Maven, Ant, Scons, Cmake sind nur eine kleine Auswahl von Build-Automatisierungs-Tools und Skriptsystemen, die helfen können.

Wenn Sie noch einen Schritt weiter gehen möchten, installieren Sie Jenkins oder Teamcity oder ein anderes kontinuierliches Integrationssystem. Zusätzlicher Bonus, wenn Sie mehrere Server oder Worker für verteiltes Computing warten müssen. Die meisten dieser Systeme verfügen über Mittel zur Unterstützung der Wartung. Außerdem können Sie die Testläufe vollständig automatisieren, sodass Sie nicht auf die Ergebnisse warten müssen, bevor Sie fortfahren. Legen Sie einfach fest und erhalten Sie später eine E-Mail. Ich hatte ein System, das Stunden brauchte, um die Testsätze zu durchlaufen. Diese Automatisierung einzurichten war die beste Investition meiner Zeit. Vor allem, wenn Sie bereits über die Skripte verfügen, um alles zu erstellen.

Umgebungsisolation

Die Forscher verbringen übermäßig viel Zeit damit, einen einzelnen oder kleinen Satz von interessierenden Variablen über ihre Protokolle von komplexen Systemen zu isolieren. Dies sollte auch auf Ihre Softwareentwicklungspraktiken ausgedehnt werden. Sie können die Containerisierung auch mit Docker oder Vagrant überprüfen. Sie haben eine bessere Kontrolle über die Umgebung, in der die Software ausgeführt wird.

Sie brauchen kein großes Team, bevor sich das auszahlt. Ich war die meiste Zeit allein und habe dennoch sehr davon profitiert, diese zu implementieren. Die Ruhe und die Zeitersparnis überwogen bei weitem den Aufwand, den ich dafür kostete.

Newtopian
quelle
Normalerweise habe ich den Code so belassen, wie er ist, wenn ich damit fertig bin. Daher wird die neueste Version für die Berechnungen verwendet. Daher muss ich diese möglicherweise verbessern. Sollte ich auch in Bezug auf die algorithmische Genauigkeit nicht davon ausgehen, dass die von mir verwendeten Bibliotheken ordnungsgemäß funktionieren?
llrs
Sie können, obwohl ich bereits Tests zu externen Abhängigkeiten durchgeführt habe, aber das war selten ... es ist Ihr eigener Code, den Sie testen sollten. Haben Sie die Bibliotheken korrekt verwendet? Schlägt es rediktabel fehl (Ihr Code)? usw.
Newtopian
0
  1. Kannst du R verwenden? Dafür ist es da.

  2. Halten Sie Ihren Code einfach . Achten Sie auf Lesbarkeit und sorgen Sie sich nicht um die Leistung, es sei denn, es handelt sich um ein Problem. Es gibt Methoden, um zu versuchen, Teams von Programmierern davon abzuhalten, Fehler in den Code des anderen zu setzen, selbst wenn das Team eine Person ist.

  3. Das heißt, Codierung Disziplin ist super wichtig. Ich habe Code von hochqualifizierten Wissenschaftlern und Mathematikern gesehen, und es ist schrecklich . Sie ignorieren die Formatierung völlig. Sie zerquetschen den Code wie vakuumverpackt. Ihre Variablennamen sind völlig mystifizierend. Sie schreiben keine Kommentare oder sie schreiben unergründliche Kommentare oder die Kommentare sagen eine Sache, während der Code eine andere sagt. Mach diese Dinge nicht. Denken Sie immer an die zukünftigen Änderungen, die Sie oder andere möglicherweise vornehmen müssen.

Mike Dunlavey
quelle
1
Ich verwende R, hoffe, mein Code ist einfach genug, um Fehler zu erkennen, die ich hätte schreiben können, und Fehler, die ich hätte machen können. Ich folge dem Formatierungsstil des Google R-Codes und würde gerne glauben, dass Kommentare nützlich sind, um zu erklären, warum ich solche Entscheidungen im Code treffe.
llrs
@Llopis: Dann würde ich sagen, dass Sie auf dem richtigen Weg sind.
Mike Dunlavey
@Llopis In der teambasierten Softwareentwicklung ist es Routine für Teammitglieder, einen anderen zu bitten, den Code zu überprüfen, basierend auf der Annahme, dass mehr Augen mehr Fehler auffangen können. Leider gibt es in Ihrer Situation niemanden, der Ihre überprüft, und die Geheimhaltungskultur in der Forschung hat Sie daran gehindert, andere (außerhalb Ihrer Arbeitsplatzberechtigungen) Ihren Code überprüfen zu lassen.
Rwong
1
@rwong in der Tat darf ich jetzt meinen Forschungscode teilen, so dass jeder es auf Github überprüfen kann
llrs
@Llopis: Umso mehr Grund, es lesbar zu machen. Eine Sache, die ich versuche, ist, ein sehr kleines Tutorial (in Kommentaren) zu diesem Thema zu geben, da die Fachkenntnisse des Lesers wahrscheinlich von meinen abweichen.
Mike Dunlavey