[Test Développeur] Test pour recruter un développeur
Posté : 02 avr. 2014, 13:07
Bonjour à tous,
J'ai construit un test PHP (ci-dessous) que je vous soumets pour savoir si vous pensez que ce dernier serait suffisant pour avoir une bonne idée du niveau du développeur.
Etant à la recherche d'un développeur passionné en PHP pour un projet super innovant, ce test aurait pour but de pouvoir filtrer dans un premier temps les personnes intéressées.
Qu'en pensez-vous ? Auriez-vous d'autres idées plus pertinentes ?
Merci encore pour votre retour.
===================================================================================================
Base de données simple
----------------------
Dans ce problème, vous allez implémenter une base de données avec stockage en mémoire.
À des fins de simplicité, plutôt que de traiter les requêtes de différents clients à travers le réseau,
votre programme recevra des commandes via l'entrée standard (stdin), et écrira ses réponses sur la sortie standard (stdout).
Ce problème devrait vous prendre entre 30 et 90 minutes. Utilisez PHP.
Ce qui nous intéresse : du code propre et un algorithme performant !
Les commandes
-------------
Votre base de données doit accepter les commandes suivantes :
SET nom valeur – Assigner "valeur" à la variable "nom". Ni les noms de variables ni les valeurs ne contiendront d'espaces.
GET nom – Afficher la valeur de la variable "nom", ou NULL si la variable n'a pas été valorisée.
UNSET nom – Libérer la variable "nom", comme si aucune valeur ne lui avait été assignée.
VARS valeur – Afficher le nombre de variables qui contiennent actuellement cette valeur. Si aucune variable ne contient cette valeur, afficher 0.
END – Quitter le programme. Ce sera toujours la dernière commande que votre programme recevra.
Votre programme recevra les commandes une par une, avec chaque commande sur sa propre ligne.
Chaque sortie produite par votre programme devra se terminer par un caractère de fin de ligne.
Voici quelques exemples de séquences de commandes :
INPUT OUTPUT
SET ex 10
GET ex 10
UNSET ex
GET ex NULL
END
INPUT OUTPUT
SET a 10
SET b 10
VARS 10 2
VARS 20 0
SET b 30
VARS 10 1
END
De plus, votre programme devra permettre l'utilisation de transactions en implémentant les commandes suivantes :
BEGIN – Ouvrir un nouveau bloc de transaction. Les blocs peuvent être imbriqués (un BEGIN peut être appelé à l'intérieur d'un bloc existant)
ROLLBACK – Annuler toutes les commandes appelées dans le bloc de transaction le plus récent, et fermer le bloc.
Ne rien afficher en cas de succès, afficher NO TRANSACTION si aucune transaction n'est en cours.
COMMIT – Fermer tous les blocs de transaction ouverts, en appliquant les changements effectués dans chacun d'entre eux.
Ne rien afficher en cas de succès, afficher NO TRANSACTION si aucune transaction n'est en cours.
Toute commande effectuée en dehors d'un bloc doit être appliquée immédiatement.
Voici quelques exemples :
INPUT OUTPUT
BEGIN
SET a 10
GET a 10
BEGIN
SET a 20
GET a 20
ROLLBACK
GET a 10
ROLLBACK
GET a NULL
END
INPUT OUTPUT
BEGIN
SET a 30
BEGIN
SET a 40
COMMIT
GET a 40
ROLLBACK NO TRANSACTION
END
INPUT OUTPUT
SET a 50
BEGIN
GET a 50
SET a 60
BEGIN
UNSET a
GET a NULL
ROLLBACK
GET a 60
COMMIT
GET a 60
END
INPUT OUTPUT
SET a 10
BEGIN
VARS 10 1
BEGIN
UNSET a
VARS 10 0
ROLLBACK
VARS 10 1
COMMIT
END
Performance
-----------
Les opérations les plus courantes sont GET, SET, UNSET, et VARS.
Toutes ces commandes devront avoir un temps d'exécution pire-cas de O(log N) ou mieux, où N est le nombre total de variables stockées dans la base de données.
La majorité des transactions ne mettront à jour que quelques variables. Votre solution devra donc être efficace en termes de mémoire utilisée par les transactions.
J'ai construit un test PHP (ci-dessous) que je vous soumets pour savoir si vous pensez que ce dernier serait suffisant pour avoir une bonne idée du niveau du développeur.
Etant à la recherche d'un développeur passionné en PHP pour un projet super innovant, ce test aurait pour but de pouvoir filtrer dans un premier temps les personnes intéressées.
Qu'en pensez-vous ? Auriez-vous d'autres idées plus pertinentes ?
Merci encore pour votre retour.
===================================================================================================
Base de données simple
----------------------
Dans ce problème, vous allez implémenter une base de données avec stockage en mémoire.
À des fins de simplicité, plutôt que de traiter les requêtes de différents clients à travers le réseau,
votre programme recevra des commandes via l'entrée standard (stdin), et écrira ses réponses sur la sortie standard (stdout).
Ce problème devrait vous prendre entre 30 et 90 minutes. Utilisez PHP.
Ce qui nous intéresse : du code propre et un algorithme performant !
Les commandes
-------------
Votre base de données doit accepter les commandes suivantes :
SET nom valeur – Assigner "valeur" à la variable "nom". Ni les noms de variables ni les valeurs ne contiendront d'espaces.
GET nom – Afficher la valeur de la variable "nom", ou NULL si la variable n'a pas été valorisée.
UNSET nom – Libérer la variable "nom", comme si aucune valeur ne lui avait été assignée.
VARS valeur – Afficher le nombre de variables qui contiennent actuellement cette valeur. Si aucune variable ne contient cette valeur, afficher 0.
END – Quitter le programme. Ce sera toujours la dernière commande que votre programme recevra.
Votre programme recevra les commandes une par une, avec chaque commande sur sa propre ligne.
Chaque sortie produite par votre programme devra se terminer par un caractère de fin de ligne.
Voici quelques exemples de séquences de commandes :
INPUT OUTPUT
SET ex 10
GET ex 10
UNSET ex
GET ex NULL
END
INPUT OUTPUT
SET a 10
SET b 10
VARS 10 2
VARS 20 0
SET b 30
VARS 10 1
END
De plus, votre programme devra permettre l'utilisation de transactions en implémentant les commandes suivantes :
BEGIN – Ouvrir un nouveau bloc de transaction. Les blocs peuvent être imbriqués (un BEGIN peut être appelé à l'intérieur d'un bloc existant)
ROLLBACK – Annuler toutes les commandes appelées dans le bloc de transaction le plus récent, et fermer le bloc.
Ne rien afficher en cas de succès, afficher NO TRANSACTION si aucune transaction n'est en cours.
COMMIT – Fermer tous les blocs de transaction ouverts, en appliquant les changements effectués dans chacun d'entre eux.
Ne rien afficher en cas de succès, afficher NO TRANSACTION si aucune transaction n'est en cours.
Toute commande effectuée en dehors d'un bloc doit être appliquée immédiatement.
Voici quelques exemples :
INPUT OUTPUT
BEGIN
SET a 10
GET a 10
BEGIN
SET a 20
GET a 20
ROLLBACK
GET a 10
ROLLBACK
GET a NULL
END
INPUT OUTPUT
BEGIN
SET a 30
BEGIN
SET a 40
COMMIT
GET a 40
ROLLBACK NO TRANSACTION
END
INPUT OUTPUT
SET a 50
BEGIN
GET a 50
SET a 60
BEGIN
UNSET a
GET a NULL
ROLLBACK
GET a 60
COMMIT
GET a 60
END
INPUT OUTPUT
SET a 10
BEGIN
VARS 10 1
BEGIN
UNSET a
VARS 10 0
ROLLBACK
VARS 10 1
COMMIT
END
Performance
-----------
Les opérations les plus courantes sont GET, SET, UNSET, et VARS.
Toutes ces commandes devront avoir un temps d'exécution pire-cas de O(log N) ou mieux, où N est le nombre total de variables stockées dans la base de données.
La majorité des transactions ne mettront à jour que quelques variables. Votre solution devra donc être efficace en termes de mémoire utilisée par les transactions.