Vor vielen Jahren sprach ich mit einem Wirtschaftsprofessor über Entwurfsmuster, wie sie eine gemeinsame Sprache für Programmierer etablierten und wie sie bekannte Probleme auf nette Weise lösten, usw. usw.
Dann sprach er mich an, dass dies genau das Gegenteil von dem ist, was er für seine Wirtschaftswissenschaftler verwenden würde. Normalerweise stellte er ein Problem vor und bat sie, zuerst eine Lösung zu finden, damit sie zuerst darüber nachdenken und nach Wegen suchen konnten, das Problem zu lösen. Erst danach stellte er die "klassische" Lösung vor.
Ich überlegte, ob der "Design Pattern" -Ansatz Programmierer wirklich schlauer oder langweiliger macht, da sie oft nur die "richtige Lösung für dieses Problem" finden, anstatt vielleicht Kreativität und Fantasie einzusetzen, um ein Problem in einem zu lösen neue und innovative Art und Weise.
Was denkst du?
quelle
Antworten:
Ihr Wirtschaftsprofessor ist absolut korrekt.
Software Design Patterns sind in erster Linie eine Möglichkeit für erfahrene Softwareentwickler, miteinander zu kommunizieren . Sie sind eine Abkürzung für etablierte Lösungen für bekannte Probleme.
Sie sollten jedoch nur von Personen verwendet werden, die verstehen, wie das Problem ohne das Muster gelöst werden kann, oder die sich selbst ein ähnliches Muster ausgedacht haben. Andernfalls treten dieselben Probleme auf wie beim Kopieren / Einfügen. Sie verfügen über Code, verstehen jedoch nicht, wie er funktioniert, und können daher keine Fehlerbehebung durchführen.
Viele der Entwurfsmuster sind auch Unternehmensmuster , Muster, die in großen Unternehmenssoftwaresystemen verwendet werden sollen. Wenn Sie die Wunder des Inversion of Control-Containers kennen, möchten Sie ihn in jedem Programm verwenden, das Sie schreiben, auch wenn die meisten Programme ihn tatsächlich nicht benötigen (es gibt bessere Möglichkeiten, Ihre Abhängigkeiten in kleinere Programme einzubringen, die nicht funktionieren) (benötigt keinen IoC-Container).
Lerne die Muster. Verstehen Sie die Muster und ihre angemessene Verwendung. Wissen, wie man dasselbe Problem ohne das Muster löst (alle Softwaremuster sind Abstraktionen über grundlegende Algorithmen). Dann sind Sie in der Lage, Software-Patterns mit Zuversicht zu verwenden, wenn dies sinnvoll ist.
quelle
Die Art und Weise, wie die Leute von Design Patterns möchten, dass Sie Design Patterns betrachten, ist eine Reihe von Lösungen, die Sie anwenden können, wenn ähnliche Probleme auftauchen. Sie möchten nicht, dass Sie sie als die einzig möglichen Lösungen ansehen, die Gott Moses in Steintafeln auf dem Berg geschnitzt hat.
Leider halten manche Leute sie eher für heilige Schriften als für eine Reihe von Beispielentwürfen, aus denen man lernen könnte. Das tötet die Kreativität und schafft einen Frachtkult.
Ihr Wirtschaftsprofessor hat erwähnt, dass er die Schüler mit dem Problem konfrontiert und sie zuerst versuchen lässt, es zu lösen. Dies ist eine gute Lernmethode, aber er hatte eine Lösung, um es ihnen zu zeigen. Eine Reihe von Lösungen für viele verschiedene Probleme im Kopf zu haben, ist eine gute Sache, und es ist etwas, was Design Patterns zu sein versucht. Ich denke, es scheitert in gewisser Weise (Singleton ermutigt zu schlechten Ansätzen, ein kurzsichtiger Fokus auf imperative OO usw.), aber es könnte gut mit Intelligenz und Geschmack verwendet werden. Es ist jedoch ein Fehler zu glauben, dass jede mögliche Beispiellösung in Software ein offizielles Entwurfsmuster sein muss.
Wenn Sie sich ein Problem ansehen und sich fragen, was das Entwurfsmuster dafür ist, dann machen Sie es falsch, und es ist weniger wahrscheinlich, dass Sie eine Lösung finden, die Ihnen ins Gesicht blickt.
Wenn Sie sich ein Problem ansehen und sich fragen: "Wie kann ich das lösen?", Wird es angezeigt, wenn es keine Musterlösung gibt. Wenn ein Muster passt, wird es auch angezeigt.
quelle
Ich denke auch, dass Ihr Wirtschaftsprofessor richtig ist und das ist eine Möglichkeit, überhaupt etwas zu lernen. Sehen wir uns jedoch wie folgt um: Würden Sie das Rad geheim halten und alle es der Kreativität zuliebe neu erfinden lassen ? Ich erwarte von dir, dass du Nein sagst, weil nicht alle Menschen dazu fähig sind, ihre Räder zu erfinden - und wenn sie es irgendwann tun, spielt es keine Rolle, ob sie sich der Existenz des Rades bewusst sind oder nicht nicht.
Kehren wir zu den Programmierern zurück. Ich bin bei Tag Webentwickler, daher ist MVC eines der Dinge, mit denen ich täglich interagiere. Einige Male habe ich versucht, meine eigenen Strukturen zu bauen, ich habe viel gelernt, aber alle waren im Grunde erfolglos. Ich habe mein Bestes versucht, aber was würde passieren, wenn es keine MVC da draußen gäbe? Nun, einfach, mein Quellcode ist zum Kotzen - in Bezug auf Zuverlässigkeit, Wartbarkeit und Erweiterbarkeit.
Ich denke, das ist für die meisten von uns gleich. Wenn Ihnen niemand von DI erzählt, wie viele Unternehmensanwendungen sollten dann Schwierigkeiten haben oder scheitern, bis ihre Entwickler die Lektion gelernt haben?
Der zweite Punkt sind Industriestandards . Wenn Sie Web-Entwicklern MVC nicht beibringen möchten, sind Sie bereit, sich mit all den nicht standardmäßigen Strukturen auseinanderzusetzen, für die Sie einige Zeit aufwenden müssen, um ihre Arbeitsweise zu erlernen Ich habe eine gute Idee, aber die meisten von ihnen weisen schwerwiegende Designfehler auf, die schwerwiegende Konsequenzen für Ihr Softwareprojekt haben können. Sogar bekannte Frameworks haben immer noch mit Designfehlern zu kämpfen.
Aber was würde passieren, wenn wir all diese schönen Ideen haben und sie alle zusammenfügen und diese intelligenten Entwickler die guten Dinge aus all diesen Experimenten herausholen und eine wirklich coole Struktur erstellen, die für dieses spezielle Problem am besten funktioniert? Dann haben Sie gerade die Entwurfsmuster erstellt . Wenn Sie ein Lebewesen sind, gibt es keinen anderen Weg; Sogar Tiere folgen in ihrem täglichen Leben Best Practices und Designmustern.
quelle
Erfinden Sie einen Hammer nicht neu, sondern behandeln Sie jedes Problem nicht wie einen Nagel
Programmiermuster sind eine große Zeitersparnis, da sie Ihnen gebrauchsfertige Lösungen bieten, die gut dokumentiert und getestet sind und die leicht vergessen werden können. Aber Sie müssen lernen (und darüber nachdenken), wann Sie sie verwenden müssen.
Um es mit Ihrer Frage zu sagen: Würde das Lernen des Fahrens mich schneller bewegen oder nur langsamer laufen lassen?
Das Erlernen des Programmiermusters bedeutet nicht, dass Sie keine eigenen Lösungen finden sollten. Es wird immer noch genug Probleme geben, auf die Sie Ihre Kreativität ausüben können. Wenn Sie die Programmiermuster kennen, können Sie sich schnell auf bekannte Probleme konzentrieren, die weniger trivial sind.
Kehren Sie zum zweiten Teil Ihrer Frage zurück - hat Ihr Professor Recht?
Ja, er hat Recht . Das Hauptziel des Studiums ist es , die Schüler zum Denken zu erziehen . Sie müssen versuchen, ihre eigenen Lösungen für das Problem zu finden und sie dann mit den vorhandenen Lösungen konfrontieren. Nur so können sie sie wirklich verstehen. Wenn Sie ihnen zuerst die Muster beibringen, riskieren Sie, dass sie nur mechanisch lernen, sie anzuwenden und nicht zu verstehen, was dahinter steckt.
Aus diesem Grund unterrichten Sie die Studierenden zum ersten Mal im Programm, und die Muster werden in weiteren Semestern eingeführt.
quelle
Ich würde absolut davon abraten, Programmieren zu unterrichten, indem ich Entwurfsmuster unterrichte. Sie können sie nicht gut anwenden, ohne die dahinter stehenden Prinzipien zu verstehen. Deshalb ist es viel wichtiger, diese Prinzipien zu lehren.
Ich neige dazu zu denken, dass Designmuster für arbeitende Programmierer sowieso nicht wirklich so wertvoll sind. Wenn Sie die Prinzipien eines bestimmten Entwurfsmusters vollständig verstehen, neigen Sie in einer Situation, in der es eine gute Lösung ist, natürlich dazu, es (oder etwas Ähnliches) zu konstruieren, auch wenn Sie es nicht wussten dass es ein Muster mit einem Namen war. Unabhängig davon, wie viel Zeit Sie mit dem Lernen von Mustern verbringen, sollten Sie besser lernen, wie Sie über Code im Allgemeinen denken. Wenn Ihre Fähigkeiten zum Lösen von Problemen im Allgemeinen nicht auf dem neuesten Stand sind, können Sie keinen guten Code schreiben, egal wie gut Sie einige Muster anwenden können. Und wenn Ihre Fähigkeiten zum "Lösen von Problemen im Allgemeinen" gut sind, können Sie Probleme auch dann lösen, wenn Sie kein einziges Muster kennen.
Ich denke auch , dass es in einer idealen Welt würde nicht sein , alles Design - Muster, weil Ideen häufig genug ein Muster all gut implementiertes in Bibliotheken würde aufgerufen werden und wir würden tatsächlich werden die Wiederverwendung Code statt ständig Umschreiben es. Stellen Sie sich vor, es gäbe ein "Entwurfsmuster für reguläre Ausdrücke", bei dem Sie jedes Mal, wenn Sie es verwenden möchten, eine kleine Regex-Engine implementieren müssten. Entwurfsmuster sind nur Bibliotheken, die nicht geschrieben werden können, da die Sprache nicht die richtigen Abstraktionsmöglichkeiten bietet.
Das ist eigentlich ein weiterer Grund, sich nicht sonderlich für sie zu interessieren. Sie sind nicht annähernd so universell, wie es manchmal behauptet wird, sondern sind in der Tat sehr stark an die besonderen Arten der Programmstrukturierung gebunden, die eine bestimmte Sprache zulässt / fördert. Ein Design Pattern-Buch, das für Python geschrieben wurde, ist völlig anders als ein Buch für Java und sogar noch anders als ein Buch für eine nicht-imperative Sprache wie Haskell. Besser zu verstehen auf einer tieferen Ebene, und Sie werden in der Lage sein, Designmuster selbst in jeder Sprache zu entdecken, mit der Sie vertraut sind.
quelle
Handel und Bildung verfolgen unterschiedliche Ziele. Wenn ich den Schülern Entwurfsmuster beibringen würde, würde ich den gleichen Ansatz verfolgen. In einer Produktionsumgebung sind Zeit und Effizienz alles.
Darüber hinaus ist (Makro-) Ökonomie außerhalb des Klassenzimmers etwas anderes. Sehen Sie, wie Regierungen sagen: "Whoa! Jetzt langweilen wir uns bei der Erledigung der Steuern, und das auf die gleiche Weise. Versuchen wir diesmal etwas Verrücktes." Nein, das tust du nicht, denn solche wilden Experimente können die Wirtschaft irreparabel zerstören. Stattdessen halten sie an bewährten Ansätzen fest: Erhöhen Sie den Zinssatz, kündigen Sie Steuerferien an usw. Mit anderen Worten, sie verlassen sich auf Entwurfsmuster.
quelle
Die Antwort lautet natürlich: Ja.
Design Patterns sind ein wunderbares Lernwerkzeug für sich, solange man sich die Zeit nimmt, um herauszufinden, wie sie funktionieren und warum sie den Wert bringen, den sie bringen.
Sie können auch die Produktivität steigern, indem sie einen Entwurfsprozess schnell verfolgen, da sie vertraute Lösungen für Probleme bieten, die ständig auftauchen.
Wenn sie jedoch das Design zu sehr kurzschließen oder wenn Menschen dogmatisch und zu präzise in Bezug auf ihre Verwendung werden, haben sie den gegenteiligen Effekt.
quelle
Designmuster sind natürlich weniger kreativ. Das ist die ganze Idee. Kreativität ist eine knappe Ressource. Sie sollten es nicht mit Problemen verschwenden, die keine Kreativität erfordern. Es ist viel einfacher, schneller und einfacher zu arbeiten, wenn Sie ein Problem auf dieselbe Weise lösen wie Hunderte von Entwicklern vor Ihnen. Langweiliger, nicht aufregender Code, der seine Arbeit erledigt, ist eigentlich gut.
quelle