Pourquoi l'utilisation des abstractions (telles que LINQ) est-elle si taboue? [fermé]


60

Je suis un entrepreneur indépendant et, à ce titre, j'interviewe 3 à 4 fois par an pour de nouveaux concerts. Je suis en plein milieu de ce cycle et je me suis vu refuser une opportunité même si j'avais l'impression que l'entretien s'était bien déroulé. La même chose m’est arrivée plusieurs fois cette année.

Maintenant, je ne suis pas un gars parfait et je ne m'attends pas à être un bon choix pour toutes les organisations. Cela dit, ma moyenne au bâton est inférieure à la normale et j'ai donc demandé poliment à mon dernier intervieweur de lui faire part de ses commentaires constructifs.

Selon l’enquêteur, l’essentiel, c’est que j’ai semblé trop m’intéresser aux abstractions (telles que LINQ) plutôt qu’à des algorithmes de niveau organique développés de manière organique.

En apparence, cela a du sens - en fait, cela a aussi donné du sens aux autres refus parce que j’ai aussi parlé de LINQ dans ces entretiens et qu’il ne semblait pas que les enquêteurs en savaient beaucoup sur LINQ (même s’ils étaient .NET les mecs).

Alors maintenant, je reste avec cette question: si nous sommes censés être "debout sur les épaules de géants" et utiliser des abstractions qui nous sont disponibles (comme LINQ), alors pourquoi certaines personnes considèrent-elles cela si tabou? N’at-il pas de sens de tirer du code "sur étagère" s’il atteint les mêmes objectifs sans coût supplémentaire?

Il me semble que LINQ, même s’il s’agit d’ une abstraction, est simplement une abstraction de tous les mêmes algorithmes que l’on écrirait pour atteindre exactement le même but. Seul un test de performance pourrait vous dire si votre approche personnalisée était meilleure, mais si quelque chose comme LINQ répondait aux exigences, pourquoi se donner la peine d'écrire vos propres cours en premier lieu?

Je ne veux pas me concentrer sur LINQ ici. Je suis sûr que le monde JAVA a quelque chose de comparable, je voudrais juste savoir pourquoi certaines personnes sont si mal à l’aise avec l’idée d’utiliser une abstraction qu’elles-mêmes n’ont pas écrites.

MISE À JOUR

Comme Euphoric l'a fait remarquer, rien n'est comparable à LINQ dans le monde Java. Donc, si vous développez sur la pile .NET, pourquoi ne pas toujours essayer de l’utiliser? Est-il possible que les gens ne comprennent tout simplement pas ce que cela fait?


8
Je pense que vous ne savez pas ce qu'est "l'abstraction", parce que LINQ n'a rien à voir avec ça.
Euphoric

8
"Je suis sûr que le monde JAVA a quelque chose de comparable" En fait, LINQ est l’une des rares choses que possède .NET et que Java ne possède pas.
Euphoric

42
@ Euphoric - Ne pas LINQ abstraite loin le travail de niveau inférieur des tâches telles que le tri et le filtrage par exemple? Je suis tout à fait sûr qu'il y aurait du code supplémentaire derrière, objectCollection.Where(oc=>oc.price > 100)par exemple. Ne serait-ce pas un usage d'abstraction? Peut-être que vous pouvez me dire ce qui me manque ici. . .
Matt Cashatt

37
Il y a toujours une chance qu'ils ne comprennent tout simplement pas LINQ et ne voient pas la valeur de l'apprendre. Les aspects fonctionnels de son écriture sont très très différents de la programmation impérative. En tant que contractant, j'ai récemment vu, en 2009, des développeurs Java " expérimentés " qui ne comprenaient pas suffisamment le langage SQL pour écrire des requêtes avancées. la base de données le faire. L'ignorance sévit dans l'industrie du développement de logiciels.

18
Si vous comprenez LINQ mais que vos enquêteurs ne le comprennent pas, vous valez mieux qu’ils ne le sont. Placez vos regards plus haut.
Jay Bazuzi

Réponses:


74

Je ne pense pas que l'utilisation d'abstractions en soi soit choquante. Il y a deux autres explications possibles. La première est que les abstractions ont toutes des fuites à un moment ou à un autre. Si vous donnez l’impression, correcte ou non, que vous ne comprenez pas les principes fondamentaux sous-jacents, cela pourrait refléter mal une interview.

L'autre explication possible est l'effet fanboy. Si vous parlez de LINQ avec enthousiasme et que vous en parlez à maintes reprises dans une interview avec une entreprise qui ne l'utilise pas et qui n'a pas l'intention de le faire, cela donne l'impression que vous seriez insatisfait ou même mécontent de travailler avec des technologies plus anciennes. Cela peut également donner l’impression que votre enthousiasme pour un produit vous a aveuglé aux alternatives.

Si vous pensez vraiment que vous seriez heureux dans un magasin non LINQ, essayez de demander à ce qu'ils font usage, et d' adapter vos réponses en conséquence. Montrez-leur que si vous préférez LINQ, vous maîtrisez les outils existants.


4
@MatthewPatrickCashatt Vous ne pouvez pas éditer et continuer dans le débogueur à l'intérieur de méthodes contenant des instructions linq. Il ne suffit pas que je ne l'utilise pas; mais c’est la raison principale pour laquelle j’ai hésité pendant un moment.
Dan Neely

3
+1, surtout pour le deuxième paragraphe. Cela s'applique totalement à moi, car je serais complètement mécontent de travailler sur un code C # sans pouvoir utiliser LINQ.
Arseni Mourzenko

5
Il y a aussi le fait qu'il y a souvent une baisse de performance en plus de l'abstraction qui fuit. Vous échangez la facilité d'utilisation contre la précision, et cette perte de précision inclut souvent des détails permettant d'accélérer les choses. Et plus vous êtes éloigné de la source, plus vous perdez de détails et plus il est probable que ces détails sont importants pour la performance.
jmoreno

6
+1 mais cela peut aussi fonctionner dans l'autre sens. Si quelqu'un me dit qu'il ne m'a pas embauché parce que j'utilise Yacc pour créer des analyseurs syntaxiques au lieu de faire tourner le mien, alors ce n'est pas un endroit où je veux travailler de toute façon.
Spencer Rathbun

5
@MatthewPatrickCashatt: cette réponse (et mon commentaire à ce sujet) ne sont pas spécifiques à LINQ, mais des instructions générales. Mais pour LINQ, voici un extrait de C # 4.0 / 5.0 en résumé, qui traite des problèmes de performances avec LINQ. Retour aux généralités: dans de nombreux cas, la performance en vaut la peine, 5% +/- n'étant pas pertinent. Mais parfois, il sera plus grand et parfois même, 1% est inacceptable. Si vous pensez qu'il ne peut jamais y avoir de problème, ou si ces performances ne concernent que des entreprises telles que Google ....
jmoreno

29

Certains programmeurs .NET, en particulier ceux issus d'un arrière-plan VB / ASP classique ou C ++, n'aiment pas les nouveautés telles que LINQ, MVC et Entity Framework.

D'après ce que j'ai observé, les ex-VB de ce groupe utiliseront probablement encore des couches d'accès aux données et d'autres codes écrits à l'origine il y a plus de 10 ans. Ils utiliseront également d'anciens mots à la mode, tels que "n-tier", etc., sans rien comprendre au-delà de .NET Framework 2.0, ni vouloir en savoir plus.

Les développeurs C ++ ont tendance à être des programmeurs à vocation académique qui aiment coder des algorithmes sympas, même si cela implique de réinventer la roue. Ils détestent dépendre de tout ce qu'ils n'ont pas codé eux-mêmes. Quelques-unes de ces personnes sont également ravies de faire en sorte que les personnes interrogées se sentent inférieures, en particulier celles ayant des antécédents moins traditionnels.

Vous risquez de rencontrer des organisations comme celle-ci lorsque vous interviewez. Mais vous rencontrerez également des personnes utilisant des méthodes plus récentes. Ne laissez pas quelques mauvaises entrevues vous décourager.


2
Merci jfrankcarr. Je pensais que c'était peut-être le cas - il y avait des questions sur l'ouverture et la fermeture datareaders!
Matt Cashatt

2
+1 pour appeler MVC "nouveautés". M'a fait éclater de rire. Il existe depuis les années 70. Vous avez peut-être voulu dire MVVM qui est essentiellement MVP (une variante de MVC) qui utilise des liaisons.

14
@ GlenH7 Je pense qu'il était assez clair, compte tenu du contexte, qu'il entendait le produit "ASP.NET MVC" et non le concept de base de Model-View-Controller.
Carson63000

4
@ GlenH7 - Je parlais entièrement dans le contexte des gammes de produits .NET et Visual Studio et des mots à la mode des produits Microsoft.
jfrankcarr

6
Bon dieu, y a-t-il vraiment des magasins qui considèrent Linq comme "nouvelle"? Il existe déjà depuis plus de 4 ans. Je peux comprendre de ne pas avoir rattrapé les porteurs de tâches, ni d'utiliser dynamic/ ExpandoObject/ etc., ou de ne pas me soucier d'Azure et de tous les autres éléments du cloud ... Je peux même comprendre de continuer à utiliser la vue WebForms de la vieille école. moteur dans MVC ou Web Forms lui-même, ou l'écriture de code WPF / WinRT sans MVVM ... mais Linq? Si vous ne l'avez pas encore compris, il est temps de quitter votre emploi de développeur .NET.
Aaronaught

16

Microsoft a une longue histoire de développement de nouvelles technologies et d’oublier ces technologies dans 5, 10 ou 20 ans. LINQ pourrait ressembler à un autre pour certaines personnes. Ils noteront que Microsoft ne peut pas déprécier SQL, mais LINQ pourrait suivre Silverlight . Vous pourriez donc voir la paranoïa résultant d'une expérience difficile, ou simplement des personnes laissées pour compte par la technologie moderne et qui en veulent.


12
Honnêtement, bien que je comprenne l'essentiel, je ne pense pas que Linq s'en va de si tôt. Linq2SQL, oui, ils l’ont déconseillée au profit d’un EF beaucoup plus puissant. Mais Linq elle-même est à la base de tant de nouveautés brillantes dans les 3 dernières versions de .NET que, si elles la déconseillaient, elles annuleraient la moitié de leur nouvelle technologie de couche de persistance, comme Azure et EF, sans parler de la paralyser pratiquement chaque ORM. là-bas et beaucoup de traitement de liste en mémoire à part.
KeithS

6
attendez ... "terrifié de quitter les vieilles technologies dépassées, parce que ça marche" ... WTF. Sommes-nous arrivés au point où travailler des trucs essayés, testés, compréhensibles et maintenables, et mûrs n'est PAS bon.
gbjbaanb

7
@ gbjbaanb - No. Mais, anecdote, voudriez-vous qu'un médecin diagnostique vos douleurs thoraciques à l'aide d'une radiographie pulmonaire parce que cette méthode est «testée, testée, compréhensible» ou souhaitez-vous une IRMf plus récente, mais avec une résolution plus élevée? , meilleur pronostic et plus d'informations? Personne ne dit se détourner des principes classiques ici; plutôt l'inverse. Vous voyez, LINQ (à titre d'exemple) est construit sur ces principes. Comme d’autres l’ont déjà mentionné, je pense que c’est l’apprentissage des éléments qui font de LINQ et son bon usage qui entraînent les moments de «WTF» tels que les vôtres.
Matt Cashatt

2
@ Matthew Patrick Cashatt: Cela dépend. Si le médecin n'a pas été formé pour lire les résultats de l'IRMf, je prendrais la radiographie plutôt que de le laisser deviner le diagnostic. Si je tombais malade dans un bras mort, je préférerais avoir un médecin capable de diagnostiquer avec rien de plus qu'un stéthoscope que de ne pas être en mesure de faire face sans le nec plus ultra des derniers outils.
gbjbaanb

2
@MatthewPatrickCashatt: Je vois ce que vous dites, mais un facteur d'équilibre est que vous ne voulez pas suivre toutes les tendances simplement parce qu'elles sont plus récentes. Je suivrai avec plaisir une nouvelle technologie qui appartient à l'une des deux catégories. 1. Cela me passionne et je suis prêt à passer mon temps libre dessus. 2. Cela s'avère être réellement meilleur et semble durer assez longtemps pour que l'investissement en vaille la peine. Les tendances qui n'entrent pas dans l'une des deux catégories sont au mieux un pari.
TimothyAWiseman Le

15

N’at-il pas de sens de tirer du code "sur étagère" s'il atteint les mêmes objectifs sans coût supplémentaire?

Il y a toujours un coût supplémentaire.

La courbe d’apprentissage des produits disponibles dans le commerce est toujours présente. La difficulté d'obtenir des mises à jour (et des dépendances) est toujours présente. L'incapacité à faire le tour avec les tripes est toujours là.

Pour LINQ, le premier s'applique seulement vraiment. Beaucoup de gens considèrent que le code à la "bizarre" est difficile à lire et à déboguer. La syntaxe de type sql est à peu près persona-non-grata à chaque travail professionnel que j'ai effectué depuis sa sortie. LINQ to SQL (et d'autres sources de données) ont un certain nombre de pièges et d'options d'optimisation limitées.

Ce sont les arguments généraux contre les outils tiers et LINQ en particulier. Cela dit, LINQ est un outil extrêmement utile et devrait être préféré dans la plupart des situations. Crying Not Invented Here, et les abstractions ne doivent pas être privilégiées sent fortement la dissonance cognitive .

Ils ne savent pas / ne peuvent pas apprendre LINQ, mais ils sont "évidemment" de bons développeurs, donc LINQ ne doit pas en valoir la peine. C'est un piège commun.


1
Bons points. Mettez-vous d'accord sur les coûts que vous mentionnez et c'est une bonne clarification. Plus généralement, cependant, le développement de classes locales avec lesquelles aucun nouvel employé ne peut être familiarisé, car elles n'existent pas en dehors de l'entreprise, présente les mêmes défis en plus du coût du développement primaire.
Matt Cashatt

2
@ Matthew Patrick Cashatt - Oh, absolument. Ce code local devrait donc presque toujours faire plus d'effort pour la même victoire, mais ce n'est pas nécessairement le cas. Comme beaucoup d'autres choses, le coût / bénéfice doit être estimé et la meilleure pratique préférée , pas suivie aveuglément.
Telastyn

@Telastyn Le code maison est également utile, car vous savez ce qu’il fait et vous pouvez le réparer en un rien de temps. En outre, vous pouvez optimiser des circonstances spécifiques en fonction de votre propre utilisation, et non d'une moyenne de toutes les personnes.
Hawken

13

Une autre chose à considérer est que votre enthousiasme pour une nouvelle technologie cool peut simplement rendre les gens mal à l'aise et ne pas vouloir de vous. Vous ne les "autonomisez" pas, car c'est vous qui connaissez cette technologie, pas eux. Même s'ils ne le réalisent pas eux-mêmes, ils peuvent rechercher des candidats qui renforcent ce pour quoi ils ont déjà investi tant de temps.

Vous voulez présenter une attitude qui dit: "Quoi que vous fassiez, je veux vous aider à y parvenir", plutôt que de donner un sous-texte qui dit: "Vous faites peut-être les choses mal, et m'avoir autour me prouvera il."


+1 - En plus de leur dire ce que vous savez, demandez-leur ce qu'ils font et en quoi ils se spécialisent.
Kirk Broadhurst

12

Mon point de vue (et TBH, je suppose, car aucun d’entre nous ne peut dire ce que pensaient les intervieweurs) est que vous assistez souvent à un entretien pour expliquer pourquoi ils devraient vous engager pour s’intégrer à leur équipe, à leur façon de travailler .

Vous pouvez être le développeur idéal, un dieu du code rock start, mais cela ne signifie absolument rien si ce que vous voulez faire (souligné par vos propos excessifs et trop enthousiastes au sujet de robots géniaux de la technologie) leur dit simplement de vous, et que vous ne le feriez pas. cadrer avec ce qu'ils veulent. S'ils ont un système d'accès aux données à l'ancienne, qui ne peut pas être mis à niveau pour une raison quelconque, ils n'ont pas besoin de quelqu'un qui avait oublié comment le maintenir. S'ils développent de nouvelles technologies et que vous voulez vraiment utiliser cette nouvelle technologie géniale partout dans le monde, il est évident qu'ils auront un gros problème en ce qui concerne la maintenance du code et / ou la formation du personnel.

En tant que pigiste, c'est beaucoup plus un problème que s'ils embauchaient une permie. Avec une permission, la formation et le développement de nouvelles méthodes de travail ne sont pas des mauvaises choses, dans le cadre du code et des pratiques existantes - vous serez là pendant longtemps pour améliorer les choses. Avec un pigiste, ils ne donnent vraiment pas envie de faire ce que vous voulez, vous êtes là uniquement pour faire leur travail comme ils l'entendent, et ce n'est pas votre travail de faire autre chose. (en désaccord - devenir un employé permanent)

Cela n'a probablement rien à voir avec LINQ lui-même, j'ai rejeté un candidat qui s'est présenté et a expliqué à quel point tout serait mieux écrit en Haskell. Nous ne faisons pas Haskell. Il en va de même pour toute technologie non utilisée par l'entreprise. Généralement, ce n'est pas un problème si vous le mentionnez comme quelque chose de bon. Le problème survient lorsque vous êtes trop enthousiaste et passionné.


2
Je suis d’accord avec cela, mais j’ai remarqué que beaucoup plus de gens utilisent cette attitude pour rejeter les bonnes idées qu’ils ne comprennent tout simplement pas (par exemple, les tests, les modèles de conception, les ORM). Donc, bien que je convienne que le fait de bien s’intégrer à l’équipe est une bonne chose, il est important de réaliser que vous pourriez être meilleur que le reste de l’équipe et que vous devriez trouver des personnes animées du même esprit où ce n’est pas une mauvaise chose que de bien connaître abstractions.
Wayne Molina

1
@WayneM bien sûr, mais OP est un pigiste, donc peu importe qu'il soit un dieu codeur, à moins d'être prêt à l'embaucher de façon permanente pour maintenir le code, le reste de l'équipe ne comprend pas (hmm), puis il doit faire ce qu'ils veulent, pas ce qu'il veut.
gbjbaanb

1
@WayneM de même, beaucoup de gens utiliseraient quelque chose de similaire à ce que vous venez de dire pour promouvoir leurs idées plutôt que celles de quelqu'un d'autre (en sachant que ceux à qui ils parlent ne l'obtiennent tout simplement pas). En fin de compte, les deux parties sont biaisées, mais le PO consiste à se faire embaucher et non à gagner la grande guerre du bricolage / de l'abstraction. Chacun aura sa propre opinion, mais quelqu'un doit s'en remettre; Je suppose que ce ne sera pas l'employeur dans ce cas. :(
Hawken

10

Ceux qui n'utilisent pas Linq ont exprimé une préoccupation valable, et je la prends à coeur: "Ce n'est pas parce que vous ne pouvez pas voir la mise en œuvre que cela ne signifie pas qu'elle n'est pas chère".

Prenez l'extrait suivant:

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

Les LINQ-initiés ici sont en train de reculer. Pourquoi? Parce que ce code est beau et élégant ne signifie pas qu'il n'est pas terriblement inefficace. Count (), avec un prédicat, évalue chaque élément de l'énumérable parent et résume les heures auxquelles le prédicat a renvoyé la valeur true. Ainsi, non seulement N ^ 2 (lorsque inputList et otherInputList ont une cardinalité à peu près égale N), c’est le pire cas absolu N ^ 2; CHAQUE élément de otherInputList est traversé pour CHAQUE élément de l'entrée. Au lieu de cela, la première étape consiste à utiliser Any () à la place de Count, car c’est vraiment ce que vous voulez savoir, et elle s’arrêtera dès que la réponse sera connue comme "oui". La configuration d’un hachage contenant des valeurs distinctes otherInputListObject.OtherPropertypeut également vous aider; l'accès devient O (1) au lieu de O (N),la pire des cas au lieu de la complexité quadratique au mieux .

Ainsi, nous voyons que ces belles méthodes élégantes entraînent des coûts importants. Si vous ne savez pas quels sont ces coûts, vous pouvez très facilement coder un algorithme de complexité O (mon GD) dans le serveur de fichiers central hautes performances de votre futur employeur. ou la page principale du portail d'atterrissage la prochaine fois qu'ils pourraient avoir besoin d'un ajustement. Vous licencier après avoir fait cela ne défait pas ce que vous avez fait, mais ne pas vous embaucher s'il pense que vous le feriez, cela l'empêcherait. Donc, pour éviter cela, vous devez leur prouver le contraire; discutez de ce que font ces méthodes (ce qui signifie que vous devez vous connaître), de leur complexité, et de la manière d’arriver à une réponse efficace (NlogN ou mieux).

Une autre préoccupation concerne le bon vieux argument "Quand votre seul outil est un marteau". Mettez-vous à la place de l'intervieweur qui interviewe ce fan de Linq. Le candidat aime Linq, veut l'utiliser, pense que c'est la meilleure des choses. Il pourrait même sembler que le candidat ne pourrait pas coder sans, puisque chaque problème de programmation posé a été résolu avec Linq. Bien que se passe-t-il quand il ne peut pas être utilisé? Il reste encore beaucoup de code .NET 2.0 qui, s'il était mis à niveau, nécessiterait de douloureuses mises à niveau des serveurs, des postes de travail des utilisateurs, etc., le tout pour que vous puissiez utiliser vos méthodes d'extension sophistiquées. En tant qu’interviewer, j’essayerais de vous montrer que vous pouvez coder un tri efficace ou utiliser les méthodes de tri 2.0 si vous le devez, quel que soit le degré d’accord avec vous sur le fait que les bibliothèques Linq et les méthodes d’extension similaires sont assez jolies. sucré. Un intervieweur qui ne comprend pas le problème pourrait ne même pas se donner la peine d'essayer de vous faire montrer de l'aptitude à autre chose. ils vont supposer que vous ne l'avez pas et passer à autre chose.


Pourquoi n'écririez-vous pas simplement votre requête var resultList = inputList.Select(i=>i.Property).Intersect(otherInputList.Select(o=>o.Property));? J'ai peut-être raté cela, mais ce que je veux dire, c'est que LINQ dispose de meilleurs moyens d'exécuter la requête que vous avez mentionnée ci-dessus (.Join () est un autre moyen). Je me rends compte qu'il existe des moyens d'utiliser LINQ qui ne sont peut-être pas aussi efficaces que d'autres moyens, mais cela ne signifie pas que vous devez compter sur ces mauvaises implémentations.
Matt Cashatt

4
@MatthewPatrickCashatt Je ne pense pas que son propos soit plutôt de prétendre que LINQ est toujours inefficace - bien que vous puissiez toujours battre une requête LINQ donnée, certaines utilisations donnent de meilleures performances par heure de développeur que de nombreuses approches autres que LINQ. Plutôt, il peut être relativement facile d'écrire une requête LINQ qui est inefficace et de ne pas s'en rendre compte, car les inefficiences ne sont pas aussi flagrantes.
Jon Hanna

3
@JonHanna: Peut-être plus encore, la valeur d'une abstraction est grandement réduite si l'on doit examiner quel code "fonctionne réellement" pour déterminer quels scénarios peu communs mais plausibles pourraient entraîner des performances beaucoup plus mauvaises que prévu. Si le passage d'une structure de données à une autre ralentit l'exécution du code 10 000 fois, la possibilité d'effectuer un tel changement sans modifier aucun autre code peut ne pas toujours être une bonne chose.
Supercat

1
@supercat: oui et non. Ce n'est pas parce que la connaissance de la manière dont une implémentation tierce est réalisée de comprendre les implications pour les performances et d'éviter les inefficiences ne signifie pas que les bibliothèques qui encapsulent ces outils ont moins de valeur. Ce sont les deux faces d'une même pièce. connaître la nature de l’implémentation et vous pouvez l’utiliser avec quelques frappes au lieu d’une heure. Mais, vous devez connaître les deux côtés et le fanatique stéréotypé de Linq qui pense que c'est parfait, rien à redire, utilisez-le pour tout ce qui ne l'est probablement pas.
KeithS

@KeithS: Une des choses qui me manque cruellement à la fois en Java et en .net est un moyen standard de demander aux objets ou aux collections diverses choses sur eux-mêmes. Par exemple, le code qui reçoit une collection énumérable pourrait avoir intérêt à savoir si le nombre d’éléments et / ou la séquence d’éléments existants pourrait être modifié, si le nombre d’éléments est connu pour être fini ou infini (ou indéterminé de toute façon), et si la collection sait de manière inhérente le nombre d’éléments qu’elle contient. Des technologies comme LINQ doivent souvent émettre des hypothèses sur des choses qui peuvent ou non être correctes, et ...
Supercat

10

Celui-ci est un peu long, mais il pourrait être utile à quelqu'un, alors je le laisse faire.

En fait, j'ai rencontré quelque chose de similaire, passant à travers un peu plus de 20 entretiens le mois dernier (mélange de téléphone et de face à face). Il y avait définitivement quelque chose d'inattendu sur lequel je ne pouvais pas vraiment mettre le doigt.

Une des choses que j’ai remarquées cependant, c’est que les sujets qui ont généralement été au centre des cycles d’interviews des cinq ou six dernières années n’ont décidément pas été discutés ou ont fait l’objet d’une discussion franche. Des éléments tels que les principes fondamentaux de l’analyse / conception orientée objet, les modèles (à la fois architecturaux et conceptuels), certaines des fonctionnalités .net les plus avancées / orientées vers l’abstraction (notamment lambdas ou LINQ, les génériques, la sérialisation / liaison de données, etc.), et même la sujet généralement brûlant de la méthodologie privilégiée (personne ne semblait se soucier beaucoup de l’agilité par rapport à la cascade ou à la saveur de l’agile) et des outils ou du choix de l’ORM ou des moyens de collaboration privilégiés ou de la gestion du contrôle à la source. Dans certains cas, pas du tout mentionnés, dans presque tous les cas, apparemment pas préoccupants.

Ce qui a attiré l’attention, dans de multiples entretiens et diverses entreprises non liées dans des industries non liées, allait dans ce sens:

  • Une étrange fixation sur les conventions obsolètes / dépassées et les limitations du "retour à l'âge de pierre". Comme développer une application web primitive dans VS2003 avec une liste de restrictions absurdes, interdisant davantage l'utilisation de fonctionnalités explicites dans cette ère de .net ... comme s'il s'agissait d'un véritable indicateur de la capacité d'un développeur moderne ... la capacité de se souvenir le paradigme et les limites d'il y a 9 ans sont encore affaiblis par des contraintes irréalistes / arbitraires. Un autre lieu était très acharné au sujet des collections personnalisées, des collections pré-génériques. Un autre endroit a filtré un exemple de code d’un modèle de classe que j’ai gratté parce que je n’utilisais pas de constructeurs en cascade (ils ne semblaient pas au courant du support de l’initialisation de la propriété lors de la déclaration, ce qui était suffisant pour répondre aux besoins).

  • Concentrez-vous sur les détails d’implémentation spécifiques dans un microcosme et / ou les paramètres de configuration, même dans le cas de technologies axées sur l’agnostic des plates-formes ou des protocoles sur la réutilisation / la réaffectation / l'extensibilité / l'intégration requise).

  • Volonté de spéculer / superviser / réviser le code / et autrement transférer du travail vers et depuis une équipe off-shore, et compétences non-codantes liées à cette tâche.

  • Utilisation de versions spécifiques de produits / plates-formes / modules / etc. À un degré parfois absurde; "Alors ... vous avez utilisé les versions 1, 2 et 4? Mais pas 3, hein? Hmmm ... {annote votre CV avec" no v3 !!!} ". Le degré d'utilisation ne semblait pas avoir d'importance; seulement que vous avez ou avez pas utilisé quelque chose du tout , et la chose spécifique qu'ils demandent aussi ... aucune substitution semblait compter, même d'un produit concurrent plus largement utilisé et complet.

  • Nous nous concentrons beaucoup plus sur "comment vous allez bien s'intégrer à notre équipe", "êtes-vous vraiment bon en tant que développeur de logiciels" ou "avez-vous les compétences et l'expérience pour ajouter de la valeur à l'entreprise et nous aider à fournir une qualité produit "ou même" êtes-vous un imbécile dangereux qui va venir et épave boutique ". Dans certains cas, mon CV était considéré comme acquis et même le prétendu "écran technique" ou entretien technique constituait une évaluation de la personnalité bien plus qu'une évaluation des compétences. Même pour des postes contractuels relativement à court terme où vous seriez là et reparti avant deux saisons ont changé.

  • Cette fois-ci, les entreprises semblaient beaucoup moins concentrées sur la résolution de problèmes techniques spécifiques, le lancement de nouveaux projets dans des environnements verts ou de grands projets de développement 2.0, ou la mise sur le marché d'un produit spécifique pour tirer parti d'une tendance ou d'une opportunité émergente, ou des grands lancements habituels . Un thème récurrent que j'ai remarqué dans au moins 15 endroits est qu'un petit groupe de 3 à 5 développeurs, principalement des survivants du krach boursier de 08, a été en mesure de créer un produit au cours des trois dernières années environ. et ont rencontré un certain succès ou leur société dans son ensemble est en plein essor et ils embauchent de nouvelles personnes pour faire face à la demande croissante de fonctionnalités ou pour traiter / corriger les défauts de conception intégrés à ces systèmes, ou pour prendre en charge les plateformes susmentionnées afin de libérer l’équipe de base qui l’a construite pour faire "d’autres projets".

Mais… s'il y a une chose que je sais à propos de cette affaire, c'est que c'est cyclique. La prochaine fois que je cherche un nouveau concert, je ne serai pas surpris si le jeu a encore changé. Vous devez simplement rester mentalement flexible, faire de l'écoute active, éviter de faire des déclarations absolues si elles sont inutiles, mais ne soyez pas non plus une indiscrète, et ne prétendez pas être unidimensionnel (vous devenez idiot ou un zélote, ni souhaitable) ou comme trop bon (il peut être menaçant et vous coûter un concert).

Ajustez simplement votre approche et essayez de donner une réponse plus mesurée la prochaine fois. Mentionnez plusieurs façons différentes d’approcher un problème. raisonner sur place. Cela semble plus humble et moins intimidant ou choquant.

Bien sûr, la loi de Murphy étant ce qu'elle est, la toute prochaine interview après que vous cessez d'être "passionné par mon type actuel de technologie préféré" et adoptiez une position plus équilibrée / caressant la barbe est le concert que vous auriez eu si vous aviez été fou gars zélé. ;)


6

Je pense que vous tirez une fausse conclusion, car votre ensemble d'échantillons est trop limité. Bien que j'aie vu une bonne partie des magasins d'informatique qui manifestaient une forte aversion pour tout ce qui "n'était pas inventé là-bas" 1 , aucun d'entre eux ne disqualifierait les candidats en fonction de leurs préférences dans la pile de technologies: ils étaient à juste titre convaincus qu'ils pourraient apprendre au bon candidat à utiliser leurs bibliothèques locales.

Je doute sérieusement que la société ait totalement interdit l'utilisation de LINQ. Plus probablement, ils voulaient que vous leur montriez vos compétences à un niveau plus profond.

Par exemple, une façon de déterminer si vous connaissez vos tables de hachage consiste à vous demander d’en implémenter une primitive sur un tableau blanc. Cet exercice simple révèle une quantité surprenante de données sur vos connaissances: il apprend instantanément si vous savez à propos du code de hachage / égaux, et ce que vous savez des collisions de hachage. En même temps, il est difficile d’imaginer une personne sensée ré-implémenter une table de hachage, car Microsoft a fait un si bon travail dans ce domaine. Il en va de même pour de nombreux algorithmes, tels que le tri et la recherche: les enquêteurs souhaitent souvent savoir si votre arrière-plan est suffisant pour comprendre les interactions de bas niveau, plutôt que de vérifier que vous avez une connaissance pratique des bibliothèques .NET.

Il est presque certain qu'ils insisteraient pour que vous utilisiez des implémentations de bibliothèques plutôt que les vôtres une fois que vous êtes embauché pour travailler pour leur entreprise. Mais pendant l'entretien, ils vous poussent vers le code de bas niveau pour mieux comprendre vos véritables capacités.


1 un magasin est allé jusqu'à la construction de son propre outil de construction assez primitif!


2
Tous vos arguments sont bien formulés, mais je devrais vous donner un peu de couleur autour de la dernière interview: l'interviewer a insisté sur le fait que LINQ était "déconseillée". J'ai demandé, "ne voulez-vous pas dire que MS n'investira plus dans Linq-to-SQL mais que Linq-to-Entities sera présent" et il a répondu qu'il pensait réellement ce qu'il a dit: LINQ est "déconseillé" donc, non, je ne pense pas qu'il en savait trop sur LINQ ou qu'il insisterait sur son utilisation.
Matt Cashatt

1
@MatthewPatrickCashatt Si quelqu'un confondait LINQ for LINQ2SQL en termes de technologie obsolète, j'avais inventé une excuse idiote pour quitter l'entrevue plus tôt et je n'ai jamais rappelé cette société. Si tel était effectivement le cas, vous devriez être heureux de ne pas vous avoir embauché :)
dasblinkenlight

1
100% certain que c'était le cas. En fait, je ne pouvais pas m'empêcher de lui envoyer des liens pour le mettre sur la bonne voie sur le sujet, non pas comme un jab puisque je n'ai pas eu le poste, mais parce que je me sentais vraiment gêné pour lui et espérais pouvoir le faire. aidez-le à ne pas faire la même erreur deux fois;).
Matt Cashatt

4
Cela semble alors moins avoir trait à la pile technologique qu’au fait que vous l’ayez corrigé. Les gens n'aiment pas être corrigés. C'est juste la nature humaine. Lorsque des personnes prennent des décisions telles que l'embauche de personnes, 99% acceptent leur intuition. Ils passent si vous leur avez fait ressentir des émotions positives ou négatives. Le corriger peut lui avoir fait ressentir des émotions négatives. Et il associe ensuite cette négativité à la situation.
codeur

1
Je ne sais pas comment les hashtables fonctionnent en interne. Des tests techniques approfondis comme celui-ci éliminent néanmoins les personnes ayant une formation pratique mais qui sont de bons candidats. Exiger que les gens aient des connaissances de bas niveau qu'ils n'utiliseront jamais me semble inutile. Les principes de conception sont devenus beaucoup plus importants!
Tjaart

4

Je pense que vous faites des généralisations folles à propos du type "j’ai vu une vache noire en Ecosse, donc toutes les vaches écossaises sont noires".

Si je vous interviewais, je serais déçu de ne pas pouvoir répondre à mes questions sur linq.

Linq est un problème cependant, beaucoup de gens le voient comme du vaudou, ce qui est injuste car très simple et d'autant plus astucieux.


3

Pour défendre les intérêts du diable, la raison en est que de nombreux développeurs ne se soucient tout simplement pas de nouvelles choses et pensent que tout doit être résolu avec des outils développés par nos soins (généralement de qualité inférieure). Il n'y a rien de mal à utiliser des abstractions. Enfer, il n'y a généralement aucune bonne raison de ne pas utiliser ces abstractions.

On dirait que vous venez d’interviewer un développeur médiocre qui ne se tient pas au courant de la situation et adopte une approche irréprochable. Ce sont les types de développeurs qui ignorent tout des outils open source utiles comme NUnit ou NHibernate, ou des divers conteneurs IoC; ceux qui essaient de résoudre tous les problèmes avec un processus stocké massif dans la base de données; ceux qui ne savent absolument rien de MVC alors qu'il existe depuis plusieurs années.


Vous pouvez lancer LINQ dans un groupe de mots à la mode contenant Nhibernate, etc. Je ne le ferais pas. En fait, je pense que les mots à la mode illustrent notre incapacité à expliquer les abstractions en expressions appropriées.
AndreasScheinert

Vous parlez de "rester à jour" et je pense que l'inverse serait beaucoup plus approprié. De nombreux concepts utiles ont été découverts et utilisés par le passé, par exemple les DSL. C'est à nous d'améliorer notre communication et notre compréhension de concepts tels que nous n'avons pas besoin d'inventer de nouveaux mots à la mode pour les vieux concepts.
AndreasScheinert
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.