Hat Linq einen betäubenden Effekt auf .NET-Programmierer?

36

Viele von uns haben dieses Phänomen vor ungefähr einem Jahr bei jQuery festgestellt, als die Leute fragten, wie man absolut verrückte Dinge wie das Abrufen der Abfragezeichenfolge mit jQuery macht . Der Unterschied zwischen der Bibliothek (jQuery) und der Sprache (JavaScript) geht offensichtlich bei vielen Programmierern verloren und führt dazu, dass eine Menge unangemessener, verschlungener Code geschrieben wird, wo dies nicht erforderlich ist.

Vielleicht ist es nur meine Einbildung, aber ich schwöre, dass ich allmählich eine Zunahme der Fragen sehe, bei denen Leute fragen, ob sie mit Linq ähnlich verrückte Dinge tun sollen, wie beispielsweise Bereiche in einer sortierten Anordnung zu finden . Ich kann nicht übersehen, wie gründlich unangemessen die Linq-Erweiterungen zur Lösung dieses Problems sind, aber was noch wichtiger ist, dass der Autor gerade davon ausgegangen ist, dass die ideale Lösung Linq beinhalten würde, ohne darüber nachzudenken (soweit ich das beurteilen kann). Es scheint, dass wir die Geschichte wiederholen und eine neue Generation von .NET-Programmierern hervorbringen, die den Unterschied zwischen der Sprache (C # / VB.NET) und der Bibliothek (Linq) nicht erkennen können.

Was ist für dieses Phänomen verantwortlich? Ist es nur ein Hype? Elster Tendenzen? Hat Linq einen Ruf als eine Art Magie erlangt, bei der man, anstatt Code zu schreiben, nur die richtige Beschwörung aussprechen muss? Mit diesen Erklärungen bin ich kaum zufrieden, aber mir fällt eigentlich nichts anderes ein.

Was noch wichtiger ist, ist es wirklich ein Problem, und wenn ja, wie kann man diese Menschen am besten aufklären?

Aaronaught
quelle
6
+1 für "Angenommen, die ideale Lösung würde Linq einbeziehen, ohne darüber nachzudenken". Es ist wirklich jenseits von mir.
Jaco Pretorius
1
Linq ist langsam ...
2
@ Pierre: Auf welcher Grundlage machen Sie diese Behauptung?
Aaronaught
5
@Mason: Das ist ein absolut schrecklicher Maßstab, der von jemandem geschrieben wurde, der offensichtlich nicht weiß, was er tut. Benchmarking in Ticks? Ungarische Notation? Und die Linq-Version macht nicht einmal das Gleiche, sondern versucht, jedes einzelne Ergebnis zu wiederholen, anstatt beim ersten anzuhalten. Ganz zu schweigen davon, dass die ganze Prämisse albern ist, wie in der heißen Frage von heute zufällig diskutiert wurde .
Aaronaught
3
Übrigens: In @Mason sind in Linq viele Optimierungen integriert. Für fast jede Methode, die optimiert werden kann, wird zunächst eine Schnittstelle gesucht, die die optimierte Methode unterstützt. Für andere satzbasierte Methoden wie Equijoins werden Hash-Tabellen erstellt. Es optimiert Ihren Code nicht für Sie, aber es wird Ihren Code auch nicht langsamer machen. Die meisten der tatsächlich dokumentierten Verzögerungen in der realen Welt sind auf Lambdas / Closures zurückzuführen, die von Linq unabhängig sind.
Aaronaught

Antworten:

52

Das liegt im Grunde daran, dass das Programmieren von Grund auf schwierig ist. Es erfordert eine Menge logischer, strukturierter Überlegungen, von denen viele einfach nicht wissen, wie sie zu machen sind. (Oder kann es einfach nicht, je nachdem, wem du zuhörst.)

Dinge wie LINQ und jQuery vereinfachen bestimmte übliche Datenmanipulationsaufgaben erheblich. Das ist großartig für diejenigen von uns, die wissen, was wir tun, aber der unglückliche Nebeneffekt ist, dass es die Messlatte senkt. Es erleichtert Menschen, die keine Ahnung haben, was sie tun, Code zu schreiben und Dinge zum Laufen zu bringen. Und wenn sie dann in die Realität geraten und etwas grundlegend Schwieriges finden, für das ihre einfachen Techniken auf hoher Abstraktionsebene nicht gut geeignet sind, sind sie verloren, weil sie die Plattform, auf der ihre Bibliothek aufbaut, nicht verstehen.

Ihre Frage ist irgendwie auf dem richtigen Weg, aber ähnlich wie die ewige Kontroverse über gewalttätige Videospiele "Kinder gewalttätig machen", hat sie die Richtung des Links nach hinten. Einfache Programmiertechniken machen Programmierer nicht dumm. Sie ziehen einfach dumme Leute zum Programmieren an. Und da kann man wirklich nicht viel machen.

Mason Wheeler
quelle
30
+1 für "Einfache Programmiertechniken machen Programmierer nicht dumm, sie ziehen einfach dumme Leute zum Programmieren an."
Steven Evers
1
Eine großartige Sache an LINQ ist, dass ich eine Lösung in einem funktionalen Ansatz prototypisieren kann. Sobald ich eine fehlerfreie Lösung habe, kann ich sie als Prüfstand für eine optimierte imperative Version verwenden. Wenn die Aufgabe so einfach ist wie das Anwenden eines einzelnen Filters, werde ich mich nicht einmal darum kümmern.
ChaosPandion
4
Ich bezweifle immer noch, dass LINQ inkompetente Programmierer anzieht - was ich gesehen habe, scheint es eines der am schwierigsten zu verstehenden Konzepte für Neulinge zu sein -, aber dies scheint die bisher beste Antwort zu sein.
Aaronaught
1
Sie sollten den letzten Satz mit einem Copyright versehen. Gut gesagt, Sir.
AJ Johnson
1
Lustig. LINQ ist für mich kein besonders einfach zu beherrschendes Konzept. Wenn Sie etwas subtiles tun, müssen Sie sehr schnell aufhören, an das Lenkrad zu denken und anfangen, das Getriebe zu verstehen. Ich schaue dich an Lamdas!
Brian MacKay
13

Für mich ist es das neue Spielzeugphänomen. Es kommt etwas Neues heraus (LINQ) und jetzt will jeder Entwickler damit spielen.

Sie sehen LINQ als Hammer und jedes Problem ist ein Nagel. Wen interessiert es, ob es einfacher ist, es anders zu machen? LINQ muss die Antwort sein! Als ob jeder XML für ALLES benutzt hätte! Konfigurationsdatei? XML. Daten speichern? XML. Etc

PSU_Kardi
quelle
5
Ich möchte hier keine XML-Debatte beginnen, aber es ist erwähnenswert, dass XML in beiden Dingen wirklich gut ist. Es ist nicht immer optimal - wenn Konfigurationsdateien nicht strukturiert werden müssen, sind KVPs besser, und wenn keine anwendungsübergreifende Kompatibilität erforderlich ist, ist ein Binärformat für die Speicherung / Serialisierung eindeutig besser. Aber ich denke nicht, dass XML ein so gutes Beispiel ist, weil es dazu neigt, in Bereichen eingesetzt zu werden, in denen es nur suboptimal war und nicht völlig unangemessen.
Aaronaught
3
+1: Es lohnt sich, Ihre Werkzeuge zu strecken, um zu sehen, wie viele Probleme in die Form eines Nagels geschlagen werden können, wenn Sie eine Technologie erlernen.
Steven Evers
+1: Andere Beispiele für diese Art von magischem Hammer sind jQuery (wie in der Frage erwähnt) und reguläre Ausdrücke. Nicht, dass diese Dinge schlecht sind, sie sind in der Tat wirklich nützlich, aber sie sind nicht die Antwort auf alles.
Tim Goodman
13
Ich denke, dass die Analogie "LINQ ist ein Hammer und jedes Problem ist ein Nagel" es ein wenig zu weit treibt. Ich würde sagen, LINQ ist ein so guter Hammer, dass Sie, wenn ein großer Teil Ihrer Arbeit mit Nägeln zu tun hat, in eine Rille geraten können und nicht bemerken, dass Sie gerade eine Schraube eingeschlagen haben. Auch wenn Sie kein schlechter Programmierer sind.
Carson63000
@Aaronaught: Andererseits erschien mir die Verwendung von XML mit langen Feldnamen für die Datenübertragung über bandbreitenarme und nicht vollständig zuverlässige Funkverbindungen suboptimal. Andererseits habe ich auch über das Datenbankdesign für dieses Produkt nachgedacht.
David Thornley
10

Ich denke, LINQ bietet in C # eine wirklich gute Möglichkeit, Probleme mithilfe eines funktionaleren Ansatzes zu lösen. Wir sollten keine neue Art der Problemlösung ablehnen, nur weil wir bereits etwas haben, das funktioniert.

Ich komme aus einem starken SQL-Hintergrund und mag die Option, setbasierte Logik in meinem C # zu verwenden, um die Absicht meiner Operationen besser zu beschreiben.

Das gesagt; Der Kontext ist König und alles kann überbeansprucht werden.

dotjosh
quelle
Wer entlässt? Ich benutze Linq die ganze Zeit. Ich mache mir nur Sorgen über die Anzahl der Vorfälle, in denen Benutzer es bei eindeutig iterativen und nicht satzbasierten Problemen verwenden (oder versuchen, es zu verwenden).
Aaronaught
Ich bin es sehr gewohnt, Probleme zu lösen, die in SQL geschrieben werden mussten, und setbasierte Logik anstelle von Cursorn zu verwenden. Tool-Missbrauch wird immer vorkommen, aber ich vermute, wenn sie schlechten LINQ-Code anstelle von schlechtem prozeduralen Code schreiben, kann eine nachfolgende Version von .NET diesen zumindest leichter parallelisieren.
Dotjosh
2

LINQ und jQuery sind die neuesten "Spielzeuge" und Entwickler lieben es, zu zeigen, wie sie mit den neuesten Dingen Sachen machen können.

Dan Diplo
quelle
Ich stimme dieser Aussage zu. Ich bin mir nicht so sicher, ob es dieses spezielle Phänomen erklärt. Die Leute, die diese Fragen stellen, scheinen nicht wirklich die Vorzeigetypen zu sein - obwohl es hilfreich wäre zu erklären, warum andere Programmierer versuchen, die gestellten Fragen zu beantworten , anstatt einen vernünftigeren Ansatz zu befürworten.
Aaronaught
@Aaronaught - Ja, ich denke, ich habe mehr darüber nachgedacht, warum die Leute auf diese Weise mit den Fragen antworten.
Dan Diplo
2

Wenn Sie Linq richtig verwenden und es verstehen, werden Sie alle möglichen neuen Programmiertechniken finden.

Wenn Sie also tief über die Verbesserungen nachdenken, behaupte ich, dass dies Sie zu einem besseren Programmierer macht. Ob ein bestimmter Programmierer dies tatsächlich tut oder nicht, ist nicht Linqs Schuld.

Dasselbe Argument kann für objektrelationale Mapper angegeben werden. Schreibt jemand wirklich noch rohe SQL-Abfragen für Datenbanktabellen? :)

Robert Harvey
quelle
9
Hey, ich schreibe rohe SQL ... sniff
Aaronaught
2
Raw SQL ist die beste Wahl, wenn Sie wissen, was Sie tun.
Fosco
1
+1 für das Argument "macht Sie zu einem besseren Programmierer". Das Verständnis von linq und insbesondere der Methoden, die es unterstützen, hat mein Verständnis für einige sehr hilfreiche Programmierkonzepte auf jeden Fall verbessert.
John M Gant
1
Ich glaube, jemand hat den Kommentar von ORM vs. Raw SQL beleidigt. Ich war es nicht; Ich verwende beide und verstehe die Bemerkung als ironisch.
Aaronaught
1
Ich würde meinen komplexen Datenbankabfragen niemals den Mist anvertrauen, den ein ORM schreibt. Für einfache Dinge ist das in Ordnung, aber für das Melden von Typabfragen. Auch in den Händen von jemandem, der weiß, was er tut, ist ORM eine gute Sache. In den Händen von jemandem, der zu faul ist, Datenbanken zu verstehen, liegt eine Katastrophe vor uns.
HLGEM
1

Einige dieser verrückten Dinge sind, weil die Leute den falschen Hammer benutzen, andere, weil sie einen wirklich eleganten Superhammer bauen, aber sie sind auf ein seltsames Detail gestoßen, das überwunden werden muss.

Wenn Sie beispielsweise eine Frage zur Verwendung von linq zur Generierung von dynamischem linq gegen nicht dynamisches linq sehen, ist die Person entweder nur neugierig, ob es möglich ist, oder sie bellt den falschen Baum an, aber es gibt einige Dinge, die Sie auf diese Weise lösen können, sind so schwer zu lösen, dass sie nicht zumutbar sind.

Ich beantworte diese Art von Fragen in zwei Teilen:

  1. Kann es getan werden und wenn ja, wie würde es aussehen?
  2. Sollte dies geschehen, gibt es ein Risiko oder eine bessere Alternative

Ich habe festgestellt, dass ich sie fast immer in dieser Reihenfolge mache. Es beantwortet die Frage und hilft Ihnen, mögliche Alternativen besser zu erklären.

Rechnung
quelle
0

Ich kenne keinen betäubenden Effekt auf den Verstand der Entwickler, aber wirf einen Blick darauf , wie sich betäubende Tools / Sprachen auf die Raten auswirken. Sprechen Sie über das Senken der Messlatte!

Pete Wilson
quelle
0

Ich stimme Mason Wheeler zu. Es ist jedoch nicht ganz verrückt zu versuchen, https://stackoverflow.com/questions/3762202/get-range-of-integers-with-linq zu lösen, indem man eine "Sequenz" bearbeitet. Das Problem ist, dass die Iteratoren von Java und .Net nicht alle drei Operationen unterstützen: aktueller Wert, nächster Wert und Verschieben zum nächsten. Clojure kann alle 3, und ich vermute, dass es in Clojure einfacher ist, dies richtig zu machen. Python hat auch Co-Routinen, und ich möchte versuchen, das zu knacken. http://clojure.org/sequences http://www.try-clojure.org/

In der Tat, wenn die Eingabe eine unendliche Folge ist, wie zum Beispiel http://oeis.org/A007401 , dann ist faul der einzige Weg.

Job
quelle
"Linq" bedeutet nicht unbedingt "Iteratoren" oder "faul" - in der Tat handelt es sich bei den meisten von Linq wirklich um Ausdrucksbäume. Wenn Sie möchten, können Sie problemlos ein eigenes 3-wertiges oder N-wertiges Aggregat mit einem Abschluss und wenig Code in C # implementieren. Das Problem entsteht, wenn die Leute keine Ahnung haben, wie sie das tatsächlich tun oder wie sie überhaupt anfangen sollen, und nur nach einer magischen Beschwörung suchen, die im System.LinqNamespace lebt .
Aaronaught
@Aaronaught ... '' '"Linq" bedeutet nicht unbedingt "Iteratoren" oder "faul" - nun, Linq kann wie SQL aussehen, aber dieser syntaktische Zucker kompiliert sich in einen tatsächlichen IL-Code, der, wenn er dekompiliert wird , würde gleichbedeutend mit einer Reihe von IEnumerable [<T>] s aussehen, die miteinander verbunden sind. Das Zeug ist faul und verwendet Enumeratoren, die in anderen Sprachen als Iteratoren bezeichnet werden. Aber ja, das Problem ist, dass LINQ das Codieren einfach macht und die Unqualifizierten es versuchen. Einige könnten vielleicht noch zu anständigen Programmierern werden. Wenn C # ihre Muttersprache ist und sie total noobs sind, dann haben sie es mit einer großen Sprache zu tun.
Job
Sicher, Linq to Objects (nicht Linq to SQL, Linq to Entities, Linq to DataSet oder ein anderer Zweig von Linq) basiert auf Iteratoren und verzögerter Ausführung, aber das ist alles unter der Haube. Iteratorblöcke und die yieldAnweisung existierten vor Linq, ebenso wie Delegierte. Closures wurden in derselben Version wie Linq ausgeliefert, aber nur wenige reine "Linq" -Operationen erfordern tatsächlich die Erfassung lokaler Variablen. Fragen zu "Wie kann ich [Beschreibung der vollständig iterativen Operation / Funktion] mit Linq ausführen?" Verrät eine tiefe Unkenntnis sowohl von Linq selbst (was es tun soll) als auch der Sprache selbst.
Aaronaught