トロントの自動車保険事情

  • トロントの自動車保険はすごく高い。
  • とくに年齢による差が激しくて、たとえば18歳で初級のライセンス(日本でいうグリーン免許証的な)を持っている場合、大体年間で100万円ぐらいする。
  • 大体フルライセンス(日本でいうゴールド免許)を持っている30歳前後でも、年間30万円ぐらいする。
  • あと住所による差も結構激しくて、上述したデータは郊外のエリアも含めた平均値であって、ダウンタウンの中心に住むとさらにこれより高くなる。
  • 困ったこととしては、多くの保険会社が、カナダでどれぐらい保険にすでに入っているかという指標をもとに保険料を算出してくるので(日本でいう等級)、移民にとっては仮に十分な運転経験があったとしてもカナダの免許取り立ての運転者と同程度のレートを課せられることが多い。
  • 保険会社によって計算基準が割と違っていて、自分のケースだと年間120万ぐらい出してきたところもあれば、年間40万程度だったところもあった。
  • いずれにせよ、日本の保険料とは桁が違うし、保険大国アメリカの保険料と比べてもずっと安い。
  • 自分が調べた中ではDesjardinsというところが一番安かった。自分が調べた範囲では唯一、USA以外の海外の免許履歴を考慮してくれるところだった。
  • かろうじてカナダの自動車保険のいいなと思った点は、同じ住所に住む、生活を共にする人の場合、一定の条件下(*1)で追加の費用なしで保証対象に入れられるところだった。日本だと同居家族であっても保証を追加するとそれなりの追加料金がかかるのでそれは良かった。
    • (*1) おそらく、25歳以上かつ、免許を取得して十分な時間が経っていること? Desjardinsの場合は無料で追加できたが、他のサービスの場合、海外での運転歴を考慮してくれなかったためか追加料金が発生した。
  • どうしてこんなに保険料が高いのかというと、理由はいろいろあって、まず日本のように自動車自体に結びつく強制保険のような概念がなく、日本でいわゆる任意保険しかない(ただしオンタリオではそれが強制)。内訳で見てみると、法的に要求される対人対物保証は高々年間2000円から8000円程度で良心的なのだが、いわゆる車両保険パートがものすごく高い。
  • カナダの医療費は無料としばしば謳われるが、日本の保険制度のように美容医療など明らかにOptionalであるものを除いてほぼほぼカバーされるのではなく、最低限の医療が無料なのであって、有名なところだと歯の治療はたとえばカバーされない。交通事故の際の医療も、緊急の手術などはカバーされるが、後遺症のリハビリ等はカバー外らしく、こうした事故に関連する医療の支出も自動車保険のカバー対象で、そのため値段が高くなっているらしい (*2)
  • 日本の車両保険と違うパートは、 "Direct Compensation Property Damage (DCPD)" という保証項目がそれなりの費用の割合を占めていて(たとえば年間15万程度)、これは 自分に非がない状況で 事故にあった時に自分の車の修理費を出してもらうための補償である。これは日本の自動車保険からするとかなり非直感的で、日本の車両保険の場合、主にたとえば自分がガードレールにぶつけた時や駐車場でぶつけた場合に修理代を出してくれる保証のことだと思うが、これとは全く違う補償項目である。どうやら、カナダでは自分に非がない場合の事故であっても、事故を調査し、相手から支払いを受ける上での、調査費用(とくに相手が逃げた場合)、弁護士費用、訴訟費用などがかなりかさむため、基本的に自分が悪い場合でも悪くない場合でも自らの保険会社とのやりとりを中心にする構造になっているらしい(*2)
    • (*2) ChatGPTとしばらく話した自分の解釈なので間違っている可能性があります
  • 他の高額パートは、保険に入っていない車と事故に遭った場合の保証で、これもほぼ強制の保障内容になっていて、それなりの価格(たとえば年間で15万円ほど)する。DCPDの説明で前述したように、もし仮に保険のやり取りが完全に事故にあった個人間で分離しているならこの保証は不要になるはずだが、DCPDと違って相手側からお金を取れる見込みがこの場合ものすごく低いので特殊なケースとして分離されていると解釈している
  • まとめ:トロントで車を「維持」しようとすると駐車場代と保険で最低年間70万円ぐらいはする。月換算6万円ぐらいだが、大体ダウンタウン内のUberでの移動は10ドルもかからないので、毎日往復で10ドルぐらいのUberを使うのと結局トータルで変わらない。ただ車を持つメリットとしては確実に行動の幅が広がって、カナダの広大ないろんなエリアに出かけることができたり、ショッピングなりトレッキングなり旅行なりいろんな体験ができることだと思う。モントリオールやケベックにペットを連れてロードトリップする、などというのは自家用車なしにはかなり難しい。

カナダとアメリカで働く場合の法律的な違い

  • カナダの場合、work permitが発行される。work permitはあくまでも許可であり、クビになったり会社を辞めてもカナダに住み続けることができる(ただし、雇用主限定されているwork permitの場合、自由に転職はできない)
  • アメリカの場合、H1B/L1Bステータスは雇用に紐づいているため、クビになったり辞めたりする場合はgrace periodの間にステータスを変更するか、アメリカを離れる必要がある
  • カナダの場合、居住用ビザの更新を国内で完結することができる。まずwork permitの更新を行い、新しいwork permitが降りるとそれを使ってカナダを離れることなくパスポートに新しい居住用ビザを貼り付けてもらえる。余裕を持って手続きをしている場合基本的に渡航制限を受けることはない。
  • アメリカの場合、アメリカ国内の機関がビザを貼り付けてくれないため居住用ビザの更新のためにアメリカを離れる必要がある。ステータスとビザの概念が大きく違い、ステータスの更新自体はアメリカ国内で容易にでき、ビザの有効期限が切れてもアメリカを離れない限り法的に問題はないが、アメリカに「入国」する際にそのステータスに紐づいたビザが必要で、従ってアメリカ国外に出国する用事がある場合は定期的にビザを貼り付けてもらう必要がある。アメリカ国外の領事館の待ち時間や追加審査の有無によって、アメリカへの再入国が不可能な期間が存在する。
  • どちらも、永住者になれば制限なく就労、転職が可能で、ビザの貼り付けの問題もなくなる。

競技Duolingoのススメ

カナダに到着したころ(昨年10月)から趣味でフランス語とスペイン語をDuolingoで勉強しています。 Duolingoというのは言語学習アプリで、ゲームスタイルになっています。各レッスンをクリアすると経験値がたまって、各週ごとにリーグが開かれ合計経験値で戦うというシステムです。

たいていこういうゲームって経験値を稼ぐことだけに集中すると極端な戦略になってまったく学習にならない虚無な操作を繰り返すことになりがちだと思うのですが、Duolingoはむしろ、今のところ自分が発見した範囲では、もっとも経験値効率の良い学習が最も効率的な語学の学習方法になっている気がしていて、初めて2か月なのですが両言語とも習った範囲ではかなりスムーズに会話できるようになっています。

ちなみにゲームを始めて最短で最上位リーグのダイヤモンドリーグで1位になりました!

これから紹介する戦略だと、1日に3000 XP程度は稼げます。1週間続けると20000 XPから25000 XPぐらいになることが多く、ダイヤモンドリーグで、運が良ければ優勝できる程度かと思います。ダイヤモンドリーグにはたまに1日に10000 XPとか稼いでくる人がいるのでそうなると難しいです。 この戦略をとるにはMAXプランに入る必要があるので、それなりの課金が必要ですが、さすがに学習した成果を振り返っても非常に効果的なので、語学スクール1か月分程度と考えると格安かと思います。

戦略

  • Duolingoにはデイリーミッションという概念があって、毎日3つのミッションがあるのですが、1つクリアするごとにボーナスタイムが10分加算されます。ボーナスタイムでは経験値が、1.5倍、2倍、または3倍になります。
  • ボーナスタイム中にミッションをクリアするとボーナスの倍率が上がります。
  • 6:00-12:00, 18:00-24:00の間にそれぞれ1レッスンでも行うと、次の枠(6:00-12:00から18:00-24:00)で15分のボーナスタイムがもらえます。

この仕組みを使い、選ぶレッスンを調整してできるだけこの3つのミッションを同時にクリアします。そうすることで3倍のボーナスタイムを45分得ることができます。同時にクリアできるレッスンの選び方が存在するかはその日の運にもよりますが、だいたいうまく調整すれば40分ぐらいは安定的に得られると思います。

これだけあれば上述した程度のXPは稼げるのですが、さらに必要な場合、以下のような方法でタイムを伸ばすことができる場合があります。

  • ボーナスタイムが短くなると(残り2,3分など)、100ジェムを使ってボーナスタイムを15分伸ばすことができます。
  • フレンドクエストなどで手に入れたアイテムを使うと、30分伸ばせたような気もします。

この3倍のボーナスタイムを得た状態で、ロールプレイのレッスンをひたすら繰り返します。 ロールプレイのレッスンはシチュエーションごとの作文、会話で1レッスン50 XPなのですが、3倍ボーナス時は150 XP入ります。150 XP入るためには作文、会話に使った語数が21語以上である必要があるのですが、慣れるとそこまで難しくないです。

ロールプレイの回答はキーボード入力で文章を打つか、音声入力するかですが、音声入力のほうが早いのでお勧めです。おそらく会話が非常にスムーズにできる人なら一瞬で150 XP手に入るんじゃないかと思います。1ロールプレイでは3回こちらが回答するチャンスがあるのですが、2分でこれをやるとして、20回繰り返すと3000 XPになります。 同じロールプレイの回をずっとやりこむのはわりと虚無ですが、ロールプレイにはたくさんのシチュエーションがあるので回していけば練習になります。

このレッスンの良いところは、とにかくスピーディーなアウトプットが大事なので、スムーズに話せるようになるということです。 ロールプレイでいろんなシチュエーション(旅行、さまざまな場面での日常会話)があるので実際の生活でもそれなりに使うだろうなという文章を繰り返し練習できるのはかなり役に立ちます。

自分は1日2時間ぐらいプレイしていて、1時間は上の日課、残りの1時間は新規レッスンを開拓しています。

おわり

2か月ぐらい勉強して、両言語ともレベル的にはCERF highA1を終了してA2に入るぐらいのところで、文法でいうと過去形に入ったぐらいになります。

よかったら上のIDから友達になってください。

Metaに転職して感じたPFNとの違い

Metaに転職して1か月近くが経ちました。カナダのトロントオフィス勤務で、今月は渡航に始まり、社会保険番号取得、口座開設、家探し(インターネット等の契約も)、州の健康保険、会社の福利厚生に含まれる保険や積み立て口座の開設、など手続き関連でかなり疲れましたが、アメリカメンローパークでの本社のオンボーディングも終了していよいよ業務が開始した、といったところです。

Metaはオンボーディング中にチームと会うまで自分が何の仕事をするか詳細は全然把握していなかったのですが、Metaが開発し運用もされている社内用の深層学習アクセラレータのコンパイラを開発する職となっています。レイヤごとに細かなチームがあり、上の方のレイヤではPyTorchとの繋ぎこみを担当しているようですが、自分が所属しているところはレイヤの最下層のところに位置しており、カーネルのコードをLLVMを介してコンパイルアクセラレータに乗せる、というところをやっています。前職はグラフコンパイラ(つまり計算グラフからオペレータの列をスケジュールするレイヤ)を作っていましたが、新しい仕事とはまったくかぶっていなくて、むしろ各カーネルの実装をアクセラレータに乗せる、というレイヤになります。

なんせ前職とは仕事の内容も会社の人数的な規模も場所も違うところなので新しいことだらけなのですが、記憶に新しいうちにPFNとMetaで感じた違いを書いていこうかなと思います。

念のため初めに注意事項を述べておきます。

PFNでも、Metaでも、自分が所属するチーム目線での感想です。チームによってカルチャーも雰囲気も異なると思うので、これを見て「{PFN/Meta}は〇〇な会社なのか~」と早とちりするのはよくないです。本当に気になる方はぜひ会社公式の情報を調べたりほかの社員の意見も聞いてみてください。

Learn or Dieカルチャーについて

言わずと知れたPFN Valuesの一つです。和訳は「死ぬ気で学べ」になっているかと思います。これはなんならMetaのほうがLearn or "Die"という気がします。 PFNもLearnすることはたくさんあったのですが、自分の場合それは何か新しいものを実装するときにリファレンスを読んだり関連研究をサーベイしたりするというのがほとんどで、自分が主体で自分のペースでLearnができました*1。それに対してMetaは日々の一つ一つのプロジェクトが、自分があまりそれに詳しくない他チームとの共同作業で、自分が頑張ってコンテキストを把握していかないとそもそも業務が不可能、というある種の強制さを感じます。

もう少し具体的に話すと、「Metaの内製深層学習アクセラレータでMetaの重要なモデルを学習、推論する」ことにかかわっている人数は膨大で、この全体像を実装レベルで把握している人なんてたぶんいないです。この人たちは細かいレイヤごとに細分化されており、自分が所属するLLVMチームはそのわずか一部分です。カーネル関係にもいくつかチームがあるのですが、たとえばそのうちの一つとともにある問題を解決する、みたいな動きがたいていの業務の流れのようで、綿密にコミュニケーションを取って問題を把握して考える、ということが要求されているようです。 PFNの場合は、人数がもう少しコンパクトですし、NVIDIA GPUを使っていたりそもそもそのランタイムはオープンソースのATenを使っていたりと、スタートアップなりの戦略をとっているので、まだコンパイラの全体像を把握しやすく、実際あらゆるレイヤにコミットしている天才的なエンジニアもいるのですが、Metaだと都度足りないところをコミュニケーションを通してLearnする、という文化があると感じています。

PFNのLearn or Dieカルチャーのここがよかったと思うところは、Learnの幅が広いことです。たとえば、たぶんPFNに所属しているエンジニアは自分のタスクと直接関係なかったとしてもLLMのpretraining, alignment, finetuning, retrieval augmented generationなどの概念は会社のAll handsやfulltimeブログ、岡野原さんのランチ会などを通して簡単には知っていると思いますが、Metaのエンジニアの場合比較的知識が自分の所属プロジェクトのみに偏る傾向があると感じています。

社内コミュニケーションのスムーズさについて

これはPFNのほうがスムーズだったと思います。PFNだと基本なんでもかんでもSlackに気軽に書いていて、すぐに反応してくれる社員がたいていいるためしょうもないことで悩む時間がほとんどなかったです。自分が新入社員のときに「自分で調べるよりも先に聞いて」と言われてこの言葉がいまでも非常に気に入っています。聞いた後に自分で調べて数分後に「解決済み」のリアクションを自分でつけるとか非常にあるあるでした。

しかしMetaでは聞く前に自分で調べろということをかなり徹底されている印象を受けます。これは人数の規模感の問題で、チャンネルによっては数百、数千、数万人が入っていることがあり、投稿に気を取られる人の時間を考えるとできるだけ自分で解決できる範囲で解決した方がよいとされており、ドキュメントを整備することも非常に推奨されている印象です。普段働くチームの人たちのみが入っている少人数のチャットではもう少し気軽に聞けますが、それでも今のところPFNの方がここはスムーズだったなあと思います。まあ自分だけのスムーズさではなく会社全体でのスムーズさの合計に注目すると妥当なシステムだと思います。

あとはMetaだとリモートのミーティングが基本です。チームの人は北米中に散らばっています。PFNのときは出社も一応ありましたし、出社しているときは机が隣同士だったので、デバッグに困ったらそのまま机に呼んで隣で聞きながらデバッグをする、ということができましたが、当然これはできなくて、たまに「これ経験者に聞いたら絶対5秒で解決するのになんか30分もかけている・・・」みたいなことが起きてしまいます。

(追加)PFNのSlackには個人のレポートチャンネルという、実質業務用ツイッターのようなチャンネルがあり各々が自由に投稿しています。自分の場合、デバッグのメモ帳のように使うことが多く自分でログをとっておけるし、見かけた人がいつでもコメントを残すことができる(しかも驚くことにかなり見てくれる人がいて数分で返信がついて解決することも多いです)のでかなり気に入っていました。MetaはSlackを使っていなくて内製のツールがあるのですが、レポートチャンネルみたいにテキトーなことを投稿できる場所がいまのところ見つかってなくて投稿のハードルの高さを感じています。

必要とされる能力について

実は、これが結構違うように感じます。2つの目線について話したいです。

1つ目は競プロ的な能力についてで、これは自分が携わった分野については、PFNではかなり武器になるように思えます。というのもsegment treeをはじめとする特殊なデータ構造はそれなりに登場しますし、名前がついているようなアルゴリズムをそのまま使うだけはなくフローのアルゴリズムをベースに独自にアルゴリズムを設計しうまく問題を解いた、という競技顔負けの瞬間も目撃したことがあります。コンパイラまわりのタスクにこういうのが常にたくさんあるわけではもちろんないのですが、アルゴリズム関連の質問をするSlackチャンネルがあり、そこにはそれなりの頻度で複雑な問題が投下され、社にいる競技プログラミングのレジェンドたちが鮮やかに解決していく様を見れます。 Metaの場合、何人かの社員に聞いてみましたが、競技プログラミングの能力が必要とされるシーンは非常に限られそうです。というのもPFNでのこうした最適化は特定のモデルに特化して性能向上させようとした場合に登場するものが比較的多かったのですが、PyTorchやそのバックエンドはあらゆるモデルをサポートし、将来的にもメンテナンスしやすいものを開発するのが大前提で、問題が複雑になりすぎて特定のアルゴリズムが力を発揮するようなシンプルな問題に落とし込むのが難しいです。たとえばLLVMにもグラフや木に関する競プロでも見かけるアルゴリズムはそれなりに隠されていますが、自分で新しいアルゴリズムを実装する機会は非常に限られそうです。Metaの場合、そういうアルゴリズムを設計するといいう方向性よりかは、ものすごく規模が大きい開発を、他のメンバーたちをうまくコミュニケーションをとって長い目線で見たときに「良い」コードを書いていくという能力があまりにも重要です。

2つ目は、扱うレイヤについてです。このトピックについてはタイトルから逸脱するのですが、日本のIT企業との比較して感じたことして、とにかくMetaはレイヤが低い!!というのがあります。日本でエンジニアのアルバイト、インターンをしてきて、あまり大学で学んだコンピュータサイエンスの低レイヤの知識が生かされると感じた機会は少なかったのですが(別に低レイヤだから偉い、みたいなことはなく、自分はそれが単にかっこいいし、その普遍的な重要性や、年月をかけて洗練されたアルゴリズムや実装が好きなだけです)、Metaには非常にたくさんあります。自分のチームに前職が中国のByteDanceの人がいるのですが、ByteDanceも独自のアクセラレータを作っていてコンパイラチームがおり、似たような低レイヤの仕事をしていると言っていました。非常に規模の大きいソフトウェアを収益の基盤としている会社は基本的にあらゆるレイヤを自分たちで作っているので、何かしら好きな分野がある人はその仕事を見つけられる場所になると思います。ただByteDanceもコンパイラチームは中国本土のみとのことで、Metaの自分のチームも北米のみなので日本だとなかなかこういうレイヤに触れられる仕事が少ないのは残念に感じました。PFNはその点独自アクセラレータを作っていることもあり低レイヤなタスクもそれなりにあっておすすめです!

開発について

これは比較というよりかはMetaが特殊なので紹介です。MetaもGoogle等と同じくモノレポでの開発で、独自のソースコントロールツールがあり、独自の分散ビルドシステムを持っていて、独自のレビューツールを使っていて、前職だと当然のように使っていたGitHubを全然使いません。最初はあまりの世界の変わりようにびっくりしましたが、全部内製だと内製のいろんなツール(生成AI含む)との紐づけができて開発体験は実際かなり良いです。

様々なポリシーについて

これも大企業あるあるだと思うのでただの紹介ですが、入社時のオンボーディングであらゆる方面のポリシーについて勉強させられたのはびっくりしました(全部合わせると体感50時間以上あるかも?)。こういうことをやるとダメ、即アウトです、みたいな内容というよりかは、こういうことをやる方がみんながうれしいよね、という内容が多く、普通に勉強になります。個人的に気に入ってるものとして、英語ネイティブ同士がすごい勢いでディスカッションしてノンネイティブの人が置いて行かれるという状況はもちろんよくなくて、全員がアイデアを発言できるように事前にアジェンダを共有しておくとか話を振ってあげるとかの工夫ができるよね、というやつがあります。こういうとき、自分が話せない立場だと、「自分の英語が悪くて~」みたいに考えがちだと思うのですが、そういう雰囲気にもっていっている会議の進行自体に問題があると考えるのはわりと自分にとっては新しい気付きでした。

こういうポリシーがしっかりしているせいか、あまり英語が話せなかったり聞き取れなかったりして不穏な空気になる感じは一切なくてすごいです。僕もまだ慣れていなくてたまに単語がでなくて10秒ぐらいフリーズすることがあるんですが全員真剣に聞いてくれていてかなり話しやすいです。

福利厚生

Metaの福利厚生はかなり多岐にわたっていて、3食食事が出ることや一年に一か月までほかの国から働いてよいとか、健康に関する一部の支出(ジムにいくとか、スポーツの習い事をするとか、スキーに行くとか、Apple Watchを買うとか)は払い戻しを受けられるとかが特にいいなと思っています。Apple Watch払い戻しとはいかなくても、たとえば会社の有志でテニスやバスケをするときの費用は会社負担、のような仕組みがあればコミュニケーション促進にも役立ちますし健康増進にもいいですし、会社側にとっては給与に比べると全然大した支出ではないので世の中の会社もどんどん採用していってほしいなと思いました。ちなみに有給に関してはPFNの方がだいぶ多くて26日です(あと日本の方が祝日多い)。あと日本からトロントに引っ越すときの補助もすごかったです(この詳細に関してはConfidentialらしいので細かく書けないのですが、家族ごと引っ越しても金銭的に損をすることは少なくともないはずです)。

おわりに

最後Metaの紹介が多めになってしまいましたが、PFNもすごくいいところです。転職のきっかけは、これまで海外留学とか頭をよぎったことはあったのですが実行に移したことがなく、今海外に行かなかったら一生行かないかもと思って、後になって海外勢をうらやむようなことがあったら情けないのでとりあえず海外のエンジニア職に何か所か出してみたら偶然通った、というだけです。こちらのエンジニアも逆に日本に{行きたい/帰りたい}と言っている人を見かけますが、自分もいったん両方経験して好きな方を選択したいなと思っています。

最後に両方の会社の求人を貼って終わりにします。

open.talentio.com

www.metacareers.com

*1:おそらくお客さんに近いところで働いているエンジニアは顧客との会話や事業領域の勉強を通して後述する状況に近いLearnがあると思います

A Faster Parameterized Algorithm for Treedepth

木分解上のDPによってtreedepthを求める。

アルゴリズム自体が結構むずかしく、正当性は非自明

木分解上の各bagは、「そのbag以下の部分木のbagのUnionに含まれるノードについてのtreedepth decompositionのpartial decomposition」をもつ。partial decompositionのdepthとそのtreepdepth decompositionのdepthは同じ。

これを、nice tree decompositionのintroduce/forget/joinについて遷移規則を定めている。 forgetはかなり愚直だが、introduce, joinについては、自分より大きいdecompositionを考えるので、partial decompositionを得るために一度、特定のサイズ以下の頂点数の木をすべて生成したりして、かなり計算量がやばそう(だけどFPTなので定義上セーフ)

ここに超忖度を要するスライドがある

Computing Tree-Depth Faster Than $2^n$

タイトルの通り

アルゴリズムの概略は以下の通り

f:id:xuzijian629:20200229132652p:plain

ほぼ愚直な O*(2^n)アルゴリズム \mathbb{A}_0があり、アルゴリズムの探索空間を狭めた、 \mathbb{A}_\varepsilonを構築して、大部分の問題を解く。

うまく行かない場合のグラフは、任意のminimalな分解がproblematic node  vを含む形になっている。

f:id:xuzijian629:20200229132849p:plain

グラフは上図のような分解になっていて、 Y = Q \cup R_1を全探索して、さらに R_1も全探索して、コーナーケースに相当する場合を解く。コーナーケースに含まれる小さな部分木 Q_i R_jのtreedepthは前計算されているか、たかだか1回 \mathbb{A}_0を適用して求めることができる。

部分木のtreedepthが分かっている状態で、 Q_i,  R_1の順番を入れ替えて最適なもの(これはtreedepthに一致することが示される)を探したいが、これは多項式時間でも止まる。

最後の最後にすごい定義が効いていてすごい