見出し画像

【2024年度版】ソフトウェアエンジニアのための面接対策マニュアル

このマニュアルの目的

このマニュアルではソフトウェアエンジニアが転職活動をして面接を突破し、給料を上げる方法を指南します。転職をしたことがない社会人やこれから社会に出る大学生も対象にしています。転職経験がない人や学生は企業の採用プロセスをよく知らないと思うので採用の裏事情も交えながら面接対策法を一から解説します。このマニュアルをよく読んで、きちんと対策をとれば誰でも一流企業に入ることができると私は確信しています
 日本ではあまり知られていませんが、ソフトウェアエンジニアのための面接対策法は確立しており、英語で検索をすると沢山の記事が見つかります。実はIT企業が採用している採用プロセスはどの企業でもほとんど同じです。あなたがどれだけ優秀で業務経験が豊かでも面接の中でそのことを会社にアピールできなければ落ちてしまいます。また採用は他の候補者との競争という側面もあり、英語圏の話者は日本語話者に比べて日本語話者は不利です。単に英語が苦手というだけではなく、英語圏で知れ渡っている面接対策法を知らない確率が高いからです。
 私は自身が面接を受けたことも沢山ありますし、これまで面接官として沢山のコーディングインタビューもしてきました。その中で強く感じるのは面接対策をきちんとしてきた人とそうでない人の差は歴然としていて、対策をしていない人には勝ち目がないということです。直感に反しますが、面接というのは大学入試のように出題範囲が決まっています。出題範囲が決まっているということは対策のしようがあり、対策をするだけで採用される確率が大幅に上がるということです
 決してなんの対策もせずに面接に行かないでください。一流大学を卒業していようが、今の会社でどれだけ評価されていようが落とされます。これまでの努力を水の泡にしないで下さい。このマニュアルを読んで、面接というゲームのルールを理解して、十分に対策に時間をとって、それから面接に挑みましょう。そうするだけであなたは他の候補者に比べて圧倒的に有利に戦うことができ、面接に受かって来年の収入も大幅に増やせます。


私について

私は日本の大学を卒業して博士号を取り、ソフトウェアエンジニアとして働いてきました。大学時代の専門はコンピュータサイエンスではない理系分野でした。就職してから社会人として働きながらソフトウェア開発手法の勉強をして、同時並行でコンピュータサイエンスの勉強も独学でしました。転職歴は5回あり、従業員10名の小さなスタートアップから世界規模の大企業まで、様々なスケールの会社で働いてきました。転職をするなかで沢山のオファーレターを頂き、何十もの不採用通知ももらいました。採用する側として面接をして、大勢を不採用にした経験もあります。英語は苦手で、コンピュータサイエンスの知識もない不利な状況から社会人生活をスタートしましたが、一流企業で働くことができており、収入も同世代の人の中ではトップクラスに高いです。それは面接が得意で、面接というゲームをハックできたことが大きな一因です。

ゲームのルールを理解する

繰り返しになりますが、どの企業でもほとんど同じ採用プロセスを取っています。外資系だろうが日系だろうが、大企業だろうがスタートアップだろうが関係ありません。コーディング面接で出される問題も範囲が決まっており、口頭面接で聞かれる質問も決まったことが聞かれます。無数にある企業が同じ面接プロセスを取っているというのは直感に反するように感じると思いますが、これまでの経験からして間違いありません。英語圏では面接対策法はよく研究されており、”coding interview” とか “cracking software engineer interview” などの単語でgoogleで検索すれば対策マニュアルが沢山見つかると思います。日本人は変に真面目なのか、馬鹿正直なのか、仕事は真面目にするのですが面接対策をおろそかにする傾向があるように感じます。面接で出される問題の範囲が決まっているということは対策をすることで誰でも高得点を取れるということです。かねがね思うのですが、面接というのは大学入試にそっくりです。試験科目と出題範囲が決まっていて、勉強をすれば誰でも解けるようにできています。時間をかけて対策をすれば誰でも解けるということは努力が報われるということでもあり、コーディング課題が解けたかで合否が決まるというのは公平であるということです。
 面接対策の第一歩は出題科目と出題範囲を把握することから始まります。全ての出題科目を勉強することが大事です。アルゴリズムの勉強だけをしてコーディング面接に受かっても、その後に待ち構えているシステム設計面接の対策をしていなければ落ちてしまいます。面接の最終ステップで給与交渉があります。給与交渉の仕方を知らなければせっかく面接に受かっても給与は上がらないのです。

採用プロセスを理解する

採用は大まかはプロセスは以下のとおりです。

  1. 企業がポジションをオープンする。

  2. 履歴書 (CV) を提出する。

  3. 企業が履歴書のスクリーニングを行う。

  4. 一週間ほどかけて自宅でお持ち帰り問題 (take home challenge) を解く。

  5. コーディング面接を受ける。

  6. システム設計面接を受ける。

  7. 行動面接を受ける。

  8. 給与交渉をする。

  9. 入社時期を伝えてオファーレターをもらう。

企業によって採用プロセスは少しずつ違っており、これ以外の種類の面接が行われることもあります。例えばコミュニケーション能力を見るために他チームと技術的な会話をしてもらったり、受けている職種の専門知識を問う問題を出されたり、チームの人とランチや飲み会をしてご飯を奢ってもらったり、と様々です。お持ち帰り問題(take home challenge )が省かれることもあります。まずはこのマニュアルや他の人の体験記を読んで大まかな流れを理解しましょう。受ける企業が決まったらその企業の採用プロセスとオファーレターを貰うまでの典型的な時間を調べましょう。企業ごとの採用プロセスは glassdoor という転職サイトを見ると分かります。コーディング面接やシステム設計面接で過去に出された問題がリークされていたり、いくらでオファーをもらったかが書かれていることがあります。知っていると非常に有利に面接を進めることができるので必ずチェックしてから応募しましょう。glassdoor でも給与が分かりますが、通常国ごとに給与体系は違うので glassdoor では見づらいと感じます。日本の企業の給与水準を調べるにはopensalary や openwork の方が便利です。オファーレターをもらって初めてその会社の給与水準の低さを知って愕然として、入社を辞退することになれば面接にかけた時間は無駄になってしまします。最初に給与水準を調べて、転職する価値があるかを考えましょう。転職サイトは有料のこともありますが、お金をかける価値はあります。転職して年収が何百万も上がれば簡単にもとは取れます。ケチらないで課金しましょう。
 ビズリーチのような転職サイトに履歴書を登録することをおすすめします。企業の採用担当者やエージェント(人材紹介会社)からメールが来て、面接をしたいと言われます。エージェントは活用できれば様々な情報を引き出せ、転職活動を有利に進めることができます。エージェントは良い候補者を企業に紹介することで紹介手数料を稼ぎます。エージェントの紹介した候補者が採用されると通常彼らは転職者の年収の30%を手数料として企業から貰います。エージェントは今採用をしている企業を多数知っており、最適な候補者を最適な企業に紹介することが役割です。良く言えばお見合いの仲人、悪く言えば女衒です。エージェントの目的は手数料として貰う転職者の30%の年収です。手数料をたくさん稼ぐためにできるだけ高い給与を出してくれる会社に候補者を紹介します。このビジネスモデルを理解した上でエージェントと面談をして転職市場の状況を聞けば応募する企業の候補はぐっと広がるはずです。

他の人の体験記

転職者の体験談を読むと面接のイメージがついて参考になるでしょう。googleで検索すれば沢山見つかります。以下は体験談の例です。

おすすめの転職サイト

  • glassdoor
    給与の他に面接回数や面接で聞かれたことが書かれています。非常に貴重な情報源ですのでよく読みましょう。オファーが出されるまでの時間も書かれています。

  • opensalary
    日本企業の給与を知るにはこのサイトがおすすめです。

  • ビズリーチ
    登録して履歴書を公開するとエージェントや企業から面談のオファーが来ます。ビズリーチの他にマイナビやdodaなど、類似のサービスは多数あります。履歴書をまともに読まずに絨毯爆撃のようにコピペメールが飛んできますが、ビズリーチが比較的まともだと私は感じました。

  • Linkedin
    ビジネス版Facebook のような雰囲気のSNSです。友人や前職の知り合いと連絡を取るのに使えるほか、企業からのお誘いのメールも来ます。知り合い経由の採用をリファラル採用といいますが、企業側からすると変な人を採用してしまうリスクが減らせるため、採用される確率が上がります。ぜひ活用しましょう。

履歴書の書き方

履歴書 (CV) は非常に大事です。間違っても30分でなぐり書きして提出する様はことはしないで下さい。
 
第一に、履歴書のスクリーニングで落とされたら面接に進めず、実力を示す機会すら与えられません。どれだけ立派な経験があっても履歴書でアピールできなければ履歴書はゴミ箱行き、応募者には冷徹に不採用メールが送られます。面接をする側になると分かるのですが、毎月莫大な数の履歴書が送られてきます。通常の業務をしながら何十通もの履歴書を読まねばならず、一通の履歴書にかける時間は私の場合1分以下です。候補者が履歴書を提出すると人事の採用システムに履歴書がアップロードされ、各チームの面接官に見るように通知が飛びます。採用システム上で履歴書を1分以下で読んで、面接に進めるか落とすかのボタンをクリックします。落としたら候補者にはシステムからメールが自動で送信されて終了です。残酷に感じるかもしれませんが、膨大な量の履歴書をさばかないといけないので仕方がないのです。さらっと眺めただけで、あなたのこれまでの業務や持っている知識がチームの求めているものにぴったりと合致し、面接に進めたいと思ってもらわないといけないのです。
 第二に履歴書に書かれた内容は面接で質問されるため、履歴書は大事です。面接ではこれまでの業務経験や知識を聞かれます。履歴書に趣味がサッカーであるとかスペイン語検定1級であるとかを書いても何の有利にもなりません。業務と関係がないことを書いても意味がないことは少し考えれば分かると思うのですが、こういうことを書く人は多いです。数学の試験の答案用紙にサッカーの話を書いてもゼロ点なのと同じです。面接の時にサッカーの話は聞かれません。履歴書に書いたことは面接で聞かれる可能性が高いため、アピールしたい業務経験を書きましょう。面接官は何を聞けばいいか困るのですが、履歴書をざっと眺めて質問することを捻り出します。例えば履歴書に大規模システムをリプレイスした経験を書いておき、それを質問してもらえればチャンス到来です。用意しておいた回答をスラスラと読み上げて、経験をアピールすることができます。サッカーの話を聞かれても(聞かれることはないでしょうが)、合格確率は上がりません。面接で聞かれたいことを履歴書には書きましょう。
 履歴書の書き方の本はたくさん出ていますので一般的な話は他書に譲ります。ここで強調したいのは履歴書は応募ごとに書き直さないといけないということです。例えば5つの企業に応募するなら履歴書は5回書かないと駄目です。履歴書を使い回してはいけないです。企業ごとに履歴書をチューニングして、あなたがぴったりの人材だと思わせないといけません。具体例を上げると、今応募しているポジションがフロントエンドエンジニアで開発言語はTypescript, ライブラリはReact, クラウドサービスはAWSを使っているチームのものだとします。あなたがフロントエンドエンジニアならこれまでに様々な言語やフレームワークを使ってきたと思いますが、履歴書ではTypescript, React, AWS の使用経験を強調して書きます。採用する側が履歴書をスクリーニングするときにこれらの単語だけ輝いているかのように目に止まります。この単語が使われているだけでぴったりの人材だと思われる確率が大幅に高まります。企業ごとに履歴書をチューニングしろと言っているのは嘘をつけと言っているのではありません。チームが求めているテクノロジーを知っていることを強調して、チームの使っていないテクノロジーの話を書くなと言っているのです。フロントエンドエンジニアのポジションに応募しているのにデータサイエンティストとして働いていたときに使っていたライブラリの使用経験を書いても有利になりません。
 履歴書は時間をかけて何回も書き直しましょう。友だちにとレビューし合うのもいいです。履歴書を書くのに2週間かけるのは正解ですが、30分しかかけないのは大きな間違いです。時間をかける価値は絶対にあります。

コーディング面接対策 (coding interview)

多くのIT企業ではコーディング面接を課されます。コーディング面接対策には数ヶ月かかるため、応募してから勉強をしても間に合いません。面接対策で一番時間がかかるのはコーディング面接対策です。私の経験では500問以上を解いておかなければなりません。時間の目安としては4ヶ月間、300時間程度が必要でしょう。競技プログラミングに出ている人を除いて殆どの人はこんなに沢山の時間をかけて勉強をしないといけないのです。一番対策が大変なのはコーディング面接ですが、一番対策が簡単なのもこの面接です。なぜなら出題範囲が決まっているからです。コーディング面接の対策法は大勢の人が研究をして本も多数出版されています。
 面接では15分以内に解ける問題しか出されないため、実装に時間がかかる複雑なアルゴリズムが出されることはありません。ほぼ間違いなく30行以下で実装できる問題が出されます。候補者は問題を出されて何も見ずに実装をします。面接官は書かれたコードを実行することなく、頭の中で実行してデバッグして誤りを指摘します。複雑で実装に時間がかかるアルゴリズムは面接官も紙とペンだけではデバッグできないため、そのような問題が出されることはないのです。コーディング面接は基本的に努力をすれば誰でも解ける問題しか出されません。頑張って対策をして満点を狙いましょう。
 対策は、1. アルゴリズムの基礎を勉強する、 2. オンラインジャッジシステムを使って500問程度解く、 3. 模擬面接を受ける の3ステップでやります。まず最初にやるのはアルゴリズムの基礎の勉強です。これは大学の教科書に書かれているような計算量とは何か、グラフとは何か、スタックとは何か、といったアルゴリズムとデータ構造の勉強です。大学の教科書を読んでもいいのですが、私のおすすめはオンラインジャッジシステムを使って練習問題を解きながら勉強ができる本です。読むだけでは頭に入ってきづらいため、実際に手を動かしながらアルゴリズムやデータ構造は勉強をしたほうがいいです。大学の先生が書いた本より競技プログラマーが書いた本の方が最初の一冊としてはよいと思います。本を読むのが面倒という人にはCoursera や Udemy のような動画の授業もおすすめです。スライドを使ってステップバイステップでアルゴリズムを解説してくれるので動作が理解しやすいというメリットがあります。
 アルゴリズムの基礎を勉強したら次にやることはオンラインジャッジシステムを使って問題を沢山解くことです。オンラインジャッジシステムというのはプログラムをアップロードするとサーバ上で運営が用意したテストコードに対してプログラムを実行してテストがパスするかを試すシステムのことです。全てのテストをパスしたらそのプログラムは合っていると判定されます。また制限時間以内にテストが終了しなかった場合もそのプログラムは誤っていると判定されいます。書いたプログラムをその場で採点してくれるためゲーム感覚で勉強ができて楽しいです。
 プログラミング言語は Python, Java, Javascript を含め非常に沢山の言語から選択できます。あなたが競技プログラマで特定の言語を使っている場合を除き、Python を使うことをおすすめします。Python は他の言語に比べて少ない行数で実装できる傾向があり、ソフトウェアエンジニアなら誰でも知っていることがメリットです。面接官も Python なら知っていると思ってよく、面接で Pythonを使うことはほぼ確実にできます。マイナーな言語を使って勉強をすることは絶対に避けるべきです。面接で使えなければ意味がないので始めから Python で課題を解きましょう。Python を普段使っていない人は Python の復習からしなければいけませんが1日もかからずに思い出せるでしょう。普段 Pythonを使っていない人は Pythonのコーディング規約 (pep8) に目を通しておきましょう面接ではコードの読みやすさも採点対象です。
 コーディング面接対策の最後の仕上げとして模擬面接 (mock interview) を受けます。模擬面接は友達同士で出し合ったり、有料サービスを使ったりします。面接では実際にプログラムを実行したり、デバッガを使うことはできません。テキストエディタやホワイトボードにプログラムを書いて面接官と話しながらデバッグします。オンラインジャッジシステムを使って解くのとは全然違うため、模擬面接を受けてで練習しないとスムーズにいかないと思っておくべです。また面接ではアルゴリズムの知識だけではなくコミュニケーション能力を審査されています。一言も話さずに書いたプログラムが完璧なものだったとしても貰える点数は低いです。模擬面接や実際の面接を受ければ分かることですが、面接官とコミュニケーションを取らないと解けないように問題は作られていることが殆どです。最初に出された問題には情報が欠けており、質問をして情報を補わないと解けないようにできているのです。これは意図的にそうされており、候補者の方から適切な質問ができるか、コミュニケーションが取れる人かを試すためです。コーディング面接では 1. 問題を出される 2. 質問をして情報を補う 3. いくつかの実行例(テストケース)を書き下して、面接官の想定通りかを質問する 4. 面接官と話しながら、説明をしながら実装をする 5. 面接官と話しながらデバッグをする、というのが典型的な流れになります。最初から最後までずっと話しながら面接は進み、黙々とプログラムを書くということはありません。模擬面接は絶対に受けたほうがいいです。それも1度や2度ではなく、できるだけ沢山、何度も受けるべきです。質問をしたり、説明をしながら実装をするのは練習をしなければできないことなのです。決して模擬面接で練習をせずにぶっつけ本番でコーディング面接に挑まないで下さい。

基礎編:アルゴリズムとデータ構造の基礎固め

基本的なアルゴリズムとデータ構造をおさえましょう。面接対策とはいえ、学習することは大学で習うことと同じです。コーディング面接では基本的なものしか出題されません。まずはどのようなアルゴリズムとデータ構造があるのかをざっと把握しましょう。次にそれらを何も見ずに実装できるようになるまで何度も書いて練習します。基本的なアルゴリズムとデータ構造はライブラリに用意されているものも多いです。よく使われるアルゴリズムのライブラリを丸暗記して使いこなせるようになることも重要ですし、それらを自分で実装できるようになる必要もあります。演習問題を解いていけば分かることですが、単純にライブラリを適用することができず、自分でデータ構造を実装しないと解けない問題が多いため、ライブラリを使いこなせるだけでは不十分なのです。一方でライブラリを呼び出すだけで解けてしまう問題もあります。したがってライブラリを暗記することと、自分で実装できるようになっていることの両方が必要なのです。また、面接では実装が終わったあとに計算量について質問されるため、理論的なことを学習しなければいけないのです。
 実装に15分以上かかる複雑なデータ構造が面接で出題されることはありません。本にはそういうものも載っていますが、流し読みすればよいでしょう。
 アルゴリズムとデータ構造の教科書は沢山出版されていますが、私のおすすめの学習方法は理論の学習とと演習を同時にできる教材を使うことです。演習はオンラインジャッジシステムを使うことをおすすめします。また、動画を使った教材もおすすめですアルゴリズムが動く様子をスライドを使ってステップバイステップで説明してくれるので分かりやすいです。以下がおすすめの教材です。

演習問題

基礎的なアルゴリズムを一通り覚えたらそれらを使いこなせるまで問題を沢山解きましょう。コーディング面接で出される問題はどのアルゴリズムを適用すべきかぱっとみでは分からないようになっていることが多いです。アルゴリズムを学びたての頃はリストを使うべきなのか、グラフを使うべきなのか、それとも他のものを使うべきなのか、と悩んでいるうちに制限時間を超過してしまうでしょう。何百問も解いているうちに瞬時に解法が浮かんでくるようになります。面接までに500問を解いておくことが一つの目安です。500問というのは忙しい社会人にとって多すぎて大変だというのはよく分かりますが、これくらい解かないと瞬時にアルゴリズムを書けるようにはならないのです。解けば解いた分だけ面接で点数がもらえる科目ですので頑張りましょう。
 進捗はスプレッドシートを使って管理することをおすすめします。何問解いたかが分かりますし、自分の苦手分野も分かります。間違った問題は何度も繰り返し解きましょう。

図:コーディング問題の進捗管理表。スプレッドシートで管理をする。問題集、オンラインジャッジの問題へのリンク、出題分野、AC した回数、復習の必要性をメモしておく。筆者は間違った問題は後日解くことにして、”need review” を◯にして忘れないようにしていた。

以下は私のおすすめの問題集です。選んだ問題集は転職の面接で良く出される問題ばかりが収められています。競技プログラミングの頻出問題と面接の転職問題は完全に一致しないため、注意が必要です。例えば座標圧縮やセグメント木は競技プログラミングでは頻出ですが、転職で出されることは殆どないようです。

この本のいい点は問題が沢山載っていることです。Python のライブラリを使って一瞬で解く解法も載っています。綺麗な Python のコードも掲載されていて、Python で面接に挑む人には参考になるでしょう。上に挙げた本に比べると良問の割合が低いと感じますが、コーディング面接に特化した貴重な一冊です。

模擬面接

コーディング面接と競技プログラミングの違いはコミュニケーション能力を見られる点です。コーディング面接は単にアルゴリズムの知識を問う面接ではないのです。コーディング面接の真の目的は他のエンジニアと技術的な会話をしながら強調して問題解決をできるかと試すことなのです。そのため、競技プログラミングでは問われないことが面接では聞かれます。以下はその例です。

  • データのサイズ。競技プログラミングでは問題文に入力のデータのサイズが指定されていますが、面接では意図的に与えられないことが多いです。データのサイズを面接官が言わなかったらこちらから質問をして情報を聞き出す必要があります

  • テストケース。競技プログラミングではテストケースは運営が用意します。面接では自分でテストケースを書き、妥当であるかを面接官と話し合う必要があります。

  • 計算量。競技プログラミングでは全てのテストケースにパスするだけでよく、計算量を正確に答えられる必要はありません。面接では計算量を聞かれますし、仮に聞かれなかったとしてもこちらから自発的に計算量について言及しなければいけません

  • アルゴリズムの改善。競技プログラミングでは制限時間内に全てのテストケースにパスすればどのようなアルゴリズムでもいいです。面接では面接官と一緒にアルゴリズムを改善して速くしていくことを求められます

  • プログラムの綺麗さ(可読性)。競技プログラミングでは可読性の低いコードを書くのは何ら問題がありません。面接では可読性の低いコードを書くことは減点の対象です。変数の命名やループの書き方に至るまで普段の業務で書くような他の人が読みやすいコードを書かなければいけません。皆さんも汚いプログラムを書く人とは働きたくないですよね。

また、統合開発環境やデバッガを使えないのも大きな違いです。一度ホワイトボードにコードを書いてみれば分かりますが、普段書くのに比べて格段に難しいです。話しながらコードを書くというのも普段やらないことです。模擬面接を通じて練習をしなければ決してよい点は取れないと思っておくべきです。
 模擬面接は知り合いに頼んでもいいですし、有料のサービスを使ってもいいです。模擬面接は面接官にとっても時間と体力を使うことなので、知り合いに何度もお願いをすることは難しいでしょう。お礼をすることを忘れないように。

会員同士で面接練習をしあうマッチングサービス。最初に片方が面接官役、他方が候補者役になり模擬面接を行います。面接が終わると役割を交代して面接をもう一度やります。無料で面接練習をできるのがメリットです。感想としては殆どの会員は学習不足でアルゴリズムの基礎的な知識が不足しています。体感として1, 2割の会員しかまともに面接官役ができる知識がないようです。コーディング問題を500問も解けば自分より優秀な会員とマッチングすることはまずなくなるはずです。

  • 有料の模擬試験 (mock interview)
    mock interview で検索すると色々見つかります。いい面接官に当たるかは運次第です。一回$200 (約3万円) くらいかかります。Gainlointerviewing.io などがあります。有料の模擬試験の中には詳細なフィードバックをくれる所もあり、参考になります。大学試験のときに予備校の模試を受けて自分の弱点を知れたように、模擬試験を受けることは大いに学習の参考になります。何度か受けて十分な実力がついたと自信が持てるまで模擬試験を受け続けましょう。筆者はこのようなサイトで Google のエンジニアを探し、模擬面接をしてもらいました。内定をもらうまで20万円程払い、何度か面接を受けました。最初は散々な有り様で、「不採用」のフィードバックを貰いましたが、学習を続けるうちにフィードバックの結果がよくなり、自信を持って面接に臨めました。決して安くないですが、内定をもらえれば元は取れます。ケチらないで何度も受けましょう。

システム設計面接対策 (system design interview)

システム設計面接では面接官に新製品のシステムを設計するように言われます。試験官と話し合いながら、多数のコンポーネントを組み合わせ、要求を満たすようなシステムの概要設計をします。この面接はシステム設計の知識を問うのと同時に、コミュニケーション能力を試されます。実際の業務では曖昧な要求が与えられ、会話を通じて要件に落とし込み、設計をします。システム設計面接はこの流れを模倣した試験です。システム設計面接の解答は十人十色です。最適な解答というものはなく、面接官と候補者の会話を通じて最終的な解答はできあがります。

ここから先は

5,788字

¥ 500

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