Ist wissenschaftlicher Code ein Bereich, der unterschiedlich genug ist, um gängige Kodierungsstandards zu ignorieren?


21

In letzter Zeit habe ich versucht, über die folgende Tatsache nachzudenken.

Einerseits gibt es eine Vielzahl von Kodierungsrichtlinien und -standards für Code, der als "gesund", "sauber", "gut geschrieben" usw. gilt. Lesen Sie auch den "Clean Code", der anscheinend auch hier ausführlich behandelt wird. Beispielregel: 7 Zeilen lange Methoden und 1 oder 2 Einrückungsstufen. Es wird erwartet, dass Code, der nicht folgt, an schlechter Wartbarkeit stirbt.

Andererseits kann ich mit OpenCV, OpenCascade, VTK usw. arbeiten. Das ist wissenschaftlicher Code. Sie haben 2-seitige Methoden (ich selbst), OpenCascade hat eine Methode oder eine Klasse, die in 10 Dateien aufgeteilt ist (keine Witze hier), VTK ist manchmal auch ein Chaos. Doch diese Projekte gedeihen, werden gepflegt und weit verbreitet!

Wo ist der Haken? Dürfen wir wissenschaftlichen, mathematischen Code so schreiben, dass er einfach funktioniert und wir ihn beibehalten können? Handelt es sich bei solchen Projekten um separate Standards?

Könnte eine naive Frage sein, aber ich bin in einer scheinbar leeren Programmierphase und versuche, Regeln aufzustellen, wie man Dinge macht und nicht, wie man mir beigebracht hat, an der High School zu arbeiten. Seit ich meinen Abschluss gemacht habe, habe ich fast keine Richtlinienunterstützung für die Dinge, die ich zu tun hatte, hauptsächlich für das Programmieren - niemand stört sich daran, dies zu lehren.


25
Nein, ist es nicht, aber die meisten Wissenschaftler haben nicht die technische Ausbildung, um es besser zu wissen.
Gort the Robot

4
In jedem Projekt, das es schon eine Weile gibt, finden Sie eine Tonne Code, der schlecht geschrieben ist, aber gut genug zu funktionieren scheint, dass sich niemand die Mühe macht, zurückzugehen und ihn zu bereinigen. Manchmal liegt das daran, dass sich Standards und Muster im Laufe der Zeit weiterentwickeln, manchmal daran, dass Standards nicht einheitlich durchgesetzt wurden, manchmal daran, dass das Hinzufügen neuer Funktionen viel mehr Spaß macht, als ein funktionierendes, aber schlechtes Stück Code neu zu gestalten dokumentiert.
Justin Cave

2
@JustinCaveL Oder: "Wenn es nicht kaputt ist, repariere es nicht." Besonders anwendbar auf Nur-Schreib-Code . Siehe auch plaza.ufl.edu/johnaris/PDFs/ProblemSolvingFlowChart.pdf
Robert Harvey

Sie werden sicherlich meine frühere Frage relevant finden: programmers.stackexchange.com/q/266388/620
rwong

8
Mitbeantworter: Diese Frage bezieht sich auf die Codebasis von Open-Source-Bibliotheken für rechenintensive Aufgaben in einem oder mehreren wissenschaftlichen Bereichen . Bei dieser Frage geht es nicht um Wegwerfcode. Bitte machen Sie eine kurze Pause, um sicherzustellen, dass Sie alle hervorgehobenen Aspekte erfassen, bevor Sie eine Antwort schreiben. Vielen Dank.
Rwong

Antworten:


28

Ist wissenschaftlicher Code ein Bereich, der unterschiedlich genug ist, um gängige Kodierungsstandards zu ignorieren?

Nein, ist es nicht.

Forschungscode wird oft "weggeworfen" und von Leuten geschrieben, die keine Entwickler sind, unabhängig von ihrer akademischen Qualifikation. Ein Teil des Forschungscodes, den ich geschrieben habe, würde mich zum Weinen bringen . Aber es hat geklappt!

Eine Sache, die zu berücksichtigen ist, ist, dass die Gatekeeper der Projekte das vorantreiben, was enthalten ist. Wenn ein großes Projekt begann als wissenschaftliches / Forschung Code - Projekt, Arbeits endet, und ist jetzt ein Chaos, hat jemand die Initiative zu ergreifen , es Refactoring.

Es ist sehr aufwändig, vorhandenen Code zu überarbeiten, der keine Probleme verursacht. Vor allem, wenn es überhaupt domänenspezifisch ist oder keine Tests hat. Sie werden sehen, dass OpenCV einen Stilleitfaden hat , der sehr umfassend ist, auch wenn er nicht perfekt ist. Rückwirkend auf den gesamten vorhandenen Code anwenden? Das ist nichts für schwache Nerven.

Dies ist noch schwieriger, wenn der gesamte Code funktioniert. Weil es nicht kaputt ist. Warum das Problem beheben?

Doch diese Projekte gedeihen, werden gepflegt und weit verbreitet!

Dies ist in gewissem Sinne die Antwort. Arbeitscode ist immer noch nützlich und wird daher mit größerer Wahrscheinlichkeit beibehalten.

Es könnte ein Durcheinander sein, besonders am Anfang. Einige dieser Projekte begannen wahrscheinlich als einmaliges Projekt, "das niemals wiederverwendet werden müsste und weggeworfen werden könnte".

Bedenken Sie auch, dass es bei der Implementierung eines komplexen Algorithmus sinnvoller sein kann, über größere Methoden zu verfügen, da Sie (und andere mit der wissenschaftlichen Seite vertraute Personen) den Algorithmus konzeptionell besser verstehen können. Meine Abschlussarbeit befasste sich mit Optimierung. Die Hauptalgorithmuslogik als eine Methode zu haben, war wesentlich einfacher zu verstehen, als sie auseinanderzubrechen versucht hätte. Dies verstieß zwar gegen die Regel "7 Zeilen pro Methode", bedeutete jedoch auch, dass ein anderer Forscher meinen Code einsehen und meine Änderungen am Algorithmus schneller verstehen konnte.

Wenn diese Implementierung weg abstrahiert und gut entworfen würde, würde diese Transparenz für Nicht-Programmierer verloren gehen .

Mitbeantworter: Diese Frage bezieht sich auf die Codebasis von Open-Source-Bibliotheken für rechenintensive Aufgaben in einem oder mehreren wissenschaftlichen Bereichen. Bei dieser Frage geht es nicht um Wegwerfcode. Bitte machen Sie eine kurze Pause, um sicherzustellen, dass Sie alle hervorgehobenen Aspekte erfassen, bevor Sie eine Antwort schreiben.

Ich denke, die Leute haben oft die Idee, dass alle Open-Source-Projekte wie folgt beginnen: "Hey, ich habe eine großartige Idee für eine Bibliothek, die sehr beliebt ist und von Tausenden / Millionen von anderen genutzt wird", und dann geschieht jedes Projekt so.

Die Realität ist, dass viele Projekte gestartet werden und sterben. Ein lächerlich kleiner Prozentsatz von Projekten "schafft" es auf die Ebene von OpenCV oder VTK usw.

OpenCV startete als Forschungsprojekt von Intel. Wikipedia beschreibt es als Teil einer "Reihe von Projekten". Seine erste Nicht-Beta-Version war 2006 oder sieben Jahre nach dem ersten Start. Ich vermute, dass das Ziel anfangs aussagekräftige Beta-Versionen waren, nicht perfekter Code.

Außerdem hat sich die "Eigentümerschaft" von OpenCV erheblich geändert. Dies führt zu Änderungen der Standards, sofern nicht alle Verantwortlichen dieselben Standards anwenden und diese für die Dauer des Projekts beibehalten.

Ich sollte auch darauf hinweisen, dass es OpenCV schon einige Jahre gab, bevor das Agile Manifest, von dem Clean Code inspiriert ist, veröffentlicht wurde (und VTK fast 10). VTK wurde 17 Jahre vor der Veröffentlichung von Clean Code gestartet (OpenCV war "nur" 9 Jahre zuvor).


2
Ich habe OpenCV 2004 benutzt und es war schrecklich. Willow Garage (neue Besitzer ) hat großartige Arbeit geleistet, indem sie fast alles in C ++ konvertiert hat. Tatsächlich ist es eine der wenigen wissenschaftlichen Bibliotheken, die aus gutem Code bestehen.
Nimcap

15

Wissenschaftler sind keine Entwickler. Ihre Aufgabe ist es nicht, Code per se zu schreiben. Ihre Aufgabe ist es, Probleme zu lösen, und die Programmierung ist nur eines der Tools, die sie möglicherweise verwenden.

Der Großteil des Unternehmenscodes, der von professionellen Entwicklern geschrieben wurde - wie sie sich nennen würden -, ist ein Durcheinander. Der größte Teil dieses Codes verwendet keine Entwurfsmuster oder missbraucht sie. Die meisten Kommentare sind Kandidaten für TheDailyWTF . Da wir in unserer eigenen Branche solche Ergebnisse von Menschen sehen, deren Aufgabe darin besteht, Code zu schreiben, was würden Sie von Menschen erwarten, deren Aufgabe es ist, keine Programme zu schreiben?

Würden alle Praktiken, die eine tatsächliche professionelle Entwicklerin während ihrer Karriere lernt, einer Wissenschaftlerin zugute kommen? Absolut. Wäre es für jede Wissenschaftlerin möglich, fünf bis zehn Jahre ihres Lebens damit zu verbringen, Software zu entwickeln? Wahrscheinlich nicht. Daher ist die Codequalität unverändert.

Ein weiterer Faktor ist die Kultur. Wenn Ihre Paare keinen sauberen Code schreiben, warum sollten Sie das tun? Da es niemanden interessiert, sind Sie nicht wirklich geneigt, zusätzliche Anstrengungen zu unternehmen.

Schließlich hat der meiste wissenschaftliche Code eine relativ kurze Lebensdauer. Sie schreiben Code für eine bestimmte Recherche, und wenn die Recherche abgeschlossen ist, verwenden Sie den Code nicht mehr. Sobald Sie diese Angewohnheit haben, ist es schwierig, einen Unterschied zwischen wiederverwendbaren Bibliotheken wie den von Ihnen zitierten und dem Wegwerfcode zu machen.


"Ihre Aufgabe ist es nicht, Code per se zu schreiben. Ihre Aufgabe ist es, Probleme zu lösen ." Seine Aufgabe ist es, ähnlich wie die des Wissenschaftlers, Probleme zu lösen. Ich schließe Software-Fabriken und Code-Affen aus, die dafür bezahlt werden, Stühle warm zu halten, aber per Definition interessieren sie sich auch nicht für sauberen Code, daher sind sie für diese Frage nicht relevant :)
Andres F.

8

Ignorieren? Nein. Überlegen und anpassen? Sicher. Viele wissenschaftliche Codes sind mathematikintensiv und leistungskritisch. Dinge wie der Overhead von Funktionsaufrufen können tatsächlich zu einem Problem werden, sodass Sie möglicherweise tiefer verschachtelte Strukturen haben als in einer typischen kommerziellen App. Das bedeutet nicht, dass Sie mit dem Kopf voran in tausend Mikrooptimierungen eintauchen sollten. Sie sollten sich weiterhin auf die Auswahl des richtigen Algorithmus konzentrieren und nur Optimierungen vornehmen, deren Wirkung Sie messen können.

Einige der Unterschiede sind offensichtlich und trivial. Die Kodierungsrichtlinien verlangen normalerweise die Auswahl aussagekräftiger Variablennamen, und Einzelbuchstaben werden sofort verdächtig. Eine wissenschaftliche Anwendung benötigt weiterhin aussagekräftige Variablennamen, aber manchmal ist der aussagekräftigste Name ein einzelner Buchstabe, der sich auf eine Variable in einer bekannten Gleichung bezieht.


4
+1 für den Variablenbenennungskommentar. Als ich in der Schule war, habe ich einige freie Codierungen für verschiedene Abteilungen durchgeführt, und in den Abteilungen Statistik und Mathematik wurde mir "nachdrücklich empfohlen", Variablennamen wie Ajund zu verwenden, T0da die Variablen in den Funktionen, die ich in Code übersetzte, so benannt wurden. Wenn Sie so etwas wie correlationIndexoder verwenden startTime, werden Sie darüber gemurrt.
TMN

4

Alle vorhandenen Antworten hatten diese Frage umfassend abgedeckt. Ich möchte jedoch darauf hinweisen, was der wahre Antipode zwischen OpenCV usw. und Code ist, der nach bewährten Geschäftspraktiken entwickelt wurde (Code Complete, Clean Code, SOLID usw.).

Im Allgemeinen bietet KISS eine Menge geschäftlicher Vorteile für den Quellcode - "halte es einfach, dumm". Es gibt auch eine verwandte YAGNI - "Du wirst es nicht brauchen".

Leider ist der Quellcode für rechenintensive Software im wissenschaftlichen Bereich selten einfach oder mager .


OpenCV litt traditionell unter einem Mangel an Verallgemeinerungen (viele Code-Duplikationen zur Unterstützung verschiedener Optionen), während VTK unter übermäßigen Verallgemeinerungen (Vorlagen) litt.

In den Anfängen wurden bestimmte Teile von OpenCV ursprünglich in C entwickelt. Später übernahm OpenCV die C ++ - API, die wir heute kennen. Einige Algorithmen wurden neu geschrieben, um die Vorteile von C ++ - Schnittstellen (abstrakte Basisklassen) und C ++ - Vorlagen zu nutzen. Andere Algorithmen waren einfach Wrapper für den ursprünglichen C-Code. Reste dieses Codes sind im Modul "imgproc" verstreut zu finden.

OpenCV enthält viele SIMD-Programme (Vektorisierung). Bis heute erfordert die SIMD-Programmierung in C ++ die Verwendung von intrinsics (intel.com) , (arm.com) .

SIMD-Eigenheiten lesen sich wie Assemblersprachen, außer dass der Compiler sich um die Registerzuweisung von Variablen kümmert und dem Compiler die Möglichkeit eingeräumt wird, die Anweisungsreihenfolge für Leistungssteigerungen auszutauschen. Für die Verwendung von SIMD-Intrinsics geschriebene Algorithmen hatten hohe Wartungskosten. Aus diesem Grund habe ich eine Frage angesprochen, die ich zuvor gestellt habe - Wartungskosten für die SIMD-Programmiercodebasis .

Eine Person, die keine SIMD-Programmierung durchführt, kann leicht glauben, dass SIMD elegant gekapselt werden kann und dass keine einfache SIMD-Programmierung mehr erforderlich sein sollte. Dies ist eigentlich ziemlich weit von der Wahrheit entfernt. Ich würde jeden herausfordern, einen nützlichen Algorithmus in SIMD (nicht in Fraktalen) zu implementieren und die Schwierigkeiten bei der Verwendung dieser vorgeschlagenen Kapselungen zu erkennen.


Nachstehend finden Sie eine lange Liste von Ideen, wenn ich zu analysieren versuche, warum Computersoftware nicht KISS oder YAGNI sein kann. Alle diese Ideen sind jedoch Überverallgemeinerungen und scheinen die obige Beobachtung nicht zu stützen.

Die wichtigsten Faktoren sind:

  • Software-Leistung
  • Die Notwendigkeit, viele Algorithmusoptionen und Kompromisse zu unterstützen
  • Die Notwendigkeit, viele verschiedene Hardwareplattformen und Compiler zu unterstützen
    • Dies hängt mit dem Problem der Softwareleistung zusammen - die Leistung muss für viele Hardwareplattformen und Compiler gut sein.
  • Das Fehlen einer fortlaufenden Modernisierung der Codebasis aufgrund von Ressourcenmangel, Mangel an sachkundigen Personen, die die Codequalität verbessern können, ohne die anderen Faktoren zu beeinträchtigen, usw.
    • Open-Source-Projekte leiden unter der Tragödie der Allgemeinheit .
    • Open-Source-Projekte, die Zuschüsse erhalten, mussten bestimmte Leistungen erbringen - Codequalität ist normalerweise nicht Teil davon.
    • Insbesondere fehlt es sogar an Fachleuten, die schrittweise Verbesserungen der Codequalität vornehmen oder vorschlagen können . Dies ist das Problem der "fehlenden Augäpfel" - viele Menschen profitieren vom Code, aber nur wenige haben Zeit gebraucht, um den Code zu lesen.
  • Historischer Mangel an Codequalitätstoren wie Codeüberprüfung, Komponententests, statische Analyse usw.
    • Für ein umfangreiches Projekt sind diese Codequalitäts-Gates nicht nur manuelle Schritte - sie erfordern jeweils eine Infrastruktur (ein webbasiertes System, ein Komponententestsystem, ein Build-Automatisierungssystem usw.).

Mehrere der oben genannten Faktoren wirken sich negativ auf die Entwicklung von Unternehmenssoftware aus:

  • In der Regel muss Unternehmenssoftware nicht mit dem gleichen hohen Datendurchsatz wie Computersoftware umgehen.
  • Unternehmenssoftware kann an ein einzelnes Betriebssystem und eine einzelne Computerarchitektur gebunden werden.
  • Unternehmenssoftware kann sparsam bei der Entscheidung sein, welche Funktionen einbezogen werden sollen. Tatsächlich ermutigt die Entwicklung von Unternehmenssoftware Manager, zu neuen Funktionen Nein zu sagen, es sei denn, es gibt ein gutes Geschäftsmodell.
    • Benutzer interner Unternehmenssoftware können geschult werden, um die Dinge anders zu machen, ohne Codeänderungen vornehmen zu müssen.
    • Wenn eine kommerzielle Unternehmenssoftware aufgrund eines fehlenden Features einen Kunden verliert, aber aufgrund der verbesserten Einfachheit und Benutzerfreundlichkeit zwei neue Kunden gewinnt (siehe "Das Paradox der Wahl" ), ist dies insgesamt ein Nettogewinn - es ist ein guter was dieses eine Feature fehlt.
  • Unternehmenssoftware wird von einer kontinuierlichen Einnahmequelle unterstützt, sodass es sich leisten kann, einen Teil davon für die kontinuierliche Modernisierung der Codebasis aufzuwenden.

1
Sie bringen eine Menge Punkte auf den Tisch, die alle für die Frage ziemlich irrelevant erscheinen.
Martin Maat

@MartinMaat Wenn Sie positive Dinge zu dieser Frage hinzufügen möchten, schreiben Sie diese bitte in Ihre eigene Antwort.
rwong

3

Ist wissenschaftlicher Code ein Bereich, der unterschiedlich genug ist, um gängige Kodierungsstandards zu ignorieren?

Dies hängt davon ab, was Sie als "gemeinsame Codierungsstandards" bezeichnen. Ich würde die Extreme von Agile nicht als "gewöhnlich" bezeichnen. Insbesondere eine Funktion, die acht Zeilen lang ist, um zu lang zu sein, oder die mehr als zwei Einrückungsebenen aufweist, um zu komplex zu sein, sind lächerliche Standards im Bereich der numerisch / wissenschaftlichen Programmierung.

Eine sehr einfache Matrix-mal-Matrix-Funktion besteht aus mehr als sieben Zeilen und hat drei Einrückungsstufen. Die Funktion wird erheblich komplexer als diejenige, bei der es um Effizienz geht. Dies ist eine so häufige Operation, dass Effizienz wichtig ist. Zerlegen ist genau das, was Sie nicht tun möchten. Eine Matrixzerlegung wird noch komplexer.


2
"Agile" hat nichts mit Codierungsstandards zu tun.
Gort the Robot

@StevenBurnap - Sicher ist es. Schauen Sie sich "Clean Code" an. Es enthält unzählige Kodierungsstandards.
David Hammen

1
Sauberer Code mit vielen Codierungsstandards ist ein schlechtes Argument. Das Agile-Manifest hat möglicherweise nichts mit Codierungsstandards zu tun, aber Agile fördert die Flexibilität und unterstützt es, auf Änderungen und das Festhalten an Codierungsstandards oder Best Practices zu reagieren. Auf sehr indirekte und umsichtige Weise hat Agilität vielleicht nichts mit Codierungsstandards zu tun, aber Codierungsstandards haben viel mit Agilität zu tun.
Marjan Venema

1

Ich habe mich entschlossen, dies als neue Antwort zu veröffentlichen, weil es eine völlig andere Perspektive ist.

Werfen wir einen Blick auf ein Codebeispiel, das ich als "sauberen Code" im Hinblick auf Computer Vision und Bildverständnis betrachte:

https://github.com/opencv/opencv/blob/05b15943d6a42c99e5f921b7dbaa8323f3c042c6/modules/photo/src/seamless_cloning_impl.cpp

Für diejenigen, die mit MATLAB und wissenschaftlichem Rechnen vertraut sind, ist der Code in C ++ fast so präzise wie der sauberste MATLAB-Code.


Nun müssen wir uns fragen, warum nicht die gesamte Bibliothekscodebasis (in diesem Beispiel OpenCV) auf den gleichen Standard wie dieses Codebeispiel geschrieben ist.


Wir müssen stratifizieren eine große wissenschaftliche Bibliothek Code - Basis in Abstraktionsebenen .

Auf der niedrigen Ebene implementieren Sie Additionen und Subtraktionen buchstäblich neu. Oder ordnen Sie buchstäblich jede Operation den schnellsten Implementierungen auf jeder Plattform zu.

https://github.com/opencv/opencv/blob/master/modules/core/src/hal_replacement.hpp

In der mittleren Ebene finden wir den "schmutzigsten" Code, innerhalb dessen möglicherweise 80% - 90% der CPU-Ausführungszeit ausgegeben werden. (In ähnlicher Weise wurden 80% - 90% des Entwicklungsaufwands auf mittlerer Ebene aufgewendet, wenn der Aufwand für die Softwareentwicklung von der wissenschaftlichen Forschung getrennt gezählt wird.)

Auf der hohen Ebene haben wir den saubersten Code, der von Forschern geschrieben wurde.


Eine hervorragende Organisation des Quellcodes ist erforderlich, um sicherzustellen, dass sich diese Ebenen nicht mischen. Dies geht über die Kodierungsstandards hinaus und hat mehr mit Open Source Stewardship zu tun .

Beispielsweise wird manchmal die Entscheidung getroffen, ein Open-Source-Projekt in zwei zu teilen. Sie können diese Dinge nicht durch Code-Commits ausführen.

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.