第一線の大規模ファクトリーコード農家が持つべき基本的な能力についてインタビューの質問から話す

第一線の大規模ファクトリーコード農家が持つべき基本的な能力についてインタビューの質問から話す

コードエイプストーン
第一線の大規模ファクトリーコード農家が持つべき基本的な能力についてインタビューの質問から話す
第一線の大規模ファクトリーコード農家が持つべき基本的な能力についてインタビューの質問から話す

著者:Yura Shevchenko出典:skypixel.com

一次農家へのインタビューについて、言いたいのは

ほとんどの人にとって就職の面接は欠かせません。私は求職者として、成功したか失敗したかにかかわらず、多くの面接に参加しました。技術面接官として4〜5年の面接の経験があります。面接の過程で私も見ました。あらゆる種類の人々(強力で素晴らしい人もいます)。ここで私自身の意見をいくつかお話ししたいと思いますが、必ずしも正しいとは限りません。意見が異なる場合は、メッセージを残してディスカッションに参加してください。

面接はもともと双方向の選考プロセスであり、面接官と候補者の立場は同じである必要があります。面接官は、簡単なコミュニケーションを通じて、候補者の技術とコミュニケーションをある程度理解し、候補者かどうかを判断できることを望んでいます。一致します。対応する位置。個人的には、面接の成功は求職者と面接官が一定の収穫を得るのに最適だと思います(人事部から、候補者が面接官の意見を表明するために具体的にフィードバックを与えたと言った後、特定の面接に遭遇しました。ありがとう、彼にとってとてもやりがいがあり、もちろんとても嬉しいです)、インタビューに参加するたびに、この目標を達成できることを願っています。候補者の場合、面接プロセスから自分の欠点を理解したり、面接の質問について話し合ったりできます。面接官の場合、候補者のテクノロジーとプロジェクトを理解できます。また、交換とディスカッションの学習と統合でもあります。また、面接が最終的に合格できるかどうかは、仕事のマッチングにあります。ニンジンには穴があります。ニンジンが大きすぎたり小さすぎたりするのに必ずしも適しているとは限りません。そのため、面接の失敗は、候補者が十分ではないためではなく、候補者が良すぎる場合もあります(たとえば、P6のみを採用したかったのですが、P8候補者は間違いなく適していませんでした)。

面接時間は限られているため、1時間(一般的に)で候補者の技術力を十分に理解することは難しく、面接の過程で絶対的な公平性を実現することは困難です。簡単な例を挙げると、面接官が質問をします。候補者Aは以前にそれを行ったか見たことがあるので、この質問に比較的簡単に答えることができますが、候補者Bは面接官を満足させる答えを出すことはできませんが、答えません。 。、しかし、Bは問題を解決するためのいくつかのアイデアを提供します。彼は最終的に質問に答えませんでしたが、それは必ずしも候補BがAよりも悪いことを意味しますか?いいえ、そうです。

このトピックから始めましょう。このトピックは、以前のインタビューでよく調べたトピックです。

それを試してみてください

ルート番号を開く操作を完了する関数を実装します。メソッドのシグネチャは次のとおりです。


double sqrt(int v, double t)

請求:

  1. Math.sqrt(v)などのシステムライブラリ関数を呼び出すことはできません。
  2. 計算結果がrであると仮定すると、次の条件を満たす必要があります。Picture、ここで、pictureは実際の値であり、tは0.1などの指定されたエラー範囲です。つまり、計算した値は指定された値の範囲内である必要があります。エラー範囲。
  3. 実装言語は制限されておらず、条件は上記よりも厳しい場合がありますが、緩くはありません。たとえば、インターフェイスsqrt(9、0.21)を呼び出すと、条件を満たすために[2.79、3.21]の範囲のいずれかが返されます。
    これを見て、実際にペンと紙を取り出して答えてみることができます。答えは与えられたエラー条件を満たす必要があることに注意してください。コミュニケーションへようこそ。実際、このトピックは、leetcodeの元のトピックを少し変更することによって取得されます。これを行った場合、leetcodeの他のトピックは比較的単純であると感じる必要があります。でも、まだやったことがなくても構いません。面接官の指示でやっとこの問題を解決できれば、大丈夫だと思います。質問をブラッシングして答えを覚えるよりもいいかもしれません。もちろん、ブラッシング)トピック自体は、このトピックに関する他の小さな質問に間違いなく散在しています)。

第一線の大規模ファクトリーコード農家が持つべき基本的な能力についてインタビューの質問から話す

境界線


答え始める

実際、最初は、このトピックは比較的単純だと思います。少なくともヒントを与えた後は、理想的には、最初の行のコーディングのほとんどのプログラマーが実際のコードを与えることができます。しかし、「理想はいっぱい、現実はとても細い」というわけではありませんが、多くの人にインタビューしたところ、この質問は単純ではないことがわかりました。書き出せれば、多くの人よりも優れているということです。人々(少なくとも私の過去の社会的採用面接の経験)。

この質問について尋ねられたとき、考えられる答えは次のとおりです。

あきらめる

トピックが与えられた後、私は通常、候補者がトピックの意味を理解したことを最初に明確にし、次に候補者に最初にそれについて考えるために1、2分与えます。

インタビュアー:何かアイデアはありますか?
求職者:いいえ。

おそらく、候補者の内部OSは、「このような問題にうんざりしていませんか?明らかに、直接使用できるlib関数があります」です。(以前は、同じグループにそのような候補者に出会った他の小さなパートナーがいます。言葉はそれほど誇張されていませんが、一般的な考え方は、実際の仕事でそのような問題が発生するのでしょうか?Baiduを1つだけあげます)

ここでは、面接の質問は質問自体を強調するものではないことを強調します。この質問を、候補者が問題を分析して解決する能力、および論理的推論と考え方を調べる機会として使用したいと思います。コミュニケーションプロセス。もちろん、最後に実際のコードを見て、コーディングプロセスから候補者のプログラミングの習慣やスタイルなどを見ていきます。

誤差範囲を制約する不等式を長い間研究してきた候補者もいますが、それ以上はありません。当初、この状態はもちろん良好ですが、この不平等がわからない場合は、最初に手放すことができ、そこで苦しむ必要はありません。

インタビュアー:私の質問のルート番号10が等しい場合は、それを実行しましょう。どのように答えますか?
候補者:それは3時です。
インタビュアー:ルート番号が3であることがわかっているので、3時であることをどうやって知ることができますか。このプログラムを使用して、脳の思考プロセスをシミュレートすることもできると想像してください。
候補者:もう一度考えます...

実際、ここでは、最初に問題を解決してから効率を検討する必要があることを候補者に思い出させます。つまり、どのような方法で答えても、今度は次の段階に入ることができます。

実際の作業シナリオでも同じことが言えます。問題が発生した場合は、まずこの実際の問題を解決する方法を考え、最も基本的な解決策が得られたら最適化について話し合う必要があります。

ブルートフォース検索

実際の面接の過程で、この段階に直行する人もいます。

最初にループを使用してrを見つけ、r ^ 2が指定されたvに最も近い平方数になるようにします。つまり、ルート番号10を計算する場合は、3 ^ 2 = 9であるため、最初に3を見つけます。

次に、r ^ 2> vになるまで、r + = tのたびに別のループを使用します。

インタビュアー:この方法は理論的には実行可能な解決策です。精度要件が高く、sqrt(v = 10000000、t = 0.000001)のようにvも非常に大きく計算したいと考えている場合を想像してください。メソッドを呼び出す効率は非常に低いですか?現時点でどのように最適化する必要がありますか?
候補:この場合、私の方法は確かに比較的非効率的ですが、ステップサイズの設定など、このように最適化できます。1回の繰り返しの後、期待を満たさない場合は、このステップ長さを継続的に変更して、10倍の誤差、100倍の誤差など、真の値に近づく速度を上げることができます。

実際、候補者の問題解決能力は、面接調査のポイントでもある候補者との継続的なコミュニケーションに見ることができます。たとえば、上記の問題の最適化は、実際の作業で発生する問題にも使用できます。

たとえば、実際の作業では、非同期のコールバック通知インターフェースなどを作成することがよくあります。このインターフェースは他のチームによって維持されている場合があります。ネットワークの問題が原因でコールバックインターフェースが失敗し、再試行が必要になる可能性があります。実際、メカニズム再試行の方法上記の「ステップサイズ」メカニズムから学ぶことができます。最初にコールバックが失敗したときは、1秒待ってから再試行し、失敗後に再試行します。1秒の間隔が適切でない可能性があります。待機を変更できますか?ステップ長、たとえば5秒、10秒待ちますか?成功するまで待ってから再試行してください。なぜこれを実行したいのですか?おそらく、相手のサーバーは現在ピークにあり、絶え間ない再試行は、インターフェイス呼び出しが成功する可能性を高めるだけでなく、相手のサーバーの負担を増やします。

ええと、逸脱、質問自体に戻って、続行します

インタビュアー:まあ、これは確かに最適化することができます。しかし、本質的には、エラーを考慮しないと仮定すると、この問題は実際には、順序付きリストの条件を満たす特定の値を検索することです。今のあなたの方法は線形探索スキームです。他に一般的な検索はありますか?
候補:二分探索?
インタビュアー:はい、この問題を解決するためにこのアイデアを借りることができるかどうかを考えることができます。

二分探索

もちろん、2つのポイントがプロンプトされた直後にポイントに到達でき、2つのポイントの一般的なフレームワークを記述できる候補者もいますが、終了条件に問題がある可能性があります。

候補者がアイデアを持っていない場合、それは続行されます

インタビュアー:このように理解してください。現在の整数部分を検索するプロセスは、実際には線形です。二分法の意味は、たとえば、ルート番号10を数えると、検索範囲は[0、10]になるということです(実際、範囲は、いくつかの番号[0、v / 2]を除いて、より小さくすることができます。あなたはそれを証明しますか?)

  • 5 ^ 2 = 25> 10であるため、rは[0、5)に属します。
  • (5/2)^ 2 = 6.25 <10であるため、rは(2.5、5)に属します。
  • (3.75 ^ 2 = 14.0625> 10)であるため、rは(2.5、3.75)に属します。
  • 続けて、終了条件がわからない場合は、そのままにしておくことができます...

この時点で、感覚は比較的明白です。

インタビュアー:あなたは今理解していますか?
求職者:なるほど。
インタビュアー:次に、コードを書くことができます。

二分探索の場合、アルゴリズムのアイデアを例を挙げて説明します。候補者が明確な答えを持っている場合、理想的には、第一線の開発者としてそれを書くことは問題ではないはずです。しかし...理想と現実の間にはまだギャップがあります。
多くの人は再帰を使って書くのが好きですが、多くの人は再帰の最も重要な終了条件やいくつかの境界条件などを持っていません。したがって、通常の状況では、コードを記述した後、受験者に独自のテストケースを記述させます。

インタビュアー:完了ですよね?いくつかのテストケースを書くことができます。このインターフェースが他の誰かによって書かれていると仮定すると、どの角度からテストする必要がありますか?
候補者:sqrt(-4、0.21)、残念ながら、ここで判断するのを忘れました。コードを変更します。
候補:sqrt(0、0.21)、sqrt(4、0.21)...ご不明な点がございましたら、変更してください。
インタビュアー:...

作成したコードの正確さを確認する前に、ケースをテストするように求められるのはなぜですか?一部の候補者が作成したコードは、一部の異常状態をチェックせず、上記のsqrt(10、0.21)の例を使用しただけですが、期待した結果が得られません。

このステップに到達できる人は少なくなります。より完全なテストケースと境界条件の判断があり、さらに次の終了条件が正しければ、基本的にこの問題は問題ないと見なされます。

終了条件について

基本的に、このアルゴリズムは反復近似プロセスです。二分法のアイデアを使用した後、重要なのはそれがいつ終了するかです。タイトルにはエラー状態の写真が記載されていますが、写真がわからないのが難点で、直接計算して判断するのは不便です。多くの人が判断を下すために異なる終了条件を使用します。実際、これら2つの条件は異なります。

この終了条件について何か意見はありますか?あなたの考えを証明できますか?

その他のソリューション

もちろん、ニュートンの反復法、最急降下法(最急降下法)、テイラー式の展開など、この問題に対する他の数学的解決策がいくつかあります。候補者がこれを考えることができれば、それは彼がまだ特定の数学的基礎を持っていることを意味し、彼が望むなら彼はそれについて話すことができます。(この質問を調査する本来の目的は、受験者がこれらの数学的方法を使用して問題を解決することを期待することではありません。)

このトピックについてもっと良いアイデアはありますか?ディスカッションに参加するためのメッセージを残してください。

一般的な問題

  1. 質問:質問intのvのタイプはなぜですか?
    回答:本当に理由はありません。doubleはOKです(これにより穴が追加されます。それが何であるかわかりますか?)、おそらく、leetcodeの元の質問で計算された数値がintであるためです。
  2. Q:この質問に正しく答えることができれば、面接に合格できますか?
    A:面接でそのようなトピックを調査することは、トピック自体を調べることだけではないことを強調したいと思います。この質問が正しければ、面接に合格できるという意味ではありません。逆に、あなたが正しくやらないでください。面接に合格できません。このトピックを機会として、問題を分析して解決する候補者の能力、コミュニケーションプロセスで具体化された論理的推論と考え方を検討したいと考えています。もちろん、最終的な実際のコードもあります。
  3. これは数学の問題ではありませんか?なぜプログラマーはインタビューでそのような数学の問題を調べる必要があるのですか?
    回答:主題自体ではなく、上記と同じです。また、これは数学の問題ではなく、もちろん数学的に解くことができるとも言えます。数学的に解くことができる候補者は正しいと見なされます。
  4. 質問:二分法はこの質問に対する標準的な答えですか?他のソリューションを使用できますか?
    回答:上記と同じです。質問に対する標準的な回答はありません。最も暴力的なアルゴリズムで検索しても、それが正しい解決策です。他の数学的方法も正しいです。
  5. 質問:この質問はとても単純です。ニュートンの反復は毎分消えます、それは単純すぎますか?
    回答:私はあなたのための写真が好きです。
  6. 質問:このトピックは何ですか、私は長い間それを理解していませんでした。このTMは何ですか?
    回答:記事全体を注意深く読んだり、インタビュアーと長い間コミュニケーションをとったりしても、問題が何であるかはまだわかりません。それからそれを放っておいて、彼を手放してください、それはターゲットユーザーではないかもしれません。
  7. 質問:実際の仕事でこのような問題に遭遇することはありませんが、これを尋ねるのはどのような用途ですか?
    回答:2番目の回答と同じです。
    質問:あなたの会社はまだ人が不足していますか?面接中にどのような点が検討されますか?
    A:興味がある場合、または他の質問がある場合は、私のメールアドレスaUB0YW5nbGVpLm1lを突くことができます。インタビュー調査には、CSの基本/コード/データ構造とアルゴリズム/問題解決/プロジェクトの経験/システム設計/コミュニケーションチームのコラボレーションなどが含まれる場合があります。

結論

この記事のトピックは「インタビューの質問から大手メーカーが持つべき基本的な能力について話すことまで」であり、実際、上記のコンテンツのほとんどはトピック自体についてのみ話します(このトピックの分析と理解も散在しています) )。上記の質問のシナリオは、社会的採用の面接にあります。そのような質問の場合、学校の採用のフィードバックはより良くなります。学生は仕事の経験やプロジェクトの経験などが不足している可能性があるため、面接とスクリーニングには比較的固定されたアルゴリズムを使用する必要があります(基本的に学校の試験と大差ありません)。

しかし、そのような同様のトピックは、社会的採用シナリオにはまったく適用できませんか?代理店に採用された学生が書けないのには理由がありますか?職場環境でこのような実際の問題に遭遇することはないかもしれませんが、私が実際に表現したいのは、最前線でコードを書くコーダーとして、他の人がバイナリアルゴリズムを説明し、それを理解した後に書くことができるということです。この二分アルゴリズムを思い付くのは難しすぎませんか?これは要件に相当します。誰もがアルゴリズムの実装とソリューションについて話し合いました。実行可能なコードに変換する必要があります。

実は、この記事はもともと「第一線のコード農家が持つべき基本的な能力についてのインタビューの質問から」と呼ばれていましたが、数年前にスプレーされましたが、後でスプレーするのは理にかなっているようです。日常のシーンでは、「コピー&ペースト」のエンジニアで十分なようです。問題が発生した場合は、より高いレベルの誰かが問題を解決するのに役立ちます。全員が同じである場合、マスターレベルをどのように反映できますか?でももちろん、雇用主の観点からは、もっと優秀な選手を募集したいのですが、どうやって優秀さを発揮するのでしょうか?候補者の基本数が多すぎるため、実際の選考方法は「大学入試」と同じで、「試験」に合格して最適な候補者を選ぶだけです。

コードを書くすべての人がこの能力を持っている必要があるかどうかについては説明しません(答えがそうではないことは明らかです)。しかし、私たちの最前線のプログラマー(特に意欲的な第一線のプログラマー)は、いくつかの基本的なデータ構造とアルゴリズムを理解し、一般的なアルゴリズムの複雑さを理解している必要がありますか?または少なくともそのような追求が必要ですか?たとえば、二分探索の複雑さがなぜであるか。たとえば、Java開発で7年または8年の経験があり、履歴書の説明がJavaに精通しているなど、以前にいくつかの候補者に会ったことがありますが、ArrayListとHashMapが内部でどのように行われるかわかりません(すべての一般的な実装原則を知っています。遭遇するさまざまなパフォーマンスの問題を最適化するためかもしれませんか?)他にVimに習熟していることは、実際にはvimを開閉する方法に習熟していることです。良い点を口頭で表現する候補者もいますが、その結果、コードをまったく書くことができなくなります。

ほとんどのプログラマーは、製品マネージャーに促され、面倒なビジネスコードを急いでコーディングし、バグを絶えず修正し、新しいバグを導入するなど、多数の要求に圧迫されていると感じることがあります。ビジネスコードは最も重要なことですが、もちろん重要です(コードは特定のビジネスに役立つことです)が、同時に、いくつかの基本的なことを放棄せず、プログラミングリテラシーを養うことを望んでいます。プログラミング言語やさまざまなツールを使用して、達成したいことを達成する場合、「それが何であり、なぜそれであるかを知る」ことができたほうがよいのではないでしょうか。

おすすめ

転載: blog.51cto.com/15072927/2607573