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 .
la source
Réponses:
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.
la source
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 ..)
la source
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 .. catch
instructions, 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.
la source
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:
la source
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)?
la source
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.
la source
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?
la source