先日ある企業の面接でコーディング試験があった。
ギリギリ(?)パスしたのでどんな問題が出たか、どんな風に勉強したか、どんな気持ちになったかを記録しておく。
目次
どんな問題が出たか
LeetCodeというプログラミングコンテストのサイトから出題された。
LeetCodeとは、有名企業のコーディング面接で出るような問題が集められているトレーニングサイトだ。
ブラウザ上で、仕様通りのクラスを作成し、テストコードが通ればOKというやつ。
ものによっては実行時に時間がかかりすぎるとNGだったりする。
そのため、計算量が少なくなるようなコードを書かなければならない。
言語は自由に選べる。
主観だけど、特に言語の縛りがないのであればPythonをオススメする。文字列操作やリストの操作が楽だと思う。
今回は、難易度がEasyのものがランダムで一問出題される。
それを、制限時間内に解くという形式だった。
解いている様子は画面キャプチャで録画され、動画が現場エンジニアに共有される。
後述するが、これがめちゃくちゃキツかった。
どんな風に勉強したか
LeetCodeの問題は、割とガチ目である。情報系の大学生が宿題で解くようなものだった。
問題文を見ると計算量が云々、ソートアルゴリズムが云々みたいな単語が頻繁に飛び交っている。対策が必要だと感じた。
そこで会社の昼休みや、娘が起きる前の早朝、通勤電車の中で下記をとにかく読みまくった。
計算量の話、基本のソート、探索、二分木が云々が詳しく説明されている。
コード付きなので、アルゴリズムをどうコードに落とし込むかのイメージもわきやすい。
実際LeetCodeの問題には、二分探索を用いないと実行時間超過エラーが出るものがあったりする。Easyでもだ。
定番のアルゴリズムをおさえておいた方が絶対に良い。
書籍と並行して、あとはLeetCodeをひたすら解いた。1日2問を目標。
Easyなんかそもそも簡単でしょ? あたしゃエンジニア何年目ですか? とか調子こいてたんだけど、難しい。やばかった。
何というか、普段業務でやってるプログラミングとは一線を画していた。
便利なライブラリとかヘルパー、フレームワークがやってくれていた泥臭いことを、自作しなければならない感じ。
それも計算量を意識しながら、だ。O(n^2)とかやると容赦無く実行時間超過エラーが起きやがる。
そもそも仕様が読み解けないこともあった。
そういうときは恥を忍んで問題文をGoogle翻訳にそのままぶち込むと、スッと解決することが多かった。
たぶん全世界でめちゃくちゃ検索されてるから精度が良くなってるんだろうと推測している。
なので、LeetCodeの問題文は例外なくGoogle翻訳にぶち込んだ方が良い。それが許される環境ならば。だけど。
まとめると、LeetCodeテイストのコーディング問題をちゃんと解けるようになるには、書籍で基礎的なアルゴリズムをおさえた上で、問題のクセに慣れる必要がある。
LeetCodeから出題するよ〜みたいな企業を受けるのであれば、対策は必須である。
面接中どんな気持ちだったか
LeetCodeの問題はクソほど解いていたので(Easyだけ)、問題自体には恐怖心はなかった(Easyならば)。
問題は見られているということだった。
検索OKな試験だったけれども、「問題名 answer」みたいな検索をして解決してもどうにもならない。
初めのうちはGoogle翻訳を使うのをためらったがこれが結果的に仇となった。けっこうな時間、仕様がキチンと読み解けないという自体に陥った。
刻一刻と進んでいく時間。白いIDE。冷や汗が流れた。
少しして、解けないよりマシだと思いGoogle翻訳を解禁したところ、重大な仕様解釈誤りをしていたことに気づく。
試験時間は50分、30分経過後ぐらいに完全な仕様を把握。
そこから仮実装をテストしながらギャンギャン書いていき、ようやく書けたと思って提出ボタンを押したらまさかの実行時間超過エラー。
ちょっと笑っちゃったもん。マジかよ〜って。
時間見たらあと5分とか抜かしやがる。
そっからPythonで学ぶアルゴリズムとデータ構造で使ってたアルゴリズムが使えることを思い出し、超速でPythonの組み込み関数の使い方をググり、何とか解答完了。
実行時間エラーは出なかったが劇遅コードかつ意味不明なコードができあがった。
気持ち的にはもう泣きたいみたいな。
人事の方と極めて事務的な会話をしたあと、逃げるようにZOOMの部屋から退出した。
まとめ
その後、奇跡的にコーディング面接をパスしたとの通知が来た。絶対ダメだと思ってたのに。
実際、平静であれば苦もなく解けるような問題だったし、もっとやりようがあったと思う。
ギリギリの勝利だったけれども、明暗を分けたのは、実行時間エラーが起きた時に、基礎的なアルゴリズムはおさえてるよ? と暗に示すことができたのがでかいと思う。(実際そんな小難しいアルゴリズムを使わずとも解ける問題だったことに気づいて赤面したけど)(でもやっぱりアルゴリズム使ったほうが良かったけど)
たぶん、次の面接ではこのコードについての話もあると思うので、どこがまずかったか、どう改善すべきかみたいなことを考えておこうと思う。
コーディング面接をこれからする方にアドバイスするとしたら
- 基礎的なアルゴリズムは本読んでおさえとけ。死ぬぞ!
- LeetCodeで練習しておいたほうがいいぞ。死ぬぞ!
- 英語の問題文だった場合、恥ずかしくてもGoogle翻訳に全ぶち込みしたほうがいいぞ。死ぬぞ!
の3点かな。
本日は以上!