元競技プログラマの転職活動
Contents
概要
この記事は、業務経験が8~9年あり、AtCoderのレートが水色~青色の元競技プログラマによる転職活動のまとめです。
1年半ほど前に、似たような記事「[ほぼ無] 無職競技プログラマの中途就職活動」も公開していました。
コンテキスト
国内のスタートアップ企業に転職してからは、検索機能の開発・運用を担当していました。検索の仕事は非常におもしろく、個人的にも満足していたのですが、検索領域に特化したキャリアを歩みたいという思いがぼんやりとありました。
あるとき、周囲で転職事情の話を耳にする機会があり、外資系企業が採用を再開していることを知りました。そこでLinkedInで興味のある企業のページを確認したところ、ちょうどSenior Search Software Engineerのポジションが募集されていたことが分かりました。
このポジションはとても魅力的でしたが、外資系企業でのSeniorポジションというハードルの高さから、「もう少し経験と技術力を積んでから応募しよう」とそのときは考えていました。
転職活動を本格的に始めたきっかけは、12月中旬にSNSで見かけた「某社がリモートワークを廃止する」という話です。某社の人材が転職市場に流れてきて、このポジションが埋まってしまい後悔するのは嫌だと思い、応募を決めました。また同時期に、BigTechや外資系企業のポジションもいくつか空いていたので、せっかくの機会だと思い、いろいろな企業に応募することにしました。
自己紹介
ベースは過去の記事に書いた自己紹介を参照してください。
転職後の業務を通じてGo、Terraform、Elasticsearch、NLP、DDD、Design Docなどを身につけました。検索機能の開発・運用改善を通じて、ソフトウェア設計力やプロジェクト推進力なども伸ばせたと思います。一方で、競技プログラミングの練習時間は取れなくなり、2024年5月を最後にコンテストに参加していません。やはり無職の頃の土日と社会人の土日では重みが違います。
面接結果
合計で5社に応募し、そのうち面接まで進めたのは2社でした。最終的にはA社からオファーをいただき、承諾しました。
A社(外資企業〈日本法人〉/Senior Search Software Engineer)
転職活動のきっかけとなったポジションです。Job Roleや技術スタック、そして一緒に働くメンバーの条件がすべて合致していて、一番志望度が高い企業でした。
面接はすべてリモートで行われましたが、時差やスケジュールの都合上、朝6時に面接を受ける必要がありました。そのため、事前に朝型の生活リズムにシフトし、面接前はコーヒーとレッドブルでしっかり目を覚ましてから臨みました。
応募してから約1か月後にオファーをいただき、承諾しました。(選考がスムーズだったこともあり、他社の選考が始まる前にオファーが出ました)
選考フロー
レジュメ提出 → リクルーター面接 → コーディング面接 → マネージャー面接 → コーディング面接+システムデザイン面接 → システムデザイン面接 → 行動面接 → コーディング面接 → オファー
B社(外資企業〈日本法人〉/Middle Software Engineer)
LinkedInでポジションを見つけて応募。面接は受けたものの、その後は音沙汰なしでした。
コーディング面接で明確に失敗した点があり、これをきっかけに「次からはRustではなくPythonでコーディング面接を受けよう」と決意することに。
選考フロー
レジュメ提出 → リクルーター面接 → コーディング面接 → コーディング面接 → サイレントお祈り
C社(BigTech〈日本法人〉/Middle Search Software Engineer)
LinkedInでポジションが空いているのを確認してレジュメを提出しましたが、そのまま音沙汰がないままポジションがクローズしました。
選考フロー
レジュメ提出 → サイレントお祈り
D社(BigTech〈日本法人〉/Software Engineer)
LinkedInでポジションを見て応募しましたが、こちらも音沙汰がないままポジションがクローズしました。
D社で働いている知人に話を聞いたところ、社内外から応募が非常に多く、リファラル(社員やリクルーターからの推薦)がないとレジュメが通りにくいようでした。知り合いのD社リクルーターに連絡することも考えましたが、すでにオファーをいただいていたため、最終的にはやめました。
選考フロー
レジュメ提出 → サイレントお祈り
E社(国内企業/Software Engineer)
LinkedIn経由でリクルーターから「応募してみないか」と誘われ、レジュメを提出しました。しかし、1か月ほど音沙汰がなかったためリクルーターに確認したところ、レジュメ選考で落ちていたことが判明しました。
選考フロー
レジュメ提出 → お祈り
面接対策
ここでは、実際に行った面接対策を4つのテーマに分けて紹介します。英語やコーディング面接に加え、システムデザイン・行動面接の対策法についても具体的にまとめました。
レジュメ準備
前回の転職活動で使ったレジュメに、最新の業務内容やスキルセットを追記しました。
特に、今回はSearch Software Engineerのポジションで検索エンジンの開発・運用経験をアピールしたかったため、検索機能の改善や運用に関する業務内容を詳細に記載しました。
本来であればポジションごとにレジュメをカスタマイズするのがベストですが、コストパフォーマンスと志望度を考慮し、今回は1通のレジュメで応募しました。
日本語でレジュメを作成してからChatGPTに校正・翻訳してもらい、不自然な部分は手動で修正しながら仕上げました。
英語
初っ端のリクルーター面接から英語でのやり取りが始まり、2年ぶりの英会話にかなり焦りました。海外の技術動画・ポッドキャストやアニメ・ドラマ・映画などを英語音声・英語字幕で見ていたので、ある程度は聞き取れるものの、スピーキング力はかなり衰えていました。
これはまずいと思い、オンライン英会話を1日2レッスン受けるほか、ChatGPTと音声英会話を毎日1時間ほど行いました。ちなみにオンライン英会話では、3年前にレッスンを受けていた講師がまだ働いており、レッスン中にお互いの近況を報告し合って盛り上がりました。
また、ChatGPTの音声英会話は速度・精度ともに驚くほど優れており、ほぼ毎日1時間ほど会話していました。この頃は、とにかく口から英語を出すことを意識していました。
だいたい2週間ほど経った頃には、英語を話すことにかなり慣れてきたと実感できました。
コーディング面接
競技プログラミングの経験はあるものの、長らく離れていたためLeetCodeに課金し、Arai60: コーディング面接対策のために解きたいLeetCode 60問やBlind75を中心に取り組みました。特にアルゴリズムの本などは読まず、問題演習をひたすら繰り返しました。だいたい1か月で180問ほど(Easy 47/Medium 110/Hard 21)解き、年末年始はほぼLeetCode漬けでした。
問題を解く際はVS Codeなどを使わず、LeetCode上の補完もエラーチェックもないエディターに直接コードを書くようにしていました。本番の面接では補完やエラーチェックのないテキストエディターを使う可能性が高かったからです。
どの難易度でも「20分以内にコードを書き切る」ことを目標にし、時間内に解けなかった問題は改めて1から解き直しました。提出後は他の人の解答や解説も参考にして、理解を深めるようにしていました。
準備期間が短かったこともあり、もっとも書き慣れているRustでコーディング面接に臨みましたが、あまり良い選択ではありませんでした。面接では「コードを書いて実際に動かす」形式が多かったため、Rustだとタイピング量が増え、厳格な型チェックや所有権まわりでコンパイルエラーが発生したときに大幅に時間をロスしてしまいます。さらに、TreeやListなどのデータ構造を実装する際にもコードが長くなりがちです。よほど自信がある方でなければ、Pythonで臨むほうが無難だと思います。僕の場合は「次に転職するならPythonでコーディング面接を受けよう」と固く心に決めました。
システムデザイン
シニアソフトウェアエンジニアのポジションに応募すると、ほぼ必ずといっていいほどシステムデザイン問題が出題されます。
僕は主に『システム設計の面接試験』やByteByteGoのYouTube動画を参考にしました。コーディング面接と比べて練習しづらいので、十分な準備ができたとは言えませんが、本や動画でシステムデザインの基本的な流れやお作法を把握した上で臨みました。
実際の面接では、これまでの業務で培った経験が大いに役立ちました。稼働中システムはそれ自体が貴重な教材になりますし、Design Docを書く際に検討した設計パターンや技術選定の知識も活用できました。
行動面接
シニアソフトウェアエンジニアのポジションでは、行動面接(Behavioral Interview)が出題されることも多いです。行動面接は、過去の具体的なエピソードをもとに回答する形式なので、日頃からプロジェクトに真剣に取り組むことが重要だと感じました。
僕は英語が苦手で、質問に対してとっさにエピソードを英語でまとめるのが難しかったため(日本語でも難しいですが)、過去の成功・失敗体験を振り返り、「自分がどのように行動し、何を学び、次はどうするか」を事前に整理しておきました。
エピソードの整理後は想定される質問と回答を用意し、日本語で書いた内容をChatGPTに校正・翻訳してもらい、STAR法に沿った英語の文章へブラッシュアップしてもらいました。
今回の面接で、一番対策しておいてよかったと感じたのがこの行動面接でした。ChatGPTには本当に助けられました。
さいごに
転職活動を振り返ると、全体的に準備不足だったなと感じます。こういった準備は普段からコツコツとやるべきですが、働きながら時間を確保するのはやはり難しいですね。
僕の場合は「競技プログラミング」で培った貯金が効いたので、何とか乗り切れたと思います。競技プログラミングには感謝です。
一方、「英語」と「システムデザイン」はまだまだ実力不足なので、今後も精進していきます。特に「システムデザイン」はTechMockInterviewなどの外部サービスも活用して練習してみようと思います。
人生で初めて「シニアソフトウェアエンジニア」という肩書きを得られることになったので、それに見合う成果を出せるよう頑張りたいと思います。不安もありますが、これ以上ないほど挑戦しがいのある環境だと感じており、ワクワクしています。
Author togatoga
LastMod 2025-03-09