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.
quelle
Antworten:
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?
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 .
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).
quelle
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.
quelle
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.
quelle
Aj
und zu verwenden,T0
da die Variablen in den Funktionen, die ich in Code übersetzte, so benannt wurden. Wenn Sie so etwas wiecorrelationIndex
oder verwendenstartTime
, werden Sie darüber gemurrt.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:
Mehrere der oben genannten Faktoren wirken sich negativ auf die Entwicklung von Unternehmenssoftware aus:
quelle
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.
quelle
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.
quelle