コーディング試験対策の必要性を感じた話(思考中)

# はじめに

私事ですが訳があり無職になりました。異世界行けずに本気が出せません。

強かに社会復帰するにあたり転職活動をする必要があるのですが、最近は業界経験者であってもコーディング試験を行う企業が散見されるようです。コーディング試験は新卒採用で実施するイメージがあったのですが、既卒であっても実施するケースがあるようです。なお、私はゲーム業界の人間です(直近Unityエンジニア)。Web業界ではありませんのでご留意ください。また、あくまでもコーディング試験初心者の記事であることにご注意ください。

さて、このコーディング試験ですが「普段業務でプログラミングしているからまぁ大丈夫でしょ」と高を括っていると涙することになります。採用企業によると思いますがFizzBuzz問題レベルではなく、[Codility](https://www.codility.com/)や[track](https://givery.co.jp/services/track/)といったサービスが利用されるようです。外資系であればCodility、日本国内であればtrackという感じでしょうか。形式的にはLeetCodeのように、ある問題が与えられ、制限時間内にアルゴリズムを実装する、という流れです(他の形式もあるのかもしれません)。使用する言語はメジャーな言語(C/C++,C#,Java,Go,Python,Ruby,PHPなど)であれば自由に選べると思うので、普段ご自身が使用している言語を選べます。なお、最近は問題の難易度も上がっているそうです。

# 何故慣れておく必要があるのか

兎にも角にも慣れなければなりません。コーディング試験に慣れていること前提なのです。普段からアルゴリズムを実装することに慣れている一部の特殊な人を除けば涙することになります。(そもそもこの時点でどうなんだって話ですが、文句を言っても仕方ありません...)

試験対策はLeetCode、Paiza、AtCoderなど便利なサービスがあるため、これらを利用して練習するのが王道のようです。試したことがなければ直ぐに試してみることをお勧めします。私が現在試しているのはLeetCodeになります。「他の人の答えを見れる点で比較できて良いよ」という評判があったためです。英文ですが期待される結果が例示されているので、普段からリファレンス等で英文を読み慣れていれば問題なさそうです(最近はDeepLもあるしね)。

さて、試せば分かる通り、Web上でオンラインエディタを使ってプログラミングすることになります。プログラムを書きRunすればシステムからプログラムに引数が渡され、合否の結果が確認できます。まるで単体テストのようですね。

ただし、printデバッグのようなことはできないケースがあるため注意が必要です。というのも標準出力の結果で合否を判定するケースがあったためです。これが個人的に非常に厄介。普段プログラムが期待どおりに動作しているかをprintデバッグして簡単な確認をしながらプログラミングしますよね？テストケースは複数個あるため、Runしたらprintした値がテスト結果に埋もれてしまい、ストレスが凄まじいです。というよりまともに見れない。

次にデバッガが使えない。デバッガでブレークポイントを設置したり、変数の中身を閲覧するケースがありますよね？システムによっては使えるor将来使えるようになるかもしれませんが、少なくとも自分が経験した試験ではありませんでした。

つまり普段の環境とは大きく異ることがあるため、初見殺しとなる可能性が高いです。

そしてこれらのことを踏まえた上で、普段業務で忙殺されているエンジニアが何ら対策せずに試験を受けたとして、制限時間のプレッシャーの中で実装を閃き対応できるか、と言われればNOだと思いました。それができたとしたら多分天才か変態の部類だと思います。殆どの人は天才でも変態でもないため試験対策やトレーニングが必要なのです。なお、私は雑魚です。

# 攻略方法(プラクティス思考中)

コーディング試験対策をするにあたり、最初の心構えとしては下記かと思います。

**素直にオンラインエディタを使うのではなく普段から使用しているエディターやIDEを使用しよう**

FizzBuzz問題など、よほど簡単な問題であれば直接オンラインエディタで試行すれば良いですが、アルゴリズムとなると直ぐに考えられるレベルの問題ではないことが多いと思われるため、デバッグ環境があった方が有利かと思います。

オンラインエディタ自体は、ちょっとしたプログラムの確認をする際にはとても便利なので時々使っています。例えばC/C++であれば[Wandbox](https://wandbox.org/)、C#であれば[.NET Fiddle](https://dotnetfiddle.net/)にお世話になっています。ですが現状コーディング試験には不向きです。手元で繰り返し試行できることが大事で、つまらないところで集中力が切れることは避けるべきです。

コーディング試験のシステムが単体テストのアイディアベースであれば下記も言えるかなと思います。

**試験開始後、直ぐに単体テストプロジェクトを作成してテストケースをコピーしよう**

これを前提とするなら、事前に単体テスト用のプロジェクトを作成しておいた方がベターかもしれません。もし単体テストを作成したことがないのであれば、この機会に学びましょう。

そして、下記が一番重く本質的なのですが、

**基礎的なアルゴリズムの参考書は一通り眺めておこう**

出題問題にもよりますが、直ぐに参考できる参考書を持っておいた方が何かと都合が良さそうです。
[アルゴリズム・クイックリファレンス](https://www.oreilly.co.jp/books/9784873117850/)などは汎用性やコンパクトに纏まっている点でお勧めです。ただし、アルゴリズムの問題がそのまま出題されるケースは稀なのではないかと思います。アルゴリズム以外にもチャレンジする業界・業種ごとに問題作成者側の気持ちを予想するしかなさそうです。

**ひたすらLeetCodeなどで鍛錬を積もう**

と書いたものの、とても根気が要りそうです...習慣化の必要性を感じます。

(現状試験経験が浅く、気づきがあれば随時更新したい)

## おわりに

コーディング試験に思うところがある企業では導入したことがあったものの既に止めているという事例や、制限時間内に問題を解くのではなく数日以内にサービスを実装する事例もあった、と聞いているため、やはり企業ごとに取り組み方は様々なんだなぁと勉強になりました。試験的に導入しているといった事例もありそうです。また、必ずしもスコアが全てという訳でもないようです。

私が新卒時(2012年頃)には手書きで紙にプログラムを書くという嫌な経験をしており、これと比較するとテクノロジーの進化と浸透具合に感慨深さを感じます。とはいえ試験対策をしなければならない、というのは試験を受ける側の負担が高過ぎ、正直賛否は立場によって異なりそうです。私は面接官経験もありますが、面接中に経験者であれば答えられる程度のクイズを出すことはあっても、このレベルとなると面接まで辿り着けず機会損失になるのでは、という恐れがあります。

一方、LeetCodeなどのサービスは学習にはとても便利で、気負いせず「スキルアップを狙って遊んでいたらついでにコーディング試験対策になっていた」という温度感で継続的に学習する、ぐらいが丁度良さそうです。

自宅からは以上です。