たけち地方国立大学情報系学部にてアルゴリズムの研究を行っている。GAFAや外資コンサル,メガベンチャーを含めた複数の難関企業から内定を獲得し,2022年からGAFAでエンジニアとして勤務予定。趣味は音楽。
GAFA・メガベンチャー志望学生のための就活ノウハウ伝授サイト『IT就活ナビ』を開設。
コーディング試験とは
外資系か日系かを問わず、ソフトウェアエンジニア職の面接プロセスの一環として、多くの企業でコーディング試験が導入されています。
コーディング試験とは文字通り、プログラミングの能力を測るために行われるものであり、1~2次面接など、選考の序盤~中盤の段階で行われます。
面接内容は会社や業種により異なりますが、一般的には競技プログラミングのような問題を解き、アルゴリズムを解説するという流れで行われます。
コーディング試験に近いもので、以下のような形式の面接もあります。
・コーディング自体は行わないものの、コンピュータサイエンスに関連した知識を問われる技術面接と呼ばれるもの
・オンラインでコーディングを行う事前課題を解き、面接官にその実装について解説をする面接(事前のコーディングに3,4時間かかるものもあります)
本記事では主に、その場で問題を解きアルゴリズムを解説する形式のコーディング試験について解説していきます。
コーディング試験の実施方式
オンラインと対面の2パターンがあります。
近年はほとんどがオンラインによる実施ですが、コロナ禍以前には対面でも多く行われていました。
対面の場合は、紙とペンや、ホワイトボードを使い、その場でコードを直接書いていく形で行います。
オンラインの場合は、HackerRank やcodeshare など、書いたコードを共有できるツールを用います。これらのツールを使用する場合は、主にブラウザのエディタにコードを書き進めていくことになります。
プログラム言語について
コーディングを行うプログラム言語に関しては、基本的に制約などはなく、自分の好きな言語を使って構いません。あらかじめ制約がある場合でも、主要な言語は必ず使えるのでほぼ問題ないと言ってよいでしょう。
競技プログラミングで人気の、以下の2つの言語を使う学生が多いですが、どの言語を選択してもマイナスに働くことはありません。
Python: 処理が簡潔に書けることや文字列や配列の扱いやすさ、ポインタなどを意識しなくてもプログラムを書けることから人気
C++: 処理速度が早いため競技プログラミングでは圧倒的に人気
また、言語を選んだ理由を深く聞かれることはあまりないですが、なぜその言語を選択したのかを軽く言えるようにしておくと良いでしょう。
全体の流れ
およそ45分~1時間です。
企業により進め方はさまざまですが、以下のようなパターンが多いです。
・45分程度の面接で、全てコーディングテスト
・90分の面接で、およそ半分がコーデイングテスト(半分は志望動機など、オーソドックスな面接)
・1日に複数回連続して面接を行い、そのうちの1つとしてコーディングテストが課される(45分程度)
雰囲気
面接官は、主に実際に現場でエンジニアとして働きコードを書いている方が出てきます。
年次に関しては比較的若い方が多い印象です。
雰囲気は比較的和やかに進むことがほとんどです。というのも、学生がアルゴリズムの解説をした後に、そのアルゴリズムや拡張した解法についてディスカッションしながら問題を一緒に解いていく際、面接官本人がプログラムへの興味関心から面接を楽しんで行っている場合が多いからです。
学生側は緊張で楽しむどころの場合ではないかもしれませんが、リラックスして臨むよう心がけましょう。
コーディング試験の流れ
大まかな流れは下記の通りです。1回の面接で複数問を解く場合は、この流れを複数回繰り返します。
↓
2. 解法を考える
↓
3. 実際にコーディング
↓
4. 解説
↓
5. ディスカッション
1. 問題の確認
まず最初に、問題が出題されます。問題を読む時間が与えられて静かに読む場合もあれば、面接官の方が問題を説明する場合もあります。
出力がどのような形式で与えられるのか、また結果としてなにを出力するのかをまず最初にチェックすることが重要です。
2. 解法を考える
問題を確認したらすぐにコーディングに移る必要はなく、一旦解法について考える時間が与えられます(数十秒~数分程度)。
1と2のステップがまとめられており、数分間じっくりと考える時間を作ることができる場合もあります。
3. 実際にコーディングを行う
問題を確認して解法を思いついたら、実際にコーディングを進めていきます。
黙々とコードを書いていくのではなく、いま書いている行がどのような挙動をするのかを説明しながら書いていくことができると、面接官がよりコードを理解しやすくなります。
4. 解説
実際にコーディングを終えたら、自分の書いたコードを解説していきます。
挙動の説明だけでなく、コードの中で工夫した点などをここで話しましょう。
5. ディスカッション
4の解説を終えると、面接官からさまざまな質問が飛んでくることを覚悟しましょう。
質問の例
- 計算量
- 更に改善できるコードがあるかどうか
- エッジケースに対応できているか
- コードを書く際に気をつけたこと(コーディング規約など)
コードを書いている時には気づかなかったものの、少しのアドバイスを受けてより良いコードを思いついたりすることもよくあります。
コードを書き終わったからと言って気を抜かないようにしましょう。
point:面接官とコミュニケーションを取ろう
自分の実力をしっかりと評価してもらうために、以下のことを心がけましょう。
- 設問について面接官から解説や補足があった場合は注意深く傾聴する
解法に特殊な条件が課せられている場合など、重要な情報である可能性が高いです。
- 分からない事やうっかり忘れてしまった事については遠慮せず聞く
- 自分の考えをこまめに口に出し、面接官に思考プロセスを開示する
どんなに普段のコーディングスキルに自信があっても、選考本番の緊張で単純な文法をド忘れしてしまったり、解法が思いつかずに焦ったりといったトラブルは起こりえます。
そんな時は自分から積極的に面接官にコミュニケーションを取りに行き、素直にアドバイスを求めましょう。
コーディング試験の評価ポイント
企業により評価方法はさまざまですが、以下の項目については共通していると思ってよいでしょう。
1. アルゴリズムとデータ構造に関する基礎知識を持っているか
そもそも基礎知識がなければ解けない問題が出題されるので
2. 全てのテストケースを制限時間内に通す実装力を持っているか
→ 入出力例には出ていないエッジケースや例外ケースに気づけるか
→ 計算量を意識して効率がよく実行時間の制約を満たす実装ができるか
3. 変数名や関数名を適切に命名するなど、他人が読みやすいコードを書けるか
一度のコーディング試験で書く必要のあるコードの量はそう多くありません。関数自体を作らなかったり、変数もxやyなど単純なものを使う場合が多いです。
また、コーディング試験の形式によっては以下のようなポイントも評価されます。
・コードを書き慣れているか
オフラインで実施する場合や、コーディング中の画面をその場で映す形式の場合、コードがスラスラと書けるかを見られる場合もあります。
・ディスカッションの中で、自分が書いたコードを分かりやすく説明できるか
コミュニケーション能力やカルチャーフィットについては中盤以降の面接で見られるため、あくまでそれ以前の足切り的な位置づけであるコーディング試験では重要視しない企業が多いと思われます。
具体的な設問
ここからは、コーディング試験で実際にどのような問題が出題されるかをお話していきます。
コーディング試験は1時間程度で終わるので、実装にとても時間のかかる問題はあまり出題されません。コードを書く時間は5~20分程度と考えて良いでしょう。
ソートや値の入れ替えだけで解ける問題もありますが、以下のような競技プログラミングのテクニックを使わないと解けない問題も多いです。
- キュー、スタック
- 幅優先探索、深さ優先探索
- 貪欲法
- 動的計画法
問題の難易度については、
- AtCoder Begineer Contest(ABC)のC~D問題くらい
- PaizaのA~S問題
程度のレベル感というとイメージしやすいと思います。
実際の出題例
- “0”と”1”からなる2次元配列が与えられて、連結成分の個数を答える
- 配列が与えられて、k番目によく出現している文字を答える
- リストの中の任意の二つの要素の和が与えられたターゲットに等しいものの、リスト番号を返す
- 2分木の最大の深さを返すコード
企業によっては、アルゴリズムを考えるのではなく以下のような実装を求められることもあります。
- ソートを実装(クイックソートやマージソート)
- 2つの配列のマージを実装
上記の問題はほんの一部の例ですが、特に外資ITの過去問はLeetCodeに多数掲載されているので、対策の参考にすると良いでしょう。
対策方法
ここからは、コーディング試験の実践的な対策方法についてお話していきます。
コーディング試験は、プログラムを書く能力を測る試験のため、付け焼き刃でなんとかなるものではありません。しっかりと事前に対策を進めていきましょう。
競技プログラミングの勉強
コーディング試験の一番の対策と言って良いでしょう。
AtCoderやpaizaなどを使って普段から勉強をしておき、アルゴリズムの実装を行っておくことが、対策につながります。
また、すべて英語ですがLeetCodeという海外の有名なコーディング試験対策サイトもあります。過去に実際に面接で出題された問題が集まっており、外資ITを受ける方はぜひLeetCodeにも手を伸ばしてみると良いでしょう。
レベルは高いに越したことはありませんが、AtCoderならば緑色以上に到達して、C問題はおおよそ問題なく解けるレベルになっておくと良いでしょう。
計算量についての勉強
競技プログラミングと大きく関わりのあるトピックではありますが、計算量について勉強をしておきましょう。
配列のソートなどのプログラム言語の動作の計算量を知っておくことや、普段から自分の書いたコードの計算量を考えてみることで、対策になります。
また、自分がコーディング試験で使用しようとしているプログラム言語のデータ構造を理解しておきましょう。データ構造の細かい計算量も知っておくことができるとなお良いです。
例: 配列において最後の要素を削除する操作はO(1)だが最初の要素を削除する操作はO(n)かかる、など
英語の勉強
一部の外資IT企業では、コーディング試験が英語で行われます。
問題の解法はわかったけど英語力がなくてうまく伝えられなかった!ということになるともったいないので、英語(特にスピーキング)を勉強しておけると良いでしょう。
スピーキングのレベルとして、日常会話レベル以上になっておくと会話がスムーズに進みます。コードがどのような挙動をするかを英語で話すために、簡単なプログラミング用語も覚えておけると良いでしょう。
直前にしておくこと
コーディング試験に付け焼き刃の対策は通用しません。とはいえ、前日や面接前にやっておくべきことがあります。
プログラム言語で使いそうな操作を確認する
自分が使う予定のプログラム言語の基本的な操作を今一度確認しておきましょう。
コーディング試験中にプログラムの書き方を少し忘れてしまってもあまり問題はないですが、覚えている方がスムーズに進みます。
競技プログラミングのテクニックを復習する
上記で紹介した競技プログラミングのテクニックを軽く復習しておきましょう。直前に復習をしておくことで、面接中に思い出しやすくなるかもしれません。
コーディング試験は十分な対策を
コーディング試験は、今まで自分が培ってきたプログラミングスキルを企業に評価してもらうための場です。
実力を十分に発揮できるよう、自分に自信をもって頑張ってください!
マッキンゼー ゴールドマン 三菱商事
P&G アクセンチュア
内定攻略 会員限定公開
トップ企業内定者が利用する外資就活ドットコム
もっと記事を読む
マッキンゼー BCG ベイン・アンド・カンパニー アクセンチュア 等の内定攻略記事を会員限定に公開しています