エンジニアが海外転職する際にプラスになるコーディング面接の対策サイト

英語を使って海外のエンジニア職に転職しようとする際に避けては通れないのが技術面談。もし海外のエンジニア職への挑戦をお考えの方でそれが初めての場合、この技術面談の対策は十分にとっておいた方がいい。

きっと思っているよりも実際にやるとその難しさを実感するパターンがこの技術面談。たまにYouTubeに技術面談をシミュレーションしている様子のビデオが上がっているが、なんか嘘くさいし、そんなビデオを横から見ても一体ナニをどうすればいいのか対策の立てようがない。

だいたいこの技術面談でその応募者の相手をするのは現役バリバリのエンジニアだ。日本のように転職面接に人事の人が出てくることはまずない。エンジニアの技術レベルを測れるのはエンジニアだけ、という当たり前な理由なんだけど。とにかく現役のエンジニアがこれでもか、というぐらいにあなたの真の実力を読み取ろうとしてくる。

技術面談で出される問題は大きく分けて２種類。

- 基本知識を問う問題
- アルゴリズムを問う問題

基本知識に関しては自分の守備範囲の専門用語を英語で言えればOk。例えばオブジェクト指向や継承を英語にすること。ただそれだけ。ここはカンタン。

問題は次のアルゴリズムの問題。これは単にアルゴリズム論の本を読めばいい、というほど単純ではない。英語で聞かれて、英語で応えるリズムや思考回路が必要になる。この英語のリズムとノリが難しいのだ。たとえあなたがスーパーエンジニアで、完璧なアルゴリズムの正解がスグに頭に浮かんでも、それだけはOkにはならない。その頭に浮かんだ内容を論理的道筋を立てて英語でイケてる風にプレゼンしないといけないのだ。

「あのー、、、でっで、、そっそっそこはーあああああ」とか英語で言ってたらなんかしょぼいエンジニアに見えてしまうのだ。間違っていても、抜けがあっても、論理の道筋と今考えていることを英語でキリっと言う必要がある。

そこでオススメするのが下記のサイト。

[Take our free programming lessons - Codility](https://codility.com/programmers/lessons/)


アルゴリズム系の問題を集めたサイト。各種のプログラミング言語に対応しており、JavaScript、Ruby、C++、Java、Objective-C、Python、Go、考えつくほぼ全てのプログラミング言語にて回答ができる。ポイントは英語で問題が書いてあること。

私が説明するよりサイトの問題を一部抜粋したのでご確認いただければ一目瞭然。


> NumberSolitaire
A game for one player is played on a board consisting of N consecutive squares, numbered from 0 to N − 1. There is a number written on each square. A non-empty zero-indexed array A of N integers contains the numbers written on the squares. Moreover, some squares can be marked during the game.
At the beginning of the game, there is a pebble on square number 0 and this is the only square on the board which is marked. The goal of the game is to move the pebble to square number N − 1.
During each turn we throw a six-sided die, with numbers from 1 to 6 on its faces, and consider the number K, which shows on the upper face after the die comes to rest. Then we move the pebble standing on square number I to square number I + K, providing that square number I + K exists. If square number I + K does not exist, we throw the die again until we obtain a valid move. Finally, we mark square number I + K.
After the game finishes (when the pebble is standing on square number N − 1), we calculate the result. The result of the game is the sum of the numbers written on all marked squares.


技術面談ではこれと似たようなことをオッサン（おばはん、ネーチャンでもとにかくエンジニア）がホワイトボードの前でべらべらと話す。上記のように文字で書かれていないから、戻って読み返すことができない。で、話が終わったら、ホワイトボードマーカーを渡されて「じゃあ、コードここに書いて」と言われる。
「おい待て！オレはまだ問題も理解していないのにそんなマーカーをオレによこすな！」と何度思ったことか。。。

人間が目の前に居ての会話だから、もし分からない箇所があったら「え？今なんて言ったの？」など質問はできる。ただ自分の言ってることを一字一句全部ホワイトボードに書き出してくれるような人は居ない。せいぜいあっても説明を補足するためのカンタンな図を描いてくれるぐらい。

もし上記の英語があまり理解できなかったとしてもそんなに落ち込む必要はない。この種類の英語には慣れが必要だからだ。codilityのサイトで練習して、いくつか英語の問題を読みこなせば、そのコツが掴めてくると思う。今、住んでいる家のお隣さんはアメリカ人のご夫婦でそこの奥さん（お仕事はイラストレーター）に上記の英語をちょっと読んでもらったら「？」となっていた。ネイティブであっても、ある程度のプログラム的思考がこの様な文章を理解するには必要なのだ。だからとにかく慣れが重要。

それと最初の一発で正解のコードを書くことを目指す必要はない。むしろ最初はちょっとアルゴリズムに抜けがあったけど、面接官と一緒に話しているうちに分かってきて正解が出てくる、という方が問題解決能力とかチームで取り組む能力があるように見えて、いい評価を得られることがある。この時に必要になってくるのは今考えている論理の道筋をうまく英語で説明しながらコードをホワイトボードに書くこと。黙ったままモクモクと間違っているコードを書くのが一番良くない。

もし私が日本でしか仕事をしたことのない技術者で海外を目指していたとしたら、TOEICの勉強なんてそこそこにしてcodilityで英語の勉強をしまくる。今になってみれば分かるがその方が海外転職に向けて一直線に要件を満たすスキルが身につくからだ。

面接官の立場で技術面談をすることが多くなったが、この種のコーディング面談がスムーズにできる人に当たると「あーこの人となら一緒に働いたらいいだろうなー」と素直に思ってしまうもんだし。

で、上記の問題をRubyで解いてみた。こういうの解くのまーまー楽しい。

```lang:Ruby
def solution(a)
  goal = a.length - 1
  score = Array.new(a.length)
  score[0] = a[0]
  a.each_index do |index|
    (1..6).each do |dice|
      pos = index + dice
      if score[pos].nil?
        score[pos] = score[index] + a[pos]
      else
        score[pos] = [score[pos], score[index] + a[pos]].max
      end
      break if pos == goal
    end
    return score[-1] if (index + 1) == goal
  end
end
```

もしこれをお読みの方で本気で海外転職を目指す方がいらっしゃれば、ここにいろいろ対策なんかも書いたので、ご参考に。[シンガポールのスタートアップで働くソフトウェアエンジニアの悪戦苦闘ブログ - 海外転職](http://tango-ruby.hatenablog.com/archive/category/%E6%B5%B7%E5%A4%96%E8%BB%A2%E8%81%B7)


# エンジニアの皆様へ
「[ほとんどのエンジニアには解けるが、下位10％のダメなエンジニアにだけ解けないパズル?](http://tango-ruby.hatenablog.com/entry/2015/11/30/122814)」なるものをシリーズ化して８パズル作成した。実はこのパズル作成の経緯こそが転職応募者向けだったのだが。詳しくは以下のページへ。もしご興味あれば解いてみてください。
http://tango-ruby.hatenablog.com/entry/2015/11/30/122814