web-dev-qa-db-ja.com

面接では、難しい質問に対するブルートフォースソリューションをコーディングする方がいいですか、それとも面接で質問を注意深く検討する方がいいですか?

面接担当者が意図するかどうかにかかわらず、面接の質問は難しい場合があります。限られた面接時間を使用して、醜く非効率的なブルートフォースソリューションをコード化するか、面接担当者との問題のあらゆる側面を理解するために時間を費やすかを選択できます。

たとえば、 Project Eulerの問題91 は、考えられるすべての三角形を計算し、isRightTriangle()テストを作成し、テストに合格したすべての三角形をポップする、それほど難しいブルートフォースソリューションによって解決できます。セット。しかし、X/Y座標の2つのペアにより、高い定数値を持つO(x ^ 4)ソリューションが作成されます。友人と私ははるかにエレガントで効率的なソリューションを思いついただけですが、2人で3時間かけて数十の図を描き、複数の数式をテストし、複数のアプローチを検討しました。

すべてのインタビューの質問が公平であるとは限りません。また、ある人にとって簡単なことは、別の人にとっては難しいかもしれません。誰かが質問に苦労している場合、ブルートフォースの醜い解決策がうまく機能することにもっと感動しますか?または、優れた問題の理解と洗練されたソリューションへの道のりはありますが、コード化されたソリューションはありませんか? 20分後、何があってもコーディングを開始するというルールはありますか?

14
GlenPeterson

まず第一に、2人の経験豊富な開発者がエレガントに最適化するのに3時間かかる質問は、インタビューの質問には適していません。頼めば完璧な答えは期待できません。

一方、時々あなたは彼らが彼らの限界に達するようにさせるとき、あなたは誰かについて最も多くを学びます。そのため、多くの大学のコースは難易度を上げてからカーブで成績を上げています。各試験で全員が100%のスコアを獲得した場合、多くの潜在的な学習を残しています。

私の理想的な候補者はおそらく、最初に複雑さの計算を行い、「ああ、それは600万回の反復であり、それほど長くはかからない」と言ってから、ブルートフォースソリューションをすばやく記述します。次に、面接担当者から依頼されない限り、必ずしも実装することなく、最適化のためのアプローチについて話し合います。

これは、現実の世界で発生するプロジェクトオイラータイプの問題の多くが、一度解決してから忘れる必要があるワンショットの問題であるためです。必要な場合のみ、雇う人が書き込みに2分、実行に10分かかるブルートフォースアルゴリズムを認識できるようになることを知りたい一度実行します。

9
Karl Bielefeldt

採用マネージャーとして、目の前のコードの問題を解決するように頼んでも、コード自体を確認することはそれほど重要ではありませんが(重要ですが)、方法と理由を確認するためではありません。あなたがしたことをした。あなたがするかもしれないそれらのことの1つはnotコードであり、代わりに、問題をよりよく解決するために、問題自体の側面について私に問い合わせます。これは私にとって意味があり、通常、コードに記載されているソリューションよりも意味があります。しかし、それは誰もがそれを行う方法ではなく、誰もが見たいものでもありません(実際、私はインタビュー設定でコーディングするように人々に頼むことはめったにありませんが、問題をテーブルに置いて、私たちはそれらについて話し合い、時には疑似コードが出現します、それは同じように良い私にとって)。

すべてのインタビューの質問が公正であるとは限らず、その設定と制約の中で、誰かにとって簡単なことは別の人にとって難しいことであり、そのため、それを理解するインタビューは通常、コードソリューションを探していません(ただし、再び、それは重要な役割を果たします)が、むしろ解決策processです。

"20分後、何があってもコーディングを開始するようなルールはありますか?"問題について考える非常に短い時間内に、少なくとも何か-さらに質問するか、ソリューションのフレームワークをスケッチするか、またはそれを行うことができない/どこから始めればよいかわからないことを言います。

時間の制約とあなたが何を持っているかを考えて、あなたとあなたが提供した解決策の前に難しい問題を置いた場合、私は力ずくで醜く、それがなぜそうだったのかについて一連の質問をします、そして、何がそれをよりエレガントなものに変えるでしょう:より多くの情報?より多くの時間?別の環境?自己認識し、あなたがやったことのwhyやあなたがやったことnotに触れ、合理的にそれを説明できることは、大きなことです私の本ではゴールドスターですが、これらは私が探している開発者の種類です。したがって、「優れた問題の理解とエレガントな解決策への道のり」も私にとってはうまくいきますが、全員にとってうまくいくとは限りません。

14
jcmeloni

私は両方が欲しいのですが、1つのソリューションで「正常に機能するコード」を表示し、その1つまたは別の問題を改善するための潜在的なソリューションについて話し合う可能性があります。

誰かにコードを書くように頼み、彼らがコードなしで可能な解決策について話したいだけなら、それは心配になるでしょう。

あなたが言ったように、誰かが何らかの理由で特定の問題に苦労するかもしれませんが、あなたは彼らがそれらを解決する方法を学ぶ必要があります。彼らは幸運になる可能性があり、すでに同様の問題の解決策について聞いています。それが起こります。

誰かが十分なコードを書き、それについて議論するのを見ると、彼らがその仕事に適しているかどうかを理解することができます。

4
JeffO

マネージャーとして、テストとしてコード化するように依頼した場合、私は最も興味があります。

  • コードを記述できるかどうか
  • あなたのコーディングスタイル
  • 選択したアルゴリズム
  • 試みは問題を理解したことを示していますか
  • 特定のテクノロジーについて私が本当に熱心である場合、多かれ少なかれそれを知っていることを示しましたか。

最初のアイテムはクレイジーに見えるかもしれませんが、驚かれることでしょう...

コーディングスタイル-それによって、ブレースをどこに置くかだけでなく、次のようなことも行います。

  • その問題を解決するために構成または継承を選択しましたか?どうして?
  • その値について、列挙型と文字列型と整数型のどちらを使用するように選択したのか(または適用される順列)
  • その値にプロパティ、フィールド、またはget/setメソッドを使用しましたか?どうして?
  • クラスでどのように状態を処理しましたか?
  • 継承、インターフェース、ラムダの仕組みを理解していますか?
  • 言語のパラメーターの規則を理解していますか(参照によると値によるとは何ですか?)
  • 単体テストの書き方を知っていますか?

これが私が本当に何をしているかしないでください気にします:

  • それがコンパイルされること(私がメモ帳を提供し、コンパイラーがないことを前提としています)
  • その1つの関数内の2つのパラメーターの順序をメモリで知っていること
  • SQL ServerまたはOracleの接続文字列を暗記できること
  • 私がすべての間違いを見てあなたの肩越しに立っている間、あなたは完璧にコードを書くことができること。

正直なところ、スタイルを分析するためのツールを除いて、コーディングテストのファンにはなりませんでした。

3
JMarsch

20分後、何があってもコーディングを開始するというルールはありますか?

いいえ、しかし、業務に取り掛かる前に問題の分析に20分を費やした場合、おそらくすでに問題が発生しています。引用したような質問をする雇用主は、問題への取り組み方に主に関心がありますが、コーディングの問題として質問した場合、いくつかのコードも見たいと思うでしょう。あなたの思考プロセスを通してそれらを話します...

さて、ここでの明白なアプローチはブルートフォースです。 3つの頂点が与えられた直角三角形を認識する方法があれば、2つの点と直角三角形を探す原点のすべての組み合わせを実行できます。それは難しいことではありません-ピタゴラスの定理を使用して直角三角形を識別する関数を書くことができます。これを簡単にするために、距離の式を使用して2点間の距離を決定する関数も記述します...

これらの関数の作成には約3分かかります。さて、質問のほんの数分で、基本的なジオメトリを覚えていて、コードの書き方を本当に知っていることをすでに示しました。それはまたあなたに話し合う何かを与えます:

したがって、isRightTriangle(p1, p2, p3)関数を4つのforループの真ん中に配置し、2つの変数ポイントのそれぞれについて可能なすべての選択肢を反復処理できることは明らかです。見てみましょう...問題は、50x50グリッド上の原点を含む直角三角形の数を要求するため、ブルートフォースメソッドを使用すると、各ポイントの各座標について50の可能性をチェックできます。これは50 ^ 4のチェックです...私たちがもっと上手くできると確信していますが、コードは明白なので、それを書き留めましょう...

したがって、ネストしたforループを使用する関数と、先ほど書いたisRightTriangle()関数を作成します。あなたは問題を解決しましたが、インタビュアーにあなたがどこへ向かっているのかを見せることができました。彼らの目標があなたがコードを書くことができることを確認することだけだったなら、彼らはあなたに止めるように言うかもしれません。より可能性が高いのは、彼らが何をしているのかを知っている誰かと話をして喜んでいることです。だから、続けます...

私が対称性を利用できるということを書いているときに私は思いつきました。 45°線の周りの任意の直角三角形を反映できます。そのため、その線の片側だけで点の1つをチェックすることを選択した場合、見つかった任意の直角三角形を2回数えることができます...三角形に対して1回と1回その反射のため。これにより、チェックの数が半分になります。また、今それを見ると、2点間の距離を見つけるために平方根を取っていますが、それをisRightTriangle()...で再び平方します。

等々。繰り返しになりますが、彼らは通常、完璧なソリューションを求めているのではなく、どのようにしてソリューションに到達するのかを見たいと考えています。あなたの思考プロセスは上記のようなものである必要はありません-大声で考える自信があるだけでも多くの価値があります。間違えても気にしないでください。「うーん、私はRailsここから外れたと思います-一歩戻らせて...」

3
Caleb

その場合、エレガントなソリューションへの進入は、悪いが完全なソリューションよりも優れています。どちらのケースも良いです。問題を理解し、実際にプログラムをコーディングする時間がなかったとしても、問題をどのように解決するつもりかを示すpusdocodeを書き留めておくのは、まったく問題ありません。

1
Tom Squires

私はあなたが実際には答えがない、「正しい」答えではない質問をしていると思います。私がこれを言う理由は、それは質問をしている人が何を評価するかに完全に依存するからです。

インタビュアーがハードコアプラグマティストであり、何かがすぐに機能することを確認し、残り時間があれば優先順位の低いアクティビティとして最適化する可能性があります。同様に、インタビュアーがGoogleの採用慣行について最高の印象を与えており、最もセクシーで最もエレガントなアルゴリズム以外には何も興味がなく、これを「粗野」や「強引」といった言葉を付けたことのない弱さのしるしと見なしている可能性もあります。互いに5ワード以内の力」面接担当者が「面接の質問」をググって、この問題があなたが入室する5分前にインターネットで発見し、彼が何を望んでいるのかわからない場合も、同様です。

すべての場合において、インタビュアーが望むものをコンテキスト情報に基づいて推測できない場合は、おそらく明確化を求めることが最善の策です。すべての面接の質問が公平であるとは限らず、実際、それらのすべてが良い質問であるとは限らず、意味のある質問でさえない。インタビューは本質的に還元主義的な活動であり、誰かと1〜2時間費やしていて、その2人が次の時間のために一緒に働くかどうかをその時間に基づいて推測しようとしている「スピードデート」によく似ています。 5年かどうか。その観点から検討すると、「ルール」についてのあなたの質問に本当に答えがないと私が言う理由がより明確になることを願っています。

誰かがあなたにあなたの能力への洞察を与え、彼らのチームに合うと思う質問をあなたに尋ねています。あなたは彼らのチーム、あなたが彼らについて知っていること、インタビュアーの人格、およびその他の何十もの要素を見て、彼らがどの回答、アプローチ、およびプロセスを評価する可能性が高いかについて最良の推測をする必要があります。個人的には、あなたが最高のアイデアだと思う方法でそれに取り組むべきだと私は言います。彼らがあなたに同意しない場合、とにかくそれは良い適合であるとは言えないかもしれません-後でそれをより早く理解するのは簡単です。

1
Erik Dietrich

とにかく面接官はあなたにあなたの解決策を改善するように頼みます。

そして、「ブルートフォースソリューションファースト」のアプローチには明白な利点が1つあります。理想的なソリューションを見つけられなかったとしても、それを示すために何かが完了しています。

0
vortexwolf