あらすじ
はじめに
遡ること2023年6月、英語で働けるソフトウェアエンジニアになることを目的にバンクーバーに渡った無職の僕は、紆余曲折の末に現地での就労を断念して帰郷。往年の子供部屋へと拠点を移して就職活動を続けること数ヶ月、次の仕事を決めて今に至る。本稿の内容は、この活動の経緯と、英語でエンジニア採用プロセスを突破するために実践したことから構成される。
そのねらいは、活動を余すことなく言語化して、過去にすること。ここ数週間はなんだか挫折感と達成感が混じり合った生ぬるい余韻に浸っているような心地がする。そこから抜け出したい。記事にしたためて、ついでに美談に見えるように精一杯の装飾を施して、もう頭の中から追い出しても良いのだと自分に言い聞かせたい。
ついでにエンジニアとしてもコミュニティに貢献できればいいと思う。僕の活動の大部分は、世界中の同士がネットでシェアしてくれた情報をもとに成り立っている。僕も情報を生産してコミュニティに価値をもたらすことを目指す。
個人編
自分を語る。
目標の達成度
渡航時、僕は次の二つの目標を立てた。
- エンジニアとしてカナダで雇用され、仕事した経験がある
- 人前でギターを弾いて、一度で良いから音楽を通して交流した経験がある
それぞれの達成度を自己評価するところから始める。
1. エンジニアとしてカナダで雇用され、仕事した経験がある
カナダで就労することは断念した。ただし、英語で Tech Interview を突破する経験を積むことが出来たという点でそれなりの達成感を感じている。
2. 人前でギターを弾いて、一度で良いから音楽を通して交流した経験がある
就職活動への尽力を大義名分として早々に放棄した。現地のブルーグラスコミュニティに何度か参加はしたものの、真剣に音楽に向き合うことはなかった。以降、本稿で音楽に触れることはない。
活動の経緯
2022年12月、英語の勉強を始める。
2023年6月、退職、渡加。
2023年9月、カナダで就職活動を開始する。
2023年12月、計60社程度応募したものの、選考に進めたのは2社のみ。このままでは Tech Interview の経験を積むことすら出来ないと悟る。重要なのはカナダで就労することではなく、英語で働けるようになることであると顧みて、日本、または APAC のリモートで働けるポジションへと対象を変更する。
2024年3月、日本で就職活動を再開する。
2024年7月、計20社ほど応募して、4社内定。
2024年9月、就労開始。
総括
予想を超えて長引いた無職期間のあいだ、僕は朝から晩まで自分のためだけに時間を使った。子供の頃には当然のように享受していた時間を、大人の僕は貯金と、履歴書にできた不格好な空白を代償に獲得したのだ。そんなことをする必要があったのかはわからないが、長い人生、こんな1年数ヶ月があったっていい。
僕はこの期間の主要な部分をカフェに篭り、Tech Interview の準備に費やした。徹頭徹尾無職なので、最善の計画を練ることも、心行くまで勉強することだって自由だ。したがって面接の都度突きつけられる合否を前に逃げ場はなく、戦略は緊張感を帯びたものとなる。そうして目標に漸近していく様を実感できる喜びは何物にも変え難い。結露がつくる水溜りに鎮座する、ぬるいカフェラテを傍らに、僕は久しぶりに熱狂していた。
物思いに耽る時間は無尽蔵に襲ってくるので、ひとり反省会に精を出すことが多かった。下記は渡加直後の反省会メモからの一節で、心底面倒くさがりな自分を、我ながら鋭く言語化していると思う。
…辛いのは、延長線上に目標を達成する自分が見えず、かつそれでもなお、傷つくこと、面倒なことを回避する目的で課題を先延ばしにしている状態。なぜその状態に陥って抜け出せない?そっちの方が面倒なことに立ち向かうよりも心地よいから。能力や才能は関係ない。仮に関係ある領域があったとしても、自分はそこにはいない。だから現在のありさまは、決して自分の能力不足を意味するものではない。自分の選好を意味するだけ。「俺は、努力して目標を達成するよりも、居心地がよい領域にいる方が好き」と言っているだけ。悪いことでも、他人に非難されるものでもない。
けれど自分は、その欲求・本能に抗おうと試みてきた。なぜだろうか?居心地が良い領域よりも、大きな歓喜があると信じているから?社会に、他人に、もっと褒められたいから?口では大層なことを言って、やっているフリだけするのが、社会からの評価と、自分の快楽とをバランスよく実現すると気づいているから?
この言語化がいちばんしっくり来た。これもただの事実。認知は人それぞれ。ともかく、自分はこのように考えていて、さらにこれを変えたいと考えた。だから、やっているフリでは済ませられないよう、自分の逃げ道をあらかじめ塞いでおいた。立派な前進。じゃあ今度は、さらにもう一歩踏み込んで、やっているフリからなお自分を遠ざけるにはどうすればよいかを考えよう。
この本能と対峙する理性の存在を、わずかでも自分に認めさせたことに、自己受容を感じたい。
技術編
エンジニア採用プロセスを語る。
Data Structures and Algorithms
Data Structures and Algorithms, DSA とは、原始的なデータ構造と、それらを用いて普遍的なロジックを効率よく実行するために開発されたアルゴリズムを扱う知識体系のことを指すものであると理解している。
学習の指針を得るためには、 DSA がどのような形で Tech Interview に現れるかを知ることが有益だろう。これは二つのケースに大別される。第一に、知識そのものを質問されるケースだ。代表的な例として「データベースのインデックスにはどのデータ構造が、どのような利点を根拠に使われているか」という質問がある。第二に、知識を実践できるかを評価されるケースが挙げられる。コーディングやシステムデザインといった応用的なラウンドでは、目的を効率よく達成できるデータ構造とアルゴリズムを選択することが求められ、DSA の知識なしではコンピュータリソースの制約に抵触してしまうことがある。
僕は体系的な入門書 (CTCI) で学びながら、YouTube の関連動画で理解を補完した。独学に疑問はつきものだが、DSA 学習者が抱きがちな疑問というのは往々にして Stack Overflow や Quora 、Reddit といったプラットフォームで既出であり、腹落ちできる解説に到達できる可能性が高い。
学習した内容を英語で記事にしたためることははたいへん役立った。その利点として次の3つを挙げたい。
- 技術的な文脈で使われる自然な英語表現をストックできる。
- いちど初版を執筆すれば、知識の退避場所として、その後の学びを反映させていくことができる。
- 面接前に見返すチートシートのような役割を期待できる。
記事をプライベートな場所ではなく、人の目に触れる、したがって内容の正確さを評価される可能性がある場所に置いておくことにはそれなりに意味がある。僕の記事に辿り着くエンジニアなど皆無といっても差し支えはないが、それでもささやかな緊張感を勝手に享受している。
Coding Interview
Coding Interview では、限られた時間内に、与えられた課題に対して、時間・空間的に効率のよいアルゴリズムを思い付き、特定のプログラミング言語でこれを実装することが求められる。回答の妥当性を担保するためには DSA の知識が前提となる。Coding Interview の準備には二つの側面がある。
第一に、解法の見当がつかない課題に対して、時間内に回答を導くことは不可能に近い。したがって代表的な解法やアプローチを仕入れ、かつそれを面接本番で応用できる程度に身体に馴染ませる必要がある。LeetCode では出題頻度や難易度、分野ごとに良問に取り組むことができる上、解説やコミュニティが充実しており、名実ともに Coding Interview 練習プラットフォームのデファクトスタンダードである。Top 100 Liked Questions を中心に、初見で解けなかった問題を対象に反復学習した。また Glassdoor には過去問に相当する情報がシェアされていることもあり、個別企業の対策を講じる上で強力なインプットとなった。
第二に、Coding Interview では、リアルタイムに面接官と対話しながら回答を完成させることが求められる。したがって、まずは自分の思考プロセスを英語で共有できる必要がある。また、解法が思いつかない場合にはいちど Brute-force なアプローチを提案した上でより効率的な解法のヒントを求める、といった自分なりのファシリテーション戦略を身に付けることも重要だった。インプットとして僕がまず実践したのは、YouTube でネイティブがコーディングする動画をディクテーションして便利な表現を模倣する、というもの。アウトプットには Pramp というプラットフォーム を利用した。ここでは世界中のユーザをマッチングして、面接官役を交互に演じることで Coding Interview の対人的な側面を無料で練習することができる。学びは言語化するのが、先述と同一の理由で有効 (参考: https://github.com/ryoma-t/sandbox/blob/main/README.md) 。
面接の意義
僕が考える面接の意義とは、自分がそのポジションにどれくらい相応しいかを明快に表現し、雇用側に対して判断材料を効果的に提供することだ。月並みなだが、この結論に至る前の僕は、Job Description に記載された Qualifications の項に徒に圧倒されたり、とにかく自分を大きく見せようと躍起になったりしていた。
この意識が顕著に現れる一例としてカバーレターが挙げられる。カバーレターとは、経歴を簡潔にまとめたレジュメとは別に、特定のポジションを念頭に Hiring Manager に訴求したい内容をしたためた補足資料であると理解している。カバーレターを書くにあたって長いあいだ僕は、レジュメと同一の内容をお化粧直しして繰り返したり、自発性だとか熱意だとかを演出してみたりするものの、その意義に腹落ちできずにいた。しかし就活終盤に上述の結論を得てからは、カバーレターにも自分なりの書き方を確立できた。それは Job Description や企業ホームページに散りばめられた情報を「どのような価値観の下、何の職責を、どの技術を使ってこなすことが期待されるか」という構造で再構築した上で、この解釈と自分の経験・技術とを対比して正直に言語化する、というものだ。そうして作り上げたドキュメントは、面接プロセスを通して一貫した自分を保つのにも役立った。
DSA の勉強や Coding Interview 対策の重要性を僕が敢えて強調する必要はないが、相手が欲する情報を正直にかつ明快に伝えるための準備というのも、大いに結果に資する活動だと思う。
おわりに
本稿タイトルは『爆発だッ!タローマン』 (ことば: 岡本太郎 作詞: 藤井亮 作曲: 林彰人) からの引用。