舞台裏でのコーディングインタビュー-良い点と悪い点

面接はそれ自体がスキルです。あなたは世界で最高の開発者になることができますが、それでも面接を台無しにする可能性があります。

Google:エンジニアの90%があなたが書いたソフトウェア(Homebrew)を使用していますが、ホワイトボード上のバイナリツリーを反転することはできません。

—マックス・ハウエル(@mxcl)2015年6月10日

面接から何回出てきて、私が何を間違えたのか疑問に思いましたか?なぜ彼らは私を拒否したのですか?

候補者として、面接での期待を理解するのに大いに役立ちます。

この記事では、志望するすべての候補者に、良い面接と悪い面接の違いと、面接官がそれをどのように認識しているかを示したいと思います。

2つの異なるインタビューを比較対照し、それぞれから学び、期待に合わせてアクションを微調整できるようにします。

最初のインタビュー

上記の「二分木の反転」についても同じ質問をします。

インタビュアー(I):こんにちは、私たちの会社へようこそ。私はyyyをやっているxxxです。じゃあ、あなたのことについて教えて。

候補者(C):私はxxxです。私はバックエンド開発で約5年の経験があります。私は技術的な問題を解決するのが大好きです.....

I:それは素晴らしい。では、問題解決の部分に移りましょう。

C:もちろんです!

I:それであなたは二分木を与えられます。二分木を反転して、結果のツリーを印刷してほしい。

C :(頭の中で考えて)うーん、わかりました。二分木には2つの子があります。したがって、反転とは葉から根への印刷を意味すると想定しています。したがって、それを行う最も簡単な方法は、最後まで木を横断して葉を見つけることです...

:(完全に沈黙してから5分後)  質問を理解していますか?何か説明が必要ですか?

Cわかりました。今、私は葉から始めてノードを印刷する方法を考えています。

I:葉から始まるノードを印刷するとはどういう意味ですか?

C:基本的に、葉から根まで印刷する必要がありますか?葉までトラバースするのは簡単です。しかし、難しい部分は逆戻りしていますか?

:うーん。質問を正しく理解していますか?ツリーを反転すると、左右の子を入れ替える必要があります

C:すみません、はっきりしていません。あなたが反転と言ったとき、私あなたが葉から根へと印刷することを意味する思いました。

I:それ大丈夫です(これはあなたが仕事を失ったところです)。明確になったので、次に進みましょう。

C:はい、はっきりしています。だから今私は左と右のノードを交換する必要があります。それは簡単です。

(無言でコードを書く)

def invert(node) t = node.left node.left = node.right node.right = t return node end 

C:コードは完成です。

I:かっこいい。それで、あなたはここで何をしましたか?

C:左右のノードを入れ替えてツリーを反転しました。だから私は同じことを達成するために一時変数を保持します。

I :(適切な解決策に向かって微調整しようとしています)しかし、これはルートノードのみをスワップしますか?

C :(困惑)うーん、そうです、左右の子が反転します。それは正しい質問ですか?

I :(まだ問題の明確さはありません)したがって、問題は完全なツリーを反転する必要があるということです。ルートだけではありません。

C:そうねえ。つまり、それはルートだけでなく、完全なツリーでもあります。私は正しいですか?

I:はい、その通りです。

C:わかりました。私はそれについて考えてみましょう。

(2分後)

C:わかったと思います。したがって、基本的には、ツリー全体に対して作成したのと同じアルゴリズムを実行する必要があります。私は正しいですか?

I:はい、でもどうやってやるの?

C :(コードの記述を開始)

def invert(node) n = Node.new(node.val) invert(node.left) invert(node.right) n.left = node.right n.right = node.left return n end

だから、私は推測する、これは動作するはずです。

:うーん、見てみましょう。(問題を見つけます。できますか?)それが機能するかどうかはわかりません。実行していただけませんか。

C:もちろんです。最初に左側のサブツリーを反転し、次に右側のサブツリーを反転してから、ルートが反転するようにそれらを交換します。

:うーん。しかし、左右のノードは、右のスワップ後に新しいノードを返していますか?あなたはまだ古いノードを交換しています。

C:それが何を意味するのかわかりません。これすべての場合に機能すると思います。

:素晴らしい男!時間がなくなった。お時間をいただきありがとうございました。お話をうれしく思いました。人事部から折り返しご連絡いたします。

フィードバック

さて、最終決定は何だと思いますか、インタビュアーのフィードバックは何でしたか?架空のフィードバックは、次のようなものになります。

  • 候補者は多くのことを想定し、問題を明確にしませんでした。
  • 候補者はどこからともなくアプローチを思いつき、採用されたアプローチの背後に適切な理由はありませんでした。(インタビューの沈黙を覚えていますか?)
  • 候補者は、実装段階でも要件について明確ではありませんでした。
  • 候補者は実装に苦労し、解決策を示すヒントを得ることができませんでした。
  • 候補者は、解決策が正しいかどうかを確認するために十分な時間を提供し、調査した後でも、コードのバグを特定できませんでした。

これが実際の面接だったとしたら、候補者は拒否されたでしょう。さて、理想的な面接はどのように進むべきですか?

2回目の面接

インタビュアー(I):こんにちは、私たちの会社へようこそ。私はyyyをやっているxxxです。じゃあ、あなたのことについて教えて。

候補者(C):私はxxxです。私はバックエンド開発で約5年の経験があります。私は技術的な問題を解決するのが大好きです.....

I:それは素晴らしい。では、問題解決の部分に移りましょう。

C:もちろんです!

I:それであなたは二分木を与えられます。二分木を反転して、結果のツリーを印刷してほしい。

C :(大声で考えて)かっこいい。したがって、二分木には2つのノードがあります。では、正確には何が反転しているのでしょうか?左右を入れ替えているのですか?

I:その通りです。したがって、左側のノードは右側にある必要があり、その逆も同様です。

C:わかりました。では、この場合はどうなりますか?

例を示し、入力と出力を明確にします

I:あなたはある程度正しいです。しかし、これは、ルートだけでなく、ツリー全体で発生するはずです。(要件がどのくらい早く固まったかに注意してください)

C:ああ、わかった!だから私はそれを再帰的に行う必要があると思っています。男、それは難しいです!そうねぇ。ただし、その前に、もう1つの例を実行して、理解度を確認します。

不足している部分を明確にするために、もう1つ提供します

I:はい、その通りです。それが出力です。私はあなたが完全に問題を抱えていると思います。では、どのようにアプローチしますか?

C:見てみましょう。したがって、左右を入れ替えるには、温度を使用するだけです。しかし、それでは私は残りのためにそれをどのように行うのでしょうか?ああ、私は他の人のためにただ再帰して同じことをすることができました。

I:かっこいい。そのアプローチに問題はありますか?

C:うーん。はい、左右を再帰的に入れ替えるだけの場合、新旧のツリーをどのように追跡しますか?

I:あなたをフォローしているのかわかりません。古いものと新しいものは何ですか?

C:つまり、更新された子があります。古い子ではなく、それらを交換する必要があります。

I:はい、正解です。

C:Yaこの関数を左右に再帰的に呼び出して、それらの値を変数に格納できます。次に、それらの変数でツリーを更新できます。このようにして、ツリー全体が反転していることを確認できます。

I:かっこいい。他に足りないものはありますか?

C:いいえ。したがって、余分なスペースを使用しないため、O(n)時間とO(1)スペースが必要になります。(候補者が時間と空間についてどれほど積極的に話し合っているかに注目してください)

I:元気です。コーディングを開始できます。

C:もちろんです。(コーディング中にコードを介して話します)

def invert(node) invert(node.left) invert(node.right) node.left,node.right = node.right, node.left return node end 

C:これで完了です。私のコードを見ていきましょう。したがって、...のようなツリーの場合(例を使用して説明とドライラン)

I:あなたが正しいと思います。それはすべての場合に機能しますか?

C:うーん。空の木に対してNullポインタ例外が発生すると思います。nullチェックを追加して修正しましょう。

I:今はよさそうだ。あなたが欠けている他のもの。

C:いいえ、私がカバーした他のことは、葉がない、葉が1つなどだと思います(彼が考えたそれぞれのケースをどのように呼んでいるかに注意してください)

I:かっこいい。私は元気です。質問は?:)

フィードバック

では、このインタビューについてどう思いますか?

  • 候補者は、実装を開始する前に要件を明確にしました。
  • 候補者はまた、いくつかの例を実行し、彼の理解を明確にすることによって要件を凍結しました。
  • 候補者は、調査なしで実用的な解決策を考え出しました。
  • 候補者は、時間と空間の複雑さについて積極的に話し合いました。
  • コーディング中、候補者は自分が何をしていて、どこに向かっているのかについて明確なビジョンを持っていました。
  • 候補者はコードにバグがあり、エラーをチェックするように求められたとき、彼はエラーを見つけて自分で修正しました。

結論

面接はコーディングとはまったく異なるスキルです。あなたは問題解決に長けていますが、面接は面接官があなたを雇うかどうかを決定しようとする設定です。したがって、コーディングに加えて、面接官があなたを簡単に採用できるように、面接官の視点も理解する必要があります。この記事では、良いインタビューと平凡なインタビューを比較対照したいと思いました。面接のスキルは、練習すればするほど上手になるので、別々に練習してみてください。模擬面接を受けるのに助けが必要な場合は、私に連絡することができます。

この記事は//kaizencoder.comで最初に公開されました。この記事が気に入った場合は、この記事を読むか、私についてもっと知るためにアクセスしてください!