Linq sta avendo un effetto strabiliante sui programmatori .NET?


36

Molti di noi hanno iniziato a vedere questo fenomeno con jQuery circa un anno fa, quando le persone hanno iniziato a chiedere come fare cose assolutamente folli come recuperare la stringa di query con jQuery . La differenza tra la libreria (jQuery) e il linguaggio (JavaScript) è apparentemente persa su molti programmatori e si traduce in un sacco di codice inappropriato e contorto che viene scritto dove non è necessario.

Forse è solo la mia immaginazione, ma giuro che sto iniziando a vedere un aumento del numero di domande in cui le persone chiedono di fare cose altrettanto folli con Linq, come trovare intervalli in un array ordinato . Non riesco a capire quanto siano inopportune le estensioni di Linq per risolvere quel problema, ma soprattutto il fatto che l'autore abbia semplicemente supposto che la soluzione ideale avrebbe coinvolto Linq senza pensarci (per quanto ne so). Sembra che stiamo ripetendo la storia, generando una nuova generazione di programmatori .NET che non sanno distinguere tra il linguaggio (C # / VB.NET) e la libreria (Linq).

Qual è il responsabile di questo fenomeno? È solo hype? Tendenze gazza? Linq ha guadagnato una reputazione come una forma di magia, dove invece di scrivere effettivamente il codice devi solo pronunciare l'incantesimo giusto? Non sono soddisfatto di queste spiegazioni, ma non riesco davvero a pensare ad altro.

Ancora più importante, è davvero un problema e, in tal caso, qual è il modo migliore per aiutare a illuminare queste persone?


6
+1 per "ipotizzato che la soluzione ideale coinvolgesse Linq senza pensarci davvero". È davvero oltre me.
Jaco Pretorius,

1
Linq è lento ...

2
@Pierre: su quale base fai questa affermazione?
Aaronaught,

5
@Mason: Questo è un punto di riferimento assolutamente orribile scritto da qualcuno che chiaramente non sa cosa sta facendo. Benchmarking nelle zecche? Notazione ungherese? E la versione di Linq non fa nemmeno la stessa cosa, cerca di iterare ogni singolo risultato invece di fermarsi al primo. Per non parlare, l'intera premessa è sciocca, come è stato discusso in modo conciso nella domanda calda di oggi .
Aaronaught,

3
E, per inciso, @Mason, Linq ha molte ottimizzazioni integrate. Per quasi tutti i metodi che possono essere ottimizzati, cerca innanzitutto un'interfaccia che supporti il ​​metodo ottimizzato. Per altri metodi basati su set come equijoin, crea tabelle hash. Non ottimizza il codice per te, ma non rallenterà neanche il codice; la maggior parte degli effettivi rallentamenti documentati nel mondo reale sono dovuti a lambda / chiusure indipendenti da Linq.
Aaronaught,

Risposte:


52

È fondamentalmente perché la programmazione è fondamentalmente difficile. Richiede un sacco di pensiero logico e strutturato in un modo che molte persone semplicemente non sanno come fare. (O semplicemente non puoi farlo, a seconda di chi ascolti.)

Cose come LINQ e jQuery rendono molto più semplici alcune attività comuni di manipolazione dei dati. È fantastico per quelli di noi che sanno cosa stiamo facendo, ma lo sfortunato effetto collaterale è che abbassa la barra. Rende più facile per le persone che non hanno idea di quello che stanno facendo iniziare a scrivere codice e far funzionare le cose. E poi quando si imbattono nella realtà e trovano qualcosa di fondamentalmente difficile a cui le loro tecniche semplici e di alto livello di astrazione non sono adatte, si perdono, perché non capiscono la piattaforma su cui è costruita la loro biblioteca.

La tua domanda è un po 'sulla buona strada, ma proprio come la polemica perenne sui videogiochi violenti "che trasformano i bambini violenti", ha la direzione del collegamento all'indietro. Le semplici tecniche di programmazione non rendono stupidi i programmatori; attraggono solo persone stupide alla programmazione. E non c'è davvero molto che puoi fare al riguardo.


30
+1 per "Le semplici tecniche di programmazione non rendono stupidi i programmatori, ma attraggono semplicemente persone stupide alla programmazione".
Steven Evers,

1
Una cosa grandiosa di LINQ è che mi permette di prototipare una soluzione in un approccio funzionale. Quindi, una volta che ho una soluzione priva di bug, posso usarla come banco di prova per una versione imperativa ottimizzata. Se l'attività è abbastanza semplice come applicare un singolo filtro, non mi preoccuperò nemmeno.
ChaosPandion,

5
Dubito ancora che LINQ attiri programmatori incompetenti - da quello che ho visto, sembra essere uno dei concetti più difficili da comprendere per i neofiti - ma questa sembra essere la risposta migliore finora.
Aaronaught,

1
Dovresti mettere un copyright su quest'ultima frase. Ben detto, signore.
AJ Johnson,

1
Divertente. Per me, LINQ non è un concetto particolarmente facile da padroneggiare. Se stai facendo qualcosa di sottile, molto rapidamente devi smettere di pensare al volante e iniziare a capire la trasmissione. Ti sto guardando, lama!
Brian MacKay,

13

Per me è il nuovo fenomeno dei giocattoli. Viene fuori qualcosa di nuovo (LINQ) e ora tutti gli sviluppatori vogliono giocarci.

Vedono LINQ come un martello e ogni problema è un chiodo. A chi importa se è più semplice farlo in un altro modo? LINQ deve essere la risposta! Come quando tutti usavano XML per TUTTO! File di configurazione? XML. Memorizzazione dei dati? XML. Ecc. Ecc


5
Non voler iniziare un dibattito XML qui, ma vale la pena sottolineare che XML è effettivamente bravo in entrambe queste cose. Non è sempre ottimale : se i file di configurazione non devono essere strutturati, i KVP sono migliori e se la compatibilità tra applicazioni non è un requisito, un formato binario è chiaramente migliore per l'archiviazione / serializzazione. Ma non credo che l'XML sia un ottimo esempio perché tendeva a trovarsi ad essere utilizzato in aree in cui era semplicemente non ottimale anziché totalmente inappropriato.
Aaronaught,

4
+1: vale la pena allungare i tuoi strumenti per vedere quanti problemi possono essere pestati a forma di unghia quando stai imparando una tecnologia.
Steven Evers,

+1: Altri esempi di questo tipo di martello magico sono jQuery (come menzionato nella domanda) ed espressioni regolari. Non che queste cose siano cattive, in realtà sono davvero utili, ma non sono la risposta a tutto.
Tim Goodman,

14
Penso che l'analogia "LINQ sia un martello e ogni problema è un chiodo" lo sta spingendo un po 'troppo lontano. Direi che LINQ è un martello così buono che quando una grande parte del tuo lavoro comporta chiodi, puoi entrare in una scanalatura e non notare che hai appena martellato in una vite. Anche se non sei un cattivo programmatore.
Carson63000,

@Aaronaught: D'altra parte, l'uso di XML con nomi di campi lunghi mi è sembrato non ottimale per la trasmissione di dati attraverso collegamenti radio a bassa larghezza di banda e non del tutto affidabili. Poi di nuovo, è anche quello che ho pensato della progettazione del database su quel prodotto.
David Thornley,

10

Penso che LINQ offra davvero un'ottima opportunità in C # per risolvere i problemi usando un approccio più funzionale. Non dovremmo respingere un nuovo stile di problem solving solo perché abbiamo già qualcosa che funziona.

Proveniente da un intenso background SQL, mi piace avere la possibilità di utilizzare la logica basata su set nel mio C # per descrivere meglio l'intento delle mie operazioni.

Detto ciò; il contesto è re e tutto può essere abusato.


Chi sta licenziando? Uso Linq tutto il tempo, sono solo preoccupato per il numero di incidenti che vedo delle persone che lo usano (o tentano di usarlo) per problemi che sono chiaramente iterativi e non basati sul set.
Aaronaught,

Sono molto abituato a provare a risolvere i problemi che sono stati richiesti per essere scritti in SQL, e per usare la logica basata su set anziché i cursori. L'abuso di strumenti accadrà sempre, ma suppongo che almeno scrivendo un codice LINQ scadente anziché un codice procedurale scadente, una versione successiva di .NET sarà almeno più facilmente in grado di parallelizzarlo.
dotjosh,

2

LINQ e jQuery sono gli ultimi "giocattoli" e gli sviluppatori adorano mostrare come possono fare cose usando le ultime novità.


Sono d'accordo con questa affermazione. Non sono così sicuro che spieghi questo particolare fenomeno. Le persone che fanno queste domande non sembrano davvero essere i tipi di show-off - anche se aiuterebbe a spiegare perché altri programmatori provano a rispondere alle domande come poste invece di sostenere un approccio più sano.
Aaronaught,

@Aaronaught - Sì, immagino stavo pensando di più al perché le persone rispondono alle domande usando questo approccio.
Dan Diplo,

2

Se usi Linq correttamente e lo capisci sotto il cofano, troverai ogni sorta di nuove tecniche di programmazione all'avanguardia.

Quindi, se pensi profondamente ai miglioramenti, sostengo che ti rende un programmatore migliore. Che un determinato programmatore lo faccia o meno, non è colpa di Linq.

Lo stesso argomento può essere fatto per i mappatori relazionali di oggetti. Qualcuno scrive davvero query SQL non elaborate su tabelle di database? :)


10
Ehi, scrivo SQL grezzo ... annusa
Aaronaught,

2
Raw SQL è la soluzione migliore se sai cosa stai facendo.
Fosco,

1
+1 per l'argomento "ti rende un programmatore migliore". Comprendere linq e soprattutto i metodi che lo supportano ha sicuramente migliorato la mia comprensione di alcuni concetti di programmazione molto utili.
John M Gant,

1
Penso che qualcuno abbia offeso l'ORM rispetto al commento SQL non elaborato. Non sono stato io; Uso entrambi, e ho capito che l'osservazione è ironica.
Aaronaught,

1
Non mi fiderei mai delle mie complesse query di database sulla merda che scrive un ORM, va bene per cose semplici, ma è sufficiente per segnalare query di tipo. Ancora una volta, nelle mani di qualcuno che sa cosa stanno facendo gli ORM è una buona cosa, nelle mani di qualcuno che è troppo pigro per capire i database, il disastro che ci aspetta.
HLGEM,

1

Alcune di queste cose folli sono perché le persone usano il martello sbagliato, altre perché stanno costruendo un super-martello davvero elegante, ma si sono imbattute in un dettaglio strano che deve essere superato.

Ad esempio, se vedi una domanda sull'utilizzo di linq per generare linq dinamico da usare contro linq non dinamico nove volte su dieci, la persona è o semplicemente curiosa di sapere se è possibile, o abbaia l'albero sbagliato, ma ci sono alcuni cose che puoi risolvere in questo modo che sono difficili al punto da irragionevole da risolvere altrimenti.

Prendo questo tipo di domande in due parti:

  1. può essere fatto, e in tal caso come sarebbe
  2. in caso affermativo, esiste un rischio o un'alternativa migliore

Ho scoperto che li faccio quasi sempre in quell'ordine. Risponde alla domanda e ti aiuta anche a fare una spiegazione migliore per potenziali alternative.


0

Non conosco alcun effetto paralizzante sulle menti degli sviluppatori, ma dai un'occhiata qui per l'effetto di strumenti / linguaggi intorpiditi sulle tariffe. Parla di abbassare la barra!


0

Sono d'accordo con Mason Wheeler. Tuttavia, non è del tutto folle cercare di risolvere https://stackoverflow.com/questions/3762202/get-range-of-integers-with-linq operando su una "sequenza". Il problema è che gli iteratori di Java e .Net non supportano tutte e 3 le operazioni: valore corrente, valore successivo e passaggio a successivo. Clojure può fare tutti e 3, e sospetto che in Clojure sia più facile farlo bene. Python ha anche delle routine condivise e voglio provare a risolverlo. http://clojure.org/sequences http://www.try-clojure.org/

In effetti, se l'input è una sequenza infinita, come http://oeis.org/A007401 , allora pigro è l'unico modo.


"Linq" non significa necessariamente "iteratori" né "pigro" - in effetti, la maggior parte di Linq riguarda in realtà alberi delle espressioni. Se lo desideri, puoi facilmente implementare il tuo aggregato a 3 o N valori con una chiusura e non molto codice in C #. Il problema arriva quando le persone non hanno idea di come farlo realmente, o anche di come iniziare, e stanno solo cercando un incantesimo magico che vive nello System.Linqspazio dei nomi.
Aaronaught il

@Aaronaught ... '' '"Linq" non significa "iteratori" né "pigro" necessariamente' '' - beh, Linq può sembrare SQL ma questo zucchero sintattico si compila in un vero codice IL, che, se decompilato , sembrerebbe equivalente a un gruppo di IEnumerable [<T>] collegati insieme. Quella roba è pigra e usa gli enumeratori, che in altre lingue sarebbero chiamati iteratori. Ma sì, il problema è che LINQ rende la codifica semplice e non qualificata la prova. Alcuni potrebbero ancora diventare programmatori decenti forse. Se C # è la loro prima lingua e sono un totale noob, allora hanno a che fare con una lingua di grandi dimensioni.
Giobbe

Certo, Linq to Objects (non Linq to SQL, Linq to Entities, Linq to DataSet o qualsiasi altro ramo di Linq) si basa su iteratori ed esecuzioni differite, ma questo è tutto. I blocchi di Iteratore e l' yieldistruzione esistevano prima di Linq, così come i delegati. Le chiusure arrivarono nella stessa versione di Linq, ma poche operazioni "Linq" pure in realtà richiedono l'acquisizione di variabili locali. Chiedere "Come posso fare [descrizione dell'operazione / funzione interamente iterativa] con Linq?" tradisce una profonda ignoranza sia dello stesso Linq (cosa si intende fare) sia del linguaggio stesso.
Aaronaught,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.