Entwerfen Sie Muster, die Kreativität ersticken

21

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?

Löwe
quelle
5
Ich würde vorschlagen, A Pattern Language (das Buch, nicht der Wikipedia-Artikel) zu lesen , auf dem die Konzepte der Softwarearchitektur von Mustern basieren. Sie sind keine Bausteine ​​oder Puzzleteile, die einfach so zusammenpassen.
11
Lehnen / Lehren unterscheidet sich von Tun. In einem wirklich guten CS-Kurs schreiben Sie möglicherweise einen Compiler. Wenn Sie Ihrem Arbeitgeber vorschlugen, einen Compiler für sein Auftragsverarbeitungssystem zu schreiben, würden / sollten Sie entlassen werden.
James Anderson
2
Ich denke nicht, dass die beiden notwendigerweise vergleichbar sind - Designmuster sind nicht die klassische Lösung, sie sind ein Ansatz für eine Vielzahl von Lösungen.
Jmoreno
1
Mögliche Duplikate von Designmustern - verwenden Sie diese? - Die Frage hört sich vielleicht anders an, aber die Antworten auf diese Frage passen gut in diesen Fall.
Doc Brown
2
Ich weiß nichts über Kreativität, aber die Vielzahl von "Welches Muster ist das?" oder "Gibt es ein Muster dafür?" Fragen erwecken den Eindruck, dass einige Entwickler der Meinung sind, dass es für alles ein Muster gibt.
JeffO

Antworten:

43

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.

Robert Harvey
quelle
3
Ich bin mir ziemlich sicher, dass es so viele Entwickler gibt, die ohne Design-Patterns einen Code von so geringer Qualität schreiben, dass niemand darauf schauen möchte. Ich bin nicht einverstanden, dass es NUR von Leuten verwendet werden sollte, die verstehen, wie man das Problem ohne das Muster löst ... Für mich ist das der springende Punkt eines Entwurfsmusters; Wenn ich wüsste, wie es geht, warum sollte ich mich für ein Designmuster entscheiden? Was sollten diese anderen Entwickler auch tun, wenn wir sie dazu zwingen, kein Entwurfsmuster zu verwenden? Sie sollen mit ihren Ideen echte Software machen und diese scheitern lassen und dann etwas Neues lernen?
Mahdi
18
@ Mahdi Wenn viele Leute die gleiche Lösung finden, wird diese Lösung als Muster bezeichnet. Es ist nicht umgekehrt - Sie betrachten Muster nicht und verwenden sie als Lösungen, Sie betrachten Lösungen und finden Muster.
user253751
13
@ Mahdi Ich sehe weit mehr Anfänger, die glauben, dass wenn sie nur Muster XXX verwenden, sie jedes Mal perfekte Software erstellen (wobei XXX das ist, worüber sie zuletzt gelesen haben) und sich dann alle Mühe geben, jedes Projekt in die richtige Form zu bringen dieses Muster.
18.
5
@ Mahdi: Nimm den Satz "von Leuten, die verstehen, wie man das Problem ohne das Muster löst" nicht zu wörtlich. Robert meint sicher "von Leuten, die das Problem mit dem Einsatz gut genug verstanden haben, um eine vernünftige Entscheidung darüber zu treffen, wann ein Muster verwendet werden soll und wann nicht".
Doc Brown
2
@Dunk Ich kann etwas Kreatives über einem bekannten Muster ausprobieren oder es von Grund auf neu erstellen, aber nachdem ich einige andere Dinge ausprobiert und die genauen Vor- und Nachteile der einzelnen Muster verstanden habe. Wenn du mich bittest, zum ersten Mal ein Haus zu bauen und mir zu sagen, ich solle kreativ sein, komme ich nicht so weit, um solide Dinge zu bauen, einfach weil das zu kompliziert ist. Wenn Sie kreativ sein möchten, anstatt ein Muster zu verwenden, sollten Sie das Problem selbst bereits genau kennen und es erst nach Jahren der Erfahrung erlangen ...
Mahdi
21

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.

Michael Shaw
quelle
10

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.

Mahdi
quelle
3
"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 scheiße" - Worte aus solidem Gold!
Ankush981
5

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.

Donau Seemann
quelle
5

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.

Ben
quelle
Hmm, interessante Antwort. Aber ich höre, dass Programmierinterviews viele Designmuster enthalten. Warum sollte das so sein, wenn sie wenig Wert hatten?
Ankush981
@dotslash Aus dem gleichen Grund, aus dem IQ-Tests schwer mit Mathematik / Logik zu tun haben: Sie haben einen gewissen Wert und sind einfach zu testen. Das heißt, bei meiner Arbeitssuche als Programmierer bin ich ihnen nicht allzu oft in Interviews begegnet; Ich bin Australier, also gibt es vielleicht einen Unterschied in der Mode.
Ben
Aber ist das Erlernen von Entwurfsmustern nicht eine gute Möglichkeit, konkrete Beispiele für das Denken über Code zu sehen? Welche Dinge würdest du dir ansehen, um zu lernen, wie man über Code denkt, wenn nicht über Probleme und allgemeine Lösungen, die die Probleme lösen, und über Beispielcode, der die Lösung implementiert?
Amy Blankenship
@Amy Ja, aber es gibt einen großen Unterschied zwischen "hier ist ein Problem, hier ist eine Lösung, hier ist, wie ich darauf gekommen bin" und "hier ist ein Muster, merken Sie es sich, damit Sie es in Zukunft auf diese Probleme anwenden können". Sie möchten die Fähigkeit lehren, Lösungen zu generieren , da Muster immer nur zeitweise angewendet werden können, sodass sie diese Fähigkeit benötigen, unabhängig davon, wie viele Muster sie kennen. Wenn ich einen Kurs mit Mustern unterrichte, würde ich das wahrscheinlich tun, indem ich Übungen setze, mit denen die Schüler selbst feststellen sollen, dass die Lösungen für die Übungen gemeinsame Konzepte enthalten.
Ben
Hervorragende Antwort. Die beste Programmierumgebung würde die interessantesten Muster in Bibliotheken oder Sprachen kapseln und es Entwicklern ermöglichen, auf einer höheren Ebene zu arbeiten. Ich mag auch den Punkt über Sprachabhängigkeiten; Viele gängige Entwurfsmuster sind derzeit veraltet.
Frank Hileman
3

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.

ankush981
quelle
1

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.

rauben
quelle
3
Sie sind schreckliche Lehrmittel für den Programmierunterricht (und nicht für das Design). Sie führen zu der in Internetforen häufig gestellten Frage: "Wie kann ich XXX mithilfe des YYY-Musters implementieren?". Dies ist die falsche Frage. Die Frage sollte lauten (wenn Sie Muster erzwingen möchten), welche Muster angemessen wären zur Implementierung von XXX ".
18.
1
lol Ich sagte Lernwerkzeug, nicht Lehrwerkzeug - wenn man lernen will;)
Rob
-2

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.

gnasher729
quelle
2
Ist das nur deine Meinung oder kannst du es irgendwie bestätigen?
gnat