Comme le titre le dit, quel est votre problème préféré d’interview sur tableau blanc, et pourquoi s’est-il avéré efficace pour vous?
Junior, senior, Java, C, Javascript, PHP, SQL, pseudo-code, etc.
Comme le titre le dit, quel est votre problème préféré d’interview sur tableau blanc, et pourquoi s’est-il avéré efficace pour vous?
Junior, senior, Java, C, Javascript, PHP, SQL, pseudo-code, etc.
Réponses:
Je demande au candidat de concevoir une solution à un problème que j'ai rencontré dans mon travail quotidien. Ce faisant, j'essaie de créer un dialogue entre moi et le candidat. J'essaie de discuter du design qu'il construit comme si je n'avais jamais pensé au problème auparavant.
Ce que j'essaie d'évaluer, c'est si nous sommes capables de nous comprendre et si nous pouvons parler d'un problème technique sans confusion.
(Pour un développeur de bureau java)
Concevez une API pour gérer l' historique de navigation d'un navigateur Web (page précédente, page suivante, liste des 10 pages précédentes), et pouvant être réutilisée dans de nombreuses parties de l'application (ici, je donne des exemples concrets dans notre application). Ensuite, dessinez une implémentation.
J'aime celui-ci, car il est assez simple, facile à illustrer, il peut être résolu étape par étape (ajouter des comportements supplémentaires sans tout casser), il permet de parler des cas extrêmes et du traitement des erreurs, ainsi que des données. structures.
J'ai trouvé celui-ci extrêmement éclairant lors des entretiens avec les candidats et du filtrage de ceux qui n'avaient aucune affaire. Sa complexité est similaire à celle de Fizz Buzz, mais se concentre sur les compétences en bases de données.
Assuming the following basic table structure
Documents (DocID, DocDate)
Keywords (KeyWordID, KeyWord)
DocumentKeywords (DocID,KeywordID)
Write a query to return the following:
Part 1: Documents with a DocDate after 4/1/1995
Part 2: Documents that contain the keyword "Blue"
Part 3: Documents that contain the either the keyword "Blue" or "Yellow"
Part 4: Documents that contain the both the keywords "Blue" and "Yellow"
Je les ai laissés écrire dans la variante SQL de leur choix et je ne suis pas trop pointilleux face aux problèmes de syntaxe mineurs. Je veux surtout savoir qu'ils comprennent les concepts de base des bases de données relationnelles.
La plupart des candidats peuvent passer à travers la partie 3 sans aucun problème. Vous seriez surpris de voir combien pensent que la réponse à la partie 4 consiste simplement à changer l'opérateur de OR à AND dans la clause where.
"Dessinez pour moi sur le tableau blanc le design du dernier projet sur lequel vous avez travaillé, sans me révéler aucun détail sensible."
Mettre en œuvre strcpy
, strcmp
et les amis.
atoi()
.
strdup()
.
strrev()
une fonction d'inversion de chaîne. Ma solution de tableau blanc les a impressionnés et je fais le travail maintenant.
Mon préféré qui englobe quelques disciplines est de compter le nombre de nœuds dans un arbre binaire en fonction de l'interface (en C #):
public interface IBinaryTree<T>
{
IBinaryTree<T> Left
{
get;
}
IBinaryTree<T> Right
{
get;
}
T Data
{
get;
}
// Other properties and methods not germane to this problem.
}
et juste pour le plaisir, voici la mise en œuvre, bien que la personne interrogée n'ait pas besoin de voir cela.
public sealed class BinaryTree<T> : IBinaryTree<T>
{
private readonly IBinaryTree<T> left;
private readonly IBinaryTree<T> right;
private readonly T data;
public BinaryTree(
IBinaryTree<T> left,
IBinaryTree<T> right,
T data)
{
this.left = left;
this.right = right;
this.data = data;
}
public IBinaryTree<T> Left
{
get
{
return this.left;
}
}
public IBinaryTree<T> Right
{
get
{
return this.right;
}
}
public T Data
{
get
{
return this.data;
}
}
// Other properties and methods not germane to this problem.
}
et la classe assistante:
public static class BinaryTreeNodeCounter
{
public static int CountNodes<T>(this IBinaryTree<T> tree)
{
// TODO: What goes here?
}
}
La solution que j'aime voir est la suivante:
public static class BinaryTreeNodeCounter
{
public static int CountNodes<T>(this IBinaryTree<T> tree)
{
return tree == null
? 0
: 1 + tree.Left.CountNodes() + tree.Right.CountNodes();
}
}
Comme il démontre la connaissance de:
Deux questions qui ont suscité d’intéressantes discussions au tableau blanc sont les suivantes:
Ils commencent simples et deviennent de plus en plus complexes.
Je n'aime pas utiliser un puzzle ou une question de conception comme une question au tableau blanc. Je préfère des questions simples, simples, qui testent la capacité du candidat à écrire du code. Mes favoris sont:
1) Ecrivez une fonction pour inverser une liste chaînée. (Cela prend un certain temps avant qu'ils se rendent compte qu'ils ont besoin de 3 pointeurs.)
2) Étant donné un arbre binaire, trouvez la profondeur de l’arbre binaire. (Cette question teste leur capacité à écrire du code récursif. Laisse-moi vérifier si leur cas de base est intact.)
3) Écrivez une procédure pour la recherche binaire d'un tableau d'entiers. (Comme le dit Jon Bentley (dans Programming Pearls), beaucoup de gens ont tendance à faire des erreurs en écrivant une recherche binaire. On peut ensuite faire un suivi avec la recherche de bogues, l'écriture de scénarios de tests, l'analyse du code, etc.)
Nous l'avons utilisé dans une entreprise pour laquelle j'ai travaillé
Nous avons remis au candidat un morceau de papier utilisé pour le suivi du temps. C'était une véritable feuille de temps utilisée par une ou nos divisions. Nous avons demandé au candidat de nous guider tout au long du processus de conception afin de créer un meilleur outil de suivi du temps. Pas de frontières, je n'ai pas dit quelle langue, etc., je veux juste voir à quel point le candidat était bon au "cycle de vie complet". Cela nous a permis de mieux comprendre comment ils ont réuni leurs besoins. Comment ils ont structuré les tables de base de données, quel type d’interface utilisateur ils pourraient faire. Des compétences en communication étaient évidemment nécessaires pour cette tâche. Cela se faisait habituellement dans une pièce avec plusieurs grands tableaux blancs et durait jusqu'à deux heures.
Nous avons embauché plusieurs personnes qui ont utilisé ce processus et s’ils réussissent très bien à la tâche, ils le feront vraiment bien pour nous. S'ils étaient marginaux et que nous avions décidé de les engager quand même (sujet distinct), ils étaient des programmeurs marginaux.
J'utilise un problème qui concerne mon domaine de programmation.
Si je développe des applications Web, je veux voir comment ils pourraient créer un formulaire Web qui supprime des enregistrements et quelle approche ils pourraient adopter pour supprimer l'enregistrement de la base de données, par exemple. Cela me dit s’ils connaissent les principes de base d'une base de données, comment ils interagissent avec l'utilisateur pour vérifier la suppression et s'ils savent ce qu'est une suppression logicielle.
Je n'ai pas de favori. Le problème que je choisirai variera grandement en fonction du travail.
Peu m'importe qu'ils puissent résoudre le problème complètement ou pas en entretien, quelles technologies et quelles langues ils utilisent, ou à quel point leur code est pourri sur un tableau blanc. Je cherche un modèle de pensée; Je veux voir s'ils savent réfléchir et résoudre les problèmes.
Mon préféré était celui de l'un de mes amis.
Ecrivez-moi une fonction pour générer / imprimer / stocker les "n" premiers nombres premiers, puis expliquer son fonctionnement et son efficacité.
Cela fonctionne bien parce que:
Il s’agit d’une question d’algorithme, de sorte que l’interviewé doit être capable de réfléchir, puis d’expliquer sa pensée - pour que vous puissiez voir comment fonctionne son cerveau.
C'est indépendant de la langue.
Presque personne ne comprend tout à fait raison (il y a habituellement un cas extrême qui leur manque (1 ou 2 normalement), ou ils ne gèrent pas les nombres négatifs, vous pouvez donc voir comment ils gèrent les bugs et se faire dire qu'ils ont tort.
La plupart le font comme un tamis simple mais très lent (par exemple, 80% des gens vont vérifier que n est un nombre premier en divisant n par tous les entiers inférieurs à n), ce qui vous laisse toute latitude pour discuter de la façon dont ils pourraient améliorer l'algorithme Par exemple, "pourquoi divisez-vous un nombre par 4 si vous savez déjà qu'il n'est pas divisible par 2?" ou "Vous avez déterminé qu'il vous suffit de diviser par tous les nombres premiers inférieurs à sqrt (n), mais cela nécessite de stocker ces chiffres quelque part, alors quelles en sont les conséquences?")
Ils n'ont pas besoin de trouver la bonne réponse. Si quelqu'un peut penser et expliquer son raisonnement, il reste encore beaucoup à faire pour être un bon candidat.
Quelque chose appelée aff_z, qui faisait partie des examens C de mon école d'ingénieur et était utilisée comme test "factice" pour faire échouer les étudiants au retour de vacances (notre système de notation impliquait que l'échec d'un test stoppait le marquage; invalide tout votre test. Vous oblige à faire attention aux détails débiles). Je l'ai réutilisé une ou deux fois lors des entretiens.
En tout cas ... j'ai oublié la formulation exacte mais c'était quelque chose comme ça ...
Write a function taking a single char parameter named c and returning nothing (void).
You function must satisfy the following requirements:
- if c is bigger or equal to 0, then print 'z' to standard output
- if c is stricly smaller than 0 , then print 'z' to standard output
- in any other case, print the letter 'z' to standard output
Ce qui est triste, c’est que non seulement certains étudiants proposent des solutions extrêmement compliquées lorsque la réponse est assez évidente, mais que certains parviennent même à échouer.
Et croyez-le ou non, cela s'est produit également lors des entretiens.
Le faire en entrevue était assez amusant, car certains candidats commençaient par écrire les branches possibles et comprenaient ensuite ce qui ne va pas (évidemment, si vous leur posez la question oralement, il est tout à fait compréhensible qu’ils le fassent comme vous le dites ... donnez-le par écrit, je trouve ça déroutant ...)
C'est idiot, mais j'imagine que c'est un filtrage minimaliste (de même, lors de l'embauche de programmeurs JS, je demande toujours comment déclarer une variable, puis en fonction de leur réponse, l'utilisation de var fait ou non une différence. Assez souvent, un moment triste, honnêtement.)
variablename = variablevalue;
", alors que les bons riraient au téléphone ou en personne et me disaient directement ce qui serait différent avec ou sans var
).
Cela dépend vraiment de ce que vous recherchez. En tant qu’organisation qui effectue de nombreux travaux Web dynamiques impliquant des images, j’ai tendance à poser une question de géométrie pertinente. Quoi qu’il en soit, j’ai tendance à poser une question de géométrie, car j’estime qu’il s’agit d’un bon test de maths, visuel et agréable, qui permet de montrer aux candidats la capacité de présenter visuellement leur travail et de résoudre méthodiquement un problème.
Pour les candidats avancés, je pose occasionnellement la question suivante:
Cette image montre un croissant de lune. La largeur du croissant de B à D est de 9 cm et entre E et F, de 5 cm. C est le centre du grand cercle.
a) S'il vous plaît calculer la superficie du croissant.
b) Décrivez les calculs nécessaires pour redimensionner une image pour s’adapter au cercle intérieur à partir d’une taille donnée, et positionnez-la dans le cercle si le point central est connu.
Pour une question plus facile, je donne généralement le même type de question, mais utilisez l'exemple "carré dans un cercle dans un carré". Bien que cela soit très facile, je m'attendrais donc à une algèbre parfaite.
De plus, j'ai tendance à leur demander de créer un algorithme pour générer toutes les combinaisons d'un ensemble de données de longueur variable.
Les meilleures réponses de FizzBuzz que j'ai vues sont:
SQL Server 2008
;WITH mil AS (
SELECT TOP 100 ROW_NUMBER() OVER ( ORDER BY c.column_id ) [n]
FROM master.sys.all_columns as c
CROSS JOIN master.sys.all_columns as c2
)
SELECT CASE WHEN n % 3 = 0 THEN
CASE WHEN n % 5 = 0 THEN 'FizzBuzz' ELSE 'Fizz' END
WHEN n % 5 = 0 THEN 'Buzz'
ELSE CAST(n AS char(6))
END + CHAR(13)
FROM mil
C # (simple)
foreach (int number in Enumerable.Range(1, 100))
{
bool isDivisibleBy3 = (number % 3) == 0;
bool isDivisibleBy5 = (number % 5) == 0;
if (isDivisibleBy3)
Console.Write("Fizz");
if (isDivisibleBy5)
Console.Write("Buzz");
if (!isDivisibleBy3 && !isDivisibleBy5)
Console.Write(number);
Console.WriteLine();
}
C # (intelligent)
Enumerable
.Range(1, 100)
.Select(i =>
i % 15 == 0 ? "FizzBuzz" :
i % 5 == 0 ? "Buzz" :
i % 3 == 0 ? "Fizz" :
i.ToString())
.ToList()
.ForEach(s => Console.WriteLine(s));
Je cherche quelques éléments chez les candidats que j'ai interviewés. Pour des raisons que je ne peux pas décrire en ligne, nous avons des candidats assez médiocres, et je m'y attendais, alors je suis assez facile avec eux. Même encore, je cherche:
Sensibilisation au design.
"Montrez-moi la structure de la table pour un programme de carnet d’adresses comportant des contacts avec des noms et des prénoms pouvant comporter plusieurs numéros de téléphone et une description du numéro (cellulaire / domicile / travail / etc.)"
Je ne cherche pas de diagramme de spécification UML 2.0 ici, mais un simple diagramme en bulle ici. Tant que c'est raisonnable.
Connaissance du travail avec une base de données (c.-à-d. SQL)
Connaissance des tests
Supposons qu’une méthode avec la signature public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)
existante renvoie les résultats de votre requête précédente. Supposons que si vous transmettez une valeur null à la méthode, elle renvoie une exception NullReferenceException. Ecrivez un test pour démontrer cette fonctionnalité.
Ecrivez un test démontrant que GetPhoneNumbers renverra un numéro de téléphone à la maison de (123)456-7890 pour une personne portant le nom "smith".
Savoir écrire du code
Implémentez une méthode qui répondra aux exigences des tests que vous avez écrits.
Compte tenu du nombre et de la qualité des candidats que nous avons reçus, j'ai interviewé toutes les personnes sérieusement postulées. Je n'ai embauché personne.
Je les laisse généralement dessiner un schéma du dernier système sur lequel ils ont travaillé, leur poser des questions sur les relations entre les blocs et les laisser expliquer le bloc sur lequel ils travaillaient / étaient en charge. Vous pouvez apprendre beaucoup de cet exercice, comme regarder au-delà de son petit domaine, à quel point il est important pour lui de savoir "où" il agit, ainsi que sur le rôle qu'il jouait, était-ce une clé ou un côté? rôle.
Ecrivez un algorithme pour le problème suivant: Avec un nombre n , indiquez le nombre total d'arbres binaires (uniques) comportant n nœuds.
Ainsi, pour n = 0 et n = 1, la réponse est 1. Pour n = 2, vous avez 2: le nœud racine, puis le deuxième nœud à gauche ou à droite.
Vous pouvez mieux comprendre les techniques de conception et voir si elles pensent à la récursivité, à la mémorisation ou à la solution de programmation dynamique.
[Voir aussi cette discussion sur StackOverflow pour le cas connexe, mais différent, des arbres de recherche binaire.]
Si je devais interviewer un développeur de logiciel, je lui demanderais de concevoir un logiciel et de décrire la configuration matérielle requise pour supprimer les entrées en double d'un fichier arbitrairement volumineux contenant un nom complet sur chaque ligne. Je laisse certaines parties de la description du problème ambiguë délibérément. Je lui demande ensuite s'il comprend l'analyse et la clarification des exigences, les différents compromis, les structures de données et les algorithmes, les E / S (stockage secondaire), les technologies logicielles et matérielles, l'évolutivité, etc.
Je pense que c'est un problème petit mais difficile, révélant les connaissances et les capacités du demandeur dans de nombreux domaines informatiques.
Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence
Beaucoup de gars pourraient rester coincés là-dessus. Si une solution est donnée - il utilise généralement la récursivité. Après ça:
Implement the same via 'for'-loop
Je ne peux pas vous dire combien de boursiers n'atteignent pas les deux tâches - 50% des candidats.
C'est pour ça que j'aime bien :)
fib(n)=round(power(PHI,n)/SQRT5)
. PHI et SQRT5 sont des constantes représentant le nombre d'or (1,618 ...) et la racine carrée de 5, respectivement.
Pour les bases de données, je vais avec:
Tableau: Choses Nom d'identité 1 Bodkin Van Horn 2 Hoos-Foos 3 Hoos-Foos 4 Hot-Shot 5 Marvin O'Gravel Balloon Face 6 Snimm 7 Marvin O'Gravel Balloon Face 8 Marvin O'Gravel Balloon Face 9 Dave
Ecrivez-moi un type de code SQL qui dédupliquera une table comme celle-ci en fonction du nom (et je ne me soucie pas de l'identifiant que je récupère mais celui qui est renvoyé doit être valide pour ce nom). Ainsi, une fois que le code SQL correct aura été appliqué, la table présentera quelque chose comme:
Tableau: Choses Nom d'identité 1 Bodkin Van Horn 2 Hoos-Foos 4 Hot-Shot 5 Marvin O'Gravel Balloon Face 6 Snimm 9 Dave
Je l'aime parce que:
(C’est là que j’aperçois qu’il ya un moyen tout à fait trivial de le faire et que j’ai trop compliqué les choses toutes ces années).
SELECT min(ID), Name FROM Things GROUP BY Name
cela fonctionnerait, non?
HAVING count(Name) > 1
, vous semblez peut-être vouloir dire quelque chose du genre , mais je suppose que votre exemple de réponse devrait exclure Bodkin Van Horn, Hot Shot, Snimm et Dave.
DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name)
. Avez-vous une solution préférée?
Mon problème de tableau blanc C ++ préféré consiste à implémenter le candidat
Vector3 a(1, 0, 0), b(0, 1, 0); // Mathematical 3D vectors
double c = 7.0;
double d = a * c;
Vector3 e = a * b;
De cela je peux apprendre
Comment représenteriez-vous un jeu de cartes standard de 52 cartes? Tout langage de programmation est bon. Comment mélangerais-tu les cartes?
Mon préféré est de commencer par demander le prototype de printf. Puis, étant donné une API de bas niveau printc (char c), qui imprimera un caractère, implémente printf. Donne toutes sortes de réponses intéressantes comme la pile fait partie de la CPU. Comme vous l'avez peut-être deviné, je viens d'un arrière-plan C et intégré.
varargs()
ou utiliser une fonction de ce type. Ai-je raison? Je ne l'ai fait qu'une fois pour dire que je l'avais fait il y a un moment.
Vous avez un bol avec 200 poissons dedans. 99% de ces poissons ne sont pas des guppys. Combien de poissons devriez-vous retirer pour que 2% de ce qui reste soient des guppys. Montre ton travail.
Il s’agit d’exigences déroutantes. On dit de cette façon de changer de perspective plusieurs fois au cours d'une même question. Il s'agit de voir s'ils peuvent comprendre ce qui se passe réellement.
Vous seriez surpris de voir combien de personnes se trompent.
answer = 100
. [En supposant que vous puissiez sélectionner sélectivement les autres poissons. Si vous supprimez les guppys, il existe d'autres réponses.] Bonne question, vous seriez surpris de voir combien peu de gens le gèrent bien, même si cela devrait être un jeu d'enfant pour un programmeur.
J'ai quelques favoris, mais voici un couple qui arrive presque toujours. La plupart du temps, je fais des entretiens techniques de dernière ronde (C ++), donc privilégiez les questions plus longues et plus ouvertes qui mènent à de nouveaux domaines d’intérêt. Il n'y a pas de «bonne» réponse, juste une ouverture à une autre conversation.
1) Implémentation d'un pointeur partagé de base, explications sur les points faibles par rapport aux indicateurs partagés de tr1 ou boost dans leur mise en œuvre, utilisation appropriée, etc.
2) une révision du code. Pour les employés expérimentés, nous espérons qu’ils seront en mesure d’examiner en toute confiance le code fourni pour résoudre les problèmes de conception, les erreurs, les horreurs de codage et les problèmes de maintenabilité potentiels. Aussi, bien sûr, comment ils régleraient le problème; et parfois, comment ils transmettaient ce message au développeur junior qu'ils abattaient.
Une question que je me sers depuis qu’elle a été utilisée est la suivante:
Ecrivez une fonction pour imprimer tous les nombres compris entre 1 et 100.
Une grande partie de la raison pour laquelle je l'utilise est due au fait que vous pouvez alors prendre la solution et aller dans différentes directions:
Comment modifieriez-vous la fonction pour imprimer tous les nombres compris entre 1 et 1000, 10000 ou n ?
Leurs réponses à ces questions pourraient vous donner une idée de la manière dont ils répondent aux exigences changeantes, ainsi que de leur capacité à reconnaître les considérations de performances. Un candidat fort pourrait répondre avec une question concernant ce que la fonction est nécessaire pour combien de fois il serait appelé.
Se déplacer dans une direction différente:
Comment changeriez-vous les choses si vous saviez que cette fonction sera appelée plusieurs fois par minute et que la performance pose problème?
J'utilise cela comme un moyen de vérifier leur pensée latérale. Étant donné que le calcul des nombres premiers peut être lent à mesure que la valeur maximale augmente, il est parfois plus judicieux d'utiliser une sorte de table de correspondance calculée ou précalculée, qui est ajustée en fonction du problème que vous tentez de résoudre.
En voici une pour provoquer une réflexion: la procédure est simple, elle implique un peu de calcul et vérifie les connaissances du candidat en matière de conception informatique de base (débordement, représentation numérique, etc.):
Ecrivez un programme (ou une procédure) prenant une paire d'entiers X, Y en entrée et déterminant si X * Y est divisible par 10. REMARQUE IMPORTANTE: X et Y peuvent être suffisamment grands pour que X * Y déborde du type entier le plus grand disponible. sur votre machine.
T_BOOL MultipleOfTen(int x, int y)
{
return((x%2==0 || y%2==0) && (x%5==0 || y%5==0));
}
Complétez la méthode suivante: PS Un mode d’un nombre est le nombre (dans la liste) qui a le plus d’occurrences.
public int getMode(List<Integer> numberList) {
}
Ceci est à voir d'effecient est votre code.
Comment représenteriez-vous une matrice de rechange relativement volumineuse ... disons 1000x1000 mais comportant au plus 100 entrées non nulles?