Quelles normes peuvent être attendues des ingénieurs diplômés / juniors? [fermé]

38

Les débordements de mémoire tampon sont-ils acceptables pour un développeur diplômé? Est-ce qu'on met la barre trop haut? Quelles sont les capacités attendues des ingénieurs diplômés / juniors?

Le contexte:

Nous recrutons actuellement pour un poste de développeur débutant travaillant principalement en C sous Linux.

Dans le cadre de ce processus, nous demandons aux candidats de passer un test de code à loisir en C.

Jusqu'à présent, nous avons rejeté deux candidats au motif que leur code, bien que lisible et dans un cas plutôt idiomatique, souffrait d'erreurs de débordement de la mémoire tampon en raison d'écritures de mémoire tampon sans limites.

[Modifier]:

  • Nous demandons explicitement un code de qualité de production vérifié et vérifié.
  • Nous fournissons un cadre de test et de construction aux candidats

[Mise à jour]:

Grâce à ce fil et aux conversations que nous avons eues en personne avec d'autres développeurs, nous modifions la manière dont nous effectuons les tests de code et ciblons notre recrutement.

Nous avons décidé que si un candidat était incapable de réparer ou de comprendre un débordement de mémoire tampon, il serait inutilisable pour le travail que nous effectuons. Il prendrait en particulier plus de mentorat que ce qui nous convient. Nous rejetterons donc toujours les candidats qui ne peuvent finalement pas soumettre un échantillon de code robuste.

Cependant, nous avons mis en place des mesures pour rendre le processus de recrutement plus productif pour nous et les candidats.

En particulier:

  • Nous rendons nos attentes plus explicites, avec une explication claire de ce que nous entendons par qualité de la production et un avertissement selon lequel le code devrait être robuste en ce qui concerne les entrées et les erreurs.
  • Nous relions maintenant les candidats aux ressources sur la programmation défensive et à la bibliothèque standard C dans la description du test de code.
  • Nous avons changé notre public cible de développeurs et diplômés débutants pour cibler des personnes possédant une expérience pertinente.
  • Au cas où le code soumis échouerait d'une manière ou d'une autre mais serait autrement accepté, nous fournissons maintenant un scénario de test minimum qui provoque la condition d'erreur et donne aux candidats une chance de corriger leurs erreurs (à moins que le code ne soit rejeté pour une autre raison). Nous indiquerons également les lignes / fonctions problématiques, le cas échéant.
  • L’objectif des tests lui-même a maintenant légèrement changé, passant d’un filtre frontal à une chance de donner une meilleure image du candidat, en particulier il éclairera notre discussion téléphonique. Cela dit, nous sommes toujours disposés à refuser en nous basant uniquement sur du code.

[Mise à jour du 15/07/2015]: Andy Davis de Nujob a écrit un article intéressant et pertinent sur l'utilisation d'un test de code du point de vue du candidat. Cet article mérite d'être examiné. Trouvez le ici .

brice
la source
29
Peut être...? Considérant qu'il semble que beaucoup de personnes scolarisées ont maintenant beaucoup plus d'expérience de Java que de C. Si les candidats sortent tout juste de l'école et que 2/3 de leurs connaissances en codage sont Java, leur C pourrait ne pas être assez fort pour tester. MAIS ... s'ils sont ouverts et désireux d'apprendre, que diriez-vous? Après tout, il s'agit d'un poste junior ...
FrustratedWithFormsDesigner
4
C'est aussi un code écrit dans une interview, peut-être pardonnable compte tenu des contraintes de temps. Je voudrais au moins leur dire que leur code ne doit pas souffrir d'un débordement de mémoire tampon.
Mansfield
4
Je seconde @FrustratedWithFormsDesigner. Je suis un développeur débutant et la seule fois où j'ai eu à traiter avec C était pour deux affectations dans une classe sur l'architecture de processeur. En attendant, je me considère assez bien en C #, Java et Ruby.
Kevin - Réintégrer Monica
4
Et la structure de test inclut-elle un test qui provoque un débordement de mémoire tampon?
FrustratedWithFormsDesigner
44
Je ne peux pas dire que vous faites quelque chose de mal, mais après avoir interrogé des dizaines de diplômés majeurs en sciences informatiques au cours des dernières années, j'ai constaté que la plupart d'entre eux n'avaient aucune idée de ce que l'on entend par «code de qualité de la production». Je ne pense pas que la plupart des instructeurs CS se soucient de l'écriture de code destiné à être utilisé par d'autres.
Jim In Texas

Réponses:

109

Je ne pense pas que vous ayez placé la barre trop haute, je pense que vous pourriez avoir besoin d'une barre différente.

Je pense que les tests de code sont utiles pour déterminer la compétence d'un candidat, mais ils ne devraient pas être un succès ou un échec. Vous devez utiliser les résultats du test de code pour démarrer un dialogue avec le candidat.

Si vous voyez des erreurs qu'ils ont commises (surtout s'il s'agit de développeurs débutants), signalez-les et demandez-leur ce qu'ils feraient différemment ou s'ils comprennent pourquoi il y a un problème.

Tombatron
la source
1
+1 c'est vrai, et c'est une bonne suggestion. En fait, nous avons demandé aux candidats de revoir leur code pour y déceler des erreurs, ce qui leur donnait tout le temps nécessaire, mais ils sont revenus avec le mauvais type de corrections, aggravant parfois le code, sans corriger les erreurs à l'origine des dépassements. en premier lieu.
Brice
15
@ Brice C'est une preuve irréfutable qu'ils sont en fait des développeurs juniors. La pratique et l'expérience permettent d'éviter les erreurs apparemment évidentes.
Tombatron
34
@ Brice: il disait de discuter des erreurs spécifiques avec eux; ne dites pas qu'il y a eu des erreurs et demandez-leur de vous recontacter. Discutez des erreurs en temps réel - donnez-leur un indice (numéro de ligne ou peut-être une description et une fonction et demandez-leur de vous donner le numéro de ligne), puis demandez-leur comment cela aurait pu être évité. L'objectif n'est pas un code de test sans erreur, mais une bonne compréhension des forces et des faiblesses des candidats.
Jmoreno
6
Si le développeur junior était capable de voir le problème, il l'aurait corrigé. Si c'était moi, je testerais leur capacité à travailler avec vous. Dites-leur quel est le problème et où on peut le trouver, donnez-leur le même traitement que celui que vous donneriez à vos collègues et voyez comment ils réagissent. Si travailler avec eux est une corvée, ils ne conviennent pas au poste. Si travailler avec eux est un plaisir, engagez-les.
zzzzBov
67

Je pense que la qualification junior est ce qui fait toute la différence ici. Les juniors ne devraient pas être testés pour leurs compétences, mais pour leurs capacités d'apprentissage, leur curiosité, leur passion, leur éthique et leur humilité. L'hypothèse avec un junior devrait être qu'ils ne sont pas compétents , c'est votre travail en tant que senior de le faire.

De toute évidence, ils devraient être capables d’écrire du code de base comme fizzbuzz et d’avoir une connaissance générale des concepts; si vous montrai à eux et ils ne savaient même pas ce qu'est un dépassement de mémoire tampon était, alors je dirais que c'est un pas aller, mais je ne vous attendez pas à un junior écrire plus de 5 lignes de code sans bug.

Le jour où vous faites confiance à la compétence de votre junior, c'est le jour où vous devriez être interrogé, les juniors doivent être traités avec beaucoup de mentorat et une bonne dose de "confiance mais de vérification". J'étais junior une fois, et à tous ceux qui étaient là à l'époque: je suis désolé. Tu te souviens des choses terribles que tu as faites en tant que junior? (S'il vous plaît ne me dites pas que c'était juste moi; vous allez me donner un complexe ..)

Jimmy Hoffa
la source
1
Je suis toujours officiellement un «ingénieur logiciel junior» avec 2 années d'expérience! Mes antécédents ne sont ni en ingénierie CS ni en ingénierie SW (c'est en physique). Je ne donnerais pas volontiers le code qui sépare les fautes sur quelque entrée que ce soit, maintenant ou quand j'ai été recruté.
Brice
31
correction, vous ne voudriez pas sciemment introduire du code segfaults sur une entrée. Si vous venez de déclarer que vous n’écrivez jamais d’insectes, désolé de vous déranger, John Carmack.
Jimmy Hoffa
Harg! backpedal! Ce n'est certainement pas ce que je prétends. J'ai publié du code buggy, certains pire que d'autres. Mais aucun n'a ressemblé au premier exemple de ce qu'il ne faut pas faire lorsque vous recherchez un "débordement de tampon" sur Google
brice
Nous fournissons même un cadre de test pour le code, y compris des tests qui ont déclenché le débordement!
Brice
@ brice Lorsque vous dites que vous avez fourni une structure de test, avez-vous fourni un outil tel que valgrind pour tester les problèmes de mémoire?
Octobre
15

Je vois quelques problèmes ici.

Le premier est de supposer qu'un diplômé en informatique moyenne sait, eh bien, n'importe quoi. Ils ne le font pas. Franchement, je suis agréablement surpris quand je vois un diplômé en informatique qui sait comment installer et configurer Visual Studio . Heck, j'ai récemment travaillé avec un gars prétendant avoir plus de cinq ans d'expérience sur la pile Microsoft en écrivant du code .NET qui ne parvenait pas à comprendre ce qu'est TFS ni comment se connecter.

La seconde est votre piscine très limitée. Nous avons également des candidats faire un test de programmation. Il y a cinq "programmes" distincts qu'ils doivent écrire. Ils le font chez eux et expédient le code. Les tests sont extrêmement simples (pas de base de données, pas de dépendances externes) et peuvent facilement être effectués à l' aide de la version Express de Visual Studio. Les tests eux-mêmes sont facilement terminés par un responsable en 30 minutes environ. Notez que nous ne les faisons généralement que pour les nouveaux diplômés et que leur expérience de travail est vérifiable jusqu’à trois ans.

Ce que nous avons quantifié, c'est qu'environ 70% de ceux qui ont subi le test ne nous contactent tout simplement jamais. Environ 15% rendent des choses qui ne seront pas compilées, généralement à cause d’erreurs de syntaxe flagrantes (par exemple, manquantes ;). Un autre 10% compile mais ne parvient pas à effectuer les actions requises.

Cela laisse un énorme 5%. À ce stade, nous n’envisageons même pas de conditions telles que la saisie d’un caractère alphabétique lorsqu’un caractère numérique est requis. C’est purement sur un ensemble très limité de X car l’application effectue la sortie appropriée. En outre, ces chiffres proviennent d'environ 500 candidats au cours des quatre dernières années: nous avons conservé des statistiques parce que nous voulions savoir.

Si nous examinions plus la structure du code et les techniques de codage défensives, telles que la suppression appropriée des ressources non gérées ou l'utilisation d' try .. catchinstructions, alors presque personne ne passerait.

La question, bien sûr, est pourquoi?

Pourquoi un enfant diplômé d'une université de quatre ans dans ce domaine ne peut-il pas accomplir de simples tâches de programmation? La réponse est que les collèges sont complètement déconnectés des besoins des entreprises et ont plusieurs années de retard sur ce que nous considérons comme étant à la pointe de la technologie. Il y a 10 ans, les normes de codage étaient telles que la sécurité était une chose que vous avez faite après coup. et les tests unitaires n'étaient même pas encore à la mode. Alors qu'aujourd'hui, la sécurité doit être au premier plan de vos préoccupations avec chaque fonctionnalité ou amélioration. Rappelez-vous: la plupart des professeurs n’ont jamais réellement travaillé dans ce domaine OU n’y ont pas travaillé pendant longtemps. Une fois que vous le savez, vous commencez à comprendre pourquoi ils sont si loin derrière. Pire encore, certains de ces professeurs consacrent trop de temps à une technologie particulière ( Java , PHP, peu importe) et ne discutez pas de problèmes fondamentaux graves tels que la structure du code ou des approches acceptables (et POURQUOI!).

Juste un exemple de côté. Un récent diplômé m'a parlé de son expérience de la rédaction d'un système d'exploitation mobile pour l'un de ses cours, mais il n'a pas pu expliquer, même en termes simples, comment fonctionnait un serveur Web. Il ne savait simplement pas. Il y a 15 ou 20 ans était probablement le bon moment pour comprendre comment créer un système d'exploitation. Aujourd'hui ... pas tellement. Pourtant, il s’agissait d’un cours obligatoire alors qu’un cours sur la programmation défensive leur serait beaucoup plus utile ET au monde extérieur.

Alors que faisons-nous?

Sur ces 5%, nous interrogerons un peu plus loin pour avoir une idée de leur personnalité et de leur forme. Ensuite, nous sélectionnons les "meilleurs" en toute connaissance de cause. Nous allons passer environ six mois à les "reprogrammer" pour les débarrasser de la merde que leurs professeurs leur ont apportée.

Pas moi
la source
2
Totalement d’accord ici, j’ai appris davantage au cours de mes deux ans et demi dans l’industrie que j’ai appris au collège. J'ai appris cela douloureusement après mon premier stage en tant que développeur Web alors que j'étais encore à l'école.
Ryan
5
Maintenant, je veux essayer votre test de programmation ..
Akash
1
Vraiment? Expérience de l'installation de logiciels spécifiques et capacité à donner une version simplifiée de ce que fait un serveur Web, c'est ce que vous cherchez? Si quelqu'un parvient à écrire un système d'exploitation mobile, il peut apprendre le fonctionnement des serveurs Web.
Michael Shaw
@ MichaelShaw: Si quelqu'un écrit un système d'exploitation, mais n'a pas encore appris les opérations de base du type de serveur le plus courant, cela montre que son école a sauté de grands domaines (et très pertinents) de son éducation. La question devient alors quoi d'autre a été sauté?
NotMe
2
@ChrisLively: Je ne vois pas en quoi ces problèmes posent un gros problème. Ce n'est pas comme si nous avions un champ minuscule qui bouge lentement. L'apprentissage sur le tas va se produire. Je pense que vous avez peut-être un bon argument, mais les exemples ne sont pas convaincants. S'il y a un problème avec le curriculum CS, l'ajout des instructions "Comment installer Visual Studio 101" et "Principes de base des serveurs Web 101" ne le résout pas. (J'aime bien l'idée d'un cours de "programmation défensive".)
Michael Shaw
5

Je pense que vous regardez le problème de la mauvaise façon. Ce que vous devriez vous demander est la suivante: qu'est-ce que nous demandons à un candidat pour qu'il puisse faire le travail? Vous devez bien évaluer le poste et ses conséquences. Vous trouverez ci-dessous quelques suggestions sur le moment d'embaucher un développeur junior et sur le choix de ne pas le faire.

Quand engager un développeur junior: - S'il y a un excès de travail facile à effectuer, ce serait une perte de temps pour un développeur plus expérimenté. - Si vous êtes prêt à encadrer et à former cette personne au cours des prochaines années. - Si vous essayez de développer l’entreprise et que vous voulez une personne qui restera longtemps. Un développeur junior qui ne reste que un an serait un gaspillage des ressources de l'entreprise, il ne ferait que très peu pour produire quoi que ce soit et la plupart des résultats seraient liés à sa croissance personnelle. - Quand vous avez envie de dépenser de l'argent pour la croissance de quelqu'un. Depuis, la plupart des avantages seront ce qu’ils apprendront.

Quand ne pas embaucher un développeur junior. - Quand le travail est trop compliqué. Dans ce cas, il est juste hors de leur ligue. - Quand vous voulez économiser de l'argent. Un développeur senior devrait effectuer les mêmes tâches en une fraction du temps avec des résultats de meilleure qualité, et devrait donc toujours être moins cher. - Lorsque le travail est sous-traité ou insuffisant pour occuper un employé. Dans de tels cas, il serait préférable de confier une partie du travail à un contractant privé.

Un dernier point important. N'embauchez pas de développeur junior car "c'est tout ce que nous pouvons nous permettre", ou "c'est tout ce que nous sommes prêts à dépenser" lorsqu'ils ne sont pas adaptés au poste. En fin de compte, tout ce que vous ferez est de jeter de l’argent dans les toilettes. De plus, une fois qu'ils auront acquis ces compétences, ils demanderont quand même beaucoup d'argent.

À propos de moi:

  • Diplôme en physique avec presque aucune formation formelle.
  • Deux ans d'expérience professionnelle. Je sais donc en quoi consiste le processus d’apprentissage.
  • Lancer le développeur de logiciels. J'ai fait un travail très exigeant et j'ai vu tous les niveaux de compétence de différentes personnes. Beaucoup d'entre eux ne peuvent pas gérer beaucoup de ce que je fais.
Matthew Ouellette
la source
4

Comme d’autres l'ont déjà mentionné, les postes subalternes n'ont peut-être que peu d'expérience avec le C. Je n'ai personnellement appris que brièvement sur les débordements de mémoire tampon dans le C et, même si je pouvais les surveiller, il est probable que j'en introduirais quand même (surtout si une affectation prête créer des débordements de mémoire tampon). Il est probable que de nombreux développeurs débutants seront dans une situation similaire et qu’ils connaîtront peut-être un débordement de mémoire tampon, mais ils n’ont pas été préparés à les identifier et à les gérer de manière approfondie.

Cela étant dit, je pense que la meilleure solution consiste à résoudre le problème lors de la prochaine interaction possible et à leur demander ce qu'ils savent sur les débordements de mémoire tampon pour tester leurs connaissances générales. Après cela, dites-leur que vous en avez trouvé un dans leur code supposé prêt à la production. Cela vous donnerait une bonne fenêtre pour juger de la manière dont ils réagiraient à la correction et aux instructions.

N’est-il pas courant de penser qu’un développeur débutant qui en sait moins mais qui est disposé à apprendre et à s’améliorer a plus de valeur qu’un développeur débutant qui en sait plus mais qui ne peut ou ne veut pas s’améliorer?

Cela étant dit, dans l'un de vos commentaires, vous avez indiqué que vous leur aviez remis des tests qui auraient montré le débordement de tampon dans leur code s'ils les avaient utilisés. Alors peut-être que la plus grande question est de savoir pourquoi ils n’ont pas exécuté les tests (ou s’ils l’ont fait, pourquoi ont-ils généré du code buggy)?

Lawtonfogle
la source
3

Un débordement de tampon est un no-go absolu. Vous pourriez avoir une question de code correspondant. Dans ce que tout est faux (peut aller mal) avec ce morceau de code, le candidat devrait être capable de cerner le problème. La question est de savoir si le problème est sans importance, car vous utilisez de toute façon clint.

Cependant, dans un test de code de forme libre artificiel, je serais doux sur une violation comme sprintf. Trop peu de temps (supposé), esprit hyperactif, trop grande envie de présenter quelque chose qui fonctionne.

Joop Eggen
la source
10
J'ai presque écrit exactement la même réponse jusqu'à ce que je remarque qu'il parle de "junior", gardez cela à l'esprit ... J'ai déjà vu des juniors vifs, mais même quand même ils font des choses stupides sans s'en rendre compte, une grande partie de l'ingénierie logicielle ne peut être enseignée. par expérience
Jimmy Hoffa
@ JimmyHoffa oui, viens de lire ta première ligne, corrige mon "Absolu Absolu". Votre point mérite d'être considéré. Jusqu'à présent, je pouvais utiliser et estimer chaque programmeur, sauf un cas psychique et un "menteur".
Joop Eggen
@JoopEggen: Je suis presque sûr que "psychique" n'était pas le mot que vous recherchiez. Sinon, ils auraient dû pouvoir lire dans vos pensées ...;)
NotMe
2

Je pense que vous posez la mauvaise question. Il n'y a pas d'objectif à exclure pour être un programmeur professionnel. S'il y en avait, il y aurait un examen de programmation standard, mais il n'y en a pas. Votre limite individuelle doit simplement être définie en fonction de vos difficultés financières, du montant que vous pouvez vous permettre de payer, de la gaffe que votre logiciel peut se permettre d’accepter et du temps que vous pouvez vous permettre d’enseigner.

Dans ce cas, je suppose qu’un dépassement de tampon signifie probablement que ce code, présenté par le candidat comme exemple de travail exemplaire, se bloque avec une erreur de segmentation au lieu de faire ce que vous avez demandé. Alors, devriez-vous accepter un codeur qui écrit du code qui plante avec une erreur de segmentation au lieu de faire ce que vous aviez demandé? Demander:

  • Votre organisation est capable d'attirer tous ceux qui peuvent écrire le code de travail?

  • Votre processus de développement est-il suffisamment robuste pour que quelqu'un qui sait presque écrire du code puisse écrire du code de travail à l'aide de la revue par les pairs et du support de test?

  • Êtes-vous capable d'enseigner à des types de programmeurs comment devenir des programmeurs, et êtes-vous prêt à déployer cet effort et à attendre peut-être quelques années et à espérer que le talent intérieur du candidat se concrétisera?

Christopher Martin
la source