Qual é o seu problema favorito de entrevista no quadro branco? [fechadas]


52

Assim como o título diz, qual é o seu problema favorito de entrevista no quadro branco e por que ele se mostrou eficaz para você?

Junior, senior, Java, C, Javascript, PHP, SQL, pseudo-código, etc.


4
Um problema que eu odiava era um quebra-cabeça de Einstein. stanford.edu/~laurik/fsmbook/examples/Einstein'sPuzzle.html Não consegui fazer isso em 30 minutos. Mas então eu fiquei chateado e achei o seguinte: games.flowix.com/en/index.html Então eu treinei para resolver um problema mais difícil de 6 x 6 x 6 em média em 20 minutos. Eu acho que posso lidar com 5 x 5 x 5 em 30 minutos agora. Quaisquer que sejam os quebra-cabeças estúpidos que o empregador jogue em mim - eu lembrarei deles e os aceitarei na próxima vez. Existem tantos bons quebra-cabeças.
Job

20
@ Job: Nada disso vai lhe dizer nada sobre como um funcionário se sairá no trabalho. A menos, é claro, que você gaste todo o seu tempo de trabalho resolvendo esses tipos de quebra-cabeças, em vez de realizar o trabalho real.
Robert Harvey

11
@ Robert Harvey, você quer dizer que está em um negócio que ganha dinheiro de outra maneira que não a solução de quebra-cabeças? Eu não tinha idéia ...;) Esse quebra-cabeça é divertido. Como observação lateral, uma empresa em que eu trabalhava usou testes de QI reais como o primeiro passo na triagem. Gostaria de encontrar algumas boas perguntas sobre o quadro branco para separar os melhores candidatos, e não simplesmente examiná-los.
24510 Nicole

4
@Renesis: Como desenvolvedor, posso ver como resolver um quebra-cabeça identifica habilidades de análise e resolução de problemas, mas os desenvolvedores também precisam saber como traduzir essa solução em código. Resolver um quebra-cabeça mostra apenas metade dessa execução. É a diferença entre resolver um cubo Rubix e escrever um algoritmo para resolver um cubo Rubix.
Robert Harvey

@ Robert Harvey Concordo, estou procurando especificamente por problemas de codificação, não apenas problemas de raciocínio.
Nicole

Respostas:


22

Peço ao candidato que crie uma solução para um problema que realmente encontrei no meu dia-a-dia. Fazendo isso, tento criar um diálogo entre mim e o candidato. Tento discutir sobre o design que ele está construindo como se nunca tivesse pensado no problema antes.

O que tento avaliar é se somos capazes de entender um ao outro e se podemos falar sobre um problema técnico sem confusão.

Exemplo concreto

(Para um desenvolvedor de desktop java)

Crie uma API para lidar com o histórico de navegação de um navegador da Web (página anterior, próxima página, liste as 10 páginas anteriores) e que pode ser reutilizável em muitas partes do aplicativo (aqui eu dou exemplos concretos em nosso aplicativo). Em seguida, esboce uma implementação.

Eu gosto deste, porque é simples o suficiente, é fácil de ilustrar, pode ser resolvido passo a passo (adicione comportamentos adicionais sem quebrar tudo), permite falar sobre casos extremos e manipulação de erros, além de falar sobre dados estruturas.


40

Eu achei este extremamente esclarecedor ao entrevistar candidatos e filtrar aqueles que não têm negócios lá. É semelhante em complexidade ao Fizz Buzz, mas se concentra nas habilidades de banco de dados.

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"

Deixei que escrevessem em qualquer variante SQL que desejassem e não sou muito exigente quanto a problemas menores de sintaxe. Quero principalmente saber que eles entendem os conceitos básicos de banco de dados relacional.

A maioria dos candidatos pode passar pela parte 3 sem problemas. Você ficaria surpreso com quantos pensam que a resposta para a parte 4 é apenas mudar o operador de OR para AND na cláusula where.


2
Ah, eu vejo o problema com o número 4. Seus documentos só tem uma palavra-chave por linha, então você não pode ter uma célula igual tanto "Blue" e "Yellow" torneiras sabe conscientemente
glasnt

8
Opa! Eu posso me ver caindo em (4) em uma entrevista. @Job: Como entrevistador , eu pediria ao candidato que explicasse a pergunta, esperando que ele se deparasse com seu problema para ver como ele lida com isso. (que normalmente diz-lhe mais do que um candidato rastreio suas perguntas na primeira tentativa.)
Peterchen

3
@ Renesis, não tenho tanta certeza de que isso esteja realmente cavando fundo. Isso parece muito bom para descobrir se alguém tem habilidades básicas de consulta SQL. Na verdade, estou chocado com o quão poucos desenvolvedores têm essas habilidades básicas nos dias de hoje.
Mark Freedman

2
@ jk01, talvez eu tenha uma atitude da velha escola sobre isso, mas a IMO, um desenvolvedor completo, deve ter algum conhecimento de banco de dados, se não acessar via código, mas pelo menos entender o domínio, experimentando consultas. Sem isso, um desenvolvedor tem um ponto cego bastante significativo. Também é EXTREMAMENTE útil para suporte e solução de problemas do sistema. A abstração é boa para ajudar a simplificar o desenvolvimento e aumentar a produtividade, mas já vi muitas suposições feitas, porque muitas vezes isso é abstraído. Eu poderia continuar, mas isso poderia ser um outro debate tenho certeza está ocorrendo em outros lugares;)
Mark Freedman

4
@ back2dos - Olha, não se ofenda só porque você não pode responder. Pode haver muitas outras tecnologias que simplificam isso, mas usamos muitos bancos de dados SQL e recruto pessoas que sabem como usar as tecnologias que usamos, sem desculpas por não ter que responder minhas perguntas da entrevista .
JohnFx

20

"Desenhe para mim no quadro branco o design do último projeto em que você trabalhou, sem me revelar nenhum detalhe sensível."


Como você definiria o design? Você está procurando um diagrama de classes? Outro diagrama UML? Um esboço básico das camadas?
justkt

11
Eu os chamo de baloongrams. ;) Apenas desenhe ciclos, coloque nomes e conecte-os com setas nomeadas. Não me importo com a inscrição dele, mas com o fato de ele ter entendido.
Uberto

5
+1. Para as pessoas que tiveram um emprego anteriormente, essa é definitivamente uma das melhores coisas que você pode fazer. Se eles puderem explicar como o projeto foi estruturado, já vale muito. Se eles têm uma idéia de por que foi estruturado dessa maneira específica, ou como algumas coisas podem ser feitas melhor, isso é realmente uma grande vantagem.
back2dos

3
@justkt: A importância é que o entrevistado receba as informações. Pouco importa como. Eu conheci pessoas que realmente conhecem a UML, que não conseguem explicar nada, e pessoas que conseguem explicar sistemas complexos com algumas linhas complicadas.
back2dos

2
Como diabos alguém deve desenhar o design de um projeto sem revelar nenhum detalhe sensível?
Nemanja Trifunovic 15/02

14

Implementar strcpy, strcmpe amigos.


4
Peço aos candidatos que implementem atoi().
Chrisaycock

2
Você ficaria surpreso com quantas pessoas não podem implementar strdup().
Tim Post

10
Isso é justo se a vaga for para um programador em C.

Na entrevista para o meu trabalho atual, o entrevistador me pediu para implementar strrev()ou restringir a função de reversão. Minha solução de quadro branco os impressionou e estou fazendo um trabalho agora.
precisa

@crisaycock atoi () é fácil. itoa () é desonesto
Michael Brown

14

O meu favorito, que abrange algumas disciplinas, é contar o número de nós em uma árvore binária, dada a interface (em 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.
}

e apenas por diversão, aqui está a implementação, embora o entrevistado não precise ver isso.

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

e a classe assistente:

public static class BinaryTreeNodeCounter
{
    public static int CountNodes<T>(this IBinaryTree<T> tree)
    {
        // TODO: What goes here?
    }
}

A solução que eu gosto de ver é esta:

public static class BinaryTreeNodeCounter
{
    public static int CountNodes<T>(this IBinaryTree<T> tree)
    {
        return tree == null
            ? 0
            : 1 + tree.Left.CountNodes() + tree.Right.CountNodes();
    }
}

Como demonstra o conhecimento de:

  • como uma árvore (árvore binária em particular) funciona
  • a definição recursiva de uma árvore binária
  • métodos recursivos e como os casos básicos interrompem a recursão
  • o que contar com um único nó significa
  • interfaces como um contrato
  • (menos importante) conhecimento da sintaxe C #:
    • genéricos
    • métodos de extensão
    • operador ternário

Poderia ser um método de extensão?
Gulshan

Hoje em dia, sim. Estávamos codificando no VS 2005 na época, daí a sintaxe esparsa.
Jesse C. Slicer

Por que usar um método de extensão quando você tem o código fonte da classe original? Não é para isso que servem os métodos de extensão.
Batibix

Eu poderia ter ido um nível mais profundo e mostrar ao candidato uma interface que essa classe implementa. O essencial é que a classe original não precisa ser modificada - alguns desenvolvedores iniciantes adorariam adicionar coisas à classe para tornar a solicitação "mais fácil".
Jesse C. Slicer

porcaria santa que se parece muito com java!
teste

12

Duas perguntas que suscitaram discussões interessantes no quadro branco para mim são:

  1. "Você pode explicar com tantos detalhes quanto quiser, como um navegador da Web obtém uma página gerada"
  2. "Por favor, explique como o Java Hibernate funciona"

Eles começam simples e depois ficam progressivamente mais complexos.


31
EHI, eu não estou mesmo qualificado para julgar as respostas ... Eu acho que para o segundo você precisa de 12 velas pretas e uma cabra ...
Uberto

4
O segundo é fácil, o sistema operacional salva o cache e a pilha do processador e o conteúdo da sua RAM no disco rígido e depois o restaura quando o computador é ligado novamente.
Malfist

No entanto, a primeira pergunta pode levar dias para ser explicada.
Malfist

@ Malfist, eu quis dizer a estrutura de persistência do Java Hibernate.
Gary Rowe

2
@ Paul Stephenson Sim, mas apenas para ter certeza ...
Gary Rowe

8

Não gosto de usar um quebra-cabeça ou uma questão de design como uma pergunta do quadro branco. Prefiro perguntas diretas e simples que testem a capacidade do candidato de escrever algum código. Meus favoritos são:

1) Escreva uma função para reverter uma lista vinculada individualmente. (Demora um tempo antes que eles percebam que precisam de 3 ponteiros.)

2) Dada uma árvore binária, encontre a profundidade da árvore binária. (Esta pergunta testa sua capacidade de escrever código recursivo. Permite-me verificar se eles têm o caso base intacto.)

3) Escreva um procedimento para pesquisa binária em uma matriz de números inteiros. (Como Jon Bentley diz (em Programming Pearls), muitas pessoas tendem a cometer erros ao escrever pesquisa binária. Depois, é possível encontrar bugs, escrever casos de teste, executar o código etc.)


+1, eu gosto que sua abordagem não faz sentido perguntar a alguém Programas dinâmicos ou conceitos desse tipo quando eles são pouco usados ​​em programação de negócios. Ênfase deve ser na qualidade do código também e não apenas na solução.
23710 Geek

Eu não me importo com perguntas de design, mas uma vez entrevistei um cara cujo hobby era fazer quebra-cabeças, e ele tinha algumas perguntas horríveis. Era como se eu fizesse perguntas a alguém sobre artes marciais.
Bob Murphy

Provavelmente deve garantir que as pessoas saibam que você quer dizer "matriz classificada" em (3), certo?
HaveAGuess

7

Usamos isso em uma empresa em que trabalhei.

Entregamos ao candidato um pedaço de papel usado para rastrear o tempo. Era um quadro de horários real usado por uma ou nossas divisões. Pedimos ao candidato que nos acompanhasse no processo de design para criar uma melhor ferramenta de rastreamento de tempo. Sem limites, não disse qual idioma etc., apenas quer ver como o candidato foi bom no "ciclo de vida completo". Isso nos deu uma visão real de como eles reuniram requisitos. Como eles estruturaram as tabelas do banco de dados, que tipo de interface do usuário eles podem fazer. Obviamente, eram necessárias habilidades de comunicação para esta tarefa. Geralmente era feito em uma sala com vários quadros brancos grandes e durava até 2 horas.

Contratamos várias pessoas usando esse processo e, se eles se saíram muito bem na tarefa, se saíram muito bem para nós. Se eles eram marginais e decidimos contratá-los de qualquer maneira (tópico separado), eles eram programadores marginais.


6

Eu uso um problema que é relevante para o meu domínio de programação.

Se eu desenvolver aplicativos da Web, quero ver como eles podem elaborar um formulário da Web que exclua registros e qual abordagem eles podem adotar para remover o registro do banco de dados, por exemplo. Isso indica se eles conhecem os princípios básicos do banco de dados, como interagem com o usuário para verificar a exclusão e se sabem o que é uma exclusão reversível.

Eu não tenho um favorito. O problema que eu escolher varia muito dependendo do trabalho.

Não me importo se eles podem resolver o problema completamente ou não em uma entrevista, quais tecnologias e idiomas eles usam ou quão ruim é o código deles em um quadro branco. Estou procurando um padrão de pensamento; Quero ver se eles sabem pensar e resolver problemas.


2
+1 Para o último parágrafo, o que é importante. Geralmente não é a resposta que importa nessas coisas, mas o caminho a seguir para chegar lá. Como todos os meus professores de matemática já disseram "mostre seu trabalho!"
Orbling

4

O meu favorito era aquele que um amigo meu usava.

Escreva-me uma função para gerar / imprimir / armazenar os primeiros "n" números primos e depois explicar como funciona e quão eficiente é.

Funciona bem porque:

  1. É uma pergunta algorítmica, por isso exige que o entrevistado seja capaz de pensar e depois explicar o pensamento deles - para que você possa ver como o cérebro deles funciona.

  2. É independente da linguagem.

  3. Dificilmente alguém consegue acertar completamente (normalmente, há casos em que eles perdem (1 ou 2 normalmente), ou eles não lidam com números negativos, então você pode ver como eles lidam com bugs e saber que estão errados.

  4. A maioria faz isso como uma peneira simples, mas muito lenta (por exemplo, 80% das pessoas verifica n é primo dividindo n por todos os números inteiros menores que n), o que oferece muito espaço para conversas sobre como elas poderiam melhorar o algoritmo com base em nas compensações espaço / tempo, por exemplo, "por que você está dividindo um número por 4 se você já sabe que não é divisível por 2?" ou "Você concluiu que só precisa dividir por todos os números primos menores que sqrt (n), mas isso exige que você armazene esses números em algum lugar; então, quais são as implicações disso?")

Não é necessário que eles obtenham a resposta certa. Se alguém puder pensar e explicar seu pensamento, estará muito longe no caminho por ser um bom candidato.


Certa vez, recebi uma pergunta de entrevista, onde recebi um bloco muito ofuscado de código C e pedi para descobrir o que ele fazia. De uma maneira muito redonda, imprimiu todos os outros números primos. 300 pessoas se inscreveram e me ofereceram o emprego, pois aparentemente eu era o único candidato que lhes disse qual era o objetivo, em vez de divulgar os valores. Então, sim, +1, números primos são uma boa verificação. Especialmente se eles criam uma peneira, embora isso troque a complexidade computacional pela complexidade do espaço.
Orbling

11
1 não é primo ..

2
@ Thorbjørn - bem, obviamente, mas uma boa percentagem das rotinas que eu vi escrito para resolver este problema têm-me dito que é
Rhys Gibson

então eles têm um bug :)

3

Algo chamado aff_z, que fazia parte dos exames C da minha escola de engenharia e era usado como um teste "fictício" para que os alunos falhassem ao voltar das férias (nosso sistema de marcação implicava que a reprovação em um teste interrompeu a marcação, portanto, a reprovação nesse teste simulado invalidar todo o teste. Obriga a prestar atenção aos detalhes idiotas). Eu o reutilizei uma ou duas vezes durante as entrevistas.

Enfim ... eu esqueci a formulação exata, mas era algo assim ...

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

O triste é que não apenas alguns estudantes apresentavam soluções extremamente complicadas quando a resposta é bastante óbvia, mas que alguns conseguiam até falhar.

E, acredite ou não, aconteceu também durante as entrevistas.

Realizá-lo em entrevistas foi bastante divertido, pois alguns candidatos começaram a escrever os possíveis ramos e então perceberam o que está errado (obviamente, se você apenas os perguntar oralmente, é compreensível que eles o façam quando você fala ... mas se você dê por escrito, acho intrigante ...)

É idiota, mas acho que é uma triagem minimalista (da mesma forma, ao contratar programadores de JS, sempre pergunto como declarar uma variável e, dependendo da resposta deles, se usar var faz ou não alguma diferença. Muitas vezes é um momento triste, honestamente.)


11
Você já teve candidatos em entrevistas que se sentiram insultados por isso? Ou acha que você estava simplesmente se divertindo às custas deles, em vez de realizar uma entrevista séria?
20910 Nicole

@ Renesis: Eu tinha alguns olhando para mim com um sorriso primeiro. Alguns dos quais falharam no teste. Em geral, os bons candidatos riem, se não. Para os programadores de JS, por exemplo, muitos candidatos que falharam na entrevista responderam com um "duh", variablename = variablevalue;enquanto os bons apenas riam por telefone ou pessoalmente e me diziam diretamente o que seria diferente ou não. var)
haylem

11
@ Renesis: Além disso, eu realmente não poderia me importar menos se alguns ficarem ofendidos. Não é discriminatório de forma alguma. Se eles se ofenderem, assumirei que eles são o tipo de pessoa que não gosta de ser posta à prova ou questionada. Eu realmente nunca tive candidatos sentindo que me diverti às custas deles. Normalmente, até peço desculpas antes de fazer perguntas muito simples, pois pode parecer uma perda de tempo para as boas. Mas o problema é que não é uma perda de tempo para mim. Não perguntar a eles, a longo prazo.
haylem

@Renesis: E mais frequentemente do que isso, o que recebi depois do sorriso zombeteiro / riso / ofendido foi uma expressão envergonhada e um pedido de desculpas por quem falhou ou começou a escrever a ramificação para todo o teste quando percebeu que era inútil. Sim, eu me divirto fazendo esse teste, mas não o faria se não fosse por um bom motivo.
haylem

Pessoalmente, eu teria um problema mental ao ler isso e gostaria de saber se alguém escreveu a pergunta para o entrevistador tirar sarro dele.
wildpeaks

3

Realmente depende do que você está procurando, como uma organização que realiza muito trabalho dinâmico na Web envolvendo imagens, eu gosto de fazer uma pergunta sobre geometria pertinente ao trabalho. De qualquer forma, costumo fazer uma pergunta de geometria, pois considero um bom teste de matemática agradável e visual e que pode mostrar a capacidade do candidato de apresentar visualmente seu trabalho e seu trabalho metodológico através de um problema.

Para candidatos avançados, ocasionalmente faço a seguinte pergunta:

Esta imagem mostra uma lua crescente. A largura do crescente de B a D é 9 cm e entre E e F, 5 cm. C é o centro do círculo maior.

a) Calcule a área do crescente. Pergunta crescente da matemática da lua

b) Descreva os cálculos necessários para redimensionar uma imagem para caber no círculo interno de qualquer tamanho e posicione-a dentro do círculo, se o ponto central for conhecido.

Para uma pergunta mais fácil, geralmente dou o mesmo tipo de pergunta, mas use o exemplo "quadrado dentro de um círculo dentro de um quadrado". Embora isso seja muito fácil, eu esperaria uma álgebra perfeita.

Quadrado dentro de um círculo dentro de um quadrado

Além disso, costumo pedir que eles abram um algoritmo para gerar todas as combinações de um conjunto de dados de comprimento variável.


11
A resposta para a) é 128,75? (não sei se cometi algum erro). Eu gosto, mas é mais sobre geometria.
Hoàng Long

2
Além disso, desculpe pelo atraso nos comentários. Não gosto de votar em regra e duplamente sem comentar o porquê. Meu voto negativo não é sobre a pergunta em si, certamente tem um objetivo para você, só não acho que tenha um contexto adequado em uma entrevista de programação.
Philip Regan

7
-1 porque a geometria é uma boa candidata ao Just In Time Learning e não reflete na minha capacidade de criar software de qualidade.
Malfist

2
Eu gostei desse problema. Espero que você não se importe de compartilhar minha solução para a parte (a). Os diâmetros diferem em 9 cm; portanto, se o círculo interno tiver raio r, o círculo externo terá raio r + 4,5. A área do crescente é a diferença nas áreas dos círculos: pi (r + 4,5) ^ 2 - pi * r ^ 2. Tudo o que resta é encontrar r. Defina C como o ponto (0,0), então o ponto E está em (0, r - 0,5) (porque CE é 5 cm menor que o raio maior). O círculo interno é deslocado para a direita 4,5 cm, então sua equação é (x - 4,5) ^ 2 + y ^ 2 = r ^ 2. Conecte (x, y) = (0, r - 0,5) e resolva para r.
Tim Goodman

2
+1 porque acho que é uma boa pergunta para um trabalho que exige geometria. Há muito raciocínio envolvido, não apenas a conexão com uma fórmula. Dito isso, conheço alguns bons programadores que seriam atropelados apenas porque eles não precisavam nem pensar em círculos em 10 anos - mas a pergunta não pede uma pergunta adequada para qualquer entrevista de desenvolvedor. A questão SQL atualmente mais votada (da qual também gosto) é pelo menos tão específica quanto à tarefa.
Tim Goodman

3

As melhores respostas do FizzBuzz que eu já vi são:

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 # (simples)

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 # (inteligente)

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

11
Você pode querer adicionar em qual dialeto SQL específico está escrito.

Parece bom com o estilo funcional.
Orbling

2

Eu procuro algumas coisas nos candidatos que entrevistei. Por uma razão que não consigo descrever on-line, temos candidatos muito ruins, e eu espero que seja, por isso sou muito fácil com eles. Mesmo assim, procuro:

  • Consciência do design.

    "Mostre-me a estrutura da tabela para um programa de catálogo de endereços que possua Contatos com nome e sobrenome que possam ter vários números de telefone com uma descrição do número (célula / casa / trabalho / etc.)"

    Não estou procurando um diagrama de especificações da UML 2.0 aqui, um diagrama de bolhas simples aqui é bom. Contanto que seja razoável.

  • Conhecimento de trabalho com um banco de dados (por exemplo, SQL)

    1. Escreva uma consulta para obter todos os números de telefone de pessoas com o sobrenome "smith"
    2. Escreva uma consulta para obter todos os clientes no banco de dados e os números de telefone daqueles com o sobrenome "smith"
  • Conhecimento de teste

    Suponha public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)que exista um método com a assinatura que retorne os resultados da sua consulta anteriormente. Suponha que se você passar um nulo para o método, ele lançará uma NullReferenceException. Escreva um teste para demonstrar essa funcionalidade.

    Escreva um teste que demonstre que GetPhoneNumbers retornará um número de telefone residencial (123)456-7890 para alguém com o sobrenome "smith".

  • Conhecimento de como escrever algum código

    Implemente um método que atenda aos requisitos dos testes que você escreveu.


Considerando o número e a qualidade dos candidatos que recebemos, entrevistei todos os que já se inscreveram seriamente. Eu não contratei ninguém.


No SQL # 2, você está falando sobre fazer isso tudo em uma consulta? O objetivo é apenas avaliar a compreensão das junções esquerda / direita ou interna?
Nicole

@ Renesis: Sim, é.
Steven Evers

2

Eu costumo deixá-los esboçar um diagrama de blocos do último sistema em que trabalharam, perguntando sobre as relações entre os blocos e depois deixá-los elaborar sobre o bloco em que estavam trabalhando / encarregado. Você pode aprender muitos com este exercício, como a maneira como alguém olha além de seu pequeno domínio, o quanto é importante para ele saber 'onde' ele está atuando; também é possível aprender sobre o papel que ele estava representando, se era uma chave ou um lado Função.


2

Escreva um algoritmo para o seguinte problema: Dado um número n , imprima o número total de árvores binárias (exclusivas) que possuem n nós.

Assim, para n = 0 en = 1, a resposta é 1. Para n = 2, você tem 2: o nó raiz e, em seguida, o segundo nó, à esquerda ou à direita.

Você pode obter informações sobre técnicas de design e verificar se elas pensam em recursão ou memorização ou na solução de programação dinâmica.

[Consulte também esta discussão do StackOverflow para o caso relacionado, mas diferente, de árvores de pesquisa binária.]


Então, um programador de interface do usuário que não conhece programação dinâmica é um programador ruim? Para o diabo, qualquer programador de negócios que não consiga lembrar a programação dinâmica é ruim? Muitos adolescentes do topcoder enfrentam um problema de programação dinâmica, mas dê uma olhada no código que eles escrevem.
23710 Geek

@ Geek: Lembre-se de que os problemas do "quadro branco" são uma maneira de ver o processo de pensamento de alguém. Problemas de programação dinâmica devem pertencer a esta discussão, pois são muito populares no Google, entre outros.
Macneil

Não discordo, mas tenho duas perguntas. 1. Resolvendo o desconhecido? Os problemas de DP tornam-se um passeio no parque se você resolveu alguns problemas no passado recente ou ainda se lembra do conceito de sair da faculdade. Alguém que a esqueceu definitivamente não se sairá bem no quadro branco. 2. Se alguém está lutando para resolver um problema, não há como quantificar a qualidade do código dele. Que tal dar um problema em algo como um LinkList ou Strings ou Arrays, para que a pessoa possa resolver o problema e escrever código.
24710 Geek

Eu também não esperaria necessariamente que um entrevistado acertasse, como algumas empresas o farão.
Macneil

@ Geek: “um programador que não conhece programação dinâmica é um programador ruim?” - sim . Dito isto, concordo que pensar em programação dinâmica não é trivial quando você não está acostumado. Mas saber que é uma necessidade absoluta.
Konrad Rudolph

2

Se eu fosse entrevistar um desenvolvedor de software, pediria que ele criasse um software e descrevesse os requisitos de hardware para remover entradas duplicadas de um arquivo arbitrariamente grande contendo um nome completo em cada linha. Deixo algumas partes da descrição do problema ambíguas de propósito. Então eu o desafio a ver se ele entende os requisitos de análise e esclarecimento, diferentes compensações, estruturas e algoritmos de dados, E / S (armazenamento secundário), tecnologias de software e hardware, escalabilidade etc.

Eu acho que é um problema pequeno, mas desafiador, que revela o conhecimento e as habilidades do candidato em muitas áreas de computação.


2

Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence

Muitos caras poderiam ficar presos nisso. Se alguma solução é dada - geralmente ela usa recursão. Depois disso:

Implement the same via 'for'-loop

Não sei dizer, quantos colegas não conseguem concluir as duas tarefas - 50% dos candidatos.
É por isso que eu gosto :)


E se a primeira implementação for feita através de um loop for?
Darknight

2
A versão recursiva é proposta para implementar. Geralmente, os caras do for-loop implementam com êxito a versão recursiva.
AlexB

Ou você poderia implementar isso como uma única instrução: fib(n)=round(power(PHI,n)/SQRT5). PHI e SQRT5 são constantes representando a proporção áurea (1.618 ...) e a raiz quadrada de 5, respectivamente.
26411 oosterwal

2

Para bancos de dados eu vou com:

Tabela: Coisas

Nome do ID
1 Bodkin Van Horn
2 Hoos-Foos
3 Hoos-Foos
4 Hot Shot
5 Marvin O'Gravel balão cara
6 Snimm
7 Marvin O'Gravel balão cara
8 Marvin O'Gravel balão cara
9 Dave

Escreva-me um SQL que desduplique uma tabela como essa com base no nome (e eu não me importo com o ID que recebo, mas o que for retornado deve ser válido para esse nome). Portanto, a tabela, uma vez que o SQL correto foi aplicado, apresentará algo como:

Tabela: Coisas

Nome do ID
1 Bodkin Van Horn
2 Hoos-Foos
4 Hot Shot
5 Marvin O'Gravel balão cara
6 Snimm
9 Dave

Eu gosto disto porque:

  • A desduplicação é um problema do mundo real
  • Existem várias maneiras de fazer isso
  • Eu acho que praticamente todas essas maneiras precisam que você entenda SQL (um pouco) mais complexo (essencialmente GROUP BY e HAVING) ou a capacidade de raciocinar através do encadeamento de várias instruções mais simples.
  • Por causa desse último pedaço, mesmo que eles estejam tendo dificuldades com sintaxe ou o que seja, você pode perguntar o que eles estão pensando e falar dessa maneira.
  • Referencia o Dr. Seuss

(É aqui que acho que há uma maneira inteiramente trivial de fazer isso e eu venho complicando todos esses anos).


11
Eu acho que não sei o que conta como "inteiramente trivial" ... Algo como SELECT min(ID), Name FROM Things GROUP BY Namefuncionaria, certo?
Tim Goodman

@ Tim - Isso lhe dá a contagem para tudo. Eu só quero aqueles com duplicatas. Editados manualmente, os resultados não contam, suponha que esteja em milhões de linhas. É um problema fácil, mas, na minha experiência, 80% das pessoas que afirmam conhecer o SQL não conseguem chegar até a primeira tentativa.
Jon Hopkins

@ Jon: Não sei o que você quer dizer com "Isso dá a conta para tudo". Na sua solução de exemplo, parece que o que você deseja é uma linha para cada nome distinto. Pelos seus comentários, parece que você quer dizer algo como HAVING count(Name) > 1, mas acho que sua resposta de exemplo deve omitir Bodkin Van Horn, Hot Shot, Snimm e Dave.
Tim Goodman

@ Tim - Você está certo, é realmente claro. Vou editar quando tiver alguns minutos.
Jon Hopkins

11
Eu acho que eu faria isso: DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name). Você tem uma solução preferida?
Tim Goodman

2

Meu problema favorito no quadro branco de C ++ é fazer com que o candidato implemente

Vector3 a(1, 0, 0), b(0, 1, 0); // Mathematical 3D vectors
double c = 7.0;
double d = a * c;
Vector3 e = a * b;

Com isso eu posso aprender

  • se o candidato reconhecer que você não pode sobrecarregar no tipo de retorno (indicação de C ++ no nível de juniour)
  • se o candidato souber retornar um temporário e implementar operadores de conversão (indicação de C ++ de nível intermediário)
  • se o candidato puder fazer matemática vetorial básica (importante para o domínio do aplicativo)

2

Como você representaria um baralho de 52 cartas padrão? Qualquer linguagem de programação está correta. Como você baralha as cartas?


vector <Card> com a função aleatória C ++ ':)
rightfold

1

O meu favorito é começar perguntando o protótipo do printf. Dada uma API de baixo nível printc (char c), que imprimirá um caractere, implemente printf. Dá todos os tipos de respostas interessantes, como a pilha faz parte da CPU. Como você deve ter adivinhado, sou de um C e de fundo incorporado.


Não entendi a coisa "a pilha faz parte da CPU".
Barjak

Quem sabe algo sobre arquitetura de computadores sabe disso. Para mim, é completamente independente, então o cara está demonstrando sua ignorância.
Michael K

@ aufather: Se bem me lembro, você tem que chamar varargs()ou alguma função assim. Estou correcto? Eu só fiz uma vez para dizer que fiz isso há um tempo atrás.
Michael K

@barjak - Depois de começar a implementar o printf, você precisará acessar sua pilha, e eu tenho respostas de que a pilha está na CPU.
aufather

@ Michael - No mundo incorporado, você precisa conhecer muito bem a arquitetura de sua plataforma. Portanto, essa pergunta elimina rapidamente os ignorantes bem cedo.
aufather

1

Você tem uma tigela com 200 peixes. Desses peixes, 99% não são guppies. Quantos peixes você deve remover para que 2% do que resta sejam guppies. Mostre seu trabalho.

Trata-se de requisitos confusos. Diz-se assim para mudar de perspectiva várias vezes durante a mesma pergunta. O objetivo é ver se eles conseguem descobrir o que realmente está acontecendo.

Você ficaria surpreso com quantas pessoas entendem errado.


4
Adicione dois Oscars de 12 polegadas na tigela e eles removerão 98% dos guppies muito em breve.
23710 Geek

O que acontece se você remover um guppy?

11
1% de guppies, = 200 x 1% = 2 (200-2 = 198 outros peixes), onde 2 = 2%, peixe restante = 98% = 98 (1: 1). 98 = 198 - 100 => answer = 100. [Supondo que você possa escolher seletivamente os outros peixes. Se você remover guppies, existem outras respostas.] Boa pergunta, você ficaria surpreso com o quão poucas pessoas lidam com isso muito bem, embora deva ser brincadeira de criança para um programador.
Orbling

1

Eu tenho alguns favoritos, mas aqui estão alguns que quase sempre aparecem. Na maioria das vezes, eu estou fazendo entrevistas técnicas da rodada final (C ++), de modo a favorecer perguntas mais longas e abertas que levam a novas áreas de interesse. Não há resposta 'certa', apenas uma abertura para outra conversa.

1) Implementar um ponteiro compartilhado básico, explicações sobre onde há deficiências em comparação com os ponteiros compartilhados tr1 ou boost em sua implementação, como ele deve ser usado etc.

2) Uma revisão de código. Para contratações experientes, esperamos que sejam capazes de revisar com segurança alguns códigos fornecidos para problemas de design, erros, horrores de codificação e possíveis problemas de manutenção. Além disso, é claro, como eles resolveriam isso; e às vezes como eles transmitiam essa mensagem ao desenvolvedor júnior que estão derrubando.


1

Uma pergunta que uso desde que foi usada em mim é a seguinte:

Escreva uma função para imprimir todos os números entre 1 e 100.

Grande parte do motivo pelo qual eu o uso é devido ao fato de que você pode pegar a solução e seguir em várias direções:

Como você modificaria a função para imprimir todos os números entre 1 e 1000, 10000 ou n ?

Suas respostas a essas perguntas podem fornecer informações sobre como eles respondem às mudanças nos requisitos, bem como se podem reconhecer considerações de desempenho. Um candidato forte pode responder com uma pergunta em relação ao que a função é necessária e com que frequência seria chamada.

Movendo-se em uma direção diferente:

Como você mudaria as coisas se soubesse que essa função será chamada várias vezes por minuto e o desempenho é uma preocupação?

Eu uso isso como uma maneira de verificar o pensamento lateral deles. Como o cálculo dos números primos pode ser lento à medida que o valor máximo aumenta, às vezes faz mais sentido usar apenas algum tipo de tabela de consulta calculada ou pré-calculada que é ajustada com base no problema que você está tentando resolver.


1

Aqui está uma para provocar um pouco de reflexão - é simples, envolve um pouco de matemática e verifica o conhecimento do candidato em design básico de computador (estouro, representação numérica etc.):

Escreva um programa (ou procedimento) que tome um par de números inteiros X, Y como entrada e determine se X * Y é divisível igualmente por 10. NOTA IMPORTANTE: X e Y podem ser grandes o suficiente para que X * Y ultrapasse o maior tipo de número inteiro disponível na sua máquina.


Solução de amostra:


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

0

Preencha o seguinte método: PS O modo de um número é o número (na lista) que tem mais ocorrências.

public int getMode(List<Integer> numberList) {


}

Isso é para ver se o seu código é eficiente.


-2

Como você representaria uma matriz sobressalente relativamente grande ... digamos 1000x1000, mas com no máximo 100 entradas diferentes de zero?

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.