Das C2-Wiki enthält eine Diskussion über empirische Evidenz für objektorientierte Programmierung , die im Grunde zu dem Schluss kommt, dass es keine gibt, die über die Autorität hinausgeht. Dies wurde zuletzt im Jahr 2008 bearbeitet. Die Diskussion hier scheint dies zu bestätigen: Fragen, ob OO veraltet ist , ob funktionale Programmierung eine schlechte Wahl ist und die Vor- und Nachteile von AOP alle mit Meinungen der Mitwirkenden beantwortet werden, ohne auf Beweise angewiesen zu sein.
Natürlich sind Meinungen von etablierten und renommierten Praktikern willkommen und wertvolle Dinge, aber sie sind plausibler, wenn sie mit experimentellen Daten übereinstimmen. Gibt es diese Beweise? Ich weiß, dass evidenzbasiertes Software-Engineering eine Sache ist, aber kann ich es in diesem Zusammenhang üben? Wenn ich ein bestimmtes Problem habe P
, das ich durch das Schreiben von Software lösen möchte, gibt es dann eine Reihe von Kenntnissen, Studien und Forschungsergebnissen, anhand derer ich sehen kann, wie das Ergebnis der Lösung von Problemen P
von der Wahl des Programmierparadigmas abhängt?
Ich weiß, welches Paradigma als "die richtige Antwort" herauskommt, kann davon abhängen, auf welche Metriken eine bestimmte Studie achtet, unter welchen Bedingungen die Studie konstant bleibt oder variiert, und zweifellos auch von anderen Faktoren. Mein Wunsch, diese Informationen zu finden und kritisch zu bewerten, bleibt davon unberührt.
Es wird deutlich, dass einige Leute denken, ich suche nach einer "Kurbel" -Lösung - einer Wurstmaschine, in die ich Informationen über mein Problem einfüge und aus der ein Wort wie "funktional" oder "strukturiert" hervorgeht. Das ist nicht meine Absicht. Was ich suche, ist die Untersuchung, wie - mit vielen Vorbehalten und Annahmen, auf die ich hier nicht eingehen werde, aber eine gute Literatur zu diesem Thema - bestimmte Eigenschaften von Software je nach Problem und Wahl des Paradigmas variieren.
Mit anderen Worten: Einige Leute sagen, "OO bietet bessere Flexibilität" oder "Funktionsprogramme haben weniger Fehler" - (ein Teil von) was ich verlange, ist der Beweis dafür. Der Rest bittet um Beweise dagegen oder um die Annahmen, unter denen diese Aussagen wahr sind, oder um Beweise dafür, dass diese Überlegungen nicht wichtig sind. Es gibt viele Meinungen darüber, warum ein Paradigma besser ist als ein anderes. Gibt es irgendetwas objektives dahinter?
quelle
Antworten:
Für die vorherige Aufnahme siehe Revision 1 dieser Antwort . Die Kommentare und Änderungen an der Frage verdeutlichen jedoch weiter, wonach die Frage sucht, und ermöglichen es mir, klarer zu sein.
Ja, evidenzbasiertes Software-Engineering (EBSE) ist eine Sache. Es scheint einige Anstrengungen in Richtung EBSE-Datenbanken zu geben, wie diese an der Durham University und SEED, die von einem Professor an der Cal Poly ins Leben gerufen wurden . All diese Bemühungen sowie diejenigen, die in einer Reihe von Artikeln besprochen wurden, die über den IEEE Xplore-Server oder die ACM Digital Library verfügbar sind(Abonnement oder Kauf für viele Artikel in beiden erforderlich), basieren auf evidenzbasierter Medizin. Sie bieten Literaturübersichten zu veröffentlichten empirischen Daten (Beobachtung und Experiment). Tatsächlich liefert das Einfügen von "Literaturübersicht" in eine Suchzeichenfolge bei jeder Publikationssuche Informationen zu den meisten Themen - über 14000 Treffer im ACM und über 1000 in der IEEE-Datenbank (wenn nur Computerthemen beschränkt sind).
Wenn ich mir die allgemeinen Arten von Themen anschaue, die in diesen EBSE-Datenbanken und Literaturrecherchen behandelt werden, sehe ich einen roten Faden - sie sind in der Regel technologieunabhängig. Der Schwerpunkt scheint eher auf dem Prozess und der Methodik als auf den spezifischen Tools zu liegen, die für die Durchführung des Software-Engineerings verwendet werden.
Dieses Konzept existiert also in der Softwareentwicklung. Die Wissenschaft ist sich des evidenzbasierten Konzepts bewusst und kann es erfolgreich auf das Software-Engineering anwenden.
Insbesondere scheint die Frage, ob EBSE-Techniken auf die Auswahl eines Paradigmas angewendet werden sollen, schwierig zu sein, da es sich um eine Vielzahl von Variablen handelt, die Annahmen erzwingen und die Fähigkeit zur Wiederholung des Experiments oder der Beobachtung verringern. Er sagte , das Recht in der Frage - „ das Paradigma kommt als‚die richtige Antwort‘kann davon abhängen , welche Messwerten eine bestimmte Studie achtet auf, unter welchen Bedingungen der Studie hält konstant oder variiert, und zweifellos von anderen Faktoren zu“ . Obwohl dies nicht bedeutet, zu untersuchen, welches Paradigma in einer bestimmten Situation "am besten" ist, macht es jede Art von Literaturrecherche dieser Dokumente unglaublich schwierig, Informationen zu vervollständigen und dennoch zu extrahieren.
Es gibt definitiv keine "Turn the Crank" -Lösung für die Auswahl eines Paradigmas.
In Anbetracht eines Programmierparadigmas finden Sie in den verschiedenen akademischen und industriellen Datenbanken Studien darüber, wie dieses Paradigma verschiedene Aspekte der Softwareentwicklung - Qualität, Mängel, Effizienz usw. - unter verschiedenen spezifischen Bedingungen beeinflusst, angefangen vom Wissen und der Erfahrung des Team zur Problemdomäne. Jedes strenge Papier sollte die Bedingungen, unter denen die Daten gesammelt wurden, und die Annahmen klar identifizieren. Das Problem besteht darin, zu versuchen, die Faktoren zu isolieren, die es unter jeder dieser Bedingungen gut machen.
Akademisch gibt es einige Aussagen, die leicht zu recherchieren sind. Die Aussage, dass das Funktionsparadigma gut für Anwendungen geeignet ist, die Parallelität erfordern, stammt beispielsweise aus dem Church-Rosser-Theorem . Aus diesem Grund ist es wahrscheinlich, dass ein in einer funktionalen Sprache geschriebenes Softwaresystem weniger Parallelitätsfehler aufweist als dasselbe in einer prozeduralen oder objektorientierten Sprache geschriebene System.
Aus praktischer Sicht kann ein Softwareteam jedoch nicht immer "das beste" Werkzeug oder die beste Technik für den Job verwenden, nur weil die Forschung dies anzeigt. Obwohl wir uns bemühen, Softwaresysteme von höchster Qualität zu produzieren, arbeiten wir innerhalb von Einschränkungen. Oft sehe ich diese Einschränkungen minimiert (oder sogar aus der Gleichung entfernt), wenn ich die Wirksamkeit einer Methodik diskutiere.
Als Praktiker versuche ich bei der Auswahl der zu verwendenden Technologien, die bestmöglichen Werkzeuge zu identifizieren. Aber dann beschränke ich mich auf das, was das Team, das ich habe, kennt und versteht. Zurück zu meinem vorherigen Beispiel: Wenn ich ein Team habe, das sich mit dem Erstellen gleichzeitiger Anwendungen in C ++ auskennt und keine Erfahrung mit Haskell hat, ist es nicht sinnvoll, das System in Haskell zu erstellen, da ich dies wahrscheinlich nicht tun kann Zeitplan- und Budgetbeschränkungen, und meine Qualität wird wahrscheinlich aufgrund mangelnder Erfahrung in der Toolchain leiden.
Zusammenfassend lässt sich sagen, dass evidenzbasiertes Software-Engineering im Allgemeinen eine gute Sache ist und dass Literaturrecherchen existieren und leicht verfügbar sind. Es gibt jedoch Aspekte des Software-Engineerings, bei denen die Anwendung evidenzbasierter Ansätze wenig Wert bietet. Die Auswahl eines Programmierparadigmas für einen großen Entwicklungsaufwand ist eine davon.
Wenn Sie herausfinden möchten, wie die Objektorientierung Wiederverwendbarkeit oder Mängel in der Funktionsprogrammierung behebt, finden Sie leicht Veröffentlichungen zu diesen Themen. Ich habe jedoch keine Veröffentlichung gefunden (und ich würde auch kein gewisses Vertrauen in sie setzen), die in der Lage ist, die Paradigmenauswahl in einem breiten Spektrum realer Softwareentwicklungsprojekte effektiv anzugehen.
quelle
Ich habe The Art of Unix Programming von Eric S. Raymond gelesen . Es enthält einige sehr interessante historische Einblicke in Dinge, die wir heute für selbstverständlich halten. Er zitiert einige gute Studien aus IEEE-Software , die empirische Belege wie die Defektdichte verwenden. Das könnte eine gute Quelle sein, wenn Sie nach Studien im akademischen Stil suchen.
Selbst Techniken wie das Modularisieren mit Funktionen waren nicht immer üblich. Eines meiner Lieblingszitate aus dem Buch:
Es gibt jedoch zwei Probleme, zu empirisch zu werden. Das erste ist, dass die Codequalität eine sehr subjektive Sache ist. Code kann schrecklich und trotzdem korrekt sein. Die Wahrnehmung eines Programmierparadigmas durch die Menschen ist eine sehr gültige Metrik, da Code so geschrieben ist, dass die Menschen genauso viel lesen können wie für Computer, wenn nicht sogar mehr.
Das zweite Problem ist, dass 50% der Entwickler unterdurchschnittliche Programmiertalente haben. Es spielt keine Rolle, ob Ihr Top-Entwickler mit funktionaler Programmierung produktiver ist, wenn das "Gesindel" Schwierigkeiten hat, funktionierende Software damit zu schreiben , geschweige denn schöne, gut strukturierte Software. Ebenso wird Ihr Top-Entwickler mit TMTOWTDI- Programmiersprachen weiterhin sauberen, modularen Code schreiben, aber weniger talentierte Codierer schreiben aufgrund des Mangels an auferlegter Struktur Zeilenrauschen .
Aus diesem Grund denke ich, dass OOP trotz seiner Mängel an Popularität gewonnen hat. Es ist nicht so restriktiv, dass es die talentiertesten humpelt, aber seine Struktur bietet eine präzise Möglichkeit, zu kommunizieren und den am wenigsten talentierten Menschen gute Designprinzipien aufzuzwingen.
In unserer Arbeit tendieren wir dazu, eine Lösung allein aufgrund ihrer technischen Vorzüge zu stark zu bewerten. Ein erfolgreiches Unterfangen muss auch die menschliche Seite der Gleichung berücksichtigen.
quelle
Es gibt Programmierwettbewerbe, die ein Computer-Bewertungssystem verwenden und es Ihnen ermöglichen, in verschiedenen Sprachen zu schreiben und alle Arten von Ergebnissen und Dingen zu veröffentlichen. Ich wette, sie haben gute Daten für Sie. Hier ist eine Liste von 8: http://www.makeuseof.com/tag/8-onlineprogramming-contests-challenge-win/
Ich stelle mir vor, Sie können aussagekräftige Vergleiche von Lösungen für sehr einfache und eindeutige Probleme wie Quadratsummen oder Fibonacci-Reihen anstellen oder mit dem Bresenham-Linienalgorithmus eine gerade Linie zeichnen. Die meisten realen Programmieraufgaben haben keine so klaren Zielpfosten und jede Sprache hat ihre Schwachstellen. Ein Großteil des Nutzens einer Sprache ist subjektiv. Möglicherweise finden Sie aussagekräftigere Daten, wenn Sie die Zufriedenheit von Programmierern und Kunden untersuchen, als indem Sie Codezeilen oder die Anzahl der Fehler zählen.
Ich erinnere mich, als ich einen halben Tag damit verbracht habe, eines meiner ersten Awk-Programme zu schreiben, dachte ich, ich hätte eine ganze Woche gebraucht, um das "Gleiche" in Java zu tun. Aber das liegt daran, dass sich meine Java-Lösung darauf konzentriert hätte, robust zu sein, da die Awk-Lösung schnell und schmutzig war und einige manuelle Anpassungen an Eingabe und Ausgabe erforderte und wirklich weggeworfen wurde, als ich fertig war. Awk und Java sind beide großartig, nur nicht für die gleichen Dinge.
Ich denke, was ich damit sagen will, ist, dass es für reale Anwendungen äußerst schwierig ist, Sprachen oder Werkzeuge auf sinnvolle Weise zu vergleichen - das Problem der alten Äpfel und Orangen. Viel Glück! Ich würde gerne sehen, was Sie herausfinden.
quelle
Ich habe über 30 Jahre lang verschiedene Möglichkeiten zur Entwicklung von Software untersucht. Es gibt einen Mangel an guten veröffentlichten Beweisen für die Wahl eines Paradigmas.
Ich habe eine große durchsuchbare ASCII-Bibliographie zusammengestellt. Dies umfasst viele IEEE- und ACM-Artikel und -Artikel. Ich beschrifte die Gegenstände mit der Art der bereitgestellten Beweise. Hier sind die häufigsten Tags:
Suchen Sie nun nach PARADIGM und zählen Sie die Tags
Wenn Sie tiefer graben möchten, http://cse.csusb.edu/dick/lab.html und ich hoffe, es hilft ...
quelle
Es scheint, dass es in vielen Fällen keinen Forschungsbestand gibt, der groß genug oder von ausreichender Qualität ist, um allgemeine Schlussfolgerungen darüber zu ziehen, ob eine Praxis in der Softwareentwicklung besser ist als eine andere. Ich habe speziell nach Forschungen gesucht, um in verschiedenen Paradigmen zu arbeiten, aber die mangelnde Verfügbarkeit ist nicht auf diesen Bereich beschränkt, daher werde ich meine Antwort im weiteren Sinne formulieren.
In einem Artikel aus dem Jahr 2004, Evidence-Based Software Engineering von Kitchenham et al. , Werden die Vorteile eines evidenzbasierten Ansatzes und die Probleme bei der Implementierung in das Software-Engineering auf den Punkt gebracht. Ich werde hier nicht auf die Vorteile eingehen (aus der Frage geht hervor, dass ich auf diese Weise arbeiten möchte), aber die Probleme sind als Antwort auf die von mir gestellte Frage relevant.
Die Antwort, nach der ich suche, ist "Nein". Die Beweise, nach denen ich suche, existieren wahrscheinlich nicht. Ich sollte mein Paradigma basierend auf den bestehenden populären Kriterien wählen, was ich weiß, was cool ist und Expertenmeinung.
quelle
Ich glaube nicht, dass diese Art von Studie existiert. Man würde glauben, dass nicht das Programmierparadigma so wichtig ist wie der tatsächlich verwendete Algorithmus. Zum Beispiel würde bei einem nicht trivialen System, das sich auf Algorithmen mit kleinem Raum stützt, ein System, das sich auf Algorithmen mit kleiner Zeit stützt, unterschiedliche Metriken erzeugen. Derjenige, der die bessere Zeit hat, wird höchstwahrscheinlich als gültiger angesehen, es sei denn, Platz ist ein Problem, dann ist das Gegenteil der Fall. Ich finde es ähnlich wie das Pflastern einer Straße. Während der Algorithmus oder das Rezept für die Herstellung der Materialien während aller Prozesse konstant ist, ist es möglich, dass ein Unternehmen zwei Fahrspuren gleichzeitig (eine auf jeder Straßenseite) für besser hält als zwei Fahrspuren gleichzeitig auf derselben Straßenseite . Am Ende des Tages spielt es keine Rolle, da der Prozess der Herstellung des schwarzen Oberteils immer noch der gleiche ist. Der einzige Unterschied ist der Ansatz. Zurück zur Programmierung: Wenn Sie ein Team von C-Entwicklern haben, schreiben Sie den Code prozedural. Wenn Sie ein Team von Java-Entwicklern haben, schreiben Sie ihn in OO. Lassen Sie sich nicht so sehr auf das Paradigma ein, sondern auf die Implementierung des Algorithmus. Denn am Ende des Tages können Sie Java wie C schreiben und versuchen, C wie Java zu schreiben.
AKTUALISIEREN
Um auf den Kommentar zu antworten, hat Graham mich verlassen:
Ich nehme an, mit Architektur meinen Sie das Programmierparadigma. Wenn Sie Clojure verwenden möchten, sollten Sie möglicherweise ein Team von Clojure-Programmierern einstellen. Basierend auf einer Schnellsuche ist Clojure jedoch eine Java-basierte Sprache, die zufällig funktioniert. Angesichts dieser Informationen würde ich die Java-Programmierer nehmen (da sie technisch nur Java schreiben können und es Ihnen die gleichen Ergebnisse liefert) oder nach funktionalen Programmierern wie Haskell-Entwicklern suchen. Bei der Auswahl der besten Produkte hängt dies vollständig von Ihrem Team ab. Ich würde niemals ein Team von Experten für relationale Datenbanken eine Cloud-Lösung für mich organisieren lassen, noch würde ich ein Team von funktionalen Programmierern eine objektorientierte Lösung für mich entwickeln lassen. Sie müssen die Stärken des Teams nutzen, Sie haben nicht die verherrlichte Vision, die Sie in Ihrem Kopf haben, für das, was ein Team "sollte".
quelle
Unterschiedliche Paradigmen führen zu unterschiedlichen Lösungen. Welche Passform am besten ist, hängt weitgehend ab von:
Ich kenne keine solche endgültige Studie, und selbst wenn es eine gäbe, würde ich ihr nicht vertrauen.
Das ist die Aufgabe des Architekten.
Die Weisheit des Architekten durch die möglicherweise irrelevanten Schlussfolgerungen einer Studie zu ersetzen, ist ein Rezept für eine Katastrophe.
Hinweis: In einem Kommentar wird erwähnt, dass Sie sich für "den Algorithmus" entscheiden und dann die Sprache auswählen. Algorithmen sind der zentrale Strukturmechanismus für prozedurale Sprachen. Objektorientierte Sprachen konzentrieren sich auf Klassen und Muster der Zusammenarbeit / Kommunikation. Wenn Sie (als Architekt) davon überzeugt sind, dass eine algorithmisch ausgerichtete Lösung „am besten“ ist, bleiben Sie bei prozeduralen oder funktionalen Sprachen.
Nachtrag: Studien nicht zu vertrauen ist kein Aberglaube, es ist gesunder Menschenverstand. Wissenschaftliche Experimente müssen objektiv und wiederholbar sein. Softwareprojekte sind sehr subjektiv, aber noch schlimmer, sie sind unwiederholbare Experimente . Sie können ein Projekt X einfach nicht mit Team Y implementieren, die Ergebnisse messen und dann die Zeit zurücksetzen, Erinnerungen löschen und dasselbe Projekt mit demselben Team erneut ausführen. Informationen, die durch Studien entdeckt oder impliziert wurden, können für den Architekten nützlich sein, sie können jedoch niemals endgültig sein.
quelle