ITエンジニアの海外転職で出された技術問題をそのままここに貼り付ける - その1
移転しました。
エンジニアが海外転職をする際に必ず出されるのが技術問題で、それらは本当に玉石混交。いい問題もあれば、なんかしっくりこないクソ問題もある。私が現職で応募者に技術問題を出す際にはいつも「外部のネットに書いたり、人に問題の内容を教えたりしないでね」と一言付け加えている。ただ全ての会社がそんなこと言ってる訳でもない。特に注意が無かった会社の技術問題はちょっとぐらい外に出しても文句を言われる筋合いは無い、と解釈してここに少しずつさらすことにした。きっと日本から海外転職をお考えのエンジニアにとっては参考になると思う。
出題した会社:ロンドンのITスタートアップ
応募職の求める技術:Ruby、Rails、サーバーサイドのメンテナンス、その他いろいろ
問題の形式:画面を共有して応募者がコードを書く様子をモニタリングして、出題する。本問題に特に制限時間は無し。Google検索は不可。「なるべく考えてることを話しながら(英語)コード書いてね」とのことだった。
Exercise 1 - Ruby
In as few lines of code as possible, implement a class Person so that each instance of this class can have children and grandchildren (of that same class Person) - but not beyond grandchildren.
問題は単純。Personクラスを作って、そのPersonのインスタンス変数には子供(children)が何人か居て、さらに孫も何人か居るように設計してね、と。
こういうのを出された時に私が言う第一声はいつも同じ。「いい問題だねー」と。で、これは技術問題の最初の第一問としては素直にいい問題だと思う。難しすぎず、特定の技術を要することなく基本ができていればだいたい解ける問題だし。
向こうの担当者はモニター越しに応募者がコードをどのぐらいのスピードで書けるか様子を見ていて、イケてそうなら次にもう少し難しい問題を。ダメそうなら次にカンタンな問題に移るのだろう。
出題された時に私が書いたコード。今から読み返すと改善の余地もあるかもしれないが、まーこんなもんでもOkかな、と。
class Person attr_reader :children attr_reader :name def initialize(name, children: []) @name = name @children = children end def grand_children @children.flat_map(&:children) end end
実行する時
grand_child = Person.new('GrandChild A') grand_child2 = Person.new('GrandChild B') child = Person.new('Child A', children: [grand_child]) child2 = Person.new('Child B', children: [grand_child2]) parent = Person.new('Parent A', children: [child, child2]) p parent.name p parent.children.map(&:name) p parent.grand_children.map(&:name)
実行結果
$ ruby person.rb "Parent A" ["Child A", "Child B"] ["GrandChild A", "GrandChild B"]
この手の問題を突破するためのコツとしてはいくつかコード書きながら話すネタを用意しておくこと。それはどんな問題が出た際にも普遍的に話せるネタの方がいい。つまり冒頭で「英語で話ながらコード書いてね」と言われるのだが、それが案外むずかしい。本来なら考えていることをそのまま言えればいいのだが、あんまりいいアイデアが無い場合にそれをするとボロが出まくる。そうした事態を避けるには「オレってコード書く時はいっつもVimを使っててね。以前はEmacsも試したんだけどやっぱりVimだよね。だって。。。」と意味はなくても話せるネタがあればかなり心強い。
想像して欲しいのだが「あれ?この問題ムズい。どうしよう。。。」と考えてモニターを眺めて黙ってしまっている時の気まずさはかなりある。そういう状況はやたら焦るのだ。「なんか英語で言わなきゃ!でもどうやってコード書いたらいいのか分からん!でもなんか言わなきゃ!なんて言う?こんな時、英語でなんて言ったらいいんだー!!」とかなってたら本来書けるはずのコードすら書けなくなる。したがって話のネタは用意すべし。
どうでもいいことでも話してたら心が落ち着くし、少なくとも雰囲気は保てる。こうした技術面談は技術だけじゃなく「こいつと一緒に働くことになってもOkか、どうか」も見られている。ムスッと黙って何も言わない人になってしまうと「こいつ大丈夫かよ?」となってしまうので、話しネタは重要。
上記の問題を見て「こんなカンタンな問題、楽勝だわ」とお考えならば、それを国境を超えた向こうの会社の人にモニター越しにあなたのタイプをひとつひとつ眺められてかつ英語で話しながらコード書かされることはだいぶ雰囲気が違うんですよ、と言いたい。慣れたらどうってこと無いんだけど。