Quels types de compétences déterminent une personne capable de déboguer facilement du code? Il y a quelque temps, mon ami a réalisé une interview avec un relativement bon programmeur. Le programmeur a été embauché. Il pouvait écrire du bon code, comprendre les cadres et les modèles de conception. La chose qui lui manquait était - des compétences de débogage. Il ne pouvait pas du tout déboguer et trouver des problèmes avec son code ou celui de quelqu'un d'autre était une énorme douleur pour lui.
Depuis lors, nous réfléchissons à la façon dont nous pouvons évaluer ou estimer les compétences de débogage d'une personne.
La première question est donc: quelles compétences déterminent si une personne peut déboguer efficacement un logiciel?
Et la seconde: comment tester ces compétences lors de l'entretien?
Si la première chose que la personne veut faire est de regarder le code et de le parcourir avec un débogueur, cette personne n'est pas un excellent dépanneur.
Si vous n'avez pas encore de plan d'action et que vous plongez dans le store du débogueur, vous êtes essentiellement Easter Egging. Cela est vrai pour tout type de dépannage.
Dans une situation d'entrevue, une personne qui demande comment le système fonctionne et pose des questions sur l'historique du système serait quelqu'un qui pourrait être un bon dépanneur. Une personne qui pense au système en premier et à la mécanique en second pourrait être un bon dépanneur.
Cela est vrai de tout système complexe.
Je dirais que la meilleure mesure d'un bon développeur de logiciel dans un langage ou un cadre particulier est la capacité d'analyser de manière critique des problèmes complexes et d'avoir de bonnes compétences de débogage dans le langage ou le cadre. Ils doivent être en mesure de démontrer le débogage de bas niveau ainsi que leur maîtrise du débogage de haut niveau avec des outils de débogage courants.
Cela signifie créer un scénario pour eux qui démontre une grande aptitude des outils de débogage dans leur IDE choisi. Vous devriez chercher des choses comme:
Exécution d'une application ou d'un serveur en bac à sable en mode débogage ou création d'une application avec des symboles pour le débogage
Mise à disposition et démonstration des ports de débogage à distance ou débogage d'une application non sandbox qui a été construite avec des symboles (si applicable à la langue)
Utilisation stratégique des points d'arrêt
Propriétés personnalisées des points d'arrêt, expressions conditionnelles sur les points d'arrêt (si applicables à la langue)
Utilisation d'expressions ou d'observations de variables pour surveiller les valeurs ou références de variables
Utilisation d'une valeur de variable ad hoc ou d'une manipulation de référence ou de pointeur en temps réel
Démontrer sa capacité à entrer, dépasser et sortir du flux d'application
Évaluation critique de la pile d'appels
Débogage d'applications multi-thread et compréhension de cela.
D'autres stratégies de débogage sans outils doivent également être démontrées, telles que l'analyse des journaux et du code source, ainsi que la possibilité d'effectuer un débogage de bas niveau sans utiliser un IDE également.
Je dirais distiller un bug que vous aviez dans votre système à quelque chose qui peut être discuté dans le cadre d'une interview. Lancez le débogueur et laissez-le faire.
Posez-lui des questions comme celle-ci:
Comment abordez-vous un problème?
Quel est l'un des projets complexes que vous avez réalisé et comment l'avez-vous réalisé?
Quels outils de débogage avez-vous utilisés?
Avez-vous une préférence pour certains outils?
Donnez un exemple de votre propre scénario et demandez-lui comment il va y faire face?
Comment évalueriez-vous votre capacité à entrer dans le code de quelqu'un d'autre?
Vous pouvez répondre à vos préoccupations en posant des questions. Il y a toujours un risque qu'il soit ou non bon dans certaines compétences. Mais s'il est un bon apprenant, cela aidera beaucoup.
Si vous voulez voir si un programmeur peut déboguer, donnez-lui le code à corriger. C'est la même approche si vous voulez voir s'ils peuvent écrire du code. Donnez-leur un problème et demandez-leur d'écrire du code.
Maintenant, je suis confus à propos de ce programmeur qui n'a aucun problème à écrire du code mais échoue lamentablement lorsqu'on lui demande de déboguer. Cette personne régurgite-t-elle des exemples de code ou s'en tient-elle simplement à des domaines dans lesquels il a de l'expérience, comme la lecture et l'écriture dans une base de données? À moins qu'ils obtiennent le bon code la première fois, ils ne peuvent pas le réparer?
Peut-être que la personne n'aime pas le débogage et ne fait aucun effort? Je ne suis pas bon dans ce domaine, alors arrêtez de me demander de le faire - impuissance apprise.
Travailler sur une base de code existante nécessite de parcourir le code, la documentation et, éventuellement, de faire vos propres notes et desgins.
Je sais que nous pensons que le débogage corrige le code de production qui a échoué, mais je dois déboguer du code pendant que je l'écris. Soit cette personne n'est pas un très bon programmeur, soit elle préfère simplement écrire du nouveau code. Ne nous tous.
De la même manière que vous détermineriez la capacité de codage de quelqu'un, posez-lui des questions sur le débogage.
Demandez-leur "comment" ils trouveraient un bogue dans une situation donnée.
Allez plus loin, installez-les devant un ordinateur et regardez-les déboguer un problème.
J'ai souvent donné aux candidats des situations hypothétiques ... par exemple, un système de production a cessé de répondre. Que faire? Ils peuvent répondre "vérifier les journaux" et je dis "les journaux ne montrent rien d'anormal, sauf qu'il n'y a rien écrit dedans depuis que le problème a commencé". Et cela continue, jusqu'à ce que je sois convaincu d'avoir évalué la capacité des candidats à résoudre des problèmes.
Habituellement, les personnes ayant de bonnes aptitudes sont également celles qui ont de bonnes compétences en débogage.
Pendant l'entretien, (en fonction de leur ancienneté), vous pouvez leur confier une tâche similaire à un puzzle tel qu'un algorithme ou plus. Voilà la manière simple.
Si vous le pouvez, vous pouvez imprimer un code à partir d'un travail, demandez à la personne si quelque chose ne va pas ici et si oui, comment y remédier.
Je ne préfère pas vraiment poser des questions d'entrevue obscures qui ont tendance à se concentrer sur la capacité des gens à lire et à corriger la syntaxe.
Pendant une interview, demandez-leur de vous parler d'un bug qu'ils ont résolu dans le passé et des étapes qu'ils ont utilisées pour le déboguer.
Demandez-leur de vous dire ce qu'ils ont fait dans leur dernier emploi, leurs devoirs, etc. Et ce qu'ils ont vécu pour trouver le problème.
Je partagerai une expérience avec une perspective de recrues sur le test des compétences d'un candidat en débogage. J'ai continué une interview qui a eu trois étapes. La deuxième étape était un "cas pratique". Je n'en savais pas plus à ce moment. Pendant que j'y étais informé, il existe un système qui a cessé de fonctionner et ils ne le savent pas. Quelques bugs sont derrière.
Il a été organisé en tant que bureau distant dans un ancien environnement de test. Probablement dans un environnement débranché ou isolé. Le projet consistait en quelques formulaires Web avec des contrôles ASP.NET et du code de fichier de code associé. Le fichier de code faisait référence à une sorte de couche métier pour laquelle je n'ai qu'une dll, pas de code source ni de description de méthode. Les formulaires Web ont fait les fonctions CRUD que vous pouvez attendre. Aussi une petite fonction de recherche. La couche métier, à son tour, a parlé à Views et SP dans un serveur SQL.
Ils ont cassé certaines parties à différents niveaux. On m'a donné un papier avec des symptômes. "Impossible de rechercher" "Le champ" région "a disparu après la dernière mise à jour" et ainsi de suite. Tels que vous pouvez recevoir de vos utilisateurs.
Je ne me souviens pas de tous les détails mais au moins un champ de table a été renommé, ce qui a conduit à un SP cassé, qui a été utilisé par la fonction de recherche. Cela signifie aucune erreur dans VS et aucun code source BL pour tracer les noms de champ. Un paramètre SELECT contre Sqlcommand a été mal orthographié et a provoqué un dysfonctionnement d'un formulaire Web. Un champ a également été omis qui était le champ manquant dans GridView (Autogeneratecolumns). Un bouton ASP.NET fait référence à quelque chose qui doit être censé être une méthode dupliquée et améliorée et "oublié" pour pointer le bouton vers une nouvelle méthode.
Aussi une chose mineure en utilisant le titre dans une balise html qui ne le permet pas. La balise ALT opposée a également été omise dans un contrôle qui l'exigeait. Il y a également eu des erreurs avec des balises html fermées incorrectes mais qui n'ont pas mal fonctionné. Je ne sais pas si tout cela était une pure erreur de projet de maison de jeu ou peut-être le même projet pour différents recrutements. Je n'ai jamais demandé. Le niveau de difficulté doit bien sûr correspondre aux besoins de la recrue.
Un tel test devrait probablement être filtré (non suivi) pour voir, après l'entretien, comment le débogage a été effectué. Pour moi à ce stade, j'ai trouvé le test un peu ridicule, mais ce serait aussi le gros point. Si c'était le cas ou non, cela devrait valoir beaucoup pour que le candidat soit au bon endroit.
* Je pense que ce test a été prouvé par les candidats/mes compétences *
* Analyser un système étranger
* Utilisez un minimum d'informations pour trouver les erreurs et les bogues
* Sous contrainte de temps et sans que personne ne vous aide, le code suppose des corrections
* Différents niveaux de connaissances;
** sql db et procédures stockées,
** utilisation de dll dans le projet,
** technique asp.net,
** architecture en couches
** aspect orienté problème
Mais aussi les choses les plus évidentes comme gérer l'environnement de développement, trouver et comprendre l'outil de gestion de serveur Db. Il y a sûrement des candidats qui ont l'air vraiment sympas sur le papier mais qui, dans la pratique, pourraient rester sur de telles tâches.
Je choisis un problème réel que j'ai rencontré qui est pertinent pour le poste et je le présente au candidat tel qu'il m'a été présenté. Bien sûr, je leur offre des informations générales et une petite quantité de documentation pertinente comme un extrait de code ou un diagramme schématique.
Je leur dis que leur travail consiste à résoudre le problème et je leur propose de répondre à toutes les questions techniques qu'ils ont et de leur dire le résultat de toutes les expériences qu'ils souhaitent effectuer. S'ils disent: "Je mettrais ici une sonde de portée", alors je leur esquisserais une trace de ce qu'ils pourraient trouver. S'ils veulent insérer un printf
dans une boucle, je leur dirai qu'il ne sort jamais (!) Ou imprime d'abord "7" puis à plusieurs reprises "5". S'ils s'éloignent si loin dans les mauvaises herbes que je ne peux pas donner de réponses significatives, j'admettrai que nous sommes sur la mauvaise voie et revenons ailleurs. S'ils sont coincés, je poserai des questions directrices ou donnerai des indices jusqu'à ce que nous puissions continuer.
Ce que je veux voir, c'est des processus de réflexion ordonnés, une détermination à trouver la solution, des questions et des expériences mûrement réfléchies et, idéalement, une identification réussie du problème. Parfois, je choisis des problèmes trop complexes pour que quelqu'un puisse déboguer complètement dans une interview d'une heure et à la fin je leur donne la vraie réponse. À ce stade, je suis à la recherche d'une réaction qui montre qu'ils ont été impliqués dans le problème et ont vécu ce moment "aha" et la gratification pour arriver à la cause. Les meilleurs candidats poseront spontanément des questions de suivi à ce stade, essayant de relier leur carte mentale du problème avec ce qui se passait réellement.
Les asseoir à un ordinateur avec quelques symboles binaires simples (avec débogage) qui segfaults avec une référence de pointeur nul ou tel + code source + gdb et voir s'ils peuvent trouver la cause de l'accident?
Si vous demandez à vos candidats de faire un test de code préliminaire, demandez-leur de modifier le code pendant l'entretien pour résoudre un bogue ou ajouter une nouvelle fonctionnalité ou mieux encore les deux. Si vous rendez les spécifications de test de code assez vagues, cela faciliterait la création de cas de test avec des "bogues".
Trouver "le bogue" dans un petit extrait de code est une situation très artificielle. Je suppose que cela pourrait être utile de la même manière que les puzzles et les énigmes.
Une approche plus globale poserait des questions comportementales sur la façon dont le candidat a effectué le débogage dans le passé en citant des incidents spécifiques, puis en effectuant un suivi avec des questions.
Quelqu'un qui est bon dans le dépannage sera en mesure de parler de plus que des installations de débogage dans l'IDE. Qu'en est-il ... des outils de rapport de bogues, de l'interaction avec l'utilisateur final, de la reproduction du bogue, de l'analyse du fichier journal, de la vérification?
Le débogage est BEAUCOUP PLUS que le traçage à travers un bloc de code et toute évaluation des compétences de débogage de quelqu'un devrait le refléter.
Donnez à quelqu'un du code génial que votre entreprise gère en production. Demandez-leur d'introduire un bug subtil. Demandez-leur pourquoi ils ont choisi celui-là. Demandez-leur comment ils s'y prendraient pour le trouver et le réparer.
Point bonus s'ils trouvent un bug dans le code d'origine.
Double bonus si ils peuvent corriger le bug dans le code d'origine.
J'ai tendance à demander aux gens de me décrire le bug le plus difficile qu'ils aient jamais eu à localiser et à corriger et ce qu'ils ont fait pour le trouver et le corriger. Je sais également que si le bug le plus difficile était quelque chose que vous attendez d'un débutant à trouver difficile, alors ce ne sont probablement pas de bons dépanneurs (sauf s'il s'agit d'une interview pour le niveau d'entrée). Si c'est quelque chose de vraiment difficile et qu'ils décrivent leur processus de pensée en essayant de le retrouver, alors je peux avoir une idée de leur niveau de compétence. Ce qui m'a toujours étonné, c'est le grand nombre de personnes qui ont un look "cerf dans les phares" et ne peuvent pas penser à un seul exemple de quelque chose qu'ils ont fait qui était compliqué. Eh bien, désolé, quelqu'un qui laisse les problèmes difficiles à résoudre par quelqu'un d'autre n'est pas quelqu'un qui m'intéresse pour quoi que ce soit, sauf un emploi tout droit sorti de l'école, très junior.
Je voudrais poser quelques questions indépendantes de la technologie comme les suivantes:
Cela fonctionne très bien, surtout dans les entretiens téléphoniques, car vous n'avez besoin que de la personne pour vous donner une réponse convaincante qui montre comment il fait vraiment les choses tout en résolvant un problème.