Je suis donc actuellement à la recherche d'un nouveau poste de développeur front-end. Je connais très bien JavaScript et j’ai une connaissance poétique des choses suivantes: fermetures, curry, héritage prototypique, modèles de conception, performances des applications et architecture frontale globale. Mais je finis toujours par des entretiens d'embauche à la bombe. (FYI la plupart des emplois que je interviewe sont pour la construction de SPA avec une sorte de cadre MVC)
Habituellement, les tests de codage sont de petits extraits de code de choses que je n'ai jamais rencontrées de manière professionnelle. Comme écrire une fonction pour résoudre un problème mathématique. Mis à part l'héritage maladroit d'essayer de coder en tenant le téléphone dans une main et en permettant à un étranger de voir votre écran et de regarder tous les caractères que vous tapez, je ne vois généralement pas ce genre de choses dans le monde réel.
Est-ce un ensemble de compétences sérieux qui me manque ou bien les intervieweurs me posent-ils des questions non pertinentes? J'imagine que je devrais travailler sur ma programmation fonctionnelle et mes algorithmes, mais je n'ai pas trouvé beaucoup de bonnes ressources sur le Web (ou sur papier), des suggestions?
la source
Réponses:
L'écriture de code n'est qu'une partie du processus d'entrevue.
En réalité, la résolution du problème logique n’est qu’une partie de la tâche d’écriture de code.
Les intervieweurs veulent être sûrs que:
Vous pouvez écrire du code. De nombreux candidats ayant une expérience professionnelle de dix ans dans une langue ne peuvent écrire aucun code et ce test est destiné à rejeter ces candidats.
Vous pensez à un problème avant d'écrire du code. Beaucoup sautaient sur leurs claviers, écrivaient des dizaines de lignes de code, puis découvraient qu'ils avaient mal compris le problème initial, car ils n'avaient pas pris le temps de les réfléchir.
Vous êtes capable de vous adapter lorsque vous écrivez du code. Supposons que vous ayez trouvé une solution, mais lorsque vous avez commencé à la mettre en œuvre, il est apparu que votre première idée n'était pas la meilleure. pouvez-vous passer rapidement à un meilleur, éventuellement refactoriser le code que vous avez écrit?
Cela signifie également que ces entretiens devraient être plus interactifs . Au lieu de taper avec une main, achetez un kit mains libres ou appelez via Skype et utilisez un casque. Tapez pendant que vous tapez au travail, tout en commentant et expliquant ce que vous faites: cela deviendra soudainement beaucoup moins gênant.
Avez-vous fait la programmation en binôme? Si oui, la situation de l'entretien est très similaire, sauf que l'intervieweur ne peut pas vous donner son avis et que vous ne lui demandez pas de changer de clavier avec vous lorsque vous avez terminé.
Voici quelques exemples d’un problème purement mathématique et comment il montre les compétences non mathématiques d’un développeur.
Exemple 1: exercice de codage simple
Ici, l'intervieweur souhaite que vous réfléchissiez le plus rapidement possible, que vous trouviez la solution et que vous la mettiez en œuvre rapidement. Un tel exercice n'a aucun lien avec ce que font les développeurs mais est beaucoup plus proche de ce que vous pouvez trouver lorsque vous faites un diplôme en informatique, mais les intervieweurs aiment ce genre de choses, alors faisons-le. De plus, les contraintes de temps empêchent tout test automatisé. L'enquêteur ne s'attend donc probablement pas à cela de votre part.
«La description de l'algorithme me fait penser à la récursivité. La deuxième règle mène à la fonction récursive suivante. ”
"Pour mettre fin à la récursion, nous allons ajouter les cas spéciaux en remplaçant le corps de la
fibonacci
fonction.""Terminé."
Conclusion
Comme je l'ai dit, un tel exercice n'a aucun lien avec le travail réel d'un développeur. Cela le rend-il sans signification? Pas vraiment, car au moins, cela montre que la personne:
Est capable de penser à un problème. Certains candidats seront totalement perdus et, sous le stress, il leur faudra plus que le temps imparti pour réfléchir à une façon possible d'aborder le problème.
Sait la récursion ou est capable de contourner la récursion par une boucle ordinaire. Plus tard, l'intervieweur peut demander s'il existe des moyens d'utiliser / de ne pas utiliser la récursivité et quels sont les avantages / inconvénients de la récursivité.
Connaître les bases du langage de programmation. Peu importe qu'il s'agisse d'une personne
switch
, d'une clause de sauvegarde, d'un conditionnel ou d' un dictionnaire : différents candidats choisiront différents outils pour réaliser la même chose.Reste concentré sur le problème, sans apporter de choses comme les tests unitaires, l'évolutivité ou les performances. L’intervieweur peut ensuite demander pourquoi, en ce qui concerne les performances, la fonction ci-dessus est terrible, car elle attend du candidat qu’il explique ce qui doit être fait pour amener les performances à un niveau raisonnable.
Exemple 2: questions délicates
Maintenant, nous avons une contrainte intéressante qui montre que l'intervieweur ne se soucie pas vraiment de la capacité du candidat à résoudre des problèmes, mais plutôt de sa capacité à deviner quelles voies sont plus rapides que les autres.
Ces questions difficiles appellent généralement des réponses difficiles. Ici, compte tenu des contraintes de temps, il n’est pas possible de faire plusieurs implémentations, de les comparer, de profiler la plus rapide et d’obtenir une solution optimale.
Au lieu de cela, qu'en est-il:
"Laissez-moi Google" Premiers chiffres de Fibonacci "... Cela semble prometteur. Avec une expression régulière
simple(qui serait un oxymoron), nous pouvons construire une liste de valeurs séparées par des virgules. ""Enfin, le programme lui-même."
Conclusion
Les questions épineuses invitent des réponses difficiles. Ne soyez pas héroïque et ne commencez pas l'analyse comparative et le profilage lorsque vous ne disposez que de trois minutes. Pensez à des moyens intelligents de résoudre le problème tout en utilisant votre expérience. Mon expérience me donne à penser que l’utilisation d’une carte peut être plus rapide que le calcul du nombre. C'est peut-être une erreur, mais cette tentative est à prévoir compte tenu des contraintes de temps.
Connaître vos outils est également utile et constitue une partie essentielle des compétences des développeurs: sans connaître les expressions régulières, je passerais les trois minutes allouées à rechercher une liste séparée par des virgules, ou bien je commencerais à écrire un analyseur qui construira le tableau dont j'ai besoin.
N'oubliez pas qu'un bon développeur n'est pas celui qui commence immédiatement à coder, mais qui sait comment éviter de le coder quand une meilleure opportunité est disponible. Certains intervieweurs n'hésiteront pas à vous donner des tâches qui ressemblent à des tâches de codage, mais qui ne nécessitent pratiquement aucun code.
Exemple 3: développement complet de l'application
Commençons.
«L'exemple de séquence est très utile, car il me permettra de réaliser un ensemble de tests unitaires pour m'assurer que mon implémentation n'a pas l'air complètement fausse. En général, j'utilise Mocha pour node.js ou QUnit pour JavaScript côté client, mais ici, par souci de simplicité, je vais simplement lancer un tas de fonctions de test. ”
«Je commence par créer
index.htm
etfib.js
classer. Ensuite, je remplisindex.htm
de code vraiment minimaliste et non conforme au W3C (nous pourrons y revenir plus tard si vos compétences en HTML vous intéressent également). ”"Écrivons maintenant du code qui appellera la fonction du générateur de Fibonacci et affichera les résultats."
«Il est temps d'exécuter le code pour la première fois et ... ça ne marche pas. Rien ne se passe. Pourquoi?"
«OK, j'ai oublié le
fibonacci.init();
à la fin. Je l'ai ajouté, mais rien ne se passe alors qu'il devrait au moins afficher le message dans la console. Attends, d'accord, ce n'est pasonclick
, maisclick
; J'utilise JQuery si souvent que je commence à oublier les noms des événements en JavaScript simple. ”"Ajoutons des tests."
"Comparer des tableaux peut être délicat, alors je viens de copier-coller le
Array.prototype.equals
code de cette réponse ."“Maintenant que nous exécutons l'application, elle affiche:”
“Le test a échoué, ce qui était hautement attendu, étant donné notre implémentation réelle (
return [1, 2, 3];
) de la séquence de Fibonacci. Il est temps de changer cela. "«À partir de la déclaration originale, la séquence de Fibonacci commence par
[0, 1]
,compute
devient ainsi :»"Cela permet de passer le premier test et nous pouvons maintenant écrire notre deuxième test."
"Il échoue, alors nous y revenons
compute
et le modifions."«Maintenant, les deux tests sont réussis et il est temps de passer aux cas non marginaux.»
«Les trois tests réussissent maintenant, sauf que le résultat ne semble pas correct pour des longueurs plus grandes, telles que 100. Pour obtenir de bons résultats, nous aurions dû utiliser une bibliothèque de précision arbitraire . Il y a aussi des choses à améliorer. Par exemple, les conventions de nommage sont parfois trop mauvaises (quoi
fib
?). Le code JavaScript lié à HTML doit également aller vers un objet différent, ainsi que le code de test. De plus, je n'ai pas testécompute(0)
ni vérifié les entrées. ”Conclusion
En parcourant l'exemple, vous pouvez voir l'interaction attendue lors d'une interview. Tout ne s'est pas déroulé sans heurts (au début, j'ai commis plusieurs erreurs qui m'ont conduit à une situation embarrassante où rien ne se passe lorsque je lance l'application), et l'approche initiale était boiteuse si nous devons supporter une longue séquence, mais j'ai réussi montrer que:
compute(0)
ce qui va échouer, mais peu importe la démo).C'est exactement ce à quoi un intervieweur doit s'attendre de votre part.
la source