ITエンジニアの海外転職で気にするべきこと、気にしなくていいこと
ITエンジニアが海外転職をする際に気にするべきこと、気にしなくていいことをまとめた。
なんか最近やたらとエンジニアに海外転職をすすめている記事が目につく。(このブログも基本そういうスタンスだけど)エンジニアが海外に仕事場を移して、そこでさらに活躍されることには賛成だ。ただ人様にそれをオススメする場合にはちゃんと整理した情報を載せる必要がある。たしかに日本に比べれば稼げる可能性が高いし、ワークライフバランスも良さげ。そんなメリットばっかり書いて「海外転職なんて楽勝!カンタン!」とか書くと変な勘違いをしてしまう人が居そうで、余計な心配が頭をよぎる。仮に不本意な結果に終わってしまっても、そのテキトー記事書いた人は責任取る訳ないので、実行に移す際には情報の裏を取るなりして十分に気を付けて欲しい。
もちろん本ブログで書いてることについても裏をとっていただいて結構だ。
私はシンガポール国内はもちろんヨーロッパと北米の会社の転職面談を何回もこなしているので場数だけはかなり踏んでいる。現職では面接官として転職応募者の方と面談をしている。日本の一般的なエンジニアよりも海外転職の酸いも甘いも噛み分けている方だと思う。
ここでいうのは日本よりも一人あたりGDPの高い国(先進国)にある非日系企業にエンジニアが海外転職する場合に限る。もし転職者が狙っているのが日本よりも一人あたりGDPが明らかに低い国の場合、就労ビザの取得条件が比較的容易になる。どんな国を選んで仕事するかはその人次第なので、いちいち「どこどこの国がオススメですよ!」とかは言えない。
日系企業は海外に支店があってももろに日本の労働文化を継承しているので、ここで書くことはあてはまらない。
したがって以下は先進国の非日系企業への転職時について。
項目を挙げるとこのようになる
気にするべきこと
- 工学系の大学卒業資格
- エンジニアとしての業務経験
- 語学力
気にしなくていいこと
- 大学のランク
- 現職の会社規模とランク
- 年齢
まず気にするべきことから説明する。
気にするべき、工学系の大学卒業資格
これについては会社というよりも就労ビザ取得のために必要な事項になる。実務においては文系学科を卒業されてエンジニアとして立派に成功している人がたくさん居ることは分かっている。ただどんなにエンジニアとして優秀であっても海外における就労ビザ取得に関しては学位と専攻内容が業務に一致している必要がある。大学で経済学を専攻して、ITエンジニアとして働きたいです、となっても就労ビザが出にくい現実がある。兎にも角にも工学部でしかもコンピュータ・サイエンスを専攻していれば海外転職成功の可能性がぐっと高くなるのだ。
※ アメリカのH-1Bビザで実務経験を大学資格に代替えする件に関しては末尾のyambe2002さんのコメントを参照ください。
気にするべき、エンジニアとしての業務経験
これは転職先の会社にとっての必要事項になる。日本も含めて世界の全てのエンジニア職には実力が求められる。「アタシできます!がんばります!」とか言っても大して意味はなく、結局は前職でどんな実績を積み上げてきたのか、が問われる。この点から大学を卒業して、就労経験無しにいきなり海外に挑戦するのは非常に難しい。例えばアメリカに渡って新卒入社をしようとしても元来「新卒入社」というコンセプトは海外には無い。しかも地元アメリカの学生は英語はもちろんネイティブだし、熾烈な競争を経てインターンとしてその会社に入り込んでなにかの実績を積んでいる人達がライバルになる。そんな中で例えば日本から英語イマイチ、実務経験ゼロの学生が来ても取る理由がない、となってしまう。
批判されつつも「新卒入社」というカードが日本では使える。そのカードを有効に使って、日本のどこかの会社に入り込んでそこで実務経験を積んでから海外に渡るのもアリだと思う。
気にするべき、語学力
語学力は言うまでもなく必要なのだが、時々「語学力が無くてもなんとでもなります!」みたいな記事があって、それにはまったく賛同できない。低い語学力を十分にカバーできる何かがある人はいいのかもしれないが、そんなのはマレなケース。海外に出る際に語学力というのは仕事だけではなく生活においてもとにかく必要。「あるにこしたことない」とかのレベルではなく「無ければ生活全ての質が下がる」と言いたい。
気にしなくていいこと
気にしなくていい、大学のランク
どんなランクの大学であろうととりあえず工学系のコンピュータ・サイエンス学科を卒業していればほぼ問題無い。これは逆に言えば、とても高い日本の学歴をお持ちの方でそのキラキラな学歴を使っていいポジションについている人が海外に出れば、その学歴は有効活動できなくなる。誰もが知っているのは一部のアメリカやイギリスの有名大学だけ。
Fラン大学なる言葉が流行っているようだが、Fランでも何ランでもコンピュータ・サイエンスならOkというのが海外。それはアメリカをはじめとしてほぼ全ての大学のコンピュータ・サイエンス学科で学ぶ内容はかなり実務に即した内容でかつマジメに勉強しないと卒業がとても難しいからだ。ヨーロッパの大学なんかでは相当な数の学生が卒業できずに途中で脱落していく。ということで日本の大学でも卒業しているだけで「おおーマジメに勉強して卒業したんだな!」と思ってもらえるのだ。(正直、私は全員がマジメに勉強した訳ではないと思っているが。。。)
気にしなくていい、現職の会社規模
現職の会社規模とランクも学歴と同様に使えない。理由はほとんどの人は日本の会社とか知らないし調べないから。もちろん日本の大企業も知られているブランドはある。ソニーやトヨタなど。だからといってITエンジニアとして「日本の大企業に勤めてましたー!」というのが有効であったことは無い。そういう前職のランクよりもその人が何ができる人なのかを徹底的に見てくる。
面接官としてインドからの応募者と面談した際にその人はインドのとても有名なデカい会社に勤めていました、と主張していた。私はその会社を知らなかったしなんとも言いようがなかった。履歴書に書かれた前職であえて目をひくのはGoogleやAppleなどのアメリカのIT大企業だけになるだろう。むしろそういう企業のランクよりも前職のボスの評価とかの方が重要。前職のボスに直接電話して「**ってのが転職の面談に来てるんだけど、アンタが一緒に働いてた時の働きぶりはどうでした?」と聞いたりするからだ。
気にしなくていい、年齢
日本ほど年齢にシビアではない。かなりのオッサン年齢でもITエンジニアとしてバリバリに活躍している場面によく遭遇する。年齢の壁は日本に居た時の方がとても強く感じていた。30過ぎたらマネージメントやってなければクソ扱い。40過ぎたら転職先なんてゼロ、というのが日本の現状だと思う。それに比較すると海外ではそういう年齢差別が法律違反というのもあるが、普通に「年食ってても技術あってしっかり仕事してくれればOk」となっている。
その逆も同じ。どんなに若くても実力さえあれば、突然に高いポジションを高給で任されることになる。明確な理由もなく年齢だけで「まだまだ坊やだから、この雑用でもやっとけ」とかは一切ない。
まー同じ技術レベルなら若い方が有利かもしれないが、なんにしても日本ほど年齢を気にする必要はない。
以上、ITエンジニアの海外転職で気にするべきこと、気にしなくていいことでした。
動的計画法(Dynamic Programming)をサルでも分かるように説明する - その1(フィボナッチ数列)
「動的計画法(Dynamic Programming、以下DP)をどんな人にも分かるように丁寧に解説する」というこれまで何人もの優秀な方々が挑戦した内容にあえてまた参戦することにした。
「動的計画法」とか「Dynamic Programming」でググると山のように解説ページがヒットする。お決まりのセリフは「とてもカンタン」「誰にでも分かる!」しかし実情は難しいし、どの解説を読んでも「カンタンじゃねーよ」と思ってしまう。その理由について以下の仮説をたてた。
- 解説を書いている人はDPをカンタンに理解できるほど頭がいい
- 頭が良すぎて「読んでも分からない人の気持ち」が分からない
- 解説を読んで「オレならもっとカンタンに説明できるゼ!」という人が現れる
- そんな人もやっぱり頭がいいので1に戻る
- 以下、無限ループの繰り返しで、世の中にDPの解説が溢れる
これはDPの解説があり過ぎるからもう要らないのではなく、むしろどんどんよりカンタンで分かりやすい説明が必要とされていることの裏返しなのだと勝手に理解した。ということで書いた。
DPはアルゴリズムの最高峰??
もしDPを今まで聞いたことがない人のために分かりやすく説明すると「わりと難しいけど、使い所さえ掴めば便利な方法」と言える。こちらのウェブサイトに「Programmer Competency Matrix(プログラマ能力指標)」なるものが勝手に定義されている。
その定義によるとアルゴリズムに関しては
レベル | 内容 |
---|---|
レベル0 | 配列に含まれる数値の平均値を求めることができない (信じ難いことですが、そんなプログラマ候補者と面接したことがあります) |
レベル1 | ソート、検索、データ構造トラバーサル、データ取り出しアルゴリズムの知識がある。 |
とかあって、最高レベルのがこれ。
最高レベル | DPソリューションに気付いてコーディングすることができ、 グラフアルゴリズムや数値計算アルゴリズムの知識が豊富で、NP問題などを特定できる。 |
まー真意の程はさておき、DPがよく分かっていて使いこなせると高レベルと認識されますよ、と。
フィボナッチ数列
最もカンタンなDPの実装例はフィボナッチ数列になる。これはどの解説でも同じ。最初の例はいつもフィボナッチ数列。
フィボナッチ数列とは
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,
前の2つの和が次の数字になる数列。自然界の現象にも存在する数列で小学生向けの中学入試なんかにも度々登場する。
n番目のフィボナッチ数列の数を求めるコードを書く。
なにも考えずに総当りの再帰で書くとこうなる。ここではこれを全探索版とする。
【全探索版】
def fib(n) if n <= 1 return 1 else fib(n-1) + fib(n-2) end end
ためしにputsで順番に出すと数列が出る。
puts fib(1) puts fib(2) puts fib(3) puts fib(4) puts fib(5) puts fib(6) puts fib(7) puts fib(8) puts fib(9) 結果 $ ruby fib.rb 1 2 3 5 8 13 21 34 55
しかしこの方法では計算量が多すぎて、まともに結果が返ってくるのはせいぜい40番目ぐらいまで。
このコードでは例えば7番目の数を出す際にはその手前の6番目と5番目の数を指す必要がある。6番目の数を出すには5番目と4番目が必要。5番目を出すには4番目を3番目が必要。と順番に全ての必要な数を繰り返し計算している。つまり2n回分の計算が必要になる。
上の図で分かるように重複した数字を何度も計算している。
これを効率よく計算するのがDP。DPは大きく分けて2種類ある。
2種類のDP
- トップダウン:メモ化再帰、メモ化
- ボトムアップ:分割統治法、漸化式ループ
この2つに分けられる、とする。ここで「いやいや厳密に言うと**という方法があってだな」とやられるからややこしくなる。ここで2つに大別した方が後の理解がより容易くなる。
トップダウン:メモ化再帰
これは計算した結果を記録しておいて、同じ数に関しては1度しか計算しないようにする方法。
@f = [] def fib2(n) if n <= 1 return 1 else if @f[n] return @f[n] else @f[n] = fib2(n-1) + fib2(n-2) end end end
メモ(記録)して、それがあればそのまま出す。メモが無ければ計算してメモに入れておく、をしているのがこの箇所。
if @f[n] return @f[n] else @f[n] = fib2(n-1) + fib2(n-2) end
ただそれだけなのだが、ベンチマークで測るとすごい差が出る。
require 'benchmark' Benchmark.bm(10) do |b| b.report "fib" do fib(35) end b.report "fib2 (DP)" do fib2(35) end end user system total real fib 1.300000 0.000000 1.300000 ( 1.306700) fib2 (DP) 0.000000 0.000000 0.000000 ( 0.000012)
これは当然のことでn=35とかになってもDP版は35回しか計算しない。それに引き換え、全探索版では29,860,703回の計算を行っている。
ボトムアップ:分割統治法、漸化式ループ
これは最初の再帰の処理において繰り返しがたくさん発生するのはトップダウンで上から下に向かって、計算することが原因としてある。逆に下から上に計算すれば1方向で何度も計算しなくて済む、という方法。
以下の図で言えば7から始めるから計算が多い。左下の1から上に上がっていけば少ない計算数で7まで辿り着く。
コードで書くとこのようになる。
def fib3(n) if n==0 return 1 else fib1 = fib2 = fib3 = 1 (n-1).times do fib3 = fib1 + fib2 fib1 = fib2 fib2 = fib3 end return fib2 end end
やってることは単純で数列の一番の最初の1,1,から始めてそれらを足して次々に数を求め、nに達したら止める、と。
ベンチマークはこの通り。全探索版との差は一目瞭然。
user system total real fib 1.900000 0.010000 1.910000 ( 1.904163) fib3 (DP) 0.000000 0.000000 0.000000 ( 0.000009)
実は他にももっと計算量を少なくする書き方があるが、そこを議論してもDPの概念理解の助けにはあまりならない。まずは大きく分けて2つあるトップダウンとボトムアップのDPを理解することで次にすすめることができる。DPを理解するにはここの例で示したのとまったく同じ手順を繰り返すこと。すなわち
- 問題を全探索で解く(実際にコードを書かなくても頭の中で考える)
- 全探索版を「トップダウン:メモ化再帰」にする
- もしくは全探索版を「ボトムアップ:漸化式ループ」にする
少なくとも私は上記のフローにしたがって学習することで少しずつ理解できた。
だいたいはここまではカンタンに理解できる。難しいのはこれらの知識を他の問題に応用したりするところ。それは次回以降ということで。
小学3年生向け英語ボキャブラリーテスト【シンガポールの地元校版】
こちらの小学生達は英語のテストをリスニング編、スピーキング編、書き取り編と3部に分けて行う。書き取り編のボキャブラリー選択問題を抜粋した。
英語のテストとしてまーまーいいので6問だけ試してみてはいかがでしょうか?
勝手に作ったり改編したのではなく、実際に出題されたテストからの抜粋です。
Section B :Vocabulary
For each of the questions 9 to 14 four options are given. One of them is the correct answer. Make your choice (1, 2, 3 or 4).
[9] Seeds that are planted on _______ soil will produce healthy plants.
(1) dry
(2) poor
(3) fertile
(4) tough
[10] Muslims do not eat pork because of their religious _________.
(1) wants
(2) beliefs
(3) actions
(4) behaviours
[11] Rahimah __________ the passenger next to her with her elbow when he fell asleep on her shoulder in the MRI train.
(1) stuck
(2) nudged
(3) pierced
(4) wrenched
[12] On her way home, Winnie saw someone behaving __________ outside her neighbour’s house.
(1) actively
(2) suspiciously
(3) unknowingly
(4) enthusiastically
[13] My parents __________ me when I did well for my examinations.
(1) chided
(2) praised
(3) consoled
(4) reprimanded
[14] Mr Muthu travelled from India to Singapore in 1971 hoping to make a __________ here and he did.
(1) luck
(2) wealth
(3) fortune
(4) prosperity
テストの抜粋はここまで。
ここから下に解答を載せます。
Q9 | Q10 | Q11 | Q12 | Q13 | Q14 |
---|---|---|---|---|---|
3 | 2 | 2 | 2 | 2 | 3 |
これらのテストはシンガポールだと小学3年生の英語力はだいたいこのぐらいですよ、という目安にもなる。アメリカやイギリスと違ってシンガポールはバイリンガル社会。なので英語はほぼネイティブといっても、それだけやってればOkな訳ではない。全ての小学生が英語と中国語、とか英語とタミル語などのバイリンガルであることが求められている。で、実際に小学生のガキであろうと2,3ヶ国語を瞬時に切り替えてよくしゃべっている。これは日本人にとって「奴らは英語ネイティブだからできて当たり前。私達の母語は日本語だから英語なんてできなくても当然」という言い訳はなにか「?」と感じる。
バイリンガル教育が発達したシンガポールの語学教材はテストにしても、教科書にしても「よくできるなー」といつも感心してしまう。