Perché l'uso delle astrazioni (come LINQ) è così tabù? [chiuso]


60

Sono un appaltatore indipendente e, come tale, intervisto 3-4 volte all'anno per nuovi concerti. Sono nel bel mezzo di quel ciclo e sono stato rifiutato per un'opportunità, anche se ho sentito che l'intervista è andata bene. La stessa cosa mi è successa un paio di volte quest'anno.

Ora, non sono un ragazzo perfetto e non mi aspetto di essere adatto per ogni organizzazione. Detto questo, la mia media in battuta è inferiore al solito, quindi ho cortesemente chiesto al mio ultimo intervistatore un feedback costruttivo e mi ha dato!

La cosa principale, secondo l'intervistatore, era che mi sembrava troppo incline all'utilizzo delle astrazioni (come LINQ) piuttosto che agli algoritmi di livello inferiore, coltivati ​​biologicamente.

In apparenza, questo ha un senso - in effetti, ha anche avuto senso anche gli altri rifiuti, perché ho parlato di LINQ anche in quelle interviste e non sembrava che gli intervistatori sapessero molto di LINQ (anche se erano .NET ragazzi).

Quindi ora mi rimane questa domanda: se dovremmo essere "in piedi sulle spalle dei giganti" e usare le astrazioni a nostra disposizione (come LINQ), allora perché alcune persone lo considerano così tabù? Non ha senso estrarre il codice "dallo scaffale" se raggiunge gli stessi obiettivi senza costi aggiuntivi?

Mi sembra che LINQ, anche se è un'astrazione, è semplicemente un'astrazione di tutti gli stessi algoritmi che uno scriverà per ottenere esattamente lo stesso fine. Solo un test delle prestazioni potrebbe dirti se il tuo approccio personalizzato era migliore, ma se qualcosa come LINQ ha soddisfatto i requisiti, perché preoccuparsi di scrivere le tue classi in primo luogo?

Non intendo concentrarmi su LINQ qui. Sono sicuro che il mondo JAVA ha qualcosa di paragonabile, vorrei solo sapere perché alcune persone si sentono così a disagio con l'idea di usare un'astrazione che loro stessi non hanno scritto.

AGGIORNARE

Come ha sottolineato Euphoric, non c'è nulla di paragonabile a LINQ nel mondo Java. Quindi, se si sta sviluppando nello stack .NET, perché non provare sempre a utilizzarlo? È possibile che le persone non capiscano completamente cosa fa?


8
Penso che tu non sappia cosa sia l'astrazione, perché LINQ non ha nulla a che fare con esso.
Euforico

8
"Sono sicuro che il mondo JAVA abbia qualcosa di paragonabile" In realtà, LINQ è una delle poche cose che .NET ha e Java no.
Euforico

42
@ Euphoric - Does LINQ non astratta via il lavoro più basso livello di attività quali l'ordinamento e filtraggio per esempio? Sono abbastanza sicuro che ci sarebbe del codice aggiuntivo dietro objectCollection.Where(oc=>oc.price > 100)per esempio. Non sarebbe un uso di un'astrazione? Forse puoi dirmi cosa mi sto perdendo qui. . .
Matt Cashatt,

37
C'è sempre la possibilità che non capiscano LINQ e non vedano il valore nell'apprenderlo. Gli aspetti funzionali della scrittura sono molto diversi dalla programmazione imperativa. Come appaltatore ho visto nel 2009 sviluppatori Java "senior" che non capiscono abbastanza SQL per scrivere query avanzate, quindi passano settimane a ottimizzare il codice che porta tutti i dati sul lato Java e li filtra con codice Java invece di avere il database lo sta facendo. L'ignoranza dilaga nel settore dello sviluppo del software.

18
Se capisci LINQ ma i tuoi intervistatori no, sei meglio di loro. Metti gli occhi più in alto.
Jay Bazuzi,

Risposte:


74

Non credo sia discutibile l'uso di astrazioni in sé. Ci sono altre due possibili spiegazioni. Uno è che le astrazioni perdono tutte una volta o l'altra. Se dai l'impressione, corretta o no, di non comprendere i fondamenti di base, ciò potrebbe riflettersi male in un'intervista.

L'altra possibile spiegazione è l'effetto fanboy. Se parli eccitato di LINQ e lo riproponi ripetutamente in un'intervista con una società che non lo utilizza e non ha in programma di farlo, ciò dà l'impressione che non saresti soddisfatto o addirittura scontento di lavorare con le tecnologie più vecchie. Può anche dare l'impressione che il tuo entusiasmo per un prodotto ti abbia reso cieco alle alternative.

Se veramente pensi che sarebbe felice in un negozio non LINQ, prova a chiedere a quello che fanno uso, e adattare le risposte di conseguenza. Mostra loro che, mentre preferisci LINQ, sei competente usando tutti gli strumenti a tua disposizione.


4
@MatthewPatrickCashatt Non è possibile eseguire modifiche e continuare nel debugger all'interno di metodi contenenti istruzioni linq. Non è abbastanza un bivio che non lo uso; ma è stato il motivo principale per cui ho esitato a farlo per un po '.
Dan Neely,

3
+1, in particolare per il secondo paragrafo. Si applica totalmente a me, dal momento che sarei completamente infelice a lavorare su un codice C # senza essere in grado di utilizzare LINQ.
Arseni Mourzenko,

5
C'è anche il fatto che c'è spesso un colpo di prestazione oltre all'astrazione che perde. Stai scambiando facilità d'uso per la precisione e quella perdita di precisione spesso include dettagli che renderebbero le cose più veloci. E più ti allontani dalla fonte, più dettagli perdi e maggiore è la probabilità che tali dettagli siano importanti per le prestazioni.
jmoreno,

6
+1 ma può funzionare anche nell'altro modo. Se qualcuno mi dice che non mi ha assunto perché uso Yacc per costruire parser invece di lanciare il mio, allora non è un posto in cui voglio lavorare comunque.
Spencer Rathbun,

5
@MatthewPatrickCashatt: questa risposta (e il mio commento su di essa) non sono specifici di LINQ, ma dichiarazioni generali. Ma per LINQ, ecco un estratto da C # 4.0 / 5.0 in breve, che parla di problemi di prestazioni con LINQ. Torna alle generalità: in molti casi il colpo di prestazione ne varrà la pena, il 5% +/- è irrilevante. Ma a volte sarà più grande e a volte anche l'1% è inaccettabile. Se non pensi che ci possa mai essere un problema, o che la performance è solo per aziende come Google ....
jmoreno,

29

Ad alcuni programmatori .NET, in particolare quelli che provengono da un classico VB / ASP o da uno sfondo C ++, non piacciono le novità come LINQ, MVC ed Entity Framework.

Sulla base di ciò che ho osservato, è probabile che gli ex VB di questo gruppo utilizzino ancora livelli di accesso ai dati e altro codice originariamente scritto più di 10 anni fa. Utilizzeranno anche vecchie parole d'ordine come "n-tier" e simili e non capiranno davvero nulla di tutto oltre a .NET Framework 2.0 né vogliono imparare nulla al riguardo.

Gli utenti del C ++ tendono ad essere programmatori orientati al mondo accademico che adorano codificare algoritmi interessanti, anche se ciò significa reinventare la ruota. Odiano a seconda di tutto ciò che non hanno scritto a mano. Alcune di queste persone si divertono anche a far sentire gli intervistati inferiori, specialmente quelli con un background meno tradizionale.

Probabilmente ti imbatterai in organizzazioni come questa quando intervisterai. Ma incontrerai anche alcuni che stanno usando metodi più recenti. Non lasciarti sfuggire alcune cattive interviste.


2
Grazie Jfrankcarr. Sospettavo che potesse essere così: c'erano domande sull'apertura e sulla chiusura datareaders!
Matt Cashatt,

2
+1 per chiamare MVC "novità". Mi ha fatto ridere ad alta voce. È in circolazione dagli anni '70. Forse intendevi MVVM che è essenzialmente MVP (una variante MVC) che utilizza i binding.

14
@ GlenH7 Penso che sia chiaro dal contesto che intendesse il prodotto "ASP.NET MVC", non il concetto base di Model-View-Controller.
Carson63000,

4
@ GlenH7 - Stavo parlando interamente nel contesto della linea di prodotti .NET e Visual Studio e delle parole d'ordine dei prodotti Microsoft.
jfrankcarr,

6
Buon Dio, ci sono davvero negozi che pensano a Linq come "nuovo"? È in circolazione da oltre 4 anni. Riesco a capire di non aver incontrato i camerieri delle attività, o l'uso di dynamic/ ExpandoObject/ ecc., O di non preoccuparmi di Azure e di tutte le altre cose del cloud ... Posso persino capire che continuando a usare la vista WebForms vecchia scuola motore in MVC o Web Form stesso, o scrivere codice WPF / WinRT senza MVVM ... ma Linq? Se non l'hai ancora capito, è ora di lasciare il tuo lavoro come sviluppatore .NET.
Aaronaught,

16

Microsoft ha una lunga storia di nuove tecnologie accese e di dimenticarsene dopo 5, 10 o 20 anni. LINQ potrebbe apparire come un altro per alcune persone. Noteranno che Microsoft non può deprecare SQL, ma LINQ potrebbe seguire Silverlight . Quindi potresti vedere la paranoia derivante da una dura esperienza, o solo persone che sono state lasciate indietro dalla tecnologia moderna e che si risentono.


12
Onestamente, mentre vedo il punto fondamentale, non penso che Linq se ne andrà presto. Linq2SQL, sì, l'hanno deprecato a favore dell'EF molto più potente. Ma Linq stesso è il fondamento di tante altre splendide novità nelle ultime 3 versioni di .NET che se lo avessero deprecato, avrebbero annullato metà della loro nuova tecnologia a livello di persistenza come Azure ed EF, per non parlare di paralizzare praticamente ogni ORM là fuori e un sacco di elaborazione di elenchi in memoria oltre.
KeithS

6
aspetta ... "terrorizzato all'allontanamento dalla vecchia tecnologia obsoleta, perché funziona" ... WTF. Siamo arrivati ​​al punto in cui le cose di lavoro che sono provate, testate, comprensibili e mantenibili e mature non sono buone.
gbjbaanb,

7
@ gbjbaanb - No. Ma, come aneddoto, vorresti che un medico diagnostichi i tuoi dolori al petto con una radiografia del torace perché quel metodo è "provato, testato, comprensibile" o vorresti una risonanza magnetica che è più recente, ma viene fornito con una risoluzione più elevata , prognosi migliore e maggiori informazioni? Nessuno sta dicendo di allontanarsi dai principi classici qui; piuttosto il contrario. Vedete, LINQ (come esempio) è basato su questi principi. Penso che, come altri hanno già detto, è l'apprendimento delle parti che rendono LINQ ed è l'uso corretto che causa i momenti 'WTF' come i tuoi.
Matt Cashatt,

2
@MatthewPatrickCashatt: dipende, se il medico non è stato addestrato a leggere i risultati della risonanza magnetica, prenderei la radiografia piuttosto che indovinarlo a una diagnosi. Se mi ammalassi in una zona arretrata, preferirei avere un medico in grado di diagnosticare nient'altro che uno stetoscopio piuttosto che essere in grado di farcela senza il massimo degli ultimi strumenti.
gbjbaanb,

2
@MatthewPatrickCashatt Capisco il tuo punto, ma un fattore di bilanciamento è che non vuoi seguire ogni tendenza solo perché è più recente. Seguirò felicemente una nuova tecnologia che rientra in una di due categorie. 1. Mi entusiasma e sono disposto a passare il mio tempo libero su di esso. 2. Si dimostra effettivamente migliore e sembra che durerà abbastanza a lungo da far valere l'investimento. Le tendenze che non rientrano in una delle due categorie sono al massimo una scommessa.
TimothyAWiseman il

15

Non ha senso estrarre il codice "dallo scaffale" se raggiunge gli stessi obiettivi senza costi aggiuntivi?

C'è sempre un costo aggiuntivo.

La curva di apprendimento per roba pronta all'uso è sempre lì. Il dolore di ottenere aggiornamenti (e dipendenze) è sempre lì. L'incapacità di rovinare le budella è sempre lì.

Per LINQ, il primo vale davvero. Molte persone considerano il codice dall'aspetto "strano" come difficile da leggere e più difficile da eseguire il debug. La sintassi di tipo sql è praticamente persona-non-grata ogni concerto professionale da cui lavoro da quando è uscito. LINQ to SQL (e altre origini dati) hanno un numero di gotcha e opzioni di ottimizzazione limitate.

Questi sono gli argomenti generali contro strumenti di terze parti e LINQ in particolare. Detto questo, LINQ è uno strumento dannatamente utile e dovrebbe essere preferito nella maggior parte delle situazioni. Piangere non inventato qui, e le astrazioni non dovrebbero essere favorite in modo forte rispetto alla dissonanza cognitiva .

Non sanno / non possono imparare LINQ, ma sono "ovviamente" buoni sviluppatori, quindi LINQ non deve valerne la pena. È una trappola comune.


1
Punti buoni. Concordare i costi che menzioni ed è un buon chiarimento. Più in generale, tuttavia, lo sviluppo di classi locali con cui nessun nuovo dipendente può avere familiarità perché non esiste al di fuori dell'organizzazione presenta le stesse sfide oltre al costo dello sviluppo primario.
Matt Cashatt,

2
@MatthewPatrickCashatt - Oh assolutamente. Quel codice coltivato in casa dovrebbe quindi quasi sempre essere uno sforzo maggiore per la stessa vittoria, ma non lo è necessariamente. Come molte altre cose, il costo / premio dovrebbe essere stimato e la migliore pratica preferita , non seguita alla cieca.
Telastyn,

@Telastyn Anche il codice cresciuto in casa è bello poiché sai cosa fa e puoi risolverlo in un attimo. Inoltre, puoi ottimizzare per circostanze specifiche in base al tuo utilizzo, non alla media di tutti.
Hawken,

13

Qualcos'altro che dovresti considerare è che il tuo entusiasmo per una nuova tecnologia interessante può semplicemente far sentire le persone a disagio e non volerti intorno. Non li stai "potenziando", perché sei tu che conosci questa tecnologia, non loro. Anche se loro stessi non se ne rendono conto, potrebbero cercare candidati in grado di rafforzare ciò in cui hanno già investito così tanto tempo.

Vuoi presentare un atteggiamento che dice "Qualunque cosa tu stia facendo, voglio aiutarti a raggiungerlo", piuttosto che dare un sottotesto che dice "Potresti fare le cose in modo cattivo, e avere me in giro dimostrerà esso ".


+1 - oltre a dire loro quello che sai, chiedi loro cosa stanno facendo e in cosa si specializzano.
Kirk Broadhurst,

12

La mia opinione su questo (e TBH indovino perché nessuno di noi può dire cosa pensavano quegli intervistatori) è che spesso vai a un'intervista per spiegare perché dovrebbero assumerti per adattarsi alla loro squadra, al loro modo di lavorare .

Puoi essere lo sviluppatore perfetto, un dio del codice di partenza rock, ma ciò non significa assolutamente nulla se ciò che vuoi fare (enfatizzato da te parlando in modo eccessivo e troppo entusiasta di alcune gubbin tecnologiche interessanti) semplicemente dice loro di te, e che non lo faresti adattarsi a ciò che vogliono. Se hanno un sistema di accesso ai dati vecchio stile, che non può essere aggiornato per nessun motivo, non hanno bisogno di qualcuno che abbia dimenticato come mantenerlo. Se stanno sviluppando nuove cose e vuoi davvero mettere questa nuova fantastica tecnologia ovunque, allora è ovvio che avranno un grosso problema con la futura manutenzione del codice e / o la formazione del personale.

Come libero professionista, questo è molto più un problema che se assumessero un permesso. Con un permesso, la formazione e lo sviluppo di nuovi modi di lavorare non sono cose cattive, nell'ambito del codice e delle pratiche esistenti: rimarrai lì a lungo per migliorare le cose. Con un libero professionista, in realtà non danno uno spasso quello che vuoi, sei lì solo per fare il loro lavoro nel modo in cui lo desiderano, e non è il tuo lavoro fare altro. (non sono d'accordo - diventa un dipendente permanente)

Probabilmente non ha nulla a che fare con LINQ stesso, ho rifiutato un candidato che si è presentato e ha spiegato quanto sarebbe stato meglio scrivere tutto in Haskell. Non facciamo Haskell. Lo stesso vale per qualsiasi tecnologia che non viene utilizzata dalla società, di solito non è un problema se lo menzioni come qualcosa di buono. Il problema sorge quando sei troppo entusiasta e appassionato.


2
Sono d'accordo con questo, ma ho notato molte più persone che usano questo atteggiamento per respingere buone idee che semplicemente non capiscono (ad esempio test, schemi di progettazione, ORM). Quindi, anche se concordo sul fatto che essere una buona scelta per la squadra è una buona cosa, è importante rendersi conto che potresti essere migliore del resto della squadra e che dovresti trovare persone affini dove non è male conoscere bene astrazioni.
Wayne Molina,

1
@WayneM certo, ma l'OP è un libero professionista, quindi non importa davvero se è un dio programmatore, a meno che non siano pronti ad assumerlo in modo permanente per mantenere il codice che il resto della squadra non capisce (hmm) quindi ha bisogno di fare quello che vogliono, non quello che vuole.
gbjbaanb,

1
@WayneM allo stesso modo molte persone userebbero qualcosa di simile a quello che hai appena detto per promuovere le loro idee su quelle di qualcun altro (essere fiduciosi che con chi parlano semplicemente non capiscono). Alla fine entrambe le parti sono di parte, ma l'OP sta per essere assunto, non per vincere la grande guerra del fai-da-te / astrazione. Ognuno avrà la propria opinione, ma qualcuno dovrà superarla; Immagino che non sarà il datore di lavoro in questo caso. :(
Hawken,

10

C'è una preoccupazione valida che ho sentito da coloro che non usano Linq, ed è una che mi viene in mente: "Solo perché non puoi vedere l'implementazione non significa che non sia costoso".

Prendi il frammento seguente:

var resultList = inputList.Where(i=>otherInputList.Count(o=>o.Property == i.OtherProperty) > 0);

I LINQ avviati qui sono il cringing. Perché? Perché solo perché questo codice sembra carino ed elegante non significa che non sia terribilmente inefficiente. Count (), con un predicato, valuta ogni elemento del suo enumerabile padre e riassume le volte in cui il predicato è tornato vero. Quindi, non è solo questo N ^ 2 (quando inputList e otherInputList sono di cardinalità N approssimativamente uguale), è il caso peggiore in assoluto N ^ 2; OGNI elemento di otherInputList viene attraversato per OGNI elemento di input. Invece, il primo passo è usare Any () invece di Count, perché è proprio quello che vuoi sapere, e si chiuderà non appena la risposta sarà "sì". L'impostazione di un HashSet che memorizza valori distinti otherInputListObject.OtherPropertypotrebbe essere d'aiuto; l'accesso diventa O (1) anziché O (N),complessità nel caso peggiore anziché complessità quadratica nel caso migliore .

Quindi vediamo che questi bei metodi eleganti hanno costi seri dietro di loro, e se non sai quali sono questi costi, puoi facilmente codificare un algoritmo di complessità O (mio GD) nel file server centrale ad alte prestazioni del tuo potenziale datore di lavoro o alla pagina del portale di destinazione principale la prossima volta che potrebbero aver bisogno di una modifica. Licenziarti dopo aver fatto ciò non annulla quello che hai fatto, ma non assumerti se pensano che lo faresti lo impedirebbe. Quindi, per evitare questo, devi dimostrare che si sbagliano; discutere cosa fanno questi metodi (nel senso che devi conoscere te stesso) e la loro complessità, e come arrivare alla risposta in un tempo efficiente (NlogN o migliore).

Un'altra preoccupazione è il buon vecchio argomento "Quando il tuo unico strumento è un martello". Mettiti al posto dell'intervistatore intervistando questo fan di Linq. Al candidato piace Linq, vuole usarlo, pensa che sia la cosa migliore di sempre. Potrebbe anche sembrare che il candidato non possa codificare senza di esso, poiché ogni problema di programmazione fornito è stato risolto con Linq. Bene, cosa succede quando non può essere utilizzato? Un sacco di codice .NET 2.0 è ancora là fuori, che se fosse aggiornato richiederebbe dolorosi aggiornamenti a server, stazioni di lavoro degli utenti, ecc. Ecc., In modo da poter usare i tuoi fantasiosi metodi di estensione. Come intervistatore, proverei a farti mostrare che potresti codificare un ordinamento efficiente o utilizzare i metodi di ordinamento 2.0 se dovessi, non importa quanto potrei essere d'accordo con te sul fatto che le librerie Linq e metodi di estensione simili sono piuttosto dolce. Un intervistatore che non vede il punto potrebbe non preoccuparsi nemmeno di farti mostrare attitudine per qualsiasi altra cosa; presumeranno che tu non ce l'abbia e andranno avanti.


Perché non dovresti semplicemente scrivere la tua domanda come var resultList = inputList.Select(i=>i.Property).Intersect(otherInputList.Select(o=>o.Property));? Avrei potuto sbagliare, ma il mio punto è che LINQ ha modi migliori di eseguire la query di cui sopra (.Join () è un altro modo). Mi rendo conto che ci sono modi per utilizzare LINQ che potrebbero non essere altrettanto efficaci di altri modi, ma ciò non significa che devi fare affidamento su quelle cattive implementazioni.
Matt Cashatt,

4
@MatthewPatrickCashatt Non credo che il suo punto sia così tanto da sostenere che LINQ sia sempre inefficiente - mentre puoi sempre battere una determinata query LINQ, alcuni usi offrono prestazioni migliori per ora-sviluppatore rispetto a molti approcci non LINQ. Piuttosto, può essere relativamente facile scrivere una query LINQ che è inefficiente e non realizzarla, perché le inefficienze non sono così palesi.
Jon Hanna,

3
@JonHanna: Forse più precisamente, il valore di un'astrazione è notevolmente ridotto se si deve esaminare quale codice sta "realmente facendo" per determinare quali scenari insoliti ma plausibili potrebbero rendere le prestazioni di molti ordini di grandezza peggiori del previsto. Se il passaggio da una struttura di dati a un'altra causerà l'esecuzione di un codice 10.000 volte più lento, la possibilità di apportare tale modifica senza alterare qualsiasi altro codice potrebbe non essere sempre una buona cosa.
supercat

1
@supercat: sì e no. Solo perché la conoscenza di come viene fatto qualcosa in un'implementazione di terze parti è fondamentale per comprendere le implicazioni delle prestazioni ed evitare inefficienze, non significa che le librerie che incapsulano questi strumenti abbiano meno valore. Sono due facce della stessa medaglia; conoscere la natura dell'implementazione e puoi usarla con pochi tasti invece di un'ora a rotazione. Ma devi conoscere entrambe le parti e lo stereotipo del fan di Linq che pensa che sia perfetto, niente di sbagliato, usalo per tutto ciò che probabilmente non lo fa.
KeithS

@KeithS: Una cosa che ritengo che manchi molto in Java e .net è un mezzo standard per chiedere a oggetti o raccolte varie cose su se stessi. Ad esempio, il codice che riceve una raccolta enumerabile potrebbe trarre vantaggio dal sapere se il numero di articoli e / o la sequenza di articoli esistenti potrebbero mai cambiare, se il numero di articoli è noto come finito o infinito (o non noto in entrambi i modi), e se la collezione sa intrinsecamente quanti elementi ci sono. Tecnologie come LINQ spesso devono fare ipotesi su cose che possono o non possono essere corrette, e ...
supercat

10

Questo è diventato un po 'lungo, ma potrebbe essere utile a qualcuno, quindi lo lascerò.

In realtà ho incontrato qualcosa di simile, passando attraverso poco più di 20 interviste il mese scorso (un mix di telefono e faccia a faccia). Sicuramente stava succedendo qualcosa di inaspettato che non riuscivo a capire.

Una delle cose che ho notato è che le cose che di solito sono state il punto centrale dei cicli di intervista degli ultimi cinque o sei anni non sono state decisamente discusse o concesse a breve termine. Cose come i fondamenti di analisi / progettazione OOP, modelli (sia di progettazione che architetturali), alcune delle funzionalità .net più avanzate / orientate all'astrazione (inclusi lambda o LINQ in particolare, generici, serializzazione / associazione dati e simili), e persino il argomento solitamente caldo della metodologia preferita (a nessuno sembrava interessarsi molto dell'agile vs waterfall o del tipo di agile) e degli strumenti o della scelta di ORM o dei mezzi preferiti di collaborazione o gestione del controllo delle fonti. In alcuni casi non menzionato affatto, in quasi tutti i casi apparentemente non preoccupano.

Ciò che ha attirato l'attenzione, in più interviste e varie aziende non correlate in settori non correlati, è stato così:

  • Una strana fissazione su convenzioni obsolete / superate e limitazioni "ritorno all'età della pietra". Come lo sviluppo di un'app Web primitiva in VS2003 con un elenco di assurde restrizioni che proibiscono ulteriormente l'utilizzo di funzionalità esplicite all'interno di quell'era di .net ... come se quello fosse un vero indicatore di una capacità moderna degli sviluppatori ... la capacità di ricordare il paradigma e i limiti di 9 anni fa ulteriormente paralizzati da vincoli non realistici / arbitrari. Un altro posto era molto perseguitato sul tema delle collezioni personalizzate, circa le collezioni pre-generiche. Un altro posto ha oscurato un esempio di codice di un modello di classe che ho scarabocchiato perché non ho usato costruttori in cascata (sembravano inconsapevoli del supporto per l'inizializzazione della proprietà sulla dichiarazione, che era sufficiente alla necessità).

  • Estrema attenzione ai dettagli di implementazione specifici in un microcosmo e / o impostazioni di configurazione, anche nel caso di tecnologie che si focalizzano sull'essere agnostico di piattaforma o protocollo (cioè ... l'intero punto NON deve essere fissato su un'implementazione specifica o un uso particolare ma piuttosto su riutilizzo / riutilizzo / estensibilità / integrazione necessaria).

  • Disponibilità a specificare / supervisionare / riesaminare il codice / e in alternativa spoolare il lavoro da e verso una squadra offshore, e abilità non codificanti legate a farlo.

  • Utilizzo di versioni specifiche di prodotti / piattaforme / moduli / ecc. In misura talvolta assurda; "Quindi ... hai usato le versioni 1, 2 e 4? Ma non 3, eh? Hmmm ... {annota il tuo curriculum con" no v3 !!!} ". Il grado di utilizzo non sembra importare; solo che hai o non hai usato qualcosa a tutti , e la cosa specifica che essi chiedono anche ... senza sostituzioni sembravano contare, anche di un prodotto concorrente più ampiamente utilizzato e completamente descritto.

  • Una maggiore attenzione a "quanto bene ti adatterai al nostro team" rispetto a "sei effettivamente un bravo sviluppatore di software" o "hai le capacità e l'esperienza per aggiungere valore all'azienda e aiutarci a fornire una qualità prodotto "o addirittura" sei un pericoloso idiota che entrerà e distruggerà il negozio ". In alcuni casi, il mio curriculum è stato preso come un dato di fatto, e persino il cosiddetto "schermo tecnico" o intervista tecnica è stata una valutazione della personalità molto più di una valutazione delle competenze. Anche per posizioni contrattuali relativamente a breve termine in cui saresti lì e ci tornerai prima che due stagioni siano cambiate.

  • Le aziende questa volta sembravano concentrarsi molto meno sulla risoluzione di specifici problemi tecnici, l'avvio di nuovi progetti di sviluppo green-field o big 2.0, o l'immissione sul mercato di un prodotto specifico per capitalizzare su una tendenza o opportunità emergente o sui soliti grandi kickoff . Un tema ricorrente che ho notato in almeno 15 dei luoghi era che un piccolo gruppo di 3-5 sviluppatori, per lo più sopravvissuti al crollo del mercato dell'08, erano in grado di macinare un prodotto nel corso degli ultimi 3 anni circa e hanno riscontrato un certo successo o la loro società nel suo insieme è in forte espansione e stanno assumendo nuove persone per stare al passo con le crescenti richieste di funzionalità o per affrontare / superare i difetti di progettazione che hanno incorporato in questi sistemi o per liberare le piattaforme di cui sopra per liberare il core team che lo ha creato per fare "altri progetti".

Ma ... se c'è una cosa che so di questo business è che è ciclica. La prossima volta che cerco un nuovo concerto, non sarò sorpreso se il gioco è cambiato di nuovo. Devi solo rimanere mentalmente flessibile, fare un po 'di ascolto attivo, evitare di fare affermazioni assolute se non sono necessarie ma non essere neanche una donnola, e non venire come unidimensionale (vieni come un idiota o uno zelota, né desiderabile) o troppo buono (può essere minaccioso e costare un concerto).

Regola semplicemente il tuo approccio e prova a dare una risposta più misurata la prossima volta ... menziona alcuni modi in cui potresti affrontare un problema ... ma anche se si tratta di una conoscenza vera per te, agisci come se stessi davvero pensando a questo e ragionando sul posto. Sembra più umile e meno intimidatorio o scoraggiante in quel modo.

Naturalmente, la Legge di Murphy è quella che è, la prossima intervista dopo che smetti di essere "appassionato del mio attuale ragazzo della tecnologia preferita" e adotti una posizione più equilibrata / accarezzata dalla barba è il concerto che avresti ottenuto se fossi stato impazzito ragazzo zelante. ;)


6

Penso che tu stia tracciando una falsa conclusione, perché il tuo set di campioni è troppo limitato. Sebbene abbia visto una buona parte dei negozi IT con forte avversione per qualsiasi cosa "non inventata lì" 1 , nessuno di loro squalificherebbe i candidati in base alle loro preferenze nello stack tecnologico: erano giustamente convinti di poter insegnare al candidato giusto da usare le loro biblioteche coltivate in casa.

Dubito seriamente che la società abbia messo al bando l'uso di LINQ. Più probabilmente, volevano che mostrassi loro le tue abilità a un livello più profondo.

Ad esempio, un modo per capire se conosci le tue tabelle hash è chiederti di implementarne una primitiva su una lavagna. Questo semplice esercizio rivela al revisore una quantità sorprendente di dati sulle tue conoscenze: apprende immediatamente se conosci il codice hash / uguali e cosa sai delle collisioni hash. Allo stesso tempo, è difficile immaginare qualcuno nella loro mente giusta reimplementare una tabella hash, perché Microsoft ha fatto un ottimo lavoro. Lo stesso vale per molti algoritmi, come l'ordinamento e la ricerca: gli intervistatori spesso vorrebbero sapere se il tuo background è sufficiente per comprendere le interazioni di basso livello, piuttosto che verificare di avere una conoscenza pratica delle librerie .NET.

È quasi certo che insisterebbero sul fatto che tu utilizzassi le implementazioni delle biblioteche piuttosto che le tue una volta che sei stato assunto per lavorare per la loro compagnia. Ma durante l'intervista ti spingerebbero verso il codice di basso livello per comprendere meglio le tue vere abilità.


1 negozio è arrivato fino a costruire il suo strumento di costruzione piuttosto primitivo!


2
Tutti i tuoi punti sono ben formulati, ma dovrei darti un po 'di colore nell'ultima intervista: l'intervistatore ha insistito sul fatto che LINQ fosse "deprecato". Ho chiesto, "non vuoi dire che MS non investirà più in Linq-to-SQL ma che Linq-to-Entities sarà in giro" e la sua risposta è stata che intendeva quello che ha detto: LINQ è "deprecato" quindi, no, non penso che sapesse troppo di LINQ o insistesse sul suo uso.
Matt Cashatt,

1
@MatthewPatrickCashatt Se qualcuno confondesse LINQ per LINQ2SQL in termini di tecnologia deprecata, mi sarei inventato una scusa sciocca per lasciare l'intervista in anticipo e non avrei mai richiamato quella società. Se così fosse, dovresti essere felice che non ti
assumano

1
100% sicuro che fosse così. In effetti, non ho potuto resistere a inviargli alcuni link per metterlo sulla strada giusta sull'argomento, non come un jab da quando non ho preso il concerto, ma perché in realtà mi sono sentito in imbarazzo per lui e speravo di poter aiutarlo a non fare lo stesso errore due volte;).
Matt Cashatt,

4
Quindi questo sembra avere meno a che fare con lo stack tecnologico e più a che fare con il fatto che lo hai corretto. Alla gente non piace essere corretta. È solo la natura umana. Quando le persone prendono decisioni come assumere persone, il 99% seguirà il loro intuito. Passano indipendentemente dal fatto che tu li abbia provati o meno emozioni positive o negative. Correggerlo potrebbe averlo fatto provare emozioni negative. E poi associa quella negatività alla situazione.
coder

1
Non so come funzionano gli hashtable internamente. Prove tecniche approfondite come quella espellono le persone con una formazione pratica che sono comunque buoni candidati. Richiedere alle persone di avere conoscenze di basso livello che non useranno mai mi sembra superfluo. I principi di progettazione sono diventati molto più importanti!
Tjaart,

4

Penso che tu stia facendo delle pazze generalizzazioni lì del tipo "Ho visto una mucca nera in Scozia, quindi tutte le mucche scozzesi sono nere".

Se ti intervistassi, sarei deluso se non potessi rispondere alle mie domande su Linq.

Anche se Linq è complicato, molte persone lo vedono come un voodoo che è ingiusto in quanto è in realtà molto semplice e tanto più intelligente per questo.


3

Per interpretare l'avvocato del diavolo, la ragione è che molti sviluppatori non si preoccupano delle cose nuove e pensano che tutto debba essere risolto con strumenti fatti in casa (di solito inferiori). Non c'è niente di sbagliato nell'usare le astrazioni. Inferno, di solito non c'è una buona ragione per non usare quelle astrazioni.

Sembra che tu abbia appena intervistato un povero sviluppatore che non si tiene aggiornato con le cose e adotta l'approccio a martello e chiodo a tutto. Questi sono i tipi di sviluppatori che non sanno nulla di utili strumenti open source come NUnit, NHibernate o i vari contenitori IoC; quelli che cercano di risolvere ogni problema con un enorme proc memorizzato nel database; quelli che non sanno assolutamente nulla di MVC nonostante sia uscito da diversi anni ormai.


Puoi lanciare LINQ in un pool di parole d'ordine contenente Nhibernate ecc ... Non lo farei. In realtà penso che le parole d'ordine esemplificino la nostra incapacità di spiegare le astrazioni in espressioni appropriate.
AndreasScheinert,

Stai parlando di "tenerti aggiornato", penso che l'inverso potrebbe essere molto più appropriato. Molti concetti utili sono stati scoperti e utilizzati in passato, ad esempio DSL. Sta a noi migliorare la nostra comunicazione e la comprensione di concetti come quello che non abbiamo bisogno di inventare nuove parole d'ordine per vecchi concetti.
AndreasScheinert,
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.