ベルリンのITスタートアップで働くジャバ・ザ・ハットリの日記

日本→シンガポール→ベルリンへと流れ着いたソフトウェアエンジニアのブログ

海外の技術職への転職の際に英語で行われる技術面談対策はこのサイトでやっておいて損はない

英語圏のエンジニア職に転職しようとする際に避けては通れないのが技術面談。何度かこのブログでも紹介しているが、もし海外のエンジニア職への挑戦をお考えの方が居ればこれは十分に対策をとっておいた方がいい。

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

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

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

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

問題は次のアルゴリズムの問題。これは単にアルゴリズム論の本を読めばいい、というほど単純ではない。英語で聞かれて、英語で応えるリズムや思考回路が必要になる。そこでオススメするのが下記のサイト。

Take our free programming lessons - Codility


日本でもあるのかは知らないが、とにかくアルゴリズム系の問題を集めたサイト。各種のプログラミング言語に対応しており、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で解いてみた。こういうの解くのまーまー楽しい。

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

もっとエレガントな方法をご存知であればぜひコメントください。自分より賢い人から、エレガントな方法を教えられた時の感覚は無上の喜び。(←マジメに言ってて、本当にそう思う)