C++プログラマーにC++のスキルを測定するための質問を1つ尋ねるとしたら、それは何でしょうか
「これを削除」と呼ぶことができますか?メンバー関数の内部?(これをリンクとして置いて、最初に考えてから、次に Best C++ Interview Question – Ever! に移動して、正解。)
ほとんどの人が答えを知っていることを期待しているので、私はこれを尋ねません。彼らがそうしたとしても、それはそれほど有用な質問ではありません。彼らが正しい答えにたどり着けるかどうか、そしてどのようにそうすることができるかを確認してもらいます。
仮想メンバー関数をC++のテンプレートで使用できない理由を尋ねます。もちろん、実際にすぐに答えられる人は少ない。ただし、インタビュイーがC++のコアメカニズム(テンプレートがC++で機能する方法、仮想関数が実装される方法、コンパイラとリンカーがソースコードから実行可能ファイルを生成する方法など)を適切に理解している場合、適切なステップバイバイで回答を得ることができますステップをリードする質問。
追加:この回答のテンプレート仮想メンバー関数は、テンプレートクラスの通常のメンバー関数ではなく、いくつかのクラスの仮想メンバー関数であるテンプレート関数を意味します。混乱してしまい申し訳ありません:(
最高のC++インタビューの質問は、クイズの質問ではなく、プログラミングの問題です。
私は彼らにC++ 0xの何が好きか尋ねます。このことから、私はそれらをさまざまなステレオタイプに「バケット化」することができました。
おそらく、これらのバケットのいくつかはあなたにとって完璧であり、いくつかは「入ってくれてありがとう」です。多くの情報をすばやく得る質問として、これが私の勝者です。
なぜ「これを削除してもらえるの?」と少し戸惑う。興味深い質問だと考えられています。 C++でCOMコードを記述したことがある人なら誰でも、基本的なCOMプログラミングの1日目に最初に学ぶことは、「これを削除する」を正しく使用する方法であることを知っています。私は、誰かがCOMプログラムを書いたことについて履歴書に嘘をついているかどうかを判断するのに役立つかもしれませんが、一般的な知識として、C++の質問として、誰かがすぐに答えられなかった場合、彼らはうまくいかないでしょう私のチームのために。
とにかく、あなたの目標がC++のスキルを測定する質問を考え出すことである場合、1つの質問を選ぶのは間違った方法です。 裏返します。正しい質問は次のとおりです。
1から10までのスケールで、C++プログラマーはどれほど優秀ですか?
これは、あなたが望む答えを得る質問ではありません。誰もが「8」と言います。あなたが望む答えを得る質問は:
はい、それであなたは8歳です。セブンが一緒に働くのが難しいと思う問題領域は何ですか?
そしてboom、今それらを持っています。候補者が「再帰と何かをする」または「仮想デストラクタをいつ使用するか」が7で苦労している種類のことであると考える場合、彼らは再帰またはデストラクタなどについて少し知っていることを知っています。 、そして彼らの知識はそれよりはるかに遠くまでは行きません。
これは、いくつかの雑学クイズを考え出すよりもはるかに優れたキャリブレーションを提供するはずです。 C++についての事実について1つの良い質問をするように強制する場合は、「仮想メソッドを処理するC++コンパイラの部分のセマンティックアナライザーとコードジェネレーターをどのように設計しますか?」基本クラスのデストラクタで呼び出されましたか?」あなたが取り組んでいる実際のものに関係している、そして候補者が取り組む可能性が高いという質問をするべきです。それは私が一度取り組む必要があった問題であり、それは、人がセマンティックアナライザーとコードジェネレーターを設計する方法、およびC++の知識についてかなり良い洞察を与えると思います。
ちょうど楽しみのために、私はこの小さな赤ちゃんと一緒にくつろぐC++プログラマーがいます:
なぜこれが無限ループに入るのですか(そして、はい、正しく入力されています)?
int x=0;
while (x<3) {
x = x++;
}
多くの人がつまずくのは驚くべきことです。もちろん、これ以上は使用できません Stack Overflowに表示された後 。つぶやく...つぶやく...
(正しい答えを得るには、告白を読み、間違いなくコメントを読んでください)
ボーナス質問を追加しました
昔ながらのクラシックFizzBuzzがあります(今では有名な コーディングホラーの記事 で紹介されています)。私自身は実際にインタビューでこれを使用したことはありませんが、開発チームのある昼食時にそれを試した後、結果は...ええと...驚くほど正確でした。
告白
標準の「x ++は元の値を返す」という応答に追いつきました。ただし、正しい答えは、シーケンスポイントのために動作が定義されていないことです。私がこれをここに投稿するまで、これを使用したすべての時間でシーケンスポイントについて言及したことはありません。
私は教育を受けており、コメントするために時間を割いてくれたすべての人に心から感謝したいと思います。
最初に尋ねるのは、ポインタに関する簡単な質問です。 C++、さらにはCを知っていると主張する人がそれに答えられない人がどれほどいるのか、私は驚きました。次に、仮想関数について簡単な質問をします。この組み合わせにより、その人が実際にC++を知っているかどうかがすぐにわかります。
コピーコンストラクタについて教えてください。
それはあなたの会社でどんなC++が書かれているかに大きく依存します。 (C++プログラマーを雇う必要があったとき、delete
を完全に記述する必要がないようにするためのテクニックについて彼らに尋ねたので、delete
について尋ねることはありませんでした。)
理想的には、チームが現在書いているレベルより高いレベルでコードを書く人を雇う必要があります。ただし、これを高くしすぎて、チームをトレーニングして、より高いレベルに引き上げる場合を除きます。
優れたC++開発者に対する最良の質問は、「なぜ[〜#〜]しない[〜#〜] C++を使用する必要があるのか理由を教えてください」です。
私は彼らに他に何を知っているかを彼らに尋ねるか、あるいはかなり異なる何かで彼らに質問をする可能性が高いと思います。
他の言語の経験がほとんどないC++プログラマーが多すぎます。狭い経験は通常制限的です。
最高のC++の質問があるとは思いません。 C++は非常に大きな言語であり、C++ 0Xを使用することで成長し、言語の特定のサブドメインに強くなり、言語の別の部分については強くなることができます。 「一発」の質問は、言語のごく一部についての知識を行使するだけであり、言語の他の側面についての彼または彼女の知識を見落とす危険性があります。
StackOverflowにはたくさんあります。いくつか紹介します。
https://stackoverflow.com/questions/2428404/tricky-interview-question-for-c
https://stackoverflow.com/questions/50447/favorite-c-interview-question
https://stackoverflow.com/questions/4269838/interview-question
https://stackoverflow.com/questions/2532102/can-a-pointer-ever-point-to-itself
https://stackoverflow.com/questions/3055141/interview-question-about-virtual-functions-in-c
私が尋ねるのが好きな質問は簡単なものです:
a)Cから始めてC++に切り替えましたか?
b)その場合、異なる方法で学習した最初のいくつかのことは何ですか?
この答えは通常、プログラマーがC++にどのようにアプローチするか、そしてOOPおよびC++全般について).
ここには「正しい」または「間違った」答えはありませんが、通常、これは候補者がどこから来ているのかを理解するための優れた方法です。
C++で仮想関数をどのように実装し、実際のシナリオを説明しますか。
現時点では、「コンテナーの移動コンストラクターをどのように実装するのですか?」
私の理論的根拠は、ムーブコンストラクターは現在の標準ではなく次の標準の機能であるため、候補者の答えは、問題の開発者が言語に関する知識を積極的に追求するか、単に知っているトリックに固執するかを示します。
たとえば、std::string
のデザインについて、彼らの意見を伺いたいと思います。また、他のデザイン(MFC/ATL CString
、wxString
など)を使用したかどうかを尋ね、使用していると想定して、デザインを比較および対比するよう依頼します。
文字列は十分に広く使用されているため、C++の使用経験があるほとんどの人は、上記の少なくとも1つまたは2つを使用する必要があります。ほとんどすべての設計は、理論的な純粋さと実際の使用との間のいくつかの妥協を具体化しています。一部は本当にうまく機能しますが、意図したとおりに使用された場合にのみ、他のいくつかは、いくつかの可能な不器用さのためにより大きな汎用性を交換します。要するに、実際の経験を持っているほとんどすべての人すべき彼らのデザインについていくつかの有意義な意見を述べることができ、それらの意見は彼らがどのように考えるかについてかなりの量をあなたに伝えるべきです彼ら設計コード、実用性と理論的純度の比較など。
私は実際に、オブジェクト指向であり、できれば彼らが知っている言語のリストにない別のプログラミング言語からのコードを少し提示します。コードは、その言語で実行される単純なタスクを表す必要があります。
これのポイントは、C++の知識を判断することではなく、プログラミングをどの程度理解しているかを知ることです。プログラミングの背後にある基本的な概念を理解すると、問題を解決できます。