Ich programmiere seit weniger als einem Jahr und habe einige Erfahrungen mit dem Schreiben von Systemanwendungen, Web-Apps und Skripten für Unternehmen / Organisationen. Eine Sache, die ich jedoch nie wirklich gemacht habe, ist die Arbeit mit einem Framework wie Django, Rails oder Zend.
Wenn ich über das Django-Framework schaue, bin ich ein wenig frustriert darüber, wie viel in Frameworks abstrahiert wird. Ich verstehe die Kernziele von DRY und minimalem Code, aber ein Teil dieser übermäßigen Abhängigkeit von verschiedenen Modulen und der starken Abstraktion von Kernfunktionen fühlt sich so an:
Lässt Programme aufgrund der sich ständig ändernden Natur von Modulen / Frameworks sehr schnell veralten.
Erschwert das Verständnis von Code aufgrund der Fülle an verfügbaren Frameworks und Modulen und all ihrer Eigenheiten.
Macht den Code weniger logisch, es sei denn, Sie haben die gesamte Dokumentation gelesen. Das heißt, ich kann einige Listenverständnisse und Bedingungslogiken durchlesen und herausfinden, was ein Programm tut, aber wenn Sie Funktionen sehen, die die Übergabe von beliebigen Zeichenfolgen und Wörterbüchern erfordern, wird es schwierig, die Dinge zu verstehen, es sei denn, Sie sind bereits ein Guru in ein gegebenes Modul; und:
Macht es schwierig und mühsam, zwischen Frameworks zu wechseln. Das Wechseln zwischen Sprachen ist bereits eine Herausforderung, aber es ist beherrschbar, wenn Sie die Kernfunktionalität / -philosophie genau genug verstehen. Das Wechseln zwischen Frameworks scheint eher eine Frage der Auswendiglernen zu sein, die in gewisser Weise die Ineffizienz zu fördern scheint, die diese Frameworks beseitigen sollen.
Müssen wir wirklich wie 50 Abstraktionsebenen auf etwas so Einfaches wie eine MySQL-Abfrage setzen? Warum nicht so etwas wie das PDO-Interface von PHP verwenden, in dem vorbereitete Anweisungen / Eingabetests behandelt werden, die allgemein verständliche SQL-Abfrage jedoch immer noch Teil der Funktion ist?
Sind diese Abstraktionen wirklich nützlich? Macht Feature Bloat sie nicht nutzlos und erschwert sie Anwendungen im Vergleich zu ähnlichen Anwendungen, die ohne Verwendung eines Frameworks geschrieben wurden?
quelle
as a relatively inexperienced programmer
- Je länger Sie Software entwickeln, desto mehr werden Sie es zu schätzen wissen, weniger Zeit damit zu verbringen, das Rad neu zu erfinden und mehr Zeit zu Hause zu verbringen, um Dinge zu tun, die Sie lieben.Do we really need to put like 50 layers of abstraction on top of something as simple as a MySQL query?
- Erstens ist ein gutes Framework eine Abstraktionsebene (vielleicht 2 oder 3 intern), und zweitens umfasst "etwas so Einfaches wie eine MySQL-Abfrage" tatsächlich ein gutes Dutzend Abstraktionen. Selbst nachdem die Abfrage, die Sie aus Ihrer interpretierten Sprache ausführen , auf dem Datenbankserver eingegangen ist, haben Sie weiterhin Abfragen über Datenbanken, über Engines, über Dateisysteme und über physischen Speicher. Kurz gesagt: Ja, wir brauchen Abstraktionen, weil sie unsere Köpfe vor dem Explodieren bewahren.Antworten:
Frameworks können in der Tat schwierig sein. Probleme können leicht auftreten, wenn ein Framework zu "eigenwillig" ist, dh wenn es wirklich einen bestimmten Anwendungsstil bevorzugt und alle Teile darauf ausgerichtet sind, diesen bestimmten Stil zu unterstützen.
Wenn das Framework beispielsweise den Authentifizierungsprozess eines Benutzers vollständig abstrahiert, indem Sie nur eine Komponente hinzufügen, eine Anmeldevorlage hinzufügen und voila, erhalten Sie die Benutzerauthentifizierung kostenlos. Dies ersparte Ihnen eine Menge sich wiederholender Arbeit bei der Sorge um Cookies, Sitzungsspeicherung, Passwort-Hashing und so weiter.
Die Probleme beginnen, wenn Sie feststellen, dass das Standardverhalten des Framework-Authentifizierungscodes nicht Ihren Anforderungen entspricht. Vielleicht entspricht es nicht den neuesten Best-Security-Praktiken. Möglicherweise benötigen Sie einen benutzerdefinierten Hook, um eine Aktion auszulösen, das Framework bietet jedoch keinen an. Möglicherweise müssen Sie die Details des gesetzten Cookies ändern, aber das Framework bietet keine Möglichkeit, dies anzupassen.
Die Abstraktion, die das Framework bietet, hat es Ihnen ermöglicht, Ihrer Site innerhalb von Minuten anstelle von Tagen eine wichtige Funktion hinzuzufügen. Letztendlich müssen Sie jedoch möglicherweise gegen das Framework kämpfen, damit es das tut, wofür Sie es benötigen, oder Sie werden Sie müssen die Funktionalität ohnehin von Grund auf neu erfinden, um sie Ihren Bedürfnissen anzupassen.
Das soll nicht heißen, dass Framework-Abstraktionen schlecht sind, wohlgemerkt. Es ist zu sagen, dass dies immer eine Möglichkeit ist, die Sie berücksichtigen müssen. Einige Frameworks sind explizit darauf ausgerichtet und bieten die Möglichkeit, als Prototyp oder sogar als Produktionsframework für einen bestimmten, begrenzten App-Typ sehr schnell etwas aufzubauen. Andere Frameworks ähneln eher losen Sammlungen von Komponenten, die Sie verwenden können, die Ihnen jedoch noch viel Flexibilität bieten, um sie später zu ändern.
Wenn Sie eine Abstraktion verwenden, sollten Sie immer zumindest grob verstehen, was sie abstrahiert. Wenn Sie Cookies und Authentifizierungssysteme nicht verstehen, ist es keine gute Idee, von einer Abstraktion auszugehen. Wenn Sie verstehen, was Sie tun möchten, und nur Code benötigen, der dies bereits tut, anstatt mühsam Ihren eigenen Code schreiben zu müssen, sind Abstraktionen eine große Zeitersparnis. Schlecht geschriebene Abstraktionen können Sie jedoch später in Schwierigkeiten bringen, sodass es sich um ein zweischneidiges Schwert handelt.
Sie sollten auch zwischen technischen Abstraktionen und "Geschäftsregel" -Abstraktionen unterscheiden. Das Programmieren in einer höheren Sprache ist eine Abstraktion, die Sie wahrscheinlich nicht missen möchten (Python, PHP, C # vs. C vs. Assembler; weniger vs. CSS), während "Geschäftsregelabstraktionen" schwierig sein können, wenn sie dies nicht tun Erfüllen Sie genau Ihre Anforderungen (Ein-Klick-Authentifizierung im Vergleich zu handcodierten Cookies).
Das liegt daran, dass technische Abstraktionen selten "lecken", dh Sie müssen kaum Maschinencode debuggen, wenn Sie Anwendungen in Python schreiben. Geschäftsregelabstraktionen funktionieren jedoch auf derselben technischen Ebene und sind eigentlich nur "Codebündel". Sie wahrscheinlich werden müssen um das Cookie debuggen, oder das Passwort - Hash festgelegt ist, an einem gewissen Punkt erzeugt wird, was bedeutet , werden Sie tauchen durch viele 3rd - Party - Code sein.
quelle
Mir scheint, dass Sie Abstraktionen und die Wiederverwendung von Code missverstehen.
Die gesamte Softwareentwicklungsbranche basiert auf Abstraktionen. Nur weil sie nicht verwendet werden, dh die Verwendung von Frameworks, Bibliotheken und im Allgemeinen nicht selbst geschriebenem Code vermieden wird, erhöhen sich die Kosten für die Erstellung einer Software um Hunderttausende, wahrscheinlich sogar noch mehr.
So wie Sie einen Jumbo-Jet nicht von Grund auf neu erstellen, schreiben Sie keine Business-Software von Grund auf neu, ohne die jahrelangen technischen Kenntnisse zu nutzen, die Sie beim Bau anderer Flugzeuge erworben haben.
Wenn Sie PHP oder Ruby verwenden, haben Sie schon eine Menge Abstraktionen, oder? Die offensichtlichsten:
Das Betriebssystem, die Programmiersprache und der Compiler bieten eine riesige Abstraktion über Assembler und Hardware.
Der Webserver bietet eine Abstraktion von Sockets, Failover, HTTP-Protokoll usw.
SQL bietet eine Abstraktion darüber, wie Daten auf einem permanenten Speicher-Support gespeichert und für einen schnelleren Zugriff im Speicher gehalten werden, stellt ACID, Spiegelung usw. sicher.
Sie können immer versuchen, eine Web-App zu erstellen, ohne ein Betriebssystem, einen Webserver, eine Datenbank oder eine höhere Programmiersprache zu verwenden. Sie werden schnell feststellen, dass Sie jahrelang das Rad neu erfunden haben, dh Ihre Programmiersprache, Ihren Webserver und Ihre Datenbank neu erstellt haben, da deren Qualität weit von der Qualität der Produkte entfernt ist, die wir tatsächlich verwenden.
Frameworks unterscheiden sich nicht davon. Sie können das tun, was sie tun. Nur damit Sie Ihre Zeit damit verschwenden, die gleiche Funktionalität zu wiederholen, mit dem Unterschied, dass diese Frameworks dies besser können und sehr oft ihr Code besser getestet und dokumentiert wird als Ihr Code.
Nehmen Sie das Beispiel eines Einkaufswagens für eine E-Commerce-Website. Sie können Ihre eigene erfinden und einige Wochen damit verbringen, sie zu entwickeln, oder Sie nehmen die, die jahrelang von einer Gruppe von Leuten innerhalb eines Frameworks entwickelt wurde. Es wird erwartet, dass ihre Software getestet wird, ohne die Tatsache zu berücksichtigen, dass diese Entwickler während einiger Jahre eine Reihe von Fehlern entdeckt und behoben haben, die Sie sich bei der Entwicklung Ihres eigenen Wagens nicht vorstellen können.
Möglicherweise antworten Sie, dass ihr Problem komplizierter ist, da es mehr Benutzerfälle gibt. Zum Beispiel sollten sie sich mit Rabatten befassen, während Sie keine Rabatte auf Ihrer Website haben und diese Funktion im Warenkorb nicht benötigen. Nun, Sie sind nicht gezwungen, diese Funktion zu verwenden, und es ist auch nicht so, als würde dies die Leistung Ihrer Web-App beeinträchtigen.
Möglicherweise haben Sie ein sehr einfaches Szenario, in dem es wirklich einfacher ist, Ihren eigenen Einkaufswagen zu entwickeln, als den vorhandenen zu verwenden. Auf die gleiche Weise brauchen Sie keine Datenbank, wenn Ihre App nur eine Liste mit Zahlen speichern muss. Eine einfache Textfüllung würde ausreichen. Überentwickeln Sie in diesen Fällen Ihre App nicht: Einfache Szenarien erfordern einfache Lösungen.
Ein weiterer Faktor ist die Lesbarkeit Ihres Codes. Stellen Sie sich vor, Sie haben eine E-Commerce-Website erstellt. Später haben Sie das Projekt verlassen und ein anderer Entwickler sollte es warten.
Wenn Sie einen von einem Framework bereitgestellten Wagen verwendet hätten, wäre Ihr Kollege erleichtert: Er müsste ein kleines Stück Code verwalten, das auf einem zuverlässigen, stark dokumentierten Framework beruht. Noch besser: Dieser Entwickler wurde möglicherweise für die Arbeit mit diesem Framework verwendet und ist damit vertraut. Wenn nicht, kann er Fragen zu Stack Overflow stellen: Sicher, jemand hat das Framework bereits verwendet.
Wenn Sie einen eigenen Einkaufswagen hätten, müsste Ihr Kollege einen benutzerdefinierten Code verwalten, der möglicherweise nicht einmal dokumentiert ist, ohne irgendwo Hilfe zu erhalten.
Wenn Sie ein Framework verwenden, verlassen Sie sich auf einen Code, der wie folgt lautet:
Geschrieben von erfahrenen Entwicklern,
Oft paarweise überprüft,
Unit-getestet,
Ausführlich dokumentiert,
Jahrelang von Tausenden von Entwicklern verwendet,
Oft unterstützt, so dass Sie einen Fehler melden und sehen können, dass er tatsächlich behoben ist.
Bekannt von vielen Entwicklern, die die möglichen Vorbehalte und Probleme kennen und auf Websites wie Stack Overflow helfen können.
Jetzt kostenlos für Sie verfügbar.
quelle
Ich stimme zu - die meisten Rahmenbedingungen werden zu aufgeblähten Diktatoren. Sie versprechen Freiheit, aber Sie geraten in Knechtschaft. Betrachten Sie also ein Framework wie ein Tool - das beste Tool ist dasjenige, das Ihnen aus dem Weg geht. Wenn Sie mit PHP arbeiten, sollten Sie das Codeigniter-Framework ausprobieren, da es eine elegante Balance zwischen Konventionen und Freiheit bietet und eine großartige Community hat. Und zu dem Plakat, das das Beispiel eines E-Commerce-Wagens verwendete - ich wünschte, ich könnte Ihnen zustimmen. Aber nachdem ich mir den Code für viele E-Commerce-Lösungen angesehen und einige entworfen habe, würde ich Ihrem Beispiel mit Respekt widersprechen.
quelle
Hmmm Ein Aspekt von LedgerSMB, an dem wir viel gearbeitet haben, war unser Ansatz zum Framework. Es gibt jedoch zwei grundlegende Probleme, die mit dieser Art von Abstraktion verbunden sind. Diese sind:
Abhängigkeitsexplosion und
Falsche Abstraktion
Das erste ist tatsächlich besser als die Alternative, bei der das Rad neu erfunden wird. Die zweite ist etwas schwierig zu kennzeichnen, da sie von einem schlecht definierten Problemfall oder häufiger von Personen stammen kann, die etwas verwenden, das nicht für den vorgesehenen Zweck vorgesehen ist.
Schauen wir uns zum Beispiel ORMs an. Ich vermeide die Verwendung von ORMs, da es sehr oft vorkommt, dass die Datenbank für das Objektmodell der Anwendung entworfen wird, da es sich bestenfalls um undichte Abstraktionsschichten handelt. Dies ist nicht unbedingt der Fall. Ich habe Entwickler getroffen, die es schaffen, ein gutes DB-Design und eine gute App bei der Verwendung von ORMs beizubehalten, aber sie greifen auf viele Dinge zurück, die laut Orm-Hype nicht erforderlich sein sollten, wie die Verkapselung der relationalen API der Datenbank hinter aktualisierbaren Ansichten.
Ein Hauptproblem ist natürlich, dass es umso schwieriger ist, zu erkennen, was falsch läuft, je stärker der Code automatisiert ist, insbesondere wenn er auch undurchsichtig ist. Dies ist ein Punkt zu ORMs, den @jhewlett oben anführt (siehe /software//a/190807/63722 ).
Eine gute Parallele könnte die fortgeschrittene Avionik als Rahmen für die Steuerung eines Flugzeugs sein. Diese sind auf Zuverlässigkeit ausgelegt und tragen zur Erhöhung der Flugsicherheit bei. Wie jedoch in vielen Artikeln des IEEE-Spektrums dargelegt wird, geht dies zu Lasten der Wiederherstellbarkeit von Fehlern, die außerhalb der Grenzen dessen liegen, was aus Sicht der Automatisierung als akzeptabel angesehen wird. Gleiches gilt für das Debuggen. Es ist eine Sache, SQL-Code in Ihrem Programm zu debuggen. Es ist eine ganz andere Sache, einen Teil Ihres Programms zu debuggen, der SQL-Code für die Verwendung durch Ihr Programm schreibt.
Wir haben das LedgerSMB-Framework von Grund auf neu geschrieben, da es zu Beginn keine wirklich guten Frameworks gab, die das machten, was wir wollten. Tatsächlich ist es eine Sache, mit der ich ziemlich zufrieden bin und die laut einem neueren Entwickler des Projekts die Anpassung der Anwendung recht einfach macht. (Wir halten die SQL-Codegenerierung auf ein Minimum und konzentrieren uns stattdessen auf handgeschriebene benutzerdefinierte Funktionen, was bedeutet, dass die SQL-Schreibabschnitte sehr dünn sind). Ja, es bietet an einigen Stellen eine Menge Abstraktion, mit der sich einige Programmierer mehr auskennen als auskennen. Wir bemühen uns jedoch, alles einfach und konsistent zu halten, so dass sofort festgestellt werden kann, was schief gelaufen ist. Das funktioniert ganz gut.
Am Ende ist "zu viel" ein bisschen subjektiv, aber auf objektiver Ebene kommt es auch darauf an, was Sie tun. Wenn Sie genau das tun, wofür das Framework entwickelt wurde, bietet ein gut gestaltetes Framework ein Höchstmaß an Abstraktion. Wenn Sie etwas tun, das ein bisschen weniger passt, wird die Abstraktion sowohl zu viel als auch zu undicht.
quelle
Ja, sie sind nützlich. Sie bieten Ihnen den Vorteil, dass viele andere erfahrene Entwickler an der Lösung eines Problems mitarbeiten, das Sie lösen müssen. Hinzu kommen die Vorteile, dass Sie es getestet, zahlreiche Fehler behoben und Lösungen für knifflige Probleme bereitgestellt haben, über die Sie sich keine Sorgen machen müssen Sie selbst, indem Sie das Framework verwenden.
Können sie übermäßig aufgebläht werden? Sicher. Dies hängt alles davon ab, was Sie brauchen und was das Framework auf den Tisch bringt. Wenn Sie eine einfache Web-App haben, ist Rails möglicherweise zu viel für Sie, und Sie sollten sich etwas Einfacheres wie Sinatra als Lösung ansehen.
Es gibt definitiv eine Lernkurve für alle Frameworks und sie ist steiler, je mehr Arbeit Sie einsparen. Das Erlernen des Frameworks bedeutet jedoch, dass Sie Zeit gespart haben und das gesamte Wissen für das nächste Projekt nutzen können, anstatt Ihre Anwendung ein zweites Mal von Grund auf neu zu schreiben.
Aber Sie sagen, ich kopiere einfach meinen Code aus dem alten Projekt und kann ihn als Ausgangspunkt für mein neues Projekt verwenden! Ich werde nur das ändern, was anders ist, und vielleicht einige meiner Objekte / Funktionen allgemeiner gestalten und mir einen besseren Weg überlegen, um dieses knifflige Stück Code zu lösen! Herzlichen Glückwunsch, Sie haben gerade ein Framework erstellt. Tun Sie dies noch ein paar tausend Mal und Sie haben so etwas wie Django, Rails oder Zend.
quelle
Frameworks führen in der Regel zu einer höheren Produktivität (möglicherweise nach einer kurzen Einarbeitungszeit), es ist jedoch häufig ein Kompromiss erforderlich. In einigen Fällen steigern Sie beispielsweise die Produktivität von Programmierern auf Kosten einer verringerten Leistung.
Betrachten Sie objektrelationale Mapper (ORMs). Sie sind großartig darin, dass sie eine Menge des langwierigen Mapping-Codes für Sie erledigen. Sie können sogar Ihre Objekte für Sie erstellen. Wenn Sie jedoch SQL abstrahieren, ist es viel schwieriger, über die Leistung nachzudenken und Ihre Engpässe zu optimieren.
Wenn Sie eine Anwendung erstellen, die nicht viele Daten oder komplexe Abfragen enthält, ist die Leistung möglicherweise kein Problem für Sie. In der Tat ist die Zeit der Programmierer der Engpass für viele Projekte, und Frameworks, Bibliotheken und Hochsprachen tragen dazu bei, dies zu mildern.
quelle
Ich bin damit einverstanden, dass "Sie Bibliotheken verwenden, aber Frameworks Sie verwenden". Das ist eine sehr nette Art, es auszudrücken. Ich stimme nicht zu, dass Sie mit dem Erstellen eines Frameworks beginnen, sobald Sie den Code wiederverwenden, da Sie in der Regel nur noch schnell kopieren und einfügen müssen, um den Code wieder zu verwenden Bibliothek, die Sie aufbauen; Sie müssen nicht sonderbar werden, wie Sie den Code in Ihre Site oder App integrieren.
Für mich ist der entscheidende Punkt, dass ich mehr aus einer Ressource herausholen muss, als ich investieren muss. Oder aus einem anderen Blickwinkel würde ich sagen, dass, sobald die Anforderungen eines Frameworks höher sind als die verfügbaren Belohnungen, kein Vorteil mehr vorhanden ist. Also ist es 'Ja! Bitte! Und danke dir!' an alle, die Assets erstellen, die direkt in meinem HTML- / CSS- / PHP- und SQL-Code abgelegt werden und nach Bedarf funktionieren.
Eine Sache, die ich für unverständlich halte, ist, dass Frameworks die Wartung vereinfachen sollen. Wenn das komplexe Netz aus zusammenwirkenden Teilen nicht wie beabsichtigt funktioniert, sollten Sie alles wissen, was Sie über das betreffende Framework wissen müssen. Oder seien Sie bereit für eine umfangreiche Eingabe neuer Syntax.
quelle
Einige Leute sagen, dies sei das Hollywood-Prinzip von Frameworks: "Rufen Sie uns nicht an, wir rufen Sie an". Wenn Sie dagegen eine Bibliothek verwenden, ruft Ihr Code die Bibliothek auf und nicht umgekehrt.
Wie Sie sehen, ist der wichtigste Punkt, wer die Kontrolle hat - nämlich die Kontrolle über den Kontrollfluss. Wer entscheidet, welche Anweisung nach welcher ausgeführt wird?
Es gibt Argumente für und gegen, und wenn ich solche endlosen Diskussionen sehe, denke ich, dass dies eher eine Geschmackssache als eine objektiv entscheidbare Frage sein muss. Sonst wäre es schon entschieden worden.
Aus meiner Sicht sagt die Frage, ob Sie lieber Frameworks oder Bibliotheken verwenden, etwas darüber aus, was für ein Entwickler Sie sind, und nicht, ob einer der beiden Ansätze überlegen ist und sich letztendlich durchsetzen wird.
Wenn Sie Frameworks bevorzugen, bevorzugen Sie den Austausch von Freiheit gegen Sicherheit: Sie sind wahrscheinlich pragmatischer und neigen dazu, anderen zu vertrauen, dass sie ihre Arbeit ordnungsgemäß ausführen. Wenn Sie Bibliotheken bevorzugen, bevorzugen Sie den Austausch von Sicherheit gegen Freiheit: Sie sind wahrscheinlich eher ein Idealist und hinterfragen die Ideen und Ansprüche anderer.
Ich denke nicht, dass es klug wäre, zu entscheiden, dass es besser ist, wie der erstere oder der letztere zu sein.
Beantwortung Ihrer Frage: Setzen Frameworks zu viel Abstraktion? Es hängt davon ab, wer Sie sind und insbesondere davon, wie weit Sie sich von den Grundprinzipien entfernt fühlen.
...
Und vor allem, wenn Sie Frameworks wie Django nicht mögen, suchen Sie nach "Microframeworks" wie Flask :)
quelle