技術面接の準備方法-最高のパフォーマンスを発揮するためのヒントとコツ

ああ、コーディングインタビュー。

「それを恐れなさい。それから逃げなさい。運命はすべて同じように到着する。」-サノス2018

さて、それは少し劇的かもしれませんが、インタビューのプロセスを通過することに興奮している人は誰も知りません。就職活動/面接のプロセスは、せいぜい疲れ果てており、最悪の場合、他の多くのことを疲れさせています。

多くの人が面接のためのトリックや戦術について勉強しますが(そして私もそれらのいくつかをあなたに与えます)、ほとんどの人は面接に入る彼らの考え方について考えません。

あなたの考え方は、あなたがあなたの状況をどのように見、形作るかというトーンを設定します。正しい考え方で入りなさい、そうすればあなたはあなたに投げられたものすべてを理解してナビゲートすることができるでしょう。散らかった、または臆病な心で入ると、あなたは自分が揺れ動き、ボロボロになっていることに気付くでしょう。

あなたはインタビュアーでもあります

ほとんどの人が忘れがちなことの1つは、あなたが面接官でもあるということです。

はい、あなたはこの会社で面接を受けいますが、彼らあなたに適しいるかどうかを確認するために会社にも面接ています。

この会社の価値観は何ですか?彼らの労働倫理はどのようなものですか?人々は何を大切にしていますか?

面接に合格することは重要ですが、合格したらこの会社で働きたいですか?

時々私たちはただ仕事を必要とします—どんな仕事でも—そしてそれで私はただ仕事を得るだけを最小にしたくありません。しかし、可能であれば、一歩下がって、この仕事が長期的にあなたのキャリアにどのように影響するかを考えてください。仕事に「はい」と言うことは、他の12人に「いいえ」と言うことです。「はい」と言うことで、大きな機会費用を支払うことになります。

つまり、これが最初に覚えておくべきことです。これは一方向のパワーダイナミクスではありません。時々それのように感じるかもしれません、しかしあなたはここでいくらかのコントロールを持っています、そしてあなたはオプションを持っています。これは力を与えています。

面接の種類

[OK]を、ので、我々はされても、私たちはその情報で何をしますか、私たちはインタビュープロセスにと対話する人々に基づいて会社を評価しますか?

さて、技術面接にはいくつかの異なるタイプがあります。これらの面接タイプは、会社の考え方とそこで働くことがどのようなものかについて多くのことを教えてくれます。私はこのようにさまざまなタイプを分類します:

  • ホワイトボード
  • コードチャレンジ(コンピュータサイエンスの質問またはアルゴリズム)
  • コードチャレンジ(合理的なコーディングの問題)
  • 持ち帰りプロジェクト

恐ろしいホワイトボード

テクノロジー業界が採用した最初の面接演習のいくつかは、ホワイトボード演習でした。タスクが与えられ、ホワイトボードにコードを書くように求められます。一般的に、このアプローチは今日のテクノロジー業界では軽視され、廃止されていますが、この手法を採用している企業はまだたくさんあります。

ホワイトボードでのコーディング自体が悪いというわけではありませんが、ホワイトボードは、私たち毎日コンピューターで作業するプログラマーとして実際に行っている作業から遠く離れています。ホワイトボードは、書き込みや編集が不器用で、フィードバックもありません。オートコンプリートや構文の強調表示はなく、Googleにアクセスして標準ライブラリの参照を検索することはできません。

その上、ホワイトボードの面接を採用している多くの場所では、率直に言って、プログラミングの仕事の99%にとって価値のない、特定の面接の質問をします。これらは恐ろしいコンピュータサイエンスアルゴリズムです:二分木を逆にする、グラフ内の最短経路を見つけるなど。

これらの質問の問題は、プログラマーとして実際に出てこないことです。アマゾンやフェイスブックでインタビューしているなら、確かに、彼らはそこに何らかの価値があるかもしれませんが、大多数の人々は彼らのキャリアの中でこの問題に直面することは決してないでしょう。その場合、その機能をすでに実装しているパッケージまたはライブラリを使用するだけです。

では、ホワイトボードについて何ができるでしょうか。さて、これが私がすることです:最善を尽くし、以下に概説するヒントとコツを使用し、この面接の実践が会社内のより大きな精神問題の症状であるかどうかを真剣に評価します。

コードの課題

ホワイトボードをかわすのに十分な運が良ければ、ほとんどの場所で何らかのコードチャレンジを行うように求められます(おそらくそうすべきです)。繰り返しますが、これは一方向のパワーダイナミックのように見えるかもしれませんが、このコードチャレンジは実際にはあなたにとって良いことです。これはあなたが輝いてあなたの技術的能力を示すようになる場所です、そして私の経験では、これは仕事のランクと支払いに関してあなたの交渉力に劇的に影響します。

特定のヒントに入る前に、ホワイトボードをかわしたからといって、ここでコンピュータサイエンスアルゴリズムの質問がまだ得られないという意味ではないことにも注意する必要があります。コンピュータだけです。その場合は、深呼吸して、以下のヒントとコツを使用してください。あなたはそれを乗り越えるでしょう。

幸運にもホワイトボードCSの質問をかわすことができたので、おそらく妥当なコーディングの課題が提示されました。私にとって、これらは次のような質問です。

セント数(USD)を100以下の整数として受け取り、それを表すために必要な最小量のコインを出力する関数を記述します。

50 => 2四半期

11 => 1ダイムと1ペニー

7 => 1ニッケルと2ペニー

CSの質問のように見えますが、それほど悪くはない質問も受け取りました。たとえば、「二重リンクリストを実装する」などです。一見、これは「二重リンクリスト」の部分によるCSの問題のように見えますが、インタビュアーが実際に望んでいたのは、二重リンクリストと同じ動作を実装するコードでした。私はポインターとアドレス指定を使用していませんでした。メモリ内のオブジェクト—同じ動作を模倣するだけです。その場合、それはかなり単純な挑戦であることになりました。

そして、それは私の最初のヒントに私をもたらします:

ヒント1:明確な質問をする

二重リンクリストチャレンジでは、空白のRubyファイル(Rubyの仕事のためにインタビューしていた)と空白のテストスイートが与えられました。このようなもの:

class DoublyLinkedList end 

(Rubyに慣れていない場合でも、心配しないでください。ここのコードは簡単に理解できます。ここでは、全体的なポイントを説明します。)

それで、二重にリンクされたリストえ?多分あなたはそれが何であるかを知っているか、多分あなたは知らない。そうでない場合:質問をします。これは避けるべき最初の落とし穴です。問題や彼らが何を求めているのか理解できない場合は、理解するまで質問を続けてください。

インタビュイーが間違ったうさぎの道を下り、インタビュアーがただ彼らを許したのを見たことがありますが、その間ずっと静かに彼らを失敗させようとしています。私はこの慣行に同意しませんが、あなたが正しい問題に取り組んでいることを確認してください。

私は二重リンクリストは、ポインタがあるリストを意味知っていたので、私は、コンピュータサイエンスの背景から来るのかheadtailそのにもポイントをノード、各ノードをnextしてpreviousノード。

それを知っていたのに、どうしたの?私はそれを大声で言い、それが正しいかどうか尋ねました。どうしようかと思っていたのに、絶対にやった。

問題を理解したと思ったら、インタビュアーがあなたを訂正または指導できるように、インタビュアーの理解を言い直してください。

次に私がしたことは、別の質問をすることでした「ノードに配列を使用できますか?」そして、私は次のようなものを入力しました:

class DoublyLinkedList def initialize @nodes = [] end end 

(Rubyに慣れていない場合、これは初期化子またはコンストラクターであり、@nodessetという新しい変数を空の配列に設定します。)

しかし、インタビュアーは私に言った、いや、私はそれをすることができなかった-それは理にかなっている。配列を使用した場合、ノード間に偽の「ポインター」を作成するという演習の目的全体が無効になります。

そして、男の子、私が尋ねてよかったです。インタビュアーが私に配列を使用させて、それから私を失敗させるというチャンスを逃したくありませんでした。

したがって、アレイはありません。では、今何をしますか?ヒント2は次のとおりです。

ヒント2:ハードコードされた->ダム->より良い

コーディングの課題に直面した場合は、次の順序で問題を処理してください:ハードコーディング->ダム->より良い->さらに良い(時間が許せば)。

インタビューを受けたり、他の開発者にインタビューしたりした私の経験では、ほとんどの人が一度にやりすぎを試みていることがわかりました。

一度にやりすぎると、間違いを犯しやすくなります(InterviewBrain™があるためにキャッチできません)。したがって、単純なものから始めて(実際に可能な限り単純なもの)、ハードコーディングして、上に向かって進んでいきます。

だから私は空白のRubyクラスを持っています、どうすれば前進するために何かをハードコーディングできますか?空のテストスイートを調べたところ、headリストの最初のノードを返す呼び出された関数があることがわかったので、それを試してみましょう。

class DoublyLinkedList def head 'A' end end 

head関数を作成し、大文字の「A」を文字列としてハードコーディングして、そのテストを実行しました。合格しました。

これはとても簡単ですか?それはあまりにも明白ですか?はい!しかし、このコードは2つの非常に重要なことを行います。

  • これにより、テストを実行して、セットアップが機能することをテストできます(ばかげたエラーや構文エラーを排除します)
  • それは私に素早い勝利をもたらします—それは私の自信を高めます

私が見たインタビューの数は数え切れないほどあります。誰かが最初に小さな間違いを犯し、慌てて、その後、インタビューの大部分を、問題を回復して修正するために費やします。

自信を持ってクイックウィンの価値を過小評価しないでください。小さな勝利を積み上げることは、面接を通してあなたを推進します。

わかりました'A'。ハードコードされた文字列があります。では、どうすればそれをばかげた解決策にすることができるでしょうか。さて、その文字「A」をハッシュ(またはマップ)にするのはどうですか?

class DoublyLinkedList def head { value: 'A' } end end 

それは少し良いです。これで、1文字の文字列の代わりに、「ノード」がvalueプロパティを持つハッシュとして表されます。ハードコードからダムに移行しました。では、どうすればそれを改善できるでしょうか。さて、headリストにポインタを導入してみませんか?

class DoublyLinkedList def initialize @head = { value: 'A' } end def head @head end end 

ここで何を変更しましたか?ここでは、初期化子を追加し直して、という新しい変数を作成し、@headその新しい変数をhead関数で使用します。これは実際のコードのように見え始めています。

今、このアプローチは本当にばかげているように見えるかもしれませんが、私はあなたに約束します、それはうまくいきますこれらの変更はそれぞれ、数秒の小さな反復コーディングで行われ、積み重ねられて、短時間で機能する実装が作成されます。

このアプローチが潜在的なインタビュアーにとって奇妙に思える場合は、次のヒントを次に示します。これは非常に重要です。

ヒント3:話す。大声で。

コーディングの課題を実行している間は、大声で話し合う必要があります

あなたが考えていることすべて、つまりすべてを言いなさい。

(まあ、プログラミング関連のすべて。)

これが重要です。正しい解決策を見つけることは重要ですが、それ以上に重要でないにしても、思考プロセスを示すことも同様に重要ですインタビュアーは、あなたがどのように考えているか、つまりどのように問題を解決しているかを知りたがっています。あなたが大声で考えているすべてを共有することによってこれを行うことができます。

すべての面接官は、ある時点で面接対象者になりました。彼らは、InterviewBrain™について知っており、面接では単純なことでも困難になる可能性があることを知っています。優れたインタビュアーは、あなたが100%正しい解決策を得ることを気にしません。彼らは、あなたが優れた批判的思考能力持っていることを知りたいだけですこれらの内部の考えを目に見えるようにする唯一の方法は、それらを大声で言うことです。

これまでにこれを行ったことがない場合は、面接を釘付けにするために不可欠であるため、練習することをお勧めします。

いくつかの実用的な例を示すために、インタビューを受けるたびに私が言うことをいくつか示します。

「わかりました。この値をハードコーディングして、セットアップが機能することを確認しましょう。」「最初にこれのダムバージョンを取得して改善しましょう。」「今はこのようにします。時間があれば戻ってきます。 「わかりました。配列を取り込んでXを実行し、。を返す関数が必要です。」

いくつかのシナリオでは、これらのインタビューはペアプログラミングセッションのように感じ始めることがあります。

わかりました、それで私たちは物事を大声で言っています。しかし、時々私たちは間違いを犯したり、行き詰まったりします。私たちは思考プロセスを大声で話してきましたが、今はシフトして潜在的な問題やエラーを調査する必要があるかもしれません。

これに関する重要なヒントは次のとおりです。

ヒント4:論理的な流れにとどまる

今、私は認めます:これは時々難しいかもしれません。

面接中にコードに問題やエラーがある場合、脳は何が悪いのかを必死に理解したいと思っていますが、コードや思考プロセスをスラッシングし始めるほど必死になってはいけません。

インタビュアーがあなたが問題をどのように分解するかを見たいのと同じように、彼らあなたが問題をどのようにデバッグするかも見たいと思っています。これはあなたの思考過程を説明するのと同じくらい重要です。論理的な流れにとどまり、コードやアイデアをスラッシングしないように最善を尽くしてください。

うまくいっていれば

したがって、課題は順調に進んでおり、問題とすべての簡単なものをノックアウトしています。

今何?どのようにして合格から粉砕に移行しますか?

これは面接の非常に重要な部分です。これは、仕事のレベルと報酬の交渉のためにレバレッジの大部分を得る場所だからです。そして、ヒントは次のとおりです。

ヒント5:知っていることを示す

あなたは挑戦に取り組んでいて、大声で話していて、うまくやっています。あなたが探す必要がある次のことはあなたの知識と専門知識示す機会です。

これは、コード内でメールを送信する可能性のある場所ですか?代わりにバックグラウンドワーカーで実行する必要があることに言及します(おそらく実装する必要はありません)。

モデルの検証ロジックに取り組んでいますか?データの整合性を確保するためにデータベースの制約を追加する方法についても話し合います。どのインデックスを追加しますか?ダウンタイムを防ぐために、移行をどのように展開しますか?

ハードコードされた->ダム->より良い解決策を入手したら、より多くの時間を与えてそれをリファクタリングする方法について話します。このためのモジュールを作成しますか?サービスオブジェクトはどうですか?このロジックの一部をバックグラウンドジョブに配置するのはどうですか?トレードオフについて話し合います。

なぜこれがそれほど重要なのですか?

ほとんどの面接の質問は、最小公分母、つまり仕事の非常に基本的な要件を対象としています。チャレンジや質問自体は、通常、誰かのスキルのトップエンドテストするようには設計されていません。面接はおそらくあなたから情報を引き出すつもりはないので、あなたはその情報を提供しなければなりません。

したがって、思考プロセスについて話しているときに、実際のアプリケーションまたはコードベースに組み込むすべてのことについて言及し、それらについて話し合います。

追加のヒントとコツはバッグをつかみます

だから、それはあなたがあなたのインタビューにアプローチし、あなたが与えられたどんな挑戦にも取り組むべき方法です。

わずかな利点のために時々採用できるいくつかの追加のトリックがあります。

秘訣#1:一般的な問題を知る

インタビュー(特にホワイトボード)で頻繁に現れる一般的な問題がいくつかあります。これらの問題は、テストで使用されることがわかっている質問のようなものであるため、これらの問題に精通している必要があります。

主なものの2つは、FizzBu​​zzとフィボナッチ数列の解決です(これらを知っていることを確認してください)。

今警告の言葉:あなたは面接で記憶された解決策を決して置きたくないです。それはうまくいかないだけです(そして私はそれが起こるのを目撃しました)。ただし、ソリューションに精通し、最初から再作成できるようにする必要があります。

ですから、面接の質問準備本を使用してください。ただし、解決策を理解し、説明し、最初から再作成できることを確認してください。記憶された答えはあなたをここのどこにも連れて行かないでしょう。

秘訣#2:通常はドキュメントを見ても大丈夫です

私が行った、またはその一部であったすべてのインタビューで、標準ライブラリまたはパッケージのドキュメントを調べても誰も気にしませんでした。インタビュアーはあなたが答えを探すことに問題があります(それで私はStackOverflowを避けます)が、参照を調べることは通常公正なゲームです。疑問がある場合は、ヒント1を参照して、説明求めてください。

秘訣#3:視覚的な手がかりに注意する

これはおそらく私のお気に入りのヒント/トリックです。それは最も便利ではありませんが、ちょっと楽しいです。リモートで行ったインタビューの1つで、画面共有プログラムを使用していて、画面の右上にインタビュアーの顔が見えました。

インタビュアーが彼らの頭うなずいていることをコーディングしているときに、私の目の隅から気づきましたあはは!私が正しい方向に進んでいたことを知るためのちょっとした視覚的な手がかり。

繰り返しますが、それほど多くはありませんが、役立つ可能性があります。:)

秘訣4:リモートの場合は、適切な設定を行う

リモートであると言えば、リモートである場合は、可能な限り最良のセットアップを行うようにしてください。これは、カメラがオンになっていること(可能であれば、カメラをまっすぐ見ているセットアップ)、優れたインターネット、電源に接続されたコンピューター、静かな部屋、近くのコップ一杯の水などを意味します。

これらのことは面接の結果に影響を与えるべきではありませんが、面接官を苛立たせたり、インターネットやノイズの問題から自分に余分なストレスを与える必要はありません。

秘訣#5:人懐っこく!

あなたのための私の最後のトリックは、人柄をよくすることです。

面接では、一緒に働きたいと思う人になりましょう。彼らにあなたの最高の自己を見せてください。

面接は恐ろしいものになる可能性があり、開発者は一般的に静かで控えめな人ですが、やり取りする人に「ねえ、私は楽しくて素敵な人です」と示す必要があります

私はあなたにあなたではない誰かになるように求めているのではありません。しかし、いつも人々にインタビューしている私の親しい友人の一人によると、あなたは「海の生き物」になりたくないのです。

ボーナストリック#6:他のすべての面接準備を行います(必要な場合)

準備不足を感じている場合、またはこれが初めての技術面接である場合は、快適になるまで準備作業を行ってください。

「世界で闘うプログラミング力」のような本を読んだり、HackerRankでアルゴリズムやパズルを練習したりできます。

インタビューについては、DeveloperNewsの他のすばらしい投稿を読んでください。

フルスタックの役割について面接している場合は、テストスイートを使用して新しいプロジェクトまたはテストファイルを最初からセットアップする準備をしてください。

会社を調べて、会社や日々の仕事などについての素晴らしい質問に備えましょう。

結局のところ、それは単なるインタビューです。

結局、それはそれが何であるかです。

あなたはあなたが実行する方法を実行します。

面接を受ける人から面接を受けます。

彼らの面接プロセスは彼らの面接プロセスになります。

多分あなたは休みの日を過ごしました—多分インタビュアーは休みの日を過ごしました。

その後、恥ずかしい思いをしたり、敗北したりした場合は、深呼吸して手放してください。あなたのトカゲの頭脳があなたを圧迫させないでください。悪いインタビューは世界の終わりではありません。あなたのキャリアは台無しにされません、あなたの評判は台無しにされません、そしてあなたの人生は台無しにされません。

ただの面接です。それから学び、適応し、次回はより良くなります。

緊張しても大丈夫

ほとんどの人(私も含めて)は、インタビュー、講演、プレゼンテーションなどの前に緊張します。

私は以前、緊張を悪いこと、つまり私が望まなかったことだと考えていました。そして、何度も「緊張しないでください」と自分に言い聞かせても、何を推測しますか。それは私をもっと緊張させただけです!

私は神経をどう見るかを再考することを学びました。神経質は、戦いの準備をしている私の体です—その主要な戦いまたは逃走反応。

しかし、前に言ったように、これは単なるインタビューです。面接室で私に忍び寄るトラはいません。この主要な応答は必要ありません。

私は緊張を良いことと見なすために自分自身を再訓練し始めましたそれは私の体と感覚が高まっていることを意味し、私が集めることができる最高のパフォーマンスを提供することができます。

だから、神経を受け入れます。彼らはあなたが最善を尽くす準備をしているだけです。

面接はスキルです

結局、面接はスキルです。習得するには、ある程度の勉強と多くの練習が必要です。

ですから、期待したとおりに行動しなくても、自分を殴らないでください。学び続け、練習し続けてください。そこにたどり着きます!

ご質問やご意見がございましたら、Twitterでお気軽にご連絡ください。開発キャリアの準備方法について詳しくは、ブログにこのようなものを書いています。

読んでくれてありがとう!

ジョン