Qual é a melhor pergunta para entrevista em C ++? [fechadas]

28

Se você pudesse fazer uma pergunta a um programador de C ++ para medir suas habilidades em C ++, qual seria?

A pergunta que acho melhor é: você pode chamar "excluir isso"; dentro de uma função membro? (Coloquei isso como um link para que você possa pensar primeiro e depois vá para A Melhor Pergunta de Entrevista em C ++ - Sempre! Para ver a resposta correta.)

Não pergunto isso porque espero que a maioria das pessoas saiba a resposta. Se o fizessem, não seria uma pergunta tão útil. Peço para ver se eles conseguem encontrar a resposta correta e como o fazem.

David Thielen
fonte

Respostas:

8

Eu perguntaria a eles o motivo pelo qual a função de membro virtual não pode ser usada com o modelo em C ++. Obviamente, existem poucas pessoas que podem realmente responder à pergunta imediatamente. Mas se um entrevistado entender adequadamente a mecânica principal do C ++ (como o modelo funciona em C ++, como a função virtual é implementada, como o compilador e o vinculador geram um executável a partir do código fonte etc.), você pode obter uma resposta com o passo a passo apropriado passo perguntas principais.

Adicionado: a função de membro virtual do modelo nesta resposta significa a função de modelo que é uma função de membro virtual de alguma classe - e não uma função de membro comum na classe de modelo. Desculpe por confundir :(

rots summerlight
fonte
3
@ Summerlight: Eu misturo funções e modelos de membros virtuais e nada de ruim aconteceu até agora ... Então, eu tenho medo de não ter entendido o que você estava dizendo. Gostaria de me esclarecer :)?
Matthieu M.
2
Esta resposta é quase, mas não totalmente correta. Você não pode ter funções membro virtuais de modelo, mas pode ter funções membro virtuais de uma classe de modelo.
catphive
1
@ Summerlight: ah entendi! Divertindo pergunta sim, muitas vezes aparece;)
Matthieu M.
2
@nikie: Essa é uma função de membro virtual na classe de modelo - não uma função de membro de modelo virtual como o modelo <typename T> virtual void doSomethingWithGenericTypeT (Arg arg);
summerlight 23/02
2
@ summerlight: você deveria ter incluído esse exemplo em sua postagem. Eu não tinha ideia do que você quis dizer até agora. Boa pergunta, no entanto, agora que eu entendo ;-)
Nikie
57

A melhor pergunta para entrevista em C ++ seria um problema de programação, não uma pergunta de teste.

Steven Evers
fonte
Acordado. Não pergunte sobre sintaxe que pode ser consultada no Google. Em vez disso, peça ao candidato que escreva uma função fácil (embora não trivial), de preferência algo que você escreveu em seu próprio código em um ponto.
Chrisaycock
4
Mesmo algo tão simples como "escrever uma função para reverter uma string" pode dizer muito sobre um programador especialista: eles usam CString, char*, std::string, etc .; eles retornam uma nova string ou invertem no lugar; eles fazem um loop manual sobre os caracteres ou chamam uma função de biblioteca. E, claro, se eles não podem fazer algo simples como reverter uma string, isso também diz muito sobre eles! Também há muitas perguntas de acompanhamento, como funciona com Unicode, funciona com UTF-8, etc.
Gabe
16
@ Ernelli: C ++ nunca realmente decolou? A sério?
Steven Evers
1
@ Gabe - bom ponto. Por exemplo, fazer um modelo invertido no local com um parâmetro de política não seria muito geral ou (provavelmente a política, e sim a função) bastante complexo, quando se trata de cadeias de bytes variáveis ​​por caractere. Eu não sei se não há otimização prematura (crie uma nova string porque é mais fácil ser geral) ou agilidade (não se preocupe com esse caso até que isso aconteça, e o inverso no local não seja mais difícil, talvez um pouco mais fácil, para cadeias de caracteres de largura fixa) venceria.
Steve314
1
@Ernelli - você está esquecendo wchar_t e std :: wstring e lhes significado coisas diferentes no Windows / Unix
Martin Beckett
32

Gostaria de perguntar o que eles gostam sobre C ++ 0x. A partir disso, eu poderia "agrupá-los" em vários estereótipos:

  • super velha escola, usa compiladores C ++ para compilar código C
  • velha escola, com medo (ou não vê sentido) na STL, não tem acompanhado as mudanças
  • adora lambdas, adora STL ficando mais rápido com referências a rvalue, grande fã de RAII, quente para usar shared_ptr, unique_ptr etc
  • é amargo porque todo o código de aumento escrito nos últimos anos precisará ser adaptado para usar equivalentes C ++ 0x
  • metaprogramador de modelos insanos que faz minha cabeça explodir enquanto responde a uma pergunta relativamente curta

Provavelmente, alguns desses baldes são perfeitos para você e alguns são "obrigado por entrar". Como uma pergunta que fornece muitas informações rapidamente, esse é o meu vencedor.

Kate Gregory
fonte
1
+1 para uma boa pergunta principal que incentiva muita discussão sobre o assunto.
Gary Rowe
8
Você esqueceu a categoria de pessoas que não têm idéia do que é C ++ 0x. Eu acho que isso seria mais uma resposta e se encaixaria nos dois primeiros tipos.
Fast Fish
1
@ Fast Fish, sim, pessoas que são como C ++ 0-whatnow? geralmente será uma das duas primeiras categorias e, normalmente, esclarecerá isso em sua resposta.
Kate Gregory
28

Estou um pouco confuso sobre o porquê "você pode excluir isso?" é considerado uma questão interessante. Qualquer pessoa que tenha escrito código COM em C ++ sabe que a primeira coisa que você aprendeu no primeiro dia de programação básica de COM é como usar "excluir isso" corretamente. Suponho que possa ser útil determinar se, digamos, alguém está mentindo em seu currículo sobre ter escrito programas COM, mas como uma pergunta C ++ de conhecimento geral, se alguém não puder respondê-lo imediatamente, não será um bom ajuste. para minha equipe.

De qualquer forma, se seu objetivo é apresentar uma pergunta que mede as habilidades de C ++, escolher uma pergunta é o caminho errado. Virar o jogo. A pergunta certa a fazer é:

Em uma escala de um a dez, quão bom é um programador de C ++?

Esta não é a pergunta que lhe dá a resposta que deseja. Todo mundo diz "oito", independentemente. A pergunta que lhe dá a resposta que você deseja é:

OK, então você tem oito anos. Qual é uma área problemática com a qual você acha que um sete teria dificuldade em trabalhar?

E bum , agora você os tem. Se o candidato acha que "algo a ver com recursão" ou "quando usar um destruidor virtual" é o tipo de coisa com a qual um sete tem dificuldade, então você sabe que ele sabe um pouco sobre recursão ou destruidores ou qualquer outra coisa e que o conhecimento deles não vai muito além disso.

Isso deve fornecer uma calibração muito melhor do que chegar a uma pergunta trivial. Se você me forçar a apresentar uma boa pergunta sobre um fato sobre C ++, provavelmente perguntarei algo como "como você projetaria o analisador semântico e o gerador de código para a parte de um compilador C ++ que lida com métodos virtuais chamado em um destruidor de classe base? " Você deve fazer perguntas relacionadas a coisas reais nas quais trabalha e em que o candidato provavelmente trabalhará. Esse é um problema no qual tive que trabalhar uma vez e acho que daria uma boa visão de como uma pessoa cria analisadores semânticos e geradores de código, bem como seu conhecimento de C ++.

Eric Lippert
fonte
3
Vou começar a usar este: OK, então você tem oito anos. Qual é uma área problemática com a qual você acha que um sete teria dificuldade em trabalhar?
David Thielen
10
Outra boa pergunta aqui: o que um nove poderia fazer com o qual você teria problemas?
David Thornley
Isso é tão brilhante que é incrível.
Jun /
14

Só por diversão, tive programadores de C ++ se recuperando com este bebezinho:

Por que isso é executado em um loop infinito (e sim, é digitado corretamente)?

int x=0;
while (x<3) {
  x = x++;
}

É incrível o número de viagens. Obviamente, não posso mais usá-lo depois que apareceu no Stack Overflow . Murmurar ... murmurar ...

(Para obter a resposta correta, leia a confissão e, definitivamente, leia os comentários)

Pergunta de bônus adicionada

Existe o clássico FizzBuzz de todos os tempos (como destaque no agora famoso artigo de Horror em Codificação ). Eu nunca o usei em uma entrevista, mas depois de dar uma olhada na equipe de desenvolvimento em uma hora do almoço, os resultados foram ... um ... surpreendentemente precisos.

Confissão

Eu fui pego na resposta padrão "x ++ retorna o valor original". No entanto, a resposta correta é que o comportamento é indefinido devido a pontos de sequência. Ninguém nunca mencionou pontos de sequência em todos os momentos em que usei isso até publicá-lo aqui.

Eu fui educado e gostaria sinceramente de agradecer a todos que se dedicaram a comentar.

Gary Rowe
fonte
1
Gary Rowe: Enquanto eu amo esse exemplo (a primeira vez que o vi). Me entristece que as pessoas não vejam isso rapidamente, muito menos não sabem.
Orbling
2
Quando eu estava na Microsoft, comecei a pedir aos candidatos que fizessem uma inserção em uma lista vinculada. Por quê? Porque cerca de 80% não conseguiram. Incrível ...
David Thielen
43
Este não é necessariamente um loop infinito. Você está invocando um comportamento indefinido aqui (x é modificado duas vezes sem ponto de sequência intermediário). E, de fato, com o meu compilador particular, gcc (Debian 4.3.2-1.1) 4.3.2 no meu arco particular (x86) que não terminar.
Logan Capaldo
2
@Logan +1 por mencionar pontos de sequência. Você deseja obter uma segunda entrevista com certeza ;-)
Gary Rowe
4
Essa é uma pergunta muito boa para a entrevista, porque informa ao candidato se vale a pena voltar para outra entrevista ;-). Se a entrevista realmente achar que o código resulta em um loop infinito (e o entrevistador deve ser tecnicamente competente), o candidato poderá com segurança deixar a "oportunidade" em falta.
CB Bailey
8

A primeira coisa a fazer é uma pergunta simples sobre ponteiros. Fiquei surpreso ao ver quantas pessoas que afirmam conhecer C ++ ou, pior ainda, C, são incapazes de responder. Então eu faria uma pergunta simples sobre funções virtuais. Essa combinação informa muito rapidamente se a pessoa conhece ou não C ++.

Dima
fonte
4
depende de seus antecedentes, nunca conheceu alguém com um histórico de hardware que não entendesse ponteiros, mas alguns que realmente não receberam encapsulamento ou polimorfismo
jk.
7

Isso depende muito do tipo de C ++ escrito em sua empresa. (Quando tive que contratar programadores C ++, nunca perguntei delete, porque perguntei sobre técnicas para evitar a necessidade de escrever deletecompletamente.)

Idealmente, você deseja contratar pessoas que escrevem código acima do nível que sua equipe atualmente escreve, mas não muito acima dele, a menos que queira combinar isso com o treinamento da equipe para elevá-lo a um nível superior.

sbi
fonte
7

Conte-me sobre o construtor de cópias.

fredoverflow
fonte
2
+1. Aquele elimina os candidatos incompetentes em cinco segundos.
Nemanja Trifunovic
6

Acredito que lhes perguntaria o que mais eles sabem ou, mais provavelmente, lhes faria uma pergunta em algo bem diferente.

Muitos codificadores C ++ sobre quem tem pouca experiência em outras linguagens. A experiência restrita é geralmente restritiva.

Orbling
fonte
6

A melhor pergunta para um ótimo desenvolvedor de C ++ é "Diga-me as razões pelas quais NÃO devemos usar C ++?"

amadvance
fonte
4

Eu não acho que haja uma melhor pergunta sobre C ++. O C ++ é uma linguagem tão grande e, com o C ++ 0X, cresce, que você pode estar forte em um determinado subdomínio da linguagem e pouco sobre outra parte da linguagem. Uma pergunta 'one shot' apenas exercita o conhecimento de alguém de uma pequena parte da linguagem e corre o risco de negligenciar o conhecimento de outros aspectos da linguagem.

sashang
fonte
3

Minha pergunta favorita é simples:

a) Você começou com C e depois mudou para C ++?

b) Em caso afirmativo, quais foram as primeiras coisas que você aprendeu a fazer de maneira diferente?

Essa resposta geralmente me dá uma idéia de como o programador aborda o C ++ e sua compreensão do OOP e C ++ em geral.

não há resposta "certa" ou "errada" aqui, mas geralmente é uma ótima maneira de ter uma idéia de onde o candidato está vindo.

mohaps
fonte
1

Na verdade, eu apresentava à pessoa um pouco de código de outra linguagem de programação orientada a objetos e, de preferência, não na lista de linguagens que ela conhece. O código deve representar uma tarefa simples feita nesse idioma.

O objetivo disso não seria determinar seu conhecimento de C ++, mas descobrir como eles entendem a programação. Quando você entende os conceitos básicos por trás da programação, pode resolver problemas.

Paulo
fonte
1

Como você implementa funções virtuais em C ++, explique um cenário do mundo real.

user616
fonte
1

No momento, eu diria: "Como você implementaria um construtor de movimentação para um contêiner?"

Minha lógica é que, como os construtores de movimentação são uma característica do próximo padrão e não do atual, a resposta do candidato indicará se o desenvolvedor em questão busca ativamente o conhecimento de seu idioma ou apenas se apega aos truques que conhece.

Kaz Dragon
fonte
1

Acho que pediria a opinião deles sobre o design de, digamos std::string,. Eu também perguntar-lhes se eles usaram outros projetos (por exemplo, MFC / ATL CString, wxStringetc.) e assumindo que eles têm, pedir-lhes para comparar e contrastar os projetos.

As strings são amplamente usadas para que quase qualquer pessoa com experiência real usando C ++ deva ter usado pelo menos um ou dois dos itens acima. Quase todos os projetos incorporam alguns compromissos entre pureza teórica e uso prático. Alguns podem funcionar muito bem, mas somente se usados ​​exatamente como pretendido, enquanto outros trocam maior versatilidade por alguma falta de jeito possível. Em suma, quase qualquer um que tenha experiência real deve ser capaz de expressar algumas opiniões significativas de seus projetos e essas opiniões deve dizer-lhe uma quantidade razoável sobre como eles pensam, como eles projetar código, o grau em que o valor pragmatismo contra pureza teórica, e assim por diante.

Jerry Coffin
fonte