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.
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.
Respostas:
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.
(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.
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.
"Desenhe para mim no quadro branco o design do último projeto em que você trabalhou, sem me revelar nenhum detalhe sensível."
Implementar strcpy
, strcmp
e amigos.
atoi()
.
strdup()
.
strrev()
ou restringir a função de reversão. Minha solução de quadro branco os impressionou e estou fazendo um trabalho agora.
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:
Duas perguntas que suscitaram discussões interessantes no quadro branco para mim são:
Eles começam simples e depois ficam progressivamente mais complexos.
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.)
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.
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.
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:
É 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.
É independente da linguagem.
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.
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.
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.)
variablename = variablevalue;
enquanto os bons apenas riam por telefone ou pessoalmente e me diziam diretamente o que seria diferente ou não. var
)
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.
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.
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.
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));
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)
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.
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.
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.]
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.
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 :)
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.
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:
(É aqui que acho que há uma maneira inteiramente trivial de fazer isso e eu venho complicando todos esses anos).
SELECT min(ID), Name FROM Things GROUP BY Name
funcionaria, certo?
HAVING count(Name) > 1
, mas acho que sua resposta de exemplo deve omitir Bodkin Van Horn, Hot Shot, Snimm e Dave.
DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name)
. Você tem uma solução preferida?
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
Como você representaria um baralho de 52 cartas padrão? Qualquer linguagem de programação está correta. Como você baralha as cartas?
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.
varargs()
ou alguma função assim. Estou correcto? Eu só fiz uma vez para dizer que fiz isso há um tempo atrás.
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.
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.
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.
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.
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.
T_BOOL MultipleOfTen(int x, int y)
{
return((x%2==0 || y%2==0) && (x%5==0 || y%5==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.
Como você representaria uma matriz sobressalente relativamente grande ... digamos 1000x1000, mas com no máximo 100 entradas diferentes de zero?