ドイツ・ベルリンに移住してエンジニアの仕事を見つけるまで

f:id:uzuki-first:20181225220211j:plain

これは ex-crowdworks Advent Calendar 2018 の9日目の記事です(でした。)

クラウドワークスでは Rails のアップグレード をしたり、新規サービス立上げの開発を担当したりしていました。クラウドワークスのあとは妻とともに去年の夏からドイツ・ベルリンに飛び込んでみて現地で仕事を探し、なんとかオファーをもらえたので、年初から現地のスタートアップでバックエンドデベロッパーとして働いています。

ex-クラウドワークスな人たちに「なにか聞きたいことある?」って聞いたら、現地での仕事探しに興味ありそうだったので、この記事では実体験をベースにどんなフローだったかざっくり書きたいと思います。

基本スペック的な

エンジニアとしての経験は、移住前の直近4年間はフリーランスとして主にスタートアップの Ruby/Rails の開発をしていました。(詳しい経歴は LinkedIn僕のサイト に書いています)

海外はいままで何度か旅行したことはありましたが、海外に定住するのも仕事を探すのも初めてでした。(ついでにいうと、ヨーロッパに来たのも初でした。)

英語については、旅行で覚えたレベルで義務教育以上の勉強をしたことはありませんでした。日常会話ならできるレベルで、英語での実務経験はありませんでした。

ただ、4年前にインドのバンガロールでミートアップに参加した時の記事を書いたことがあり*1、その時にエンジニアとだったら意外と話が通じたので、もしかしたら海外でも仕事できるかも?と淡い希望を持っていました。

プログラミング言語は世界共通ですし、そもそも僕らが話している事は専門用語が多いので、話している言葉が違っても通じやすい部分があると感じました。 例えば「それぞれのバッチが相互に依存し合っていて。。(Each batch depends on each other) 」「(あーそれは辛いやつや!!)」とかいう話がわかるかどうかは英語の問題じゃないですよね?

ただし、仕事で使う英語となると当然エンジニアとだけ話すわけではないので、仕事をし始めてからは本腰を入れて勉強しています。 *2

なぜ海外に移住したのか?

英語で仕事ができるようになりたかったからです。将来のキャリアを考えた上で、英語ができたほうが広がりもあるしリスクヘッジになると考えていました。そして、英語を身につけるためには使わざるを得ない環境に身を置くのが手っ取り早いと考えていましたし、逆にそのくらいでないと身につかないとも思っていました。

国内で外資という選択肢もあったのかもしれませんが、もともと早いうちに海外に住んでみたいとも思っていたので選択肢としてあまり考えていませんでした。

なぜドイツ・ベルリンなのか?

英語で働ける環境とビザです。エンジニアの仕事が豊富にある都市でかつ英語圏となると選択肢は限られてきます。ドイツはドイツ語圏なのですが、ベルリンは外国人がとても多く英語だけでも生きていけるし仕事も英語でできると聞いていました。(なお、実際に就活してみてドイツ語能力について聞かれることは一度もありませんでした)

そして、ビザがないと働くことはできないので、就労ビザの取りやすさも考慮する必要があります。エンジニアとしては、シリコンバレーがあるアメリカはまず候補に浮かぶと思うのですが、ビザを取るのがとにかく大変そうなので今回の候補から外しました。(特に僕はコンピュータサイエンスの学位を持っていません。でも、いつかは一度はシリコンバレーに行ってみたいですね!)

僕は当時30歳ギリギリでワーホリビザが取得できる年齢だったので、ワーホリが行ける国から選びました。カナダ・オーストラリアも候補だったのですが、ワーホリの行き先としてベタな感じがなんとなく嫌だったのと(笑)、せっかく住むならヨーロッパがいいなとぼんやり思っていたので候補から外しました。

イギリスは有力候補に残っていたのですが、イギリスのワーホリは全員が行けるわけではなく抽選であり、応募しましたが普通に落選しました。フランスやスペインもワーホリがありますが、英語で働けるイメージがなかったので外しました。*3

ドイツは移民について寛容な国で、ワーホリビザの後も就労ビザへの切り替えが出来そうだというのも決断を後押しました。(実際に今はブルーカード*4という優遇ビザを取得することができました)

仕事の探し方

僕は、いままでの日本での経験を生かして Ruby/Rails を使っている会社でかつスタートアップを狙っていました。今回はスタートアップでもそこそこ大きめの会社を狙っていたので、各スタートアップの資金調達額や従業員数をリストアップして参考にしたりしていました。(ちょっとデータが古いですが表へのリンク を貼っておきます)

仕事探しでは逆求人の Honeypottalent.io がすごくおすすめです。こちらのプロフィールに対して企業がオファーしてくるので、探す手間が省けますし書類選考を突破した段階から始められます。

リストとしては Berlin Startup Jobs が良いと思います。また、LinkedIn などでリクルーターを使うのも良いかもしれません(僕もリクルーターを使おうとしたのですがレスが悪かったところが多く、結局役に立ちませんでした)

またちょっと変化球ですが、現地のプログラミングコミュニティのメーリングリストに仕事を探しているというメールを送ったり、ミートアップで発表したりするのもオススメです。実際に僕はやりましたし、反応も良かったです。僕が最終的にオファーをもらったのは、ミートアップで声をかけられた会社からでした。 ミートアップは Meetup.com で探すといいです。

他に、僕はあまり使っていませんが良さそうと思われるサイトをいくつか挙げておきます。

選考フロー

こちらの選考フローは、書類選考・1次面接(人事)・コーディングチャレンジ・2次面接(エンジニア)が大きな流れで、会社によっては3次面接やリファレンスチェック、コードサンプル提出(後述します)があったりします。

正攻法でいったらこんな感じですが、例えば中の人からの紹介だったりだといくつかスキップできたりします。(この辺は日本と同じ感じだと思います) LinkedIn はほぼみんな使っているので、自分のアカウントを整理しておくのは必須だと思います。

また、バケーション期間(夏休み・クリスマス年末)だと担当者が不在で選考が大幅に滞ることはよくあります。

書類選考

日本で言うところの履歴書・職務経歴書による選考です。こちらではペライチの紙一枚にまとめることが一般的です。(resume とか CV とか呼ばれます)

僕は My Perfect Resume というサイトを利用しました。テンプレートから選んで作成して、例文のサジェストがあったりして、最終的にはワード形式でダウンロードもできたりして便利でした。*5 また、出来上がったレジュメは最終的に英語圏出身の方や添削サービスなどで添削してもらって、不自然な言い回しなどを直した方が良いと思います。

どう書けば良いかはお国柄もあるらしく、例えばドイツだとかっちりした気質が反映されるのか、スペルミスはもちろんのこと、過剰なアピールは印象が悪かったりするらしいです。また、ドイツだとちょっと笑顔の自信ありげな顔写真をつけるのが一般的です。(この辺は北米等だと事情が違うと聞きましたが僕はよく知りません。海外と一言にいっても色んな国があるので一括りにはできないよ!というのがここで言いたかったことです。)

さらに、カバーレターと呼ばれる文書を添付することも多いです。これは「どれだけ自分が求人内容にマッチしているか」をアピールする文章です。(これは会社ごとに作成する必要があり手間がかかってコスパが悪そうだったので、僕はなるべく書かなくていいように頑張ったので書いたことがありません)

ちなみに、ここで実際に人事は LinkedIn も合わせてチェックしていることが多いらしく、場合によっては LinkedIn の提出だけでOKのこともあるそうです。

1次面接(人事)

書類を突破すると人事から面接の日程調整の連絡電話がきます。なお、落ちている場合に連絡がないことはよくあります。

これは基本的なステータスの確認や受ける意志があるかどうかレベルの簡単なスクリーニングで、オンライン(スカイプなど)で行われることが多く、その後にコーディングチャレンジに案内されることが多いです。

あと、希望年収をここでほぼ聞かれるので、相場を把握しておく必要があります。相場はこの辺が参考になると思います。

コーディングチャレンジ

課題を出されてコードを提出する選考です。日本ではあまり見かけませんでしたが、こちらではかなり一般的です。ここを突破できなければそもそも面接にも行けません。

アルゴリズムとかデータ構造とか聞かれるのか!?と思ってビビってましたが、そういうコンピュータサイエンス系の知識を聞かれる出題はほぼなく、実際の業務の簡易版のような実践的な課題が出されることが多かったです。*6

出題形式は色々なものがあり、オンラインで1時間程度で受けるものもあれば *7 、課題に対してざっくりした制限時間内に出来るところまで作って提出するものや、逆に制限時間がなく好きなところまで作って提出するものもありました。会社によっては次の面接で提出したものに対して深掘りされることもありました。

具体例を挙げておきます(これらはバックエンドデベロッパー向けの課題です)

  • 入力された文字列が回文 ( palindrome ) かどうかを判定するコードを時間制限内にオンラインエディタで作成
  • R言語向けのパッケージ管理システム CRANのパッケージ一覧 をパースしてDBに保存、一覧を閲覧できる Rails アプリケーションの作成
  • 株価をAPI経由で取得し、特定期間で特定株を売買した場合の利益/損失を計算するコマンドラインツールの作成(資産運用サービスを提供している会社からの出題)
  • Ruby または Elixir にて契約書を作成/管理する RESTfulAPI を提供するアプリケーションを作成 (契約書の有効期限などを管理するサービスを提供している会社からの出題)

大別すると、実際の業務にかなり近い課題を使ってコード自体のクオリティをしっかり確認する、あるいはあくまできちんとコードが書けるかどうかのスクリーニングという2種類がある気がします。

2次面接(エンジニア)

コーディングチャレンジを突破できると、いつ面接に来れるのか聞かれます(オンラインの場合もあります)。スピード感がある所が多く、場合によっては面接自体が次の日、遅くとも次の週には設定されました。実際に配属対象チームの現場のエンジニアが出てくることが多いと思います。

面接内容はテクニカルで実践的な質問が非常に多く、かなり突っ込まれた質問をされることが多いです。会社によってはペアプログラミングやライブコーディングをすることもあるので、実際にスキルがなかったらまず通らないと思います。

参考までに、実際に聞かれた質問をいくつか挙げておきます。(僕が受けていたのはシニアレベルの求人が多かったので、こちらで聞かれている質問はシニアレベルだと思ってください)

全般

  • 良いコードとはどういうコードか?その理由は?
  • TDDとは何か?普段の開発ではどのように活用しているか?
  • RESTfulとは何か?そのメリットは?
  • スレッドとプロセスの違いは?
  • APIサーバをスクラッチで作る場合の技術スタックとその理由は何か?
  • Docker とは何か?メリットや vagrant との違いは何か?
  • 良いAPI設計とはどういうものか?気をつけるべきポイントは何か?

RDB

  • ファントムリードとは何か?その対策方法は?
  • 複合インデックスとは何か? どういったクエリで有効に働くか?

Rails

  • Rails の最も好きな機能・嫌いな機能は何か?その理由は?
  • N+1 問題とは何か?その対策は?
  • Unicorn と Puma の違いは?

Ruby

  • ||= という書き方を知っているか?メリットは何か?
  • #inject/reduce メソッドの使い方は?
  • 遅延評価 (lazy loading) の具体的な使いどころはどこか?

などなど。ちなみに、全問正解しなくても大丈夫ですし正解がない質問もあります。(僕が合格した面接でも答えられてない質問はあったりします)

数をこなしていくうちに気づいたのですが、こちらの求人はかなりストレートで Job description に書いてあることを聞かれる事が多く、本当にそのスキルを持っているかどうかを確かめていることが多いような気がします。例えば、マイクロサービスに移行しようとしている会社ならば pub/sub など非同期メッセージングの理解を聞かれたり、フィンテックなど精緻な数字を扱うところでは丸め誤差についての理解を聞かれたりなどです。

質問を通してこちらのスキルとのマッチングをかなり確認されるので、個人的には自分からスキルをアピールする必要はあまりないような気がしています。ただ、最後に「何か質問はあるか」とほぼ聞かれるので、質問や聞きたいことはあらかじめ準備しておいたほうがいいと思います。

3次面接

あったりなかったりします。また、出てくる人も様々です。エンジニアのヘッドが出てくることもあれば、プロダクトの人が出てきたり、アジャイルコーチ/スクラムマスターが出てくることもあります。ここではスキルチェックよりカルチャーフィットを見ていることが多い気がしますが、会社によって様々でしょう。

リファレンスチェック

リファレンスチェックというものを求められることがあります。具体的には、前職の上司や同僚に電話をして、候補者がどういう人なのかを確認するプロセスのようです。

ただし、当然英語で電話がかかってくるので、僕のように日本でしかキャリアがない人は、英語ができる人を探すのが一番の難関でしょう。。(僕の場合、いくつかリファレンスを提出したのですが、結局連絡がなかったので詳細はわかりません)

コードサンプル提出

自分が今まで書いたコードのサンプルの提出を求められることがあります。OSSへのPRとかがあればベストだと思います。業務で書いているコードは当然守秘義務があって出せないので、その場合は大変かもしれません。

OSSへ貢献するのは大事ですね。。!

内定(オファー)🎉

以上のようなプロセスを突破すると、正式にオファーが来ます!ちなみに、各プロセスで落ちていた場合に連絡がこないことはよくあります。

正式にオファーが来たところで年収の交渉ができたりしますが、オファーを受けるかどうかは早めの決断を求められることが多いようです。待ってくれても1週間程度のようです。(僕はオファーまでたどり着いたのは1社だけなので他社もそうなのかは知りませんが、他の人の話も聞くとそんな感じらしいです)

僕の場合は、オファーをもらうまで20社以上受けて、仕事を探し始めてから3ヶ月ほどかかりました。特に英語で面接を受けるのは大変で、面接で何を聞かれているかわからなかったりして、実際に英語が理由で落とされたこともありました。(そもそも英語を鍛えたくて移住したのでそりゃそうなのですが。。)正直、けっこう心が折れそうになることがありましたが、諦めずに頑張ることが大事ですね。。!ずっと励ましてくれた妻や友人には感謝の限りです。

ところで、つい最近ベルリンで未経験からエンジニアへのジョブチェンジに成功した友人が就職活動についてステキなまとめ記事を書いていたので、参考までにシェアしておきます!

www.ykst.de

実際に働いてみて

とにかく英語が大変ですが、それを差し置いてとりあえず一つ言いたいのは、スキル的に通用しないという事は全くありません。 (ex-)クラウドワークスの人たちの方がスキルが高かったと感じることもあります。妄想の世界の app00b に立ち向かえる人なんてそうそういないですし*8、どこの世界も一緒でみんながみんなできるわけでもありません。

また、僕たちエンジニアは同じ世界に住んでいて、つい先日もクラウドワークスで同じチームだった元同僚が、今の会社の同僚と同じOSSへのコントリビュートでやりとりしていて話が盛り上がったりしました。(当人同士はGitHub上でしか面識がありません笑)

言葉の壁は大きいと感じますが、それはこちらの欧米の人も同じように(もしくは僕ら以上に)日本に対して言葉の壁を感じています。ですが、逆にいうとその壁さえ超えられれば、そのあとには同じ世界・もっと大きな世界が広がっています。日本でエンジニアとして通用するならこちらでも通用すると思います。*9

英語の壁はたしかに大変ですが、それは日本人だけではなく英語を母国語としない人たち共通の悩みです。*10 そして今のところ、英語は時間さえかければある程度なんとかなるものだと感じ始めています。プログラミング言語の方が難しいかもしれません。

そんな感じで、僕はベルリンで毎日楽しく働いてます!では、Merry Christmas!

f:id:uzuki-first:20181225220053j:plain

*1:「インドのシリコンバレー」バンガロールの IT コミュニティ事情

*2:入社してしばらくは英語で大変な時期がありました😓

*3:いま気づいたんですが、ノルウェーもワーホリあったんですね(今さらw)、これはありかもしれません。ただ、ベルリンのほうがエンジニアの仕事は多いと思います。

*4:ブルーカードについてはこのあたりの記事が参考になりそうです ヨーロッパの優遇滞在ビザ:EUブルーカード

*5:ただ free と書いてあるものの、ダウンロードするためには最終的に課金する必要があり、さらに自動で月額課金になっていて非常に不親切に課金された記憶があるので、使うときはよく確認したほうがよいと思います

*6:ただしGAFAとかは事情が異なるかもしれません。そういった出題があるという話を耳にしたことがあります。

*7:例えば HackerRank 上に先方が用意した問題を解いたりしました

*8:そもそもクラウドワークスのドメインはかなり複雑で、アレをまともに扱える時点で結構スキルがあるのでは?と個人的には思ったり。

*9:少なくともドイツ・ベルリンでは。他国の事情はわかりませんが、ベルリンには色んな国から来ている人がいるので、きっと他国でも通用するのでは?とポジティブに予想しています

*10:例えば僕を含む非英語圏出身の社員で希望する人は、英語のレッスンを会社の費用で業務時間中に受けさせてもらったりしています