Quel est votre problème d'interview de tableau blanc préféré? [fermé]


52

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.


4
Un problème que je détestais était le casse-tête d'Einstein. stanford.edu/~laurik/fsmbook/examples/Einstein'sPuzzle.html Je ne pouvais pas le faire en 30 minutes. Mais ensuite je me suis énervé et j'ai trouvé ceci: games.flowix.com/fr/index.html Alors je me suis entraîné à faire un problème plus difficile de 6 x 6 x 6 en moyenne en 20 minutes. Je pense que je peux gérer 5 x 5 x 5 en 30 minutes maintenant. Quelles que soient les idées stupides que l’employeur me lancera - je me souviendrai d’eux et je les reproduirai la prochaine fois. Il y a tellement de bons puzzles.
Job

20
@Job: Aucune de ces informations ne vous dira comment un employé se comportera au travail. À moins, bien sûr, de consacrer tout votre temps de travail à résoudre ce type de casse-tête au lieu de travailler proprement.
Robert Harvey

1
@ Robert Harvey, vous voulez dire que votre entreprise gagne de l'argent autrement qu'en résolvant des énigmes? Je n'avais aucune idée ...;) Ce puzzle est amusant cependant. En guise de remarque, une entreprise dans laquelle je travaillais auparavant utilisait des tests de QI réels comme première étape de leur filtrage. J'aimerais trouver de bonnes questions au tableau blanc pour séparer les meilleurs candidats, pas simplement pour les filtrer.
Nicole

4
@Renesis: En tant que développeur, je peux voir comment résoudre un casse-tête identifie les compétences en résolution de problèmes et en analyse, mais les développeurs doivent également savoir comment traduire cette solution en code. La résolution d'un puzzle ne montre que la moitié de cette exécution. C'est la différence entre la résolution d'un cube Rubix et l'écriture d'un algorithme pour résoudre un cube Rubix.
Robert Harvey

@ Robert Harvey Je suis d'accord, je recherche spécifiquement des problèmes de codage, pas seulement des problèmes de réflexion.
Nicole

Réponses:


22

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.

Exemple concret

(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.


40

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.


2
Ah, je vois le numéro w / # 4. Vos documents ne comportent qu'un mot-clé par ligne, vous ne pouvez donc pas avoir une cellule égale à la fois des robinets
Glasnt

8
Ooops! Je peux me voir tomber pour (4) dans une interview. @Job: En tant qu'interviewer , je demanderais au candidat d'expliquer la question, en espérant qu'il trébuche sur son problème pour voir comment il s'en occupe. (cela vous dit généralement plus qu'un candidat répondant à vos questions au premier essai.)
peterchen

3
@Renesis, je ne suis pas sûr que ce soit vraiment en train de creuser profondément. Cela semble très utile pour savoir si quelqu'un a des compétences de base en requêtes SQL. Je suis choqué par le peu de développeurs qui possèdent ces compétences de base ces jours-ci.
Mark Freedman

2
@ jk01, j’ai peut-être une attitude d’ancienne école à ce sujet, mais l’OMI, développeur bien agencé, devrait avoir quelques connaissances en base de données, sinon accéder via du code, mais au moins comprendre le domaine en expérimentant des requêtes. Sans cela, un développeur a un angle mort assez important. C'est aussi extrêmement utile pour le support système et le dépannage. L'abstraction est un bon moyen de simplifier le développement et d'accroître la productivité, mais j'ai vu trop d'hypothèses, car elles sont trop souvent abstraites. Je pourrais continuer, mais ce pourrait être un tout autre débat, j'en suis sûr, se déroule ailleurs;)
Mark Freedman

4
@ back2dos - Écoutez, ne vous énervez pas simplement parce que vous ne pouvez pas y répondre. Beaucoup de technologies peuvent rendre cela plus simple, mais nous utilisons beaucoup de bases de données SQL et je recrute des personnes qui savent comment utiliser les technologies que nous utilisons, sans nous excuser de la raison pour laquelle elles ne devraient pas avoir à répondre à mes questions. .
JohnFx

20

"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."


Comment définiriez-vous le design? Vous recherchez un diagramme de classe? Un autre diagramme UML? Un croquis de base des tiers?
Justkt

1
Je les appelle baloongrams. ;) Il suffit de dessiner des cicles, de mettre des noms et de les relier avec des flèches nommées. Je me fiche de sa candidature mais du fait qu'il l'a bien comprise.
Uberto

5
+1 Pour les personnes qui travaillaient auparavant, c'est certainement l'une des meilleures choses à faire. S'ils peuvent expliquer la structure du projet, cela vaut déjà beaucoup. S'ils ont une idée de la raison pour laquelle cela a été structuré de cette manière, ou de la manière dont certaines choses pourraient être améliorées, cela représente un avantage considérable.
back2dos

3
@justkt: L'important est que l'interviewé comprenne l'information. Peu importe comment. J'ai rencontré des personnes, qui connaissent vraiment UML, qui ne peuvent pas expliquer une chose avec elle, et des personnes qui peuvent expliquer des systèmes complexes avec quelques lignes sinueuses.
back2dos

2
Comment peut-on imaginer dessiner la conception d'un projet sans révéler aucun détail sensible?
Nemanja Trifunovic

14

Mettre en œuvre strcpy, strcmpet les amis.


4
Je demande aux candidats de mettre en œuvre atoi().
chrisaycock

2
Vous seriez surpris de voir combien de personnes ne peuvent pas mettre en œuvre strdup().
Tim Post

10
Ce n’est que juste si l’emploi est pour un programmeur C.

Dans l'interview pour mon emploi actuel, l'intervieweur m'a demandé de mettre en œuvre strrev()une fonction d'inversion de chaîne. Ma solution de tableau blanc les a impressionnés et je fais le travail maintenant.
Gulshan

@crisaycock atoi () est facile. itoa () est sournois
Michael Brown

14

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:

  • comment fonctionne un arbre (arbre binaire en particulier)
  • la définition récursive d'un arbre binaire
  • méthodes récursives et comment les cas de base arrêtent la récursivité
  • Que signifie compter un seul nœud
  • interfaces en tant que contrat
  • (moins important) connaissance de la syntaxe C #:
    • génériques
    • méthodes d'extension
    • opérateur ternaire

Serait-ce une méthode d'extension?
Gulshan

De nos jours, oui. À l'époque, nous codions dans VS 2005, d'où la syntaxe clairsemée.
Jesse C. Slicer

Pourquoi utiliser une méthode d'extension lorsque vous avez le code source de la classe d'origine? Ce n'est pas ce que les méthodes d'extension sont pour.
Batibix

J'aurais pu aller plus loin et montrer au candidat une interface implémentée par cette classe. L'essentiel est que la classe d'origine ne devrait pas avoir besoin d'être modifiée - certains développeurs débutants aimeraient ajouter des éléments à la classe pour rendre la requête "plus facile".
Jesse C. Slicer

merde sainte qui ressemble beaucoup à Java!
Test

12

Deux questions qui ont suscité d’intéressantes discussions au tableau blanc sont les suivantes:

  1. "Pouvez-vous expliquer en détail, à votre guise, comment un navigateur Web obtient une page générée"
  2. "Veuillez expliquer le fonctionnement de Java Hibernate"

Ils commencent simples et deviennent de plus en plus complexes.


31
ehi, je ne suis même pas qualifié pour juger les réponses ... Je pense que pour le second il vous faut 12 bougies noires et une chèvre ...
Uberto

4
La seconde est simple, votre système d’exploitation enregistre le cache, la pile et le contenu de la mémoire vive du processeur sur le disque dur, puis le restaure à la mise sous tension de l’ordinateur.
Malfist

Cependant, la première question pourrait prendre des jours à expliquer.
Malfist

@ Malfist, je parlais du framework de persistance Java Hibernate.
Gary Rowe

2
@Paul Stephenson Oui, mais juste pour être sûr ...
Gary Rowe Le

8

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.)


+1, j'aime votre approche, ça n'a aucun sens de demander à quelqu'un Des programmes dynamiques ou de tels concepts quand ils sont à peine utilisés dans la programmation d'entreprise + L'accent devrait être mis sur la qualité du code aussi bien que sur la solution seule.
Geek

Les questions de design ne me dérangent pas, mais j’ai interviewé un jour un type dont le hobby était de faire des énigmes, et il avait des questions horribles. C'était comme si je posais des questions d'arts martiaux à quelqu'un.
Bob Murphy

Devrait probablement faire en sorte que les gens sachent que vous voulez dire "tableau rangé" en (3), non?
HaveAGuess

7

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.


6

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.


2
+1 Pour le dernier paragraphe, qui est tout important. Habituellement, ce n'est pas la réponse qui compte dans de telles choses, mais le chemin emprunté pour y arriver. Comme tous mes professeurs de maths ont dit "montrez votre travail!"
Orbling

4

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:

  1. 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.

  2. C'est indépendant de la langue.

  3. 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.

  4. 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.


Une fois, j’ai eu une question d’entrevue, où on me donnait un bloc très obscurci de code C, et on me demandait de savoir ce qu’il faisait. De manière très approximative, il imprimait tous les autres nombres premiers. 300 personnes ont postulé et m'ont proposé le poste, car apparemment, j'étais le seul candidat à leur expliquer son objectif, au lieu de promouvoir les valeurs. Alors oui, +1, les nombres premiers sont un bon moyen de contrôle. Particulièrement s’ils trouvent un tamis, cela al’équilibre toutefois entre complexité informatique et complexité spatiale.
Orbling

1
1 n'est pas premier ..

2
@ Thorbjørn - bien évidemment, mais un bon pourcentage des routines que j'ai vues écrire pour résoudre ce problème m'ont dit que c'était le cas
Rhys Gibson le

alors ils ont un bug :)

3

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.)


1
Avez-vous déjà eu des candidats en entrevue se sentir insulté par cela? Ou pensez-vous simplement vous amuser à leurs dépens au lieu de mener une entrevue sérieuse?
Nicole

@Renesis: j'en ai eu quelques-uns qui me regardaient d'abord avec un sourire narquois. Certains d'entre eux ont échoué au test. En général, les bons candidats se moquent. Pour les programmeurs de JS, par exemple, beaucoup de candidats qui ont échoué à l'entretien répondent avec un "duh 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).
Hayem

1
@Renesis: De plus, je m'en fous si certains s'offusquent. Ce n'est pas discriminant en aucune façon. S'ils s'offusquent, je présumerai qu'ils sont le genre de personne qui n'aime pas être mise à l'épreuve ou interrogée. Je n'ai jamais vraiment eu de candidats qui se sentaient amusés à leurs dépens. D'habitude, je m'excuse même avant de poser des questions très simples car cela peut sembler une perte de temps pour les bons. Mais le fait est que ce n'est pas une perte de temps pour moi. Ne pas leur demander ne serait pas, à long terme.
Hayem

@Renesis: Et plus souvent que non, ce que j'ai eu après le regard narquois / rire / offensé était une expression honteuse et des excuses de celui qui avait échoué ou avait commencé à écrire le branchement pour tout le test quand ils avaient réalisé que c'était inutile. Oui, je m'amuse beaucoup à faire ce test, mais je ne le ferais pas si ce n'était pas pour une bonne raison.
Haylem

Personnellement, lors de la lecture de cette lettre, j'aurais un visage mental et je me demanderais si quelqu'un d'autre a écrit la question pour que l'intervieweur se moque de lui.
paroles sauvages

3

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. Crescent Moon Maths Question

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.

Carré à l'intérieur d'un cercle à l'intérieur d'un carré

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.


1
La réponse pour a) est 128,75? (je ne sais pas si j'ai commis une erreur). J'aime ça, mais c'est plus une question de géométrie.
Hoàng Long

2
Aussi, désolé pour le retard dans les commentaires. En règle générale, je n'aime pas les votes négatifs, sans le moindre commentaire, sans dire pourquoi. Mon vote vers le bas ne concerne pas la question elle-même, elle a certainement un but pour vous, je ne pense pas que le contexte dans une interview de programmation est approprié
Philip Regan

7
-1 car la géométrie est un bon candidat pour Just In Time Learning et ne reflète pas ma capacité à créer des logiciels de qualité.
Malfist

2
J'ai apprécié ce problème. J'espère que cela ne vous dérange pas que je partage ma solution à la partie (a). Les diamètres diffèrent de 9 cm. Ainsi, si le cercle intérieur a un rayon r, le cercle extérieur a un rayon r + 4,5. L'aire du croissant est la différence entre les aires des cercles: pi (r + 4,5) ^ 2 - pi * r ^ 2. Il ne reste plus qu'à trouver r. Définissez C comme le point (0,0), puis le point E est à (0, r - 0,5) (car CE est inférieur de 5 cm au plus grand rayon). Le cercle intérieur est décalé de 4,5 cm, son équation est donc (x - 4,5) ^ 2 + y ^ 2 = r ^ 2. Branchez (x, y) = (0, r - 0.5) et résolvez pour r.
Tim Goodman

2
+1 parce que je pense que c'est une bonne question pour un travail qui nécessite de la géométrie. Il y a beaucoup de raisonnement impliqué, pas seulement de brancher une formule. Cela dit, je connais quelques bons programmeurs qui seraient embusqués simplement parce qu’ils n’avaient pas eu à penser aux cercles dans 10 ans - mais la question ne pose pas de question appropriée pour une entrevue avec un développeur. La question SQL actuellement la plus votée (que j'aime aussi) est au moins spécifique à un travail.
Tim Goodman

3

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));

1
Vous voudrez peut-être ajouter le dialecte SQL dans lequel il est écrit.

A l'air bien avec le style fonctionnel.
Orbling

2

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)

    1. Ecrivez une requête pour obtenir tous les numéros de téléphone des personnes portant le nom "smith"
    2. Ecrivez une requête pour obtenir tous les clients de la base de données et les numéros de téléphone de ceux portant le nom "smith".
  • 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.


En SQL # 2, parlez-vous de faire tout cela en une seule requête? Est-ce juste pour jauger la compréhension des jointures gauche / droite ou intérieures?
Nicole

@Renesis: Oui c'est ça.
Steven Evers

2

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.


2

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.]


Ainsi, un programmeur d'interface utilisateur qui ne connaît pas la programmation dynamique est un mauvais programmeur? Pour le plaisir de tout programmeur d'entreprise qui ne se souvient pas de programmation dynamique est mauvais? Beaucoup d'adolescents chez topcoder vont résoudre un problème de programmation dynamique, mais jetez un coup d'œil au code qu'ils ont écrit.
Geek

@ Geek: N'oubliez pas que les problèmes de "tableau blanc" sont un moyen de voir le processus de pensée de quelqu'un. Les problèmes de programmation dynamique devraient faire partie de cette discussion, car ils sont très populaires parmi Google, entre autres.
Macneil

Je ne suis pas en désaccord mais j'ai deux questions. 1. Résoudre l'inconnu? Les problèmes de DP se transforment en une promenade dans le parc si vous avez résolu certains problèmes dans un passé récent ou si vous vous souvenez encore du concept sorti du collège. Quelqu'un qui l'aura oublié ne réussira vraiment pas au tableau blanc. 2. Si quelqu'un a du mal à résoudre un problème, vous ne pouvez pas quantifier la qualité de son code. Qu'en est-il de donner un problème sur quelque chose comme une LinkList ou des chaînes ou des tableaux de sorte que la personne puisse résoudre le problème et écrire du code.
Geek

Je ne m'attendrais pas nécessairement que la personne interrogée comprenne bien les choses, contrairement à certaines entreprises.
Macneil

@ Geek: “un… programmeur qui ne connaît pas la programmation dynamique est un mauvais programmeur?” - oui . Cela dit, je conviens que penser à la programmation dynamique n’est pas anodin quand on n’y est pas habitué. Mais le savoir est un impératif absolu.
Konrad Rudolph

2

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.


2

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 :)


Et si la première implémentation est faite via une boucle for?
Darknight

2
Une version récursive est proposée pour la mise en œuvre. Habituellement, après les gars de la boucle for implémenter avec succès la version récursive.
alexb

Ou vous pourriez mettre en œuvre cela comme une seule instruction: 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.
Oosterwal

2

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:

  • La déduplication est un problème réel
  • Il y a un tas de façons de le faire
  • Je pense que, dans presque tous ces cas, il est nécessaire que vous compreniez (légèrement) un SQL plus complexe (essentiellement GROUP BY et HAVING) ou que vous puissiez raisonner en enchaînant plusieurs instructions plus simples.
  • À cause de ce dernier élément, même s'ils ont des problèmes de syntaxe ou autre, vous pouvez leur demander ce qu'ils pensent et en parler de cette façon.
  • Il fait référence au Dr Seuss

(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).


1
Je suppose que je ne sais pas ce qui est considéré comme "tout à fait trivial" ... Quelque chose comme SELECT min(ID), Name FROM Things GROUP BY Namecela fonctionnerait, non?
Tim Goodman

@ Tim - Cela vous donne le compte pour tout. Je veux seulement ceux qui ont des doublons. Le fait de modifier manuellement les résultats ne compte pas, supposons qu'il soit redimensionné en millions de lignes. C'est un problème facile, mais d'après mon expérience, 80% des personnes affirmant connaître le langage SQL ne peuvent pas aller aussi loin que votre premier coup de poignard.
Jon Hopkins

@Jon: Vous ne savez pas ce que vous entendez par "Cela donne le compte pour tout". Dans votre exemple de solution, il semble que vous souhaitiez une ligne pour chaque nom distinct. D'après vos commentaires 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.
Tim Goodman

@ Tim - Vous avez raison, ce n'est vraiment pas clair. Je vais éditer quand j'aurai quelques minutes.
Jon Hopkins

1
Je suppose que je ferais ceci: DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name). Avez-vous une solution préférée?
Tim Goodman

2

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

  • si le candidat reconnaît que vous ne pouvez pas surcharger le type de retour (indication du C ++ de niveau junior)
  • si le candidat sait comment renvoyer un opérateur temporaire et implémenter des opérateurs de transtypage (indication du C ++ de niveau intermédiaire)
  • si le candidat peut faire du calcul vectoriel de base (important pour notre domaine d'application)

2

Comment représenteriez-vous un jeu de cartes standard de 52 cartes? Tout langage de programmation est bon. Comment mélangerais-tu les cartes?


vecteur <Card> avec la fonction shuffle C ++ '
droitier

1

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é.


Je ne comprends pas la chose "la pile fait partie de la CPU".
Barjak

Quiconque en sait quelque chose sur l'architecture informatique le saurait. Pour moi, c'est complètement indépendant, alors le gars démontre son ignorance.
Michael K

@aufather: Si je me souviens bien, vous devez appeler 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.
Michael K

@barjak - Une fois que vous avez commencé à implémenter printf, vous devez accéder à votre pile. J'ai reçu des réponses indiquant que la pile se trouvait dans la CPU.
aufather

@Michael - Dans le monde intégré, vous devez vraiment connaître l'architecture de votre plate-forme. Donc, cette question élimine rapidement les ignorants assez tôt.
aufather

1

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.


4
Ajoutez deux Oscars de 12 pouces dans le bol, ils retireront très vite 98% des guppys.
Geek

Qu'advient-il si vous retirez un guppy?

1
1% de guppys, = 200 x 1% = 2 (200-2 = 198 autres poissons), où 2 = 2%, poisson restant = 98% = 98 (1: 1). 98 = 198 - 100 => 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.
Orbling

1

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.


1

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.


1

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.


Exemple de solution:


T_BOOL MultipleOfTen(int x, int y)
{
    return((x%2==0 || y%2==0) && (x%5==0 || y%5==0));
}

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.


-2

Comment représenteriez-vous une matrice de rechange relativement volumineuse ... disons 1000x1000 mais comportant au plus 100 entrées non nulles?

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.