Developpez.com - PHP
X

Choisissez d'abord la catégorieensuite la rubrique :


Test d'embauche en PHP

Date de publication : 31/12/2009 , Date de mise à jour : 31/12/2009

Par Rija Randriano (Site perso de Randriano)
 

De plus en plus de recruteurs exigent des candidats qu'ils écrivent, pour prouver leurs savoir-faire, des bouts de codes ; mais pas n'importe quels bouts : il faut que ceux-ci soient entièrement fonctionnels.

La différence est de taille.

Joel Spolsky, célèbre programmeur américain - il a notamment été le chef de projet d'Excel entre 1991 et 1994 -, explique qu'il impose toujours cet exercice aux candidats. Mais lui, précise-t-il, ne demande qu'une bribe de code, pas un produit fini "qui tourne". Pour Spolsky, il s'agit d'évaluer in vivo la capacité à penser, à réagir aux critiques, à s'adapter. Ce type d'exercice, précise-t-il, ne sert en fait pas à évaluer un savoir-faire technologique.

Il utilise une métaphore intéressante. Un test fondé sur l'écriture de code revient à évaluer les capacités d'un électricien ou d'un plombier. Il ne viendrait à l'esprit de personne de demander à l'une de ces deux professions de faire toute l'électricité ou toute la tuyauterie d'un studio avant l'embauche.

C'est pourtant, pour continuer la métaphore, ce que font les recruteurs qui demandent une application clef en main à un programmeur.

Certains vont jusqu'à dire que ces exigences sont irrespectueuses et, pour parler cruement, complètement à "coté de la plaque".
Un candidat n'a en effet pas le temps matériel de produire un code focntionnel pour chaque entreprise à laquel il postule. Un recruteur peut néanmoins évaluer la motivation de cette manière. Mais la manière reste bizarre.

Irrespectueux également pour les programmeurs seniors. Un simple examen du CV ou une conversation sur quelques subtilités devraient suffire à évaluer la maîtrise de tel ou tel langage.

Enfin, pour d'autres, écrire un code fonctionnel passe surtout à coté de l'essentiel.

Or l'essentiel c'est ce que cherche Joel Spolsky ou n'importe quel bon recruteur : mettre à jour les facultés d'apprentissage et d'adaptation dans le temps (avec la syntaxe d'un langage donné).

Un test fondé sur la production d'un code fonctionnel est une photo figée. Pas une mise en perspective du profil du candidat.

Pour toutes ces raisons, la question de la pertinence de ce genre de tests se pose de plus en plus, surtout en période économiquement tendue où les rapports de force employeurs-employés sont modifiés au profit des premiers. Et où il est difficile de refuser.

Y compris les pratiques les plus inadéquates ?

Source : Les billet de Spolsky (ici)




Exercice 1

Il s'agit de gérer les notes des étudiants d'un établissement scolaire.
On donne la base de données composée de 3 tables dont 2 contiennent déjà des valeurs.
sql
-- phpMyAdmin SQL Dump
--
-- Version de PHP: 5.2.1
-- 
-- Base de données: 'test_01'
-- 
CREATE TABLE 'etudiant' (
  'id_etudiant' int(10) NOT NULL auto_increment,
  'nom_etudiant' varchar(30) character set latin1 collate latin1_general_ci NOT NULL,
  'prenom_etudiant' varchar(30) character set latin1 collate latin1_general_ci NOT NULL,
  PRIMARY KEY  ('id_etudiant')
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

INSERT INTO 'etudiant' ('id_etudiant', 'nom_etudiant', 'prenom_etudiant') VALUES 
(1, 'RANDRIANO', 'Rija'),
(2, 'DUPONT', 'Paul'),
(3, 'RAKOTO', 'Andry'),
(4, 'HAMILTON', 'Steve'),
(5, 'ROBERT', 'Andrew'),
(6, 'STRAUSS', 'Mike');

CREATE TABLE 'module' (
  'id_module' int(10) NOT NULL auto_increment,
  'nom_module' varchar(30) character set latin1 collate latin1_general_ci NOT NULL,
  'coeff_module' int(10) NOT NULL,
  PRIMARY KEY  ('id_module')
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

INSERT INTO 'module' ('id_module', 'nom_module', 'coeff_module') VALUES 
(1, 'Mathématiques', 3),
(2, 'Informatique', 2),
(3, 'SVT', 2),
(4, 'Littérature', 2),
(5, 'Education Physique et Sportive', 2);

CREATE TABLE 'note' (
  'id_note' int(10) NOT NULL auto_increment,
  'idnote_etudiant' int(10) NOT NULL,
  'idnote_module' int(10) NOT NULL,
  'valeur_note' float NOT NULL,
  PRIMARY KEY  ('id_note'),
  UNIQUE KEY 'idnote_etudiant' ('idnote_etudiant','idnote_module')
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
1) Il s'agit de créer la page formulaire.php qui contiendra les formulaires pour saisir les notes de chaque étudiant. Il est préférable d'utiliser des listes déroulantes pour choisir les étudiants et les matières.

  • La note est une valeur comprise entre 0.00 et 20.00 ; on pourra vérifier la valeur entrée avant envoi par Javascript
2) Créer la page moyenne.php qui calcule et affiche les moyennes de chaque étudiant par ordre de mérite


Exercice 2

On donne souvent un deuxième exercice pour étudier le raisonnement et la capacité à trouver une solution de la part du candidat. Il s'agit d'un exercice où l'on met des bugs dans un code déjà écrit : au candidat de résoudre les bugs.

En plus, il y a souvent une autre question qui consiste par exemple à trier un tableau à deux dimensions. Pour cela, on va utiliser la fonction usort().


Rappel de la fonction usort()

Cette fonction permet de trier un tableau en utilisant une fonction de comparaison.

Description

bool usort ( array &$array, callback $cmp_function )

usort() va trier le tableau array avec ses valeurs, en utilisant une fonction définie par l'utilisateur. Si un tableau doit être trié avec un critère complexe, il est préférable d'utiliser cette méthode

La fonction de comparaison cmp_function doit retourner un entier, qui sera inférieur, égal ou supérieur à zéro suivant que le premier argument est considéré comme plus petit, égal ou plus grand que le second argument. Si les deux arguments sont égaux, leur ordre est indéfini.


Correction de l'exercice 1


Script formulaire.php

php
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Formulaire de saisie des notes</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript">
<!--
	function verifyNote()
	{
		var mynote = parseFloat(document.getElementById('idnote').value);
		if ((mynote >= 0) && (mynote <=20))
			document.myform.submit();
		else
			alert('Donnees incorectes');
	}
//-->
</script>
<body>
	<h1>Formulaire</h1>
	<form name="myform" method="get" action="formulaire.php">
		<table>
		<tr><td>Etudiant</td><td>
            <select name="nom_etudiant">
            <?php
				mysql_connect('localhost','root','');
				mysql_select_db('test_01');
				
				$res = mysql_query("SELECT id_etudiant, nom_etudiant, prenom_etudiant FROM etudiant");
				
				while($row = mysql_fetch_row($res))
				{
					echo '<OPTION value="'.$row[0].'">'.$row[2].' '.$row[1].'</OPTION>';
				}
			?>
            </select>
        </td></tr>
		<tr><td>Module</td><td>
            <select name="nom_module">
            <?php 
				$res = mysql_query("SELECT id_module, nom_module FROM module");
				
				while($row = mysql_fetch_row($res))
				{
					echo '<OPTION value="'.$row[0].'">'.$row[1].'</OPTION>';
				}
			?>
            </select>
        </td></tr>
		<tr><td>NOTE : </td><td><input id="idnote" name ="note"></td></tr>
		<tr><td></td><td><INPUT type="button" value="Envoyer" onclick="verifyNote();"></td></tr>
		</table>
	</form>
</body>
</html>
<?php 
	$id_etudiant = $_GET["nom_etudiant"];
	$id_module = $_GET["nom_module"];
	$note = $_GET["note"];
	
	if (isset($id_etudiant) && isset($id_module) && isset($note))
	{
		mysql_query("INSERT INTO note(idnote_etudiant, idnote_module, valeur_note) VALUES(".$id_etudiant.",".$id_module.",".$note.")");
	}
?>

Script moyenne.php

php
<?php 
	mysql_connect('localhost','root','');
	mysql_select_db('test_01');
	
	$res = mysql_query("SELECT prenom_etudiant, nom_etudiant, ROUND(T_Moy.somme/T_Moy.somme_coeff, 2) AS moyenne
		FROM etudiant LEFT JOIN
		(SELECT idnote_etudiant, SUM( valeur_note * coeff_module ) AS somme, SUM(coeff_module) AS somme_coeff
		FROM module
		INNER JOIN note ON ( module.id_module = note.idnote_module )
		GROUP BY note.idnote_etudiant) AS T_Moy 
		ON (etudiant.id_etudiant = T_Moy.idnote_etudiant)
		ORDER BY moyenne DESC");
		
	echo '<table>';
	while($row = mysql_fetch_row($res))
	{
		echo '<tr><td>'.$row[0].'</td><td>'.$row[1].'</td><td>'.$row[2].'</td></tr>';
	}


Valid XHTML 1.1!Valid CSS!

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
Contacter le responsable de la rubrique PHP