1

Récemment ma boîte a lancé une annonce pour le recrutement d'un nouveau dev backend PHP. Étant le plus technique sur ce point, j'assiste aux entretiens avec mon responsable , et afin de tester les candidats de manière égale (nous cherchons un dev CakePHP, mais acceptons tout dev ayant des compétences dans un framework mvc) j'ai rédigé un petit questionnaire PHP pur.

Je vous propose de le tester, à savoir y répondre d'abord PUIS me faire vos remarques :-)
Pour information, il est prévu de laisser 30min pour ce questionnaire, pas d'accès à internet (une seconde partie "écrire du code" se fait sur le pc avec toute la doc accessible sur le net) ni test en local, juste voir les connaissances

----------

1 - Écrivez la condition suivante sous forme d'une condition ternaire :if ($victoire) { echo "Vous avez gagné"; } else { echo "Vous avez perdu"; }

2 - « Never trust user's inputs ». Qu'est ce qu'une injection SQL ? Qu'est ce qu'une faille XSS ? Pour chacune d'entre elle, donnez un moyen de s'en protéger.

3 - Les règles régissant les plaques d'immatriculation actuelles en France sont les suivantes :
1. Une plaque d'immatriculation s'écrit sous la forme AA-001-AA : deux lettres, trois chiffres, deux lettres, tout en majuscule, chaque groupe séparé par un tiret.
2. Le nombre central ne peut pas être 000 3. Les lettres I, O et U sont exclues

Écrivez une expression régulière (regex) permettant de trouver un numéro d'immatriculation française respectant ces règles au milieu d'un texte. Vous pouvez ignorer une ou deux des trois règles si vous n'avez pas certains concepts de regex en tête, le plus étant le mieux.

4 - Quelle est la différence entre public, protected et private dans une classe ?

5 - Soit if(condition) {...} où la condition à vérifier est que la variable $foo contienne la valeur « null ». Donnez toutes les possibilités qui vous viennent en tête sur la façon d'écrire cette condition.

6 - Les mots de passe des utilisateurs ne doivent jamais être stockés en clair dans une base de données. Qu'utiliseriez-vous pour les rendre illisibles ?
1. crypt
2. bcrypt
3. md5
4. sha1 5. sha256


7 - Quel va être l'affichage de sortie de la fonction suivante : $foo = 8 % 5; switch ($foo): case 0: echo "Bam !"; case 1: echo "Blam !!!"; case 2: echo "Dram !!"; case 3: echo "Slam !"; case 4: echo "Cram..."; case 5: echo "Mam ?"; default: echo "Tant pis..."; }

8 - Soit $date = "17/10/2012" (de type string). Modifiez cette variable pour qu'elle soit au format SQL YYYY-MM-DD (ex : 2012-10-17, toujours de type string).

9 - Qu'est ce que T_PAAMAYIM_NEKUDOTAYIM ?

10 - Quelles sont les valeurs de $a et $b à la fin de cette fonction : function doSomething( &$arg ) { $return = $arg; $arg += 1; return $return; } $a = 3; $b = doSomething( $a );


11 - La page contenant le code ci-dessous est accessible par l'url : localhost/mapage.php?user=Max
Quel sera le résultat à l'accès à cette page ?<html> <?php if (isset($_GET['user'])) : if (in_array($_GET['user'], array("Serge", "Max", "Jim") { header("Location: admin.php"); } header("Location: user.php"); } ?> <body> <h1>Bienvenue sur mon site</h1> <p>Je suis heureux de vous accueillir !</p> </body> </html>
avatar
« Nous avons propagé sur Extranet une histoire fabriquée de toutes pièces selon laquelle une certaine disposition d'étoiles, vue depuis la planète d'origine des butariens, formaient le visage d'une déesse galarienne.
Sans chercher à vérifier ces informations, certains ont décrété que c'était la preuve de l'existence de la déesse. Ceux qui notaient le manque de preuves se faisaient attaquer. »

Legion, geth trolleur à portée galactique

2

Meowcate (./2) :
9 - Qu'est ce que T_PAAMAYIM_NEKUDOTAYIM ?

Non mais sérieux qu'est ce que cette question a à voir avec les compétences en développement? une fois que la petite culture gé sur le nom débile de ce truc est acquise, est ce que tu utilises ce mot quotidiennement?
il s'agit pas de faire un petit plaisir a l'ego du recruteur, il s'agit de juger l'efficacité d'un candidat... face à du VRAI travail.

Tout le reste me parait extrêmement basique, scolaire, et ennuyeux. savoir répondre à ces questions ne demande aucune compétence spéciale. Ne pas savoir, par contre, c'est raccompagnement direct à la porte avec un coup de pied au c*l pour vous avoir fait perdre du temps...

je ne vois aucune question liée à ce que tu cherches vraiment, c'est à dire des gens compétents sur des frameworks. Pose des questions compliquées, là tu ne testes rien.

Il vaut mieux souvent poser des questions de bon sens technique que des machins théoriques qu'on a bâchoté.

Demande pourquoi une ampoule est chaude
Demande si 212.287.38.134 est une IP valide
Demande un truc sur une confusion entre == et =, sur les conversions implicites de type en PHP, sur un mot clé global dans une fonction, enfin des trucs qui font réfléchir quoi!

A la question 6 je peux répondre "aucun" en hurlant de peur devant tes propositions?

3

J'aurais voulu qu'on réponde d'abord aux questions, ensuite les commentaires tongue
Pour infos, je suis tombé sur ce terme en cherchant des questions possibles d'entretien, quelqu'un a proposé cela en guise de "blague". Du coup je l'ai reprise, pour me demander comment les candidats vont réagir, et ceux qui répondent ont de bonnes chances d'avoir cherché sur leur smartphone. Certains de ceux que j'ai déjà vu ont simplement laissé la question vide, j'en ai un qui a au moins tenté "C'est une variable globale ou une constante" du fait qu'elle est écrite en majuscule conformément à la convention PHP, ce à quoi il a mérité d'avoir une "bonne réponse".

Pour le reste, je suis content pour toi que les questions te semblent faciles à en hurler. Peux-tu cependant apporter les réponses aux questions ou cela t'est trop insultant ?
avatar
« Nous avons propagé sur Extranet une histoire fabriquée de toutes pièces selon laquelle une certaine disposition d'étoiles, vue depuis la planète d'origine des butariens, formaient le visage d'une déesse galarienne.
Sans chercher à vérifier ces informations, certains ont décrété que c'était la preuve de l'existence de la déesse. Ceux qui notaient le manque de preuves se faisaient attaquer. »

Legion, geth trolleur à portée galactique

4

J'ai surtout autre chose à faire.

Tu veux vérifier que je sais répondre avant de prendre en compte mes remarques?

5

Du calme squalyl... si un simple QCM te met dans cet état, respire un bon coup et supprime ce topic de tes sujets.

Meowcate : que veux-tu exactement comme commentaire ? Tu veux conserver ces questions et les améliorer sans les remettre entièrement en question, ou bien tu veux savoir lesquelles nous semblent intéressantes, ou bien encore tu cherches comment compléter ton questionnaire avec d'autres questions ? Par ailleurs quelles sont tes contraintes, dois-tu proposer quelque chose du style "QCM" comme ici, ou bien des questions plus ouvertes sont envisageables ?

Je pense qu'il faudrait que tu précises beaucoup de choses pour qu'on puisse te donner un avis, le sujet est vaste et je pense qu'on pourrait remplir des dizaines de pages de commentaire si tu ne nous indiques pas plus précisément vers quoi tu veux te diriger smile
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

6

Non mais je suis calme, hein grin

c'est juste qu'il semble me mettre inutilement au défi. je lui ai donné des commentaires que je pense utile, avec les éléments qu'on avait smile

7

Hu, squalyl :s mauvaise journée ?
Cross : je ne te mets pas au défi. Je préférai qu'on passe le test avant de répondre pour voir si, par exemple, d'autres personnes répondaient sans voir les exemples d'erreurs de code dans la question 11.

Je voulais que des personnes qui semblent à mes yeux assez compétentes pour venir résoudre des problèmes sur ce forum voient ce que pourraient donner ce formulaire. Si j'avais voulu des tests pointus sur PHP, je me serais inspiré des quizz PHP d'Aslacreations (je me souviens d'ailleurs avoir eu certains tests du sites à la virgule près lors d'un ancien entretien). Avec celui-ci, j'ai envie de voir à certains moments comment les gens réagissent, réfléchissent. Pour le côté plus "techniques" comme j'ai dit ils ont un test de code sur ordinateur.

Zeph : très honnêtement, j'aurais d'abord voulu des tests pour voir si mes questions posent tant problèmes. Si tu ne veux pas passer le test, tu es libre de lire le spoiler suivant.
Quand bien même certaines questions sont faciles, mes candidats vus jusqu'à présent butent sur bien des points, et ceux même avec plusieurs années d'expérience. Certains n'ont jamais entendu parler de ternaires. D'autres ne savent pas comment se protéger d'une faille XSS. J'en ai eu un qui n'a jamais entendu parler de regexp. Un seul a su me faire une conversion valable à la question 8. Et surtout, les codes des questions 7 et 11 ont des erreurs de codes intentionnelles qu'ils ne remarquent pas.
Aussi squalyl, je suis content que tu n'ais aucun soucis à répondre à la simplicité de ces questions, mais nous avons une quinzaine de candidats pour ce poste (après un premier écrémage).
Concernant tes remarques, sur les exemples de questions "qui font réfléchir", je ne vois pas en quoi une ampoule chaude a à voir ici, ou que savoir qu'une IPv4 a un max de 255 fait réfléchir. Pour ta remarque sur les confusions possibles des "=" et des conversions, c'est la question 5 et j'ai eu bien peu de réponses valables (à leur expliquer à chaque fois pourquoi $foo == null n'est pas une bonne réponse dans ce cas précis et leur parler du problème du typage dynamique).

Quant à ta question 6, tu peux si ça t'amuse. Je considère md5 comme la plus mauvaise réponse possible à mon sens, l'un d'eux l'a choisi en argumentant sur la rapidité des différents algorithmes. D'autres ont mis md5 sans réfléchir. Il y en a un qui a songé à sa réponse plutôt que par automatisme. C'est justement ce genre de comportement que je cherche à faire sortir par mon test.
En revanche je fais peut-être bien preuve de méconnaissance crasse à voir ta réaction. Peux-tu me dire (sans aucune ironie de ma part) quelle serait une bonne réponse si ce n'était pas un QCM mais une réponse libre ?

Après, je suis codeur, pas DRH. J'ai cherché pas mal d'exemples de codes et de questions de recruteurs pour savoir ce que je voulais chercher, je suis peut-être totalement à côté.
avatar
« Nous avons propagé sur Extranet une histoire fabriquée de toutes pièces selon laquelle une certaine disposition d'étoiles, vue depuis la planète d'origine des butariens, formaient le visage d'une déesse galarienne.
Sans chercher à vérifier ces informations, certains ont décrété que c'était la preuve de l'existence de la déesse. Ceux qui notaient le manque de preuves se faisaient attaquer. »

Legion, geth trolleur à portée galactique

8

Pour les erreurs de code de 7 et 11, une fois c'est bien, deux fois c'est un peu lourd je pense. En plus tester intensivement si les gens voient ce genre d'erreur en lecture rapide lors d'un QCM ne me semble pas une donne tres interessante, faire une faute de frappe arrive a tous le monde et c'est ce type de fautes qu'un compilateur, ou meme PHP dans ce cas trouve tres bien et avant meme que le code soit exécute, donc pas le genre d'erreur qui peux passer en production sans etre vu.)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

9

Marrant, j'ai beau n'avoir jamais fait de PHP, j'arrive à répondre à la plupart des questions (même la 9, comme quoi y'a pas besoin de s'énerver ^^)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

10

P'taiiiin... mon entretien actuel a répondu à la question 9... et vu son background ce n'est pas le genre qui triche. Cette question n'était PAS censée être résolue.
Et 0², comment connais-tu la 9 ? ^^
EDIT : bon d'accord, en fait c'est surtout comparé à mes compétences que l'ego en prend un coup, puisque je suis le plus porté sur les petits détails dans l'équipe ^^

Godzil : dans l'idée, la 7 c'était une typo, la 11 c'était une erreur d'avoir soit fait un : au lieu de {, soit } au lieu de endif (puisque "endswitch" n'existe pas). Malgré cela, certains ont vu cette erreur en 11 mais pas en 7.
Après tout cela, une fois de plus, est fait pour voir la façon de répondre et de réagir. Il n'y a rien de vraiment éliminatoire, on ne recrute pas quelqu'un qui va écrire du code sans doc et sans le tester. Ces petits "pièges" n'ont pas pour but de faire trébucher le candidat.
En exemple, ma ligne in_array manque deux parenthèses fermantes. Quelqu'un m'a fait souligner cette erreur alors que j'avais fini par l'oublier, comme quoi je n'en tiens pas compte tant que ça.
avatar
« Nous avons propagé sur Extranet une histoire fabriquée de toutes pièces selon laquelle une certaine disposition d'étoiles, vue depuis la planète d'origine des butariens, formaient le visage d'une déesse galarienne.
Sans chercher à vérifier ces informations, certains ont décrété que c'était la preuve de l'existence de la déesse. Ceux qui notaient le manque de preuves se faisaient attaquer. »

Legion, geth trolleur à portée galactique

11

l'esprit de ma réponse, c'est qu'un test de code, c'est pipeau. Tu peux bloquer quelqu'un par une formulation, alors qu'il connait le concept, et aurait pu répondre si la question avait été exprimée autrement. Donc à la limite, si on veut absolument faire un test de ce genre, je pense qu'il faut des réponses ouvertes.

Ce n'est que mon avis évidemment. Bien des recruteurs ne s'embarrassent pas.

Pour 6 quelle est la meilleure réponse pour toi? bcrypt? Moi je t'aurait dit SHA256+ un mécanisme de salt, car toute utilisation brute d'un hash est mauvause, juste parce qu'on peut comparer des hashs.

12

Meowcate (./10) :
Et 0², comment connais-tu la 9 ? ^^
Je l'avais vu dans un article sur le PHP, probablement sur TheDailyWTF grin (d'ailleurs mine de rien, grâce à ce site j'ai appris un certain nombre de trucs sur les langages/technos que je ne pratique pas, en regardant les exemples de ce qu'il ne faut pas faire)

Et cette question ne me paraît pas absurde : même sans savoir pourquoi ça s'appelle comme ça, c'est quelque chose qui apparaît dans un message d'erreur assez courant.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

13

J'avais lu que faire ce genre de test de code au pied levé, c'était contre la déontologie professionnelle, si tant est que ça existe en informatique. En effet, piéger quelqu'un sur une parenthèse ou un $ ne prouve en rien son incompétence générale et sa faculté à mathématiser des problèmes, à les porter sous une forme algorithmique, ça ne parle en rien de sa rigueur concrète dans le travail, de la propreté de son code, bref, ça rimerait pas à grand chose au final. Je suis très étonné de voir ça ici, mais peut-être ce que j'ai lu était très vieu ou erronné.

14

Folco (./13) :
la déontologie professionnelle, si tant est que ça existe en informatique
(ce petit troll glissé comme ça, l'air de rien grin)

Je suis d'accord que pénaliser quelqu'un pour un caractère oublié est contreproductif. Par contre, un test de code, même basique, permet d'éliminer les beaux parleurs qui sont infoutus de coder concrètement. Et apparemment, il y en a un paquet !
Un exemple "célèbre" que tu connais peut-être déjà : Fizzbuzz
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

15

Ah non, je connaissais pas, mais j'ignorais qu'il y avait des codeurs qui n'ont que de la gueule. Quant au troll, je savais pas que c'en était un, j'ai répété texto ce que j'ai lu un jour dans un article qui en parlait, tout simplement. ^^

16

Folco (./16) :
j'ignorais qu'il y avait des codeurs qui n'ont que de la gueule

rhoooo grin

17

Folco: ca existe dans tous les domaines, tu ne pensais pas que ca pouvais exister ici aussi?
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

18

Encore une fois, sur les réponses je suis très permissif smile je n'ai pas refusé des gens qui ne voyaient pas l'erreur, c'était davantage un "plus". Honnêtement je ne sais pas si j'aurais vu ces erreurs dans un entretien avec le stress de passer un test pour un boulot et l'absence de test local possible.
Mon dernier candidat "j'ai vu la 9" est tombé sur cette erreur il y a très longtemps... mais m'a dit également que ça traînait sur des questions de recrutement embarrassed
squalyl (./11) :
Tu peux bloquer quelqu'un par une formulation, alors qu'il connait le concept, et aurait pu répondre si la question avait été exprimée autrement.

Je debrief les candidats après le temps laissé, et on s'explique sur les questions et les réponses attendues. Il arrive que le candidat change sa réponse une fois expliquée sous un autre angle. C'est le plus important, et non un questionnaire où je donne un point par réponse et je prends le plus gros score.

0² > j'aurais voulu connaître cela tiens smile ça aurait pu faire l'écrémage qu'on a réalisé entre les postulants par email/tel et ceux qu'on a effectivement reçu (ce qui s'est finalement fait en collégial sur les CV).

Et les codeurs qui n'ont que de la gueule, on en avait un précédemment. Il a fini par être licencié à l'amiable (au risque de faute grave) pour code inconsistant, retard sur les projets, et toujours à se plaindre de ceci/cela qui l'empêchait de bosser et était la raison de ses résultats. Tu sais que tu as un problème quand les clients disent qu'ils ne veulent plus avoir à faire à cette personne.
C'est à cause de cette expérience que nous avons décidé de faire passer des tests de connaissance & codage pour s'assurer un minimum des compétences de nos candidats.
avatar
« Nous avons propagé sur Extranet une histoire fabriquée de toutes pièces selon laquelle une certaine disposition d'étoiles, vue depuis la planète d'origine des butariens, formaient le visage d'une déesse galarienne.
Sans chercher à vérifier ces informations, certains ont décrété que c'était la preuve de l'existence de la déesse. Ceux qui notaient le manque de preuves se faisaient attaquer. »

Legion, geth trolleur à portée galactique

19

bon si y'a discussion c'est bien. Mais du coup, pour moi, ça justifie que tu peux poser des questions bien plus tordues, pour voir la réaction.

20

Meowcate (./18) :
Tu sais que tu as un problème quand les clients disent qu'ils ne veulent plus avoir à faire à cette personne.

Ah, ben au moins ça c'est commun à tous les corps de métier grin

Meowcate : Ok pour le débrief. Le questionnaire sert, au final, plus de support que d'examen de passage. C'est pas ce que j'avais immaginé à la base en effet.

Godzil : ça me parait si dur à cacher que je pensais pas, non. Faut être sacrément culotté pour prétendre savoir coder quand on sait pas ^^

21

Les culotté il y en a malheureusement partout...
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

22

Folco (./20) :
Faut être sacrément culotté pour prétendre savoir coder quand on sait pas ^^
Il y a malheureusement moyen de faire illusion assez facilement, en copiant/collant des bouts de code trouvés sur le net pour la partie codage, et en balançant des concepts fumeux et/ou à la mode pour la partie architecture. Ça peut marcher tant que personne n'y regarde de trop près, ou que ce sont d'autres personnes qui font le boulot réel.

Au passage, embaucher quelqu'un comme ça est un excellent moyen de pourrir un projet de l'intérieur, avec effet à retardement. J'en ai eu bel exemple dans le dernier poste salarié que j'ai occupé.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

23

Meowcate, tu veux tester quoi avec ce questionnaire ? Là, il ne me semble pas qu'il puisse te permettre de vérifier que le candidat connait CakePHP ou qu'il a des compétences dans un autre framework MVC.

Si vous cherchez quelqu'un de confirmé, ce test me semble trop long pour juste voir s'il connait le PHP alors qu'il faudrait plutôt vérifier que vous partagez les mêmes idées (ou que le candidat est prêt à intégrer les vôtres) de conception de code, de procédure de test, etc. Pour tester un candidat, vous pouvez par exemple lui donner de la documentation (maximum 10 pages) à lire avant l'entretien sur votre framework préféré ou sur ce que vous voulez et l'interroger dessus. Pour voir s'il sait coder, un petit programme avec quelques méthodes manquantes à compléter est suffisant. Avec connexion à internet et documentation, dans les mêmes conditions que le travail de tous les jours.

Si vous cherchez un débutant, un test technique est presque inutile. Il faudra plutôt parler de son intérêt pour la programmation, de ses réalisations (si le candidat a déjà fait des sites web ou des programmes ou des jeux sur calculatrice pour lui-même ou pour ses proches)... Vous pouvez lui donner un programme à trou à compléter avec connexion à internet et documentation pour voir s'il sait se débrouiller.

En tout cas, si vous faites un test de programmation, il faut éviter de surveiller le candidat par-dessus l'épaule, ça pourrait le déstabiliser et diminuer sa performance.

Il ne faut pas oublier que c'est un entretien et pas un concours, ça ne sert à rien de faire des QCM, surtout si c'est pour revoir le tout en entretien. À la rigueur, on peut faire un questionnaire à questions ouvertes pour donner une base à la discussion qui va suivre. On peut tester sa culture dans votre domaine, mais il ne doit pas y voir de question piège, ça ne sert à rien.

Si tu tiens à ton questionnaire, par exemple, pour retirer le piège de la question 11, on peut demander pourquoi ce code ne donne pas le résultat qu'on pourrait en attendre.
avatar

24

Rapidement, sans lire les réponses qui ont suivi (Edit: désolé, j'ai pas tellement répondu aux questions, je crois. j'espère que les notes ci-dessous t'apporteront quand même quelques infos intéressantes).

1> j'ai du mal à voir l'utilité de la question : soit le gars sait ce qu'est l'opérateur ternaire soit il ne sait pas... quoi qu'il en soit, utiliser un ternaire dans ce cas n'est pas "mieux" que de ne pas en utiliser.

2> je vois à peu près l'intérêt de la question. je laisserais le candidat parler librement. en gros, je lui demanderais à quoi il pense quand il s'agit de sécurité et je verrais jusqu'où va sa réponse (css et sqli c'est les classiques ; la réponse peut aller plus loin, des fois). Moyens de s'en protéger, surtout pour les xss, il faut penser que c'est dépendant du contexte (tu htmlspecialchars() quand tu génères du html, mais pas quand tu génères du javascript, par exemple -- beaucoup oublient ce détail ^^ ).

3> moué. à la limite, pour voir si ton candidat a quelques notions de regex. en tant que recruteur, sur une question comme ça, j'aimerais beaucoup qu'un candidat me réponde qu'il va commencer par mettre en place des tests (c'est un cas d'école quasi parfait pour du TDD ^^ )

4> au-delà de la différence de visibilité évidente, l'utilité me semble plus importante (donc aller plus loin que la question ne le sous-entend : *pourquoi* jouer avec la visibilité ? )

5> si par valeur "null" tu entends le type null (et pas la chaine de caractères "null"), tu vois une autre solution que if (null === $foo) et if (is_null($foo)) ? (isset fera plus que ça ; empty fera plus que ça ; !$foo fera plus que ça ; 0 == $foo ou false == $foo ou null == $foo feront plus que ça)

6> aucune de tes propositions : PHP fournit password_hash() depuis PHP 5.5 -- c'est *la* fonction à utiliser si tu ne veux pas avoir à t'emmerder à gérer des trucs que tu comprends pas forcément toujours bien. Pour PHP 5.4 (et 5.3 hormis les plus vieilles) tu as une couche de compatibilité écrite en PHP. De mémoire, cela dit, password_hash() fait par défaut du bcrypt, au moins en PHP 5.5

7> la réponse attendue est "n'omettez jamais les break, sauf à mettre un commentaire explicitant que c'était voulu" ?

8> tu as en tête le truc de barbare à base de explode + implode ? ou tu penses à quelque chose de plus moderne et plus safe genre DateTime::createFromFormat puis DateTime->format ?

9> purement une question inutile, pour moi (le paamayim nekudotaiym, ça a d'intérêt que pour un quizz piégeur, si tu demandes aux gens de l'écrire :-p )

10 > $a=4 et $b=3 ? vu que $a est passé par référence ?

11 > il manque un exit() après tes header() de redirection. Et pour Location, la RFC HTTP dit que tu devrais utiliser des URLs absolues (même si les navigateurs ont tendance à accepter des URLs relatives)
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

25

En lisant les autres posts, maintenant :

Ah, je n'ai pas forcément répondu à tout -- j'ai un peu hésité sur la dernière question, en me demandant quel header Location serait finalement renvoyé au navigateur, vu qu'il n'y a pas de exit/die après chaque ^^
squalyl (./2) :
je ne vois aucune question liée à ce que tu cherches vraiment, c'est à dire des gens compétents sur des frameworks. Pose des questions compliquées, là tu ne testes rien.

Je suis assez d'accord : tu as là des questions qui permettent de voir si le gars en face de toi a quelques notions. Mais pas de juger d'un niveau autre que "en a déjà vu un peu" (certes, tu peux avoir besoin de ce niveau de filtre, mais la partie intéressante de l'entretien ne sera clairement pas ce questionnaire -- ah, aussi : si tu le fais passer par écrit, c'est vraiment pas sympa pour le candidat : c'est le genre de trucs qui passe bien mieux dans une conversation que sur papier où ça fait "froid" comme ambiance. Enfin, perso, une boite qui me fait passer un entretien de ce type sur papier tout seul dans une salle, je vais vraiment pas avoir envie de bosser pour eux...).
Meowcate (./3) :
Pour infos, je suis tombé sur ce terme en cherchant des questions possibles d'entretien, quelqu'un a proposé cela en guise de "blague". Du coup je l'ai reprise, pour me demander comment les candidats vont réagir, et ceux qui répondent ont de bonnes chances d'avoir cherché sur leur smartphone. Certains de ceux que j'ai déjà vu ont simplement laissé la question vide, j'en ai un qui a au moins tenté "C'est une variable globale ou une constante" du fait qu'elle est écrite en majuscule conformément à la convention PHP, ce à quoi il a mérité d'avoir une "bonne réponse".

Le :: tu connais le message d'erreur dès que tu as fait du PHP pendant quelques jours, à mes yeux : ça fait partie de la culture générale du langage (et savoir expliquer d'où vient le nom est un bon point : pareil, culture générale)
Meowcate (./7) :
Je considère md5 comme la plus mauvaise réponse possible à mon sens, l'un d'eux l'a choisi en argumentant sur la rapidité des différents algorithmes. D'autres ont mis md5 sans réfléchir. Il y en a un qui a songé à sa réponse plutôt que par automatisme. C'est justement ce genre de comportement que je cherche à faire sortir par mon test.

la rapidité, c'est bien dans certains cas, mais clairement pas pour un stockage de mots de passe. Au contraire, il est intéressant d'utiliser une fonction volontairement lente, pour luter contre le brute-force (j'ai déjà eu à l'expliquer à des mecs ayant plusieurs années d'XP -- ça peut être sympa pour ton candidat que tu lui expliques, aussi, s'il partait sur md5 pour sa rapidité)
Meowcate (./7) :
Après, je suis codeur, pas DRH. J'ai cherché pas mal d'exemples de codes et de questions de recruteurs pour savoir ce que je voulais chercher, je suis peut-être totalement à côté.

C'est pas facile de faire passer des entretiens techniques et de juger quelqu'un en une demi-heure à une heure, t'inquiète pas smile
Avant que je fasse passer mon tout premier entretien il y a des années, mon manager m'a dit que la question qu'il me poserait à la fin serait "est-ce que tu veux bosser avec lui ?" -- finalement, le niveau technique n'est qu'un point parmi d'autres (et tu peux être mieux placé qu'un RH pour juger l'aspect "humain" d'un développeur, aussi)
Meowcate (./10) :
Godzil : dans l'idée, la 7 c'était une typo, la 11 c'était une erreur d'avoir soit fait un : au lieu de {, soit } au lieu de endif (puisque "endswitch" n'existe pas). Malgré cela, certains ont vu cette erreur en 11 mais pas en 7.

Aergh, même pas vu ces trucs là grin
C'est carrément pas le genre d'erreur que je vois dans du code autour de moi : du code comme ça ne compile même pas (donc aucune chance que les tests passent et que ça soit commité)... Et même avant ça, c'est souligné en rouge dans l'IDE, donc ça a peu de chance d'arriver jusqu'à l'étape F5 du développement ^^
(sans compter que mélanger à ce point syntaxe traditionnelle et syntaxe alternative, je n'ai jamais vu ça)
Zerosquare (./14) :
Je suis d'accord que pénaliser quelqu'un pour un caractère oublié est contreproductif. Par contre, un test de code, même basique, permet d'éliminer les beaux parleurs qui sont infoutus de coder concrètement. Et apparemment, il y en a un paquet !Un exemple "célèbre" que tu connais peut-être déjà : Fizzbuzz

A faire en live avec la personne (sur papier ou sur tableau), pour voir sa façon de raisonner, qui est souvent plus importante que le code final !

Pour finir, comme dit par d'autres : ce test me semble plus orienté "piège à débutants" que "on cherche un développeur cakephp".
Tu peux aussi, dans la conversation (qui est LE truc important d'un entretien à mes yeux -- mes deux dernières boites, je suis allé les voir en entretien seulement après avoir vu plusieurs fois mes futurs collègues autour d'un verre, hors-boulot, sans même savoir que j'allais bosser avec eux un jour), parler plus librement smile. J'aime bien parler de veille, en entretiens : voir un peu si c'est juste un boulot pour le candidat, ou s'il est vraiment intéressé par ce qu'il fait.
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

26

squale92 (./24) :
6> aucune de tes propositions : PHP fournit password_hash() depuis PHP 5.5 -- c'est *la* fonction à utiliser si tu ne veux pas avoir à t'emmerder à gérer des trucs que tu comprends pas forcément toujours bien. Pour PHP 5.4 (et 5.3 hormis les plus vieilles) tu as une couche de compatibilité écrite en PHP. De mémoire, cela dit, password_hash() fait par défaut du bcrypt, au moins en PHP 5.5
Mouais, c'est un point de vue discutable je trouve.

Pour : comme tu le fais remarquer, ça évite que des gens qui ne s'y connaissent pas réimplémentent maladroitement un truc qui sera foireux du point de vue sécurité.

Contre : quitte à se reposer sur une solution existante, je ferais plus confiance à une biblio de sécurité/crypto (même si ce n'est pas la panacée, cf. les failles dans OpenSSL) plutôt qu'aux développeurs de PHP, qui ont montré par le passé à quel point ils pouvaient être mauvais grin
Et utiliser une fonction sans comprendre ce qu'elle fait n'est pas un bon plan non plus : imagine que cette fonction ait existé à l'époque où le MD5 était considéré comme sûr. Quelques années plus tard, MD5 est cassé, mais la fonction continue à l'utiliser pour assurer la compatibilité. Si tu lui fais aveuglément confiance, tu te fais avoir.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

27

Zerosquare (./26) :
imagine que cette fonction ait existé à l'époque où le MD5 était considéré comme sûr. Quelques années plus tard, MD5 est cassé, mais la fonction continue à l'utiliser pour assurer la compatibilité. Si tu lui fais aveuglément confiance, tu te fais avoir.

non, justement : si tu utilises l'algo par défaut et que celui aujourd'hui utilisé par défaut n'est plus jugé comme secure demain, un autre algo deviendra celui par défaut. Et donc ton code continuera d'utiliser (via password_hash()) un mécanisme jugé comme secure -- même si ce n'est pas le même qu'hier.
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

28

Sauf que du coup, tous les hashes stockés en BDD deviennent invalides, donc le changement ne peut pas être automatique.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

29

Non, la méthode de hash peut être marquée dans le hash, du genre $methode$sel$hash
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

30

Zerosquare (./28) :
Sauf que du coup, tous les hashes stockés en BDD deviennent invalides, donc le changement ne peut pas être automatique.

si : l'algo est stocké dans la chaine retournée par password_hash().

Quand tu as un mot de passe et que tu vérifie son hash (à l'identification d'un utilisateur, typiquement), tu fais ensuite appel à password_needs_rehash() pour voir si le mot de passe doit être re-haché (par exemple, parce que l'algo a changé).
Et si oui => tu stocke le nouveau hash (donc, généré avec le nouvel algo)
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall