ソフトウェアエンジニア、コーディングテスト対策の順番と方法
以前の記事でソフトウェアエンジニアの面接の種類について書きました。
その中でもコーディングテストの対策は範囲がとても広く、対策に時間がかかります。日本企業でもこの面接形式を取り入れるところが増えているため、この形式の面接対策をする人も増えてくるのではないかと思います。
今回は、私の(とても苦戦した)経験を踏まえて、知識ゼロからコーディング面接の対策をするとしたらどうやるかを解説します。
ちなみに筆者はここで紹介する手法で、日系大手企業のコーディングテストを突破することができました。
コーディングテスト対策
コーディングテストの全体を知る
コーディングテストはその他の知識を口頭で問うような面接と全く違う形式で行われます。全体の流れとしては
のように進みます。この形式や、面接で問われることがあるトピックを簡単に説明した講座がUdacityで提供されています。まずはこれで概要をつかむのがおすすめです。使用されているプログラミング言語はPythonです。
Swift版も用意されています。
英語のコースですが、日本語字幕もあるので概要をつかむのにはもってこいだと思います。
データ構造とアルゴリズムについて基礎を固める
先ほど紹介したUdacityの講座はわかりやすいのですが、実際のコーディングテストの対策のためには練習量や理解度が足りません。私は勉強を始めた当初、そもそも問題をどのようにプログラムで実装すべきかわかりませんでした。例えばグラフの概念がわかっていても、いざ実装するときにどんなデータ構造を使うべきか見当がつかなかったのです。そんな時に便利な本がこちらです。
この本では、データ構造とアルゴリズムを体系立てて勉強することができます。また、使用されているコードもどの言語を使ってる人でも読みやすいような疑似コードで書かれているため、慣れてしまえば読みやすい本です。
この本を一通り解くことで、データ構造とアルゴリズムの問題に対してどのような表現方法があるのかを頭に入れることができます。
問題を系統立ててたくさん解く
ここまでで、面接の形式と内容を把握できたので、あとはひたすら練習するのみです。米国のビッグテック(GoogleやApple、Facebook、Amazonなど)に入社するためには200問解いたとか300問解いたというような体験談がありますが、量と同時に質も大事です。いくら多くの問題数を解いても解いたことがある問題を忘れた頃にもう一度解けるくらい深く理解してないと実際の面接では役に立ちません。
そこで、質の高い練習をするためにとてもいいサイトが neetcode.io です。
このサイトではRoadmapという項目で、どの項目から勉強すべきかを教えてくれています。この順番に解いていけば知識と知識が有機的に結びつき、GraphやDynamic Programmingなどの難しい概念もすんなりと理解できるようになります。
このサイトのいいところは、付属しているYouTubeでの解説がとてもわかりやすいところです。英語でコーディング問題の解説をしているチャンネルは数多くありますが、私にとってはNeetCodeの解説が群を抜いてわかりやすかったです。
また、NeetCodeのRoadmapに含まれる問題数は150で、これは入門レベルの問題も含まれた数なので、実際に本腰入れて解くようなものは100ぐらいです。とても面接対策としてちょうどいい数だと思います。この150問を繰り返しといて、わからないところは解説ビデオを見たり、前述の『問題解決力を鍛える!アルゴリズムとデータ構造』を読み返すことで理解を深めていきました。
もし本がいい場合は、以下の本がおすすめです。コーディングテスト対策の定番の本です。
最近の本では"Elements of Programming Interviews in Python: The Insiders' Guide"も人気です。
本にも体系立てられた問題が収録されているため、効率的な順序で問題を解くことができると思います。ただ、LeetCodeのように実際に入力して書いたコードが合ってるかどうかを確かめることはできないので注意が必要です。一方で、実際の面接ではホワイトボードやGoogle Docsなど実行環境のないところでコードを書く場面も少なくないので、本番環境に即した練習ができるというメリットもあります。
面接本番に向けた予行演習をする
データ構造とアルゴリズムの知識を固めつつ、質の高い問題を繰り返し練習していると、いよいよ本番が近づいてきます。そしたら、本番に向けた準備をします。そこでは、初見の問題を解く練習を意識的します。 たとえNeetCodeの厳選された150問をマスターしていても、初見の問題をすぐに解けるとは限りません。自分の頭で柔軟に対応する経験をしておくことで、本番でもうまく対応できる可能性が高まります。自分の頭で柔軟に対応する経験をしておくことで本番でもうまく対応できる可能性が高くなります。
そのために便利なのが、LeetCodeというサイトのOnline Assessmentの機能です。この機能では時間を測りながら、あらかじめ用意されている2-3の問題セットを解くことができます。また、Prampというプラットフォームでは、他のユーザーとマッチングして、交互に面接練習をすることができます。基本的には英語圏のユーザーと繋がるので英語の練習にもなります。
まとめ
10以上のトピックの数百問近い問題を解くということで、コーディングテストの対策が大変に感じられた方もいるかもしれません。ただ、一つずつ知識を積み重ねて解いていくことで、だんだんとパターンが見えてきて解くので楽しくなってくると思います。ちょうどRPGのゲームで武器を一つずつゲットしながらだんだんと強い相手に向かっていくような感覚です。そして、ここで得られるアルゴリズムや計算量の考え方は実際のソフトウェアエンジニアの仕事でも役立つことがあります。実際に私の場合はコーディングテスト対策を始めてからコードを書く前に、これから書くコードのアルゴリズムや構成を考える精度が上がり実装時間が短くになりました。また、書いたコードがなぜいいのかを説明できるようになりました。その結果かどうかはわかりませんが、当時いた会社で昇給しました。
この記事がこれからコーディングテストの準備をする人の役に立てれば幸いです。
他のリソース
本文では紹介しきれなかった役立ち情報をいくつか紹介します。
Back To Back SWE
コーディングインタビュー問題の解説をしているYouTubeチャンネル。この人の説明スタイルがとても情熱的で元気が出ます。元気が欲しい時に見るといいです。
Clément Mihailescu
AlogExpertというソフトウェアエンジニア向け面接対策のサイトを運営する会社の代表。元Googler。問題の解説はないですが、ソフトウェアエンジニアのキャリアなど幅広いトピックを語っています。見ているととてもモチベーションが上がります。
CS Dojo
米国在住の日本人の方が英語でやっているYouTubeチャンネル。以前はコーディング問題の解説が主でしたが、最近はAIなど幅広いトピックを扱っています。