Ich gehe in mein drittes Jahr meines Doktorandenprogramms und bis jetzt besteht mein Forschungscode (numerische inverse Probleme / medizinische Bildgebung / Bildverarbeitung / usw.) hauptsächlich aus unorganisierten MATLAB-Skripten und -Funktionen mit einigen MEX'd C ++ und CUDA Routinen, die hier und da für zusätzliche Geschwindigkeit sorgen. Die Arbeit mit MATLAB hat (meistens) Spaß gemacht, und ich werde es wahrscheinlich nicht ganz aufgeben:
Diesen Sommer habe ich in einem nationalen Labor an einem "großen" Code gearbeitet, und ich beginne, die Schönheit in einem gut geölten, objektorientierten, versionierten Code mit einer guten Verwendung von gmake und anderen Informatikspielzeugen zu sehen .
Meine Frage lautet: Inwieweit sollte ich versuchen, diese Tools in meinen Forschungscode aufzunehmen? Wie viel Zeit sollte ich damit verbringen, die Struktur und Implementierung meines Codes zu "planen", oder sollte ich aufhören, darüber nachzudenken und einfach gute Routinen schreiben? Ich habe das Gefühl, dass ich als Produkt meiner Dissertation eine gut geplante Open-Source-Codebasis für die Erfahrung und den Lebenslauf entwickeln sollte, bin mir aber nicht sicher, wie ich diesen Prozess steuern soll. Irgendwelche Tipps, Buch- / Artikel- / Website-Empfehlungen usw.?
quelle
Antworten:
Ich würde diese Fragen berücksichtigen:
Möchten Sie, dass Ihr Code zu einem ziemlich universellen Code wird, den Sie später wiederverwenden können, oder ist dies nur ein Teil des Codes, den Sie für ein Forschungsprojekt oder ein Papier verwenden, das Sie nicht wiederverwenden möchten? Wenn Sie nicht vorhaben, den Code wiederzuverwenden, lohnt es sich wahrscheinlich nicht, Zeit und Mühe zu investieren, um den Code zu verbessern.
Haben Sie genug über die von Ihnen verwendeten Algorithmen und Datenstrukturen gelernt, um sicher zu sein, dass Sie diese Algorithmen und Datenstrukturen weiterhin verwenden möchten? Wenn nicht, ist es möglicherweise verfrüht, Ihre Forschung in einen stabilen Code einzufrieren.
Möchten Sie den Code freigeben, andere dazu bringen, den Code zu verwenden, und letztendlich andere Personen dazu bringen, den Code weiterzuentwickeln? Als Forscher sollten Sie verstehen, dass dies eine der effektivsten Methoden ist, um sicherzustellen, dass Ihr Code Auswirkungen auf Ihr Forschungsgebiet hat. Um dies zu starten, müssen Sie jedoch einen relativ robusten Code bereitstellen, und Sie möchten ihn unter einer Open Source-Lizenz veröffentlichen, damit andere den Code in ihren eigenen Projekten verwenden können.
quelle
Nur so viel, wie Sie fühlen, zahlt sich für alles aus, was Sie versuchen zu tun. Wenn Sie hauptsächlich MATLAB-Skripte ausführen, sind Versionskontrolle und möglicherweise Unit-Tests alles, was Sie brauchen. Wenn Sie über MEX-Dateien verfügen, ist es wahrscheinlich gut, ein Makefile zu haben, das diese kompiliert, wenn auch nur aus eigenen Gründen, da die Eingabe von Sequenzen von Kompilierungsbefehlen jedes Mal, wenn Sie die MEX-Dateien erstellen möchten, fragil ist.
Ein Grund dafür, dass diese Workflow-Tools verwendet und in große Projekte integriert werden, ist, dass sich die Investition in diese Tools für ihre Ziele auszahlt. Als Beispiel für einen einmaligen Forschungscode, der Ihre These unterstützt, lohnt es sich wahrscheinlich nicht, ein plattformübergreifendes Build-System wie CMake zu verwenden. Für eine Bibliothek, deren erklärter Zweck darin besteht, plattformübergreifend kompatibel zu sein, wie z. B. Elemental, ist es sinnvoller, Zeit in die Verwendung eines plattformübergreifenden Build-Systems zu investieren.
Dies hängt davon ab, wie gut Sie mit dem zu lösenden Problem, den geeigneten Algorithmen, Datenstrukturen, Programmierpraktiken usw. vertraut sind. Ähnlich wie Gliederung und Vorabschreibung für Zeitschriftenartikel hilfreich sind, ist ein gewisses Maß an Brainstorming und Pseudocodierung hilfreich, um gut strukturierten Code zu schreiben. Ich mag den Pseudocode-Programmierprozess in Code Complete von Steve McConnell. Er enthält auch einige Referenzen und Richtlinien, wie viel Zeit je nach Art des Projekts für die Entwurfsphase aufgewendet werden sollte.
Das Schreiben von Wegwerfversionen von Routinen und das Experimentieren mit kurzen Codebits ist ebenfalls sehr hilfreich. Ein häufiger Aphorismus in der Softwareentwicklung ist, dass Sie immer mindestens eine Version Ihres Codes wegwerfen.
Ich neige dazu zu glauben, dass "agile" Entwicklungspraktiken bei den meisten wissenschaftlichen Softwareentwicklungen am besten funktionieren, basierend auf Greg Wilsons Arbeit bei Software Carpentry (Haftungsausschluss: Ich habe mich in der Vergangenheit freiwillig bei ihnen gemeldet). Im Allgemeinen bedeutet "agil", dass Sie sich Ziele setzen sollten, von denen Sie glauben, dass Sie sie in kurzer Zeit erreichen (z. B. ein paar Tage, eine Woche, höchstens einen Monat). Planen Sie, wie Sie diese Ziele durch Pseudokodierung erreichen können und entwerfen, dann Code schreiben und wiederholen. Kurze Zyklen helfen Ihnen dabei, auf Änderungen zu reagieren, z. B. wenn Ihr Berater entscheidet, dass Sie Ihre Arbeit auf eine Weise erweitern sollen, die Sie nicht erwartet haben.
Das hängt alles davon ab, was Sie tun möchten. Für Positionen, die Softwareentwicklung betreffen, ist die Entwicklung einer Open-Source-Codebasis hilfreich, da Sie diese auf GitHub veröffentlichen und darauf verweisen können. Das heißt, wenn Sie es zu einem Softwarepaket machen möchten, das die Leute verwenden werden, müssen Sie einige Zeit damit verbringen, es zu warten. Vielleicht möchten Sie das nicht tun. Das Einbringen Ihres Forschungscodes in relevante bestehende Projekte kann ebenfalls eine gute Option sein. Unternehmen scheinen eine Mischung aus beidem zu wollen. Wenn Sie zum Code anderer Personen beitragen können, zeigt dies, dass Sie ein Teamplayer sind und dass Sie den Code anderer Personen lesen und dennoch etwas Nützliches damit tun können.
In Bezug auf Referenzen ist die Referenzleseliste von Software Carpentry gut auf Wissenschaftler ausgerichtet. Wenn Sie sich eingehender mit der Praxis der Softwareentwicklung befassen möchten, enthält Code Complete (siehe Liste im vorherigen Link) weitere Referenzen, die sich allmählich weiterentwickeln datiert, aber nützlich, um nachzuschlagen. Hilfreich sind auch die Veröffentlichungen zu Best Practices im Bereich wissenschaftliches Rechnen
Der Unterricht in Software Carpentry ist ebenfalls hilfreich. Sie sind Python-zentriert, wenn es um die Programmierung geht, also nehmen Sie das vielleicht mit einem Körnchen Salz, aber die Teile der Versionskontrolle sind einen Blick wert.
quelle