アメリカに何の縁もないプログラマが渡米して働くには？

**12/8/2014追記:　普通のプログラマの定義が色々と誤解を受けているようなので、日米の文化的差異を含む背景を説明しました。最後のセクションをお読み下さい。**

**12/7/2014追記**：　推敲せずに一気に書いたので、色々と説明不足な点がある事に気づきました。補足や私のこの件に関する考えをツイートしましたので、興味のある方は[そちら](https://twitter.com/c_z)を御覧ください。　

#はじめに
私は[アメリカの州立大学](http://med.ucsd.edu/Pages/default.aspx)にて、研究助手兼[科学アプリケーション](http://www.cytoscape.org/)開発者兼NIHスポンサードの[NPOメンバー](http://nrnb.org/)という比較的珍しいポジションで働いております。手短に言えばカリフォルニア州政府職員、つまり公務員です。私はかなり例外的な経路でアメリカで働くことになったため、私自身の経験はそれほど他の方の役に立たないですが、外国人がアメリカで働くことの諸問題は経験していますので、その辺りのことが参考になればと思いこの記事を書きました。

#日本人が米国でプログラマとして働く場合の問題点
アメリカでは**普通のプログラマが足りていません**。全く足りていません。しつこいですが、本当に足りていません。我々も人を雇おうと募集をかけるたびに膨大な「自称プログラマ」の履歴書が届き、電話インタビューをして落胆し...ということを繰り返しています。ここで言う普通とは、計算機科学の学位を持ち、いくつかの言語でコードが書けて、テストが作成でき、英語でドキュメントの読み書きができて、アーキテクトと協力してモジュールレベルの設計と実装ができるレベルの人を指しています。スーパーハッカーを探しているわけではありません。このレベルを軽く凌駕する優秀な日本人のプログラマが多数いるのは私も知っていますが、それにもかかわらずアメリカで彼らが働くのはとても難しいです。これはどういうことなんでしょうか？以下でその理由を述べます。


## 運の要素
一括就職のようなシステムがないアメリカですが、外国人が働くには一年に一回やってくるビザの抽選という関門が待ち構えます。[H-1B](http://www.uscis.gov/eir/visa-guide/h-1b-specialty-occupation/h-1b-visa)と言う、プログラマのような技術者がアメリカで働くための一般的なビザは、一年に新規発行できる最大数が決まっており、これを決めるのは政治の問題です。多くの調査では、比較的高給取りになることが多いH-1Bホルダーをアメリカに受け入れるのは経済にとってプラスになることが示唆されていますが、表面的には「外国人がアメリカ国民の仕事を奪っている」と見えるので、なかなかアメリカ国民としては感情的に受け入れがたいようです。この問題に悩まされているシリコンバレーの大手が重い腰を上げてロビー活動を初めてますが、未来は不透明です。

アメリカの経済が上向きの時、このビザに対する需要は急増します。そもそも一朝一夕でそれなりに働けるソフトウェア開発者を育てることには無理があるので、アメリカ国内でその人材に対する需要の急増に応えきれていないのが理由です。そして応募者の総数が上限を超えた場合は抽選になります。これにはアメリカで大学院以上の学位を取得した人向けの優先枠と、それ以外の学士号取得者の２つのカテゴリに分けて行われますが、近年はどちらのカテゴリもまず間違いなく抽選になります。すなわち、**どんなに実力があってもこの部分は純粋に運になるため、優秀な外国人でも二の足を踏む理由の一つになっています**。（LinuxのオリジネーターであるLinusのような、業界全体にインパクトを与えるような貢献をしている人ならば、Oビザというこの制限に関係ないビザの可能性もありますが、これは例外的なものです。）

実際に行動を考えておられる方は、この辺りの最新情報はきちんと移民法専門の弁護士の方にご相談下さい。非常に移り変わりが早いので。


## 英語
英語が全く出来ない人は、やはりアメリカで働くのは無理です。異常な才能を持った天才プログラマならともかく、通訳をつけるなんていう余裕はどこにもありませんので、チームの一員として基本的な意思疎通の出来るレベルの英語は必要です。そもそもこれが出来ないと電話インタビューも突破できません。しかし、必要以上に神経質になる必要もありません。**基本的にはコードがもっとも重要な世界では、弁護士やカウンセラーに求められるようなレベルの英語の流暢さは求められません**。私は常に英語赤点の酷い語学力で渡米しましたが、今では下手くそながらどうにか英語で議論したりするレベルの英語力はありますので、必要に迫られればなんとかなるものです。目指すレベルの目安としては「英語でアメリカ人学生相手に授業をして、『あいつは何を言ってるのか全然わからない』、と言う苦情が出ない程度」の英語力を目指して下さい。難しい表現を使い流暢に話すというより、簡潔な表現でいいので、相手に話のバックボーンとなる部分が伝わることを意識すれば大丈夫だと思います。いずれにせよ、極端に英語を話す機会に乏しい日本では、これもソフトウェアエンジニアが渡米して働くときの障壁の一つになっています。

##守るべきもの
当たり前ですが、日本でそれなりのポジションを得ていた方々は、それを全て捨てて渡米することになります。更に家族もあれば、言葉が全く通じない環境で適応できる人かどうかということも関わってきます。中にはそれがストレスで耐え切れなくなる人も居ます。ここも自分ではどうしようもない部分があり、一つの障壁です。

#実際のオプション
これだけ様々な問題があってもなお働いてみたいという方には、普通の方にも出来るオプションがいくつかあります。

## キャリアアップとしての留学をする
とても長い道のりですが、結局普通の人が就職するにはこれがある意味一番可能性が高いかもしれません。日本で関連分野の学位を持っていることが前提になりますが、**アメリカの大学院の計算機科学コースに入学して修士（もちろん博士でも構いませんが、その場合は6-7年を想定して下さい）を取ることです**。これには通常二年程かかります。大学院に入学するための情報はたくさん出回っていますので省略しますが、大学時代の成績がそれなりによければ、あとはTOEFLのみ対策すれば大丈夫だと思います。GREは数学は日本人にとっては考えなくても答えられるものばかりですし、逆にVerbalのセクションはやるだけ無駄です（私も捨てて受験しました）。

**ちゃんとコードの書けるアメリカの院卒のプログラマは引く手あまたです。たとえ外国人でもあっても、欲しがる企業は多いです**。余談ですが、某大手に勤めている友人の話では「今年はX人計算機科学の博士を雇う」と言う目標を持って探しているくらいですから...

無事入学出来ましたら、以下のことに注力して下さい。

###スペシャリティを作る
こういった道を模索する方のほとんどが、既に日本でソフトウェア技術者として働いていたのではないかと思います。その場合、何らかの興味のある分野、技術などがあるはずです。大学院ではそれを掘り下げて下さい。私は計算機科学の学士を取得後、多分それだけだと外国人として就職するのは難しいと思い、プラスアルファとしてバイオインフォマティクスを学びました。最近ならば、需要の多い人工知能系の周辺技術を掘り下げるのも良いでしょう。最終的にしたい仕事を念頭に置きながら専門を作って下さい。

### コネを作る
コネを使うというのは何も学校の先輩等に頼ることではなく、学生の身分で渡米したとしても構築することは可能です。現在は、数えきれないほどのオープンソースプロジェクトがありますので、ぜひ自分の興味のあるプロジェクトにコミットして下さい。何もいきなりコアコミッターになる必要はありません。バグを見つけたらpull requestを送るのもよし、本家に足りていないドキュメントを書くもよし、プラグイン構造を持つシステムなら、便利なプラグインを書くのも良い考えです。とにかく、何らかの分野で自分の名前を売って下さい。これが長い目で見て最も確実な異国でのコネクション構築の方法です。口先だけではなく、手を動かしてものを作る人はアメリカでもちゃんと評価されます。

#### Google Summer of Codeに参加する
上に関連して、大学院生として[Google Summer of Code](https://developers.google.com/open-source/soc/?csw=1)に参加することをお薦めします。これは有名プロジェクトのコアコミッターに直接のコネクションを築く近道です。

##OPTの期間を活用する
さて、以上のような忙しい日々を過ごして無事に計算機科学の修士を取得できたとしましょう。米国で修士を取るメリットの一つに、この卒業後最大29ヶ月(12+[STEM extension最大17ヶ月](http://www.uscis.gov/eir/visa-guide/f-1-opt-optional-practical-training/understanding-f-1-opt-requirements))働ける許可がもらえる点です。外国人を雇うことに企業が躊躇するのは、ビザ取得に膨大な労力がかかるのが理由です。しかし、就労許可さえ持っていれば、アメリカ人と同じ条件で面接を受けられます。この間にアメリカ国内でポジションを見つけ、できるだけ早い時期にH-1Bへの切り替えを目指して下さい。

###学生時代に築いたコネを使う
当然ですが、ただ単にresumeを送ってきた人より「xxプロジェクトのAさん」と言う形で紹介された方が圧倒的に会って話を聞いてもらえる確率は上がります。オープンソース関連だけではなく、有名研究室に所属していた方ならば、教授の紹介も有効でしょう。

----

###H-1Bの上限を無視できる別の方法
私の経歴があまり参考にならない、と言った理由がこれです。**H-1Bには毎年発行の上限数がありますが、大学などの研究機関にはこれがありません**。大学院を卒業後、研究助手などのポジションで働く場合は、研究員にとっては比較的取りやすいJ1と言うビザを申請できる可能性があります。そこで働く中で貴方が高度な技術を有する代替の難しい人材だと認められれば、研究所をスポンサーとするJ1からH-1Bへの切り替えも可能です。ただし、**これには非常に安定したグラントが必須という前提条件があります**。私は、たまたま入った研究室で取り組んでいたソフトウェアが業界標準になると言う幸運に恵まれたため長期のグラントを得ることが出来ましたが、これもまた不確定要素が多く、万人にお薦めできる方法とは言いがたいです。しかし、貴方が民間よりも給与は低いが自由度の高い労働スタイルを好む方ならば、こういう道もあるということは覚えておいても良いかもしれません。

#おわりに
かつてアメリカは「移民の国」と呼ばれ、移民に寛容な国でした。過去形なのは、今では**米国市民との結婚以外の方法でアメリカで働く許可を得るのは極めてハードルが高いからです**。上に書いたような、日本人にとってはかなり覚悟のいる方法くらいしか無いのが実情です。極度に社会が複雑化し、高スキルを必要とするポジションと、そう必要ではないポジションに求人が偏るという先進国ではおなじみの病をアメリカも患っています。このような中、急にアメリカがまた移民にとって開かれた国になるとは考えにくいです。

しかしそれでもやってみたい、と言う方々は是非挑戦してみてください。At your own riskですが、刺激もありますよ。

----

##追記 - **普通のプログラマ**とは何か？
日本の事情に疎いので、こちらで人を探すときに当たり前のように使う*Bachelor of Science in computer science is required*というフレーズをそのまま日本語にして「普通のプログラマ」の定義に含めた所、違和感を感じた方が多かったようなので少々補足します。

### 日米の差
アメリカでプログラマとして働き始める場合、大きな企業でも一から教えてくれるなどということはありえません。そもそも新卒と中途採用などという別々の入り口もありません。10年20年と一箇所で働くことが稀なので、何年もかけて新入社員を育てるなどということはありません。**日本が会社に就職する文化なのに対して、アメリカは役職に就職すると言う文化です**。すなわち、Job Descriptionに書かれたことが数週間〜数ヶ月の適応期間内に完全にこなせるようになる人を探します。そしてポジションが無くなればその人を解雇します。

そういった社会では、その人が職務をこなせる人間かどうかを判断するのに大学の学位を「その職業に就くための免許」のように扱うのです。つまり、学位はスタートラインに立つための許可証のようなものです。従って、アメリカは日本よりもはるかに学歴社会です。そこをまずご理解ください。良い悪いではなく、事実としてそうなっているのです。**プログラマの世界では、計算機科学の学士号がプログラマの世界で働く際の参加証、修士が応用分野に挑戦するためのショートカット、博士号が研究に関わるためのライセンスと考えてもらえば良いでしょう**。だから、社会人がわざわざ高いお金を払って大学に入り直すといったことが一般的なのです。

プログラマが比較的高給の仕事だと認識されているアメリカでは、このように学位を使った一定のフィルタリングを行わないと、凄まじい数の「誇大広告入り」履歴書が届き、雇う方がパンクします。特に我々のような小規模な組織や中小企業ではそれが顕著です。キャリアの浅い人を雇う場合、大学の名前はあまり見られませんが、学部とGPAは必ず見られます。逆に、長いキャリアのある人であれば、学位がなくても顕著な功績があれば問題無いです。


###教育の問題
そうやって一定のトレーニングを受けた人のみをフィルタリングして面接しているはずなのに、fizzbuzzを解けない人が時々やってくるのもまた悲しい現実です。[Joel on Software](http://japanese.joelonsoftware.com/)と言う有名なプログラマ兼作家の本があります。日本語版も出ているので読んだ方も多いでしょう。彼は計算機科学教育に潜む問題点を幾つか指摘しています。それは大学で教えることと、実践の間にあるギャップです。これは教育者のあいだでも認識されており、常にカリキュラムを改良しようと皆さん努力されていますが、リベラルアーツも重視される大学という場所では専門に割ける時間が限られており、なかなか難しい問題です。この問題への解として、Bootcamp等と呼ばれる集中トレーニングや、Extensionと呼ばれる大学の社会人向け講座（より具体的かつ実践的なトピックが扱われます）などがありますが、どれも決定打ではなく、今後も様々な方法が考案されていくでしょう。

こういった大学以外で発行されたcertificateなども、定評のあるプログラムならば今後は考慮する会社も出てくるのではないでしょうか。


### 具体的な普通の定義
具体的に言うと、アメリカ人が経験者を雇おうとする時、「普通」というのは以下の様なものだと思います:

- キャリアの初期なら最低1つ、中期以降は複数のプログラミング言語を自由に使える
- 計算量（Big O notation等）の概念が理解できている
    - PとNPに関する深遠な議論をしろと求めるわけではないです。あくまで概念の理解で十分です
- 基礎的なデータ構造とアルゴリズムが分かる
    - ソート、サーチから基本的グラフアルゴリズム、動的計画法程度で十分です
- *Code Complete*や*プログラミング作法*に書いてあるベストプラクティスがそこそこ実行できている
- テストが書ける
- ソースコード管理システム、各種自動化の重要性を理解できている
    - もちろん実際に使えることを期待しています
- 新しい技術やパラダイムが出現した時、それを学ぶ方法を知っている
- **コードは人間が読むもの。機械のために書いているわけではない**と言う言葉の意味が理解できる

この程度です。プロジェクトによって必要な詳細技術は異なりますが、この辺りはほとんどのプロジェクトで共通して求められる点だと思います。ここに書かれたことの半分以上は必ず大学で学びます。最後の方の項目は一部経験の中で学びます。だからこそ、少しでも「普通の人」が来てくることを期待して、アメリカの企業はBS in CS is requiredの一文を求人票に入れるのです。

一部の超カッティングエッジなプロジェクト以外では、決して多くは求めていません。アメリカで働くのに、魔術師である必要はないのです。