見出し画像

コーディングインタビューに挑むアプローチを理解する

コーディングインタビューに挑むアプローチ

本記事では、コーディングインタビューに挑むアプローチに関して解説を進めていきます。
「何も知らない状態」で、コーディング問題に挑んでしまうと、とにかく緊張が強く、まともに問題を解く事すらままならない精神状態でコーディングインタビューに挑んでしまうことになり、大きな機会損失に繋がってしまいます。

勿論、コーディングインタビューの攻略のためには「慣れ」が必要で、本記事に書いているステップを正しく実行しようとしても、なかなか上手くいかないものです。
弊社では、そういった方へのご相談も承っておりますので、そちらに関してご相談等、ございましたらinfo@mdiua.comまで、お気軽にご連絡下さい。

それでは、早速コーディングインタビューのアプローチについて解説を進めて行きます。

今回の課題

コーディングインタビューのアプローチの開設にあたって、「具体的な問題」があったほうが解説がしやすいので、以下の問題を解いてみる事を仮定し解説を進めて参ります。
なお、今後、コーディングのサンプルでお見せする使用言語は、Pythonで統一します。

引数として、リストmと、整数nが与えられます。リストの中の2つの要素を足し合わせて、値がnになる組み合わせを網羅する関数を実装して下さい

例)
入力:m = [1,3,4,6,7,2,5] n=7
出力:(1,6), (3,4), (5,2)

さて、こちらの問題に関しては、Pythonの基礎を習得されている方には、割と優しい内容ではないでしょうか?
すぐに回答が思い浮かぶ方も多いと思いますが、すぐにコードを書き始めてしまってはいけません。
まず事前に問題について、曖昧な点を確認しておきましょう

step1 : 課題の曖昧な点の確認

上記の課題が出された際、明確になっていない点は
「関数を実装しろと言われているものの、その関数名の指定が無いこと」「出力の値に関する指定が無い事」かと思います。
この状態でコードを書いていくと、人によっては「2つの数字の組み合わせを関数中でプリントする人」もいれば、「それらをタプル形式でリストに格納して戻り値として返却する人」もいるかと思います。

面接官によっては、その部分は候補者の判断に委ねるという形で、あまり重視しない人もいます。逆に、候補者がこういった確認を「きっちり行う事ができるかどうか」を、厳しく見極めている面接官もいます。
こういった仕様の確認は、実プロジェクトでも大事な要素です。まずは課題の曖昧性を解消しておきましょう。

step2 : アプローチの説明

コーディングインタビューは、自分が試されているテストと考えてしまうと、途端に緊張し、頭が真っ白になってしまうものです。
まずはこの緊張と向き合って、平常心を取り戻す事が何よりも大事なのです。
そのために有効なのが、「今自分はペアプログラミングを行っていて、コーディングインタビューをしているのでは無い」と、気持ちを切り替える事です。

つまり、ペアプログラミングであれば、何かのコードを実装する際に、まずは「どのようなアプローチで実装を進めるか」等について、パートナーと実装指針を話し合い、コーディングを進めて行くはず。それと同じ事を、面接官としていくイメージです。
中には「自分で考えろ」と突き放してくる面接官もいるかと思いますが、面接官にとっても、「候補者のコミュニケーションスキル」を測定する事も大事な着眼点なので、実装前にアプローチを面接官に共有しておく事は非常に有効です。

それでは、上の課題の例に関して、どのようにアプローチを面接官に伝えていくのか?以下に例を説明します。

(候補者)問題の趣旨は理解できました。mリスト中から2つの値を足し合わせて、nになる値をプリントするコードを実装しますね

(面接官)はい、お願いします

(候補者)まず、2つの値を足し合わせる方法ですが、mリストをforループで徘徊して、さらにその内側にforループを作成し、それぞれの値を足し合わせればいいかと思うので、そのように実装を進めますね

(面接官)なるほど

(候補者)内側のループに関しては、外側と同じ値を加算してしまってはいけないので、外側のループのインデックスの1つ先からループを開始します。

こういった形で、課題の意識合わせと実装を進めて行くにあたって、「ポイント(着眼点)がずれていないか」等を、面接官とペアプログラミングを進めていくようなイメージで取り組んで行きましょう。
認識のズレや齟齬を防ぐと同時に、緊張も和らいでいくと思います。

step3 : コードの実装

いよいよ、コードの実装に進んでいきます。
組み立てたアプローチを実装に落としていく必要がありますが、ポイントは「最初から完璧に動くコードを目指さず、それを面接官に断った上で、ラフにコードを書いていく事」をおすすめします。
動作検証に関しては、後程、書いたコードを見直していく事で精査ができていくので、必ずその旨を面接官に伝えておきましょう。

上記のアプローチに従って、コードを実装すると以下のようになるかと思います。

fig1. 課題のコード実装

当然、コードを実装した後は、面接官に対して解説を行う必要があります。この場合は、アプローチ通りの単純なコードなため、特段説明に困ることは無いと思いますが、アプローチを忠実に実装したコードである事を面接官に理解してもらう事が大切です。

step4 : コードの計算量の確認

GAFAMのコーディングインタビューでは、ただ「コードが動けばいい」というような内容では、あまり評価されません。コードを実装した後に、そのコードの計算量についても面接官に共有しておくと良いです。
計算量の話は、別記事で詳しく解説を行う予定ですが、上記のコードの例では、forループを2回回っているので、O(N²)となります。

また、コードの計算量を見積もる事で、O(N²)のコードはO(N)に、等計算量を減らす事が可能な場合もあり、そこも合わせて言及し、コードを変更する事で面接官にアピールを行う事もできるので、コードの計算量に関しては必ず押さえるようにしてください。

step5 : コードのテスト

場合によっては、step4とstep5の順番が前後する事もあるかもしれないですが、ただコードを実装しただけでは、このコードが正しいかどうかもわからないので、必ずテストを実行し結果を確認しましょう。テスト実施にあたって必要な項目は以下のようなものがあります。

  • 正常系テスト:今回の場合だと、m = [1,3,4,6,7,2,5] n=7 を入力した際に、(1,6), (3,4), (5,2)がプリントされるか等、最もオーソドックスな内容になります

  • 正常系テスト:m=[1,2,3] n= 10 のように、どの組み合わせでも、和がnにならない場合は、プリントがされないかの確認テスト

  • 異常系テスト:入力に、空のリストや、None等、想定にない型を入力した際のプログラムの挙動を確認する

この位の挙動は最低確認しておきましょう。
因みに、テスターのインタビューの場合は、このテスト部分にフォーカスを当てたインタビューになる事が多く、上記の正常系、異常系以外にも、パフォーマンスの観点や、セキュリティの観点でのテストの視点をもっているか等も審査基準に入る場合があります。

まとめ

本記事では簡単にコーディングインタビューに挑むためのアプローチを紹介させて頂きました。単に機械的にコードを書く、という発想から、いかに面接官と強調してペアプログラミングを行うか、、、という方針転換が有効かと思います。
面接官によっては、全くこのアプローチを受け付けてくれない人もいるでしょうが・・・

こちらで紹介したアプローチを参考にし、是非コーディングインタビューに慣れていって下さい


この記事が気に入ったらサポートをしてみませんか?