どんなことでもそうですが、「アレは難しいですよね」「そうですよね」ではどうにも話しにならないので、どういうところが難しいのか、考察してみます。
ペース配分に注意する
以前の記事でも書きましたが、Google の面接はタフです。昼食などの休憩が入ることもありますが、面接官1人あたり45分で合計4人程度から面接されます。別にストレス耐性をみたいわけではないのですが、多くの応募者を面接するにはある程度こういう詰め込みになってしまっています。
大学の講義のように受け身でいられるなら、2〜3時間聞き続けるというのは、まぁなんとかなるかもしれませんが、面接では自分からアクションを起こさないと先に進まないので、そりゃまぁ疲れます。もちろん、面接中喉が乾いたりしたら、飲み物要求して構わないですし、お手洗いに行きたくなったら遠慮なく言ってもらって構いません。それでも、やはりこの長時間は疲れます。
どう考えても、この時間中ずっと集中力と緊張を保ったままアタマを使い続けることは無理なので、面接の合間は気持ちを切り替えてアタマを休ませる、終わった質問についてアレコレ考え続けたりしない、などペース配分に気をつけましょう。
気負わず分かりやすいコーディングを
Google の質問は、比較的簡単に答えられる問題設定から徐々に難しい設定に移行する、という形をとります。大抵の問題は、入力のサイズが小さかったり、出力までの待ち時間が無限にあったり、緩い条件のもとでは力技で解くことができます。ところが同じ問題でも、膨大な入力数だったり、極端に素早く出力しなければならなかったりすると、効率的なデータ構造やアルゴリズムを考える必要が出てきます。
ここでのポイントは、最初の段階から効率的な解答を得ることは求めていない、ということです。もちろん効率的な方が良いですが、そもそもその効率性が必要かどうかは状況によって大きく変わります。そして、効率的な解というのは複雑であったりリソースを大量に消費することもよくあります。その複雑性やリソース要求が許容されるかも、また状況次第です。なので、最初はシンプルな解答で構わないのです。
ところが、Google の面接に来る人は、とてもとても肩に力が入っていることがあります。そして単に2重ループ書けば済むところで、超絶技巧ビット演算の妙技を披露したりします。披露できればまだいいのですが、大抵の場合はうまくいきません。そしてそういう技巧的なコードというのは読み慣れない人からすれば、単にメンテナンス困難なコードでしかありません。
多くの人が誤解しているのですが、Google のエンジニアの大部分はキラキラスーパーハッカーではありません。そういう「普通の」エンジニアが読めないコードはいくら効率的でも困りものです。Google を受ける、ということで気合いが入るのはよく理解できるのですが、それで空回りしてしまっても仕方ありません。また空回りほどエネルギーを浪費することはありません。問題にあわせた適切な回答をこころがけましょう。
考えを説明する力
先程の話と共通しますが、Google の面接は簡単な質問からはじめて、それに徐々に条件や制約を加えていって難しくする、という形式を取ることが多いです。面接官が見ているのは、そういうときにどのような解法をどういう見方で探して応用していくか、ということです。そしてその道筋を説明するときに適切なコンセプトを使って的確に語ることができるか、ということも見ています。
なので、面接中は「いまどういうことを考えているか教えて下さい」とよく聞きます。たとえ解答に辿り着けなくても、問題への取り組み方が論理的か、分析に適切なコンセプトを使っているか、などは話を聞くことでよくわかります。逆にいきなり答えだけ出てきても、そういった部分を知るのは難しいです。
本当に良く書けたコードというのは、それだけで十分明確なのかもしれませんが、そこに至る道筋というのはやはり言葉で説明してもらわないとわからないものです。モノを作るというのはチームプレーです。個々に割り当てられた仕事をこなして完成品を納品すればおしまい、というわけにはいきません。単に良いコードを書く力ではなく、どうしてそういうコードになったのかを明快に説明する力は重要です。
完璧を求めない
エンジニアというのは良かれ悪しかれ完璧主義者の人が多い気がします。とはいえ、現実の問題を限られた時間のなかで完璧に解くことはまず不可能です。そして、Google の問題も多くの場合、時間内に完璧な解答に到達するのはとても難しいたぐいのものです。
それはなぜか。部分解のほうがその人の強み弱みをよりよく知ることができるからです。満点の解答というのは味気ないもので、「できた」という以上のことを窺い知ることが難しいです。どんな人間も得手不得手があります。それを多角的に評価するために複数の面接官がいろいろなことを聞くわけです。また一つの問題を特にしても、いろいろな技術や知識が必要になります。その得手不得手を見るために、あえて時間内に完全に解くのが難しい質問をします。
完璧主義というのは、うまくはたらくと卓越したものづくりに繋がります。しかし、それは現実の場、あるいは、Google の面接においては命取りにもなりかねません。Google の面接はあくまで実際の開発でどのような力を発揮できるかを見るためのもので、その人の本質を見極めるためのものではありません。問題に完璧に答えられなくて気にせず先に進みましょう。
Google の面接は難しいのか?
よく Google の面接は難しい、と言われるのですが、その難しさは思われているほど技術的・知識的なものではなく、面接に向かうにあたっての心理的な心構えが、実際の面接とミスマッチしているところに起因するのではないかと思っています。もちろん心構えだけで面接を突破できるだけではないですが、逆に心構えができていなくて不意打ちをくらって実力が発揮できないのも残念なことです。この記事がそういった残念な出来事を減らすのに役立てばいいのですが。