ソフトウェアエンジニア面接の傾向と対策
ソフトウェアエンジニアをやって8年目。最近2回目の転職活動をしました。今回は日系の大手企業から外資の東京リージョンやフルリモートの会社まで幅広く受けました。そして最終的に日本の大手企業から内定をもらうことができました!(入社が6月なので、実際に入社したら会社名も書くかもしれません。)
前職では採用側で面接をすることもありましたが、候補者として面接を受ける経験は久々のものでとても苦労しました。その中で、ソフトウェアエンジニアの面接にはいくつかの形式があり、それぞれに対策が必要なことがわかりました。どんな面接があり、それぞれどんな視点があるのか、候補者としてどう対策していくかを書いていきます。
これから面接を受ける方、採用面接をする方の参考になるのではないかと思います。
ソフトウェアエンジニアの面接形式とその特徴
面接にはいくつか形式があり、今回は以下の6つを紹介します。
コーディング面接
システムデザイン面接
コードベース改善面接
実務
知識質問面接
行動質問面接
それでは、一つづつ見ていきたいと思います。
コーディング面接
これは米国のテック企業が古くから取り入れている面接形式で、問題のお題が出されてそれに対して実際にホワイトボードやGoogle Docsなどにコードを書いてみせるというものです。最近は日本でも取り入れる企業が増えてきています。どんなものかはGoogleのYouTubeチャンネルで公開されているものを見ると参考になります。この動画では「Intの配列とTargetの数値が渡されるので、配列の中の2つの数字を足すとTargetになる組み合わせを出力するようなプログラムを書いてください」というお題の面接です。
対面でやる場合もありますし、HackerRankなどのシステムを使って候補者がいつでもできるような場合もあります。
採用側として、この面接は候補者の問題解決能力を見ることができるといわれています。未知の問題に対して候補者がどうアプローチしていくかを見ることで、候補者の思考プロセスを見ることができます。一方で、この形式の問題点はすでに候補者が知っている問題が出題されてしまった時に前述のような能力を測れるかどうかは微妙なことです。ただ、実際にコードを書いてもらうので、クリーンなコードを書けるか、適切な変数名がつけられるかなどコーディングに関して得られる情報量は多いと思います。
候補者側の視点に立つと準備に時間がかかることがデメリットです。この面接のためには「データ構造とアルゴリズム」について学習し、問題が解けるように練習しておく必要があります。その準備をするだけで、早くて数週間(過去に学習したことある人)、長くて半年以上かかります。アメリカではソフトウェアエンジニアは人気の職種でコーディング面接が第一関門なので、コーディング面接対策について多くの書籍・YouTubeチャンネル・オンライン教材が生まれては消え、もはや一大産業のようになっています。老舗では "Cracking the Coding Interview" (日本語版)という書籍、最近ではNeetCodeというサイトが人気です。日本語での情報はあまり多くないですが、競技プログラミング関係の書籍が比較的近いものがあります。個人的には『問題解決力を鍛える!アルゴリズムとデータ構造』 を繰り返し読んで日本語で概念を理解し、英語の問題集で繰り返し練習しました。
データ構造とアルゴリズムの学習は時間がかかり大変ですが、ひとまず学習してしまえば、どの企業を受けても頻出するトピックはだいたい同じなので学習した内容が使いまわせるという点では便利です。
ここまで読んできた人の中で、「ソフトウェアエンジニアは普段からコーディングしてるのだから、普段の業務がコーディング面接対策になっているのでは?」という疑問を持たれる方もいるかもしれません。しかし残念ながら普段の業務で必要とされるコーディングスキルとコーディング面接で出題される問題を解くためのスキルは思考プロセスで相関はあるものの、実際には別物で、対策が必要です。この対策ついてはこちらの記事で解説しています。
システムデザイン面接
コーディング面接が実際にコードを書く面接である一方で、システムデザインはより設計に重きをおいた面接です。この面接ではお題を渡され、それをどういうシステム構成にするかを説明、ディスカッションします。
例えば、「デプロイシステムを作る」というお題で模擬面接をしているのが次の動画です。
実際のソフトウェア開発でもコーディングする時間よりも、チームでどういうふうに作るか議論する時間は長いです。そこでの議論の成否が最終的なコードの成否に繋がります。ただコードを書けるだけではいいソフトウェアは作れません。そういった意味で、この面接はより実務的な能力を測れる面接形式だと思います。候補者側としても普段からこういったことを業務でやっていれば、コーディング面接ほどには対策に時間を取られないでしょう。
コードベース改善面接
この面接は前述したコーディング面接とシステムデザイン面接のちょうど中間のような面接です。土台となるコードベースが与えられ、そのコードを見ながらどのような改善ができるか候補者が提案、議論する形式です。
模擬面接ではなくメンタリングセッションですが、この動画がイメージに近いです。
採用側として、この面接では候補者がどのくらい早くコードベースを理解できるか、どんな着眼点を持っているか、また設計に対してどのようにアプローチしていくかを見ることができます。一方で、少しコードを書く時間があるので、システムデザイン面接よりもシステム設計について質問する時間が限られてしまいます。また、この面接のためのコードベースを作るのはコストがかかり、これをそれぞれの面接官が習熟するためのコストもかかります。さらにコーディング面接に比べてレパートリーはすごく限られてしまうため、問題が漏洩した時のリスクが高い点が難点です。
候補者側の視点では、普段の業務にとても近いため対策にほとんど時間がかかりません。ペアプログラミングのように話しながらコードを改善していくので、同僚候補の雰囲気もなんとなく伝わってきます。この点はとても好きな面接でした。
実務
コードベース改善はより実務に近いものでしたが、さらに実際に一緒に働いて候補者とのマッチングを図るのが実務形式の採用方法です。報酬が支払われることもあります。私の以前の職場では「お試し仕事」と呼ばれ、実際に候補者に報酬も支払われました。実際の仕事を一日一緒にするので候補者・採用側ともに、面接よりも多くの情報が得られます。ただこの方法の難点は時間がかかることと、お題を準備するのが大変というところです。お試し仕事のために1日単発のタスクがちょうど良くあればいいのですが、なかなかタイミングよくそういうことはないので、準備が難しいものです。候補者側としても、報酬をもらえるものの、時間がかかるので少し抵抗があります。個人的には、報酬がもらえるとはいえ、不合格だった場合にかけた時間がもったいなく感じるので、せめてどんなことが良かったかなど学びのあるフィードバックがあると企業に対する印象が悪くならずに終われたように思います。ただ、それらの点を乗り越えれば一番ミスマッチを防ぐことのできる採用方式なのではないかと思います。
知識質問面接
上記の面接形式はコードや設計図など何かしらアウトプットのある面接でしたが、口頭だけで完結する面接もあります。それが質問系の面接です。
知識質問面接はドメイン知識やコンピュータサイエンスの基礎知識を問う面接です。例えば、私ならiOSエンジニアの職種に応募していたので、iOS開発に関する基礎知識を聞かれました。コンピュータサイエンス系の質問ではデータ構造とアルゴリズムについて聞かれることが多いです。
これらの面接では採用側としては候補者が基礎的な知識を持っているかどうかを測ることができます。ただ、個人的に候補者としてはこの面接はあまり好きではありませんでした。たしかに必須の知識というのはどのドメインにもあるように思います。しかし、何が必須知識で何がそうでないかの線引きは人によって意見が分かれるところです。さらに、技術の移り変わりはとても早く、ソフトウェアエンジニアのキャリアを重ねる中で、必要な時に必要なことを素早く学べることの方が大事だと考えています。受けた会社の中には「採用プロセスでドメイン知識は質問しません。問題解決能力だけを見ます。」と言い切っている会社もありました。
個人的にはこの面接形式はあまり好きではないですが、知識を整理する意味で準備はしました。この時に使用したのがChatGPT APIです。ChatGPT APIを使えばプロンプトを学習に使われないとされているので、ChatGPTよりもAPIの方を使うのがおすすめです。「自分がどの職種に応募していて、どんな面接があり、想定される質問のリストを作ってほしい」というようなプロンプトを入れると、ずらっと質問リストを作ってくれます。それらに対して自分なりに答えを用意すると、勉強にも面接対策にもなり、一石二鳥です。
行動質問面接
今までの職歴の中でどんなことをしてきたかを聞かれます。例えばプロジェクトを率いた経験や、今まで経験した技術的なチャレンジは何かといった質問をされます。いわゆる面接という感じで想像しやすいかと思います。
この形式の面接でソフトウェアエンジニアの実装力を測ることは難しいです。一方でプロジェクトを率いる能力や他の人との協調性を測ることはできそうです。候補者としてはよくある形式なので、特筆することはありません。
この形式の面接準備にもChatGPTはとても便利でした。自分の職務経歴とそこから想定される質問をChatGPTに考えてもらい、それに対して自分の答えを整理することで、効率的に面接対策ができました。
どの面接形式が優れているのか?
採用側としては何をみたいかによる
ここまでいろいろな面接形式を見てきましたが、どれも特徴があり、一つで候補者とのマッチングを完全に測れるものはありません。そこで、それぞれの面接形式を組み合わせてベストマッチを探っていくしかないんだろうなと、月並みの結論になります。ただ、いろいろな募集要項を見ると総じて「リーダーシップがあって、設計できてコードの書けるエンジニア」が求められていると思うので、コーディング面接やシステムデザイン面接でコーディングと設計能力をみて、行動面接でリーダー資質を見るというのが一般的な流れになるのではないかと思います。
米国ではコーディング面接が盛んで、日本企業も徐々に取り入れているところが増えてきているように思います。ただ、コーディング面接も準備の大変さや、実際に面接で問われた時の問題との相性次第なところがあって完璧ではないので、何かより良い面接形式の発明が待たれるところではないかと思います。
候補者としては形式に合わせて準備を
今回候補者側で面接を受けて、いい面接も悪い面接もあり、とても勉強になる機会もあればそうでないものもありました。何がいい体験と悪い体験を分けたかと振り返るとやはり自分のレベルと面接官の求めるレベルが合ってる時に波長が合い、いい体験に感じられました。
もちろん日頃の実務の中でエンジニアとしてのレベルを上げていくことも大事ですが、面接前の準備もとても大切でした。一度学習したことのあるトピックでも面接の時にいきなり聞かれると緊張から知識を思い出せず、ディスカッションにならないこともあります。そういったことにならないために準備がとても大切で、今回はChatGPTにとてもお世話になりました。特に質問系の面接にはとても威力を発揮しました。ChatGPTで質問を考えてもらい、答えを作り、さらに深めていく作業をすることで回答に深みを持たせられます。面接の準備にChatGPTを使うことはこれからどんどん広がっていくと思うし、この感動を他の人にも体験して欲しいという思いから「AI面接コーチ(仮)」というアプリ・サービスを計画中です。もし興味のある人はこちらのウェイティングリストに登録してもらえると開発進捗やリリース情報をお届けします。
最後に
ここまでさまざまな面接形式を見てきました。転職活動はとてもストレスのかかる大変なものです。この記事が参考になって転職活動の負担が少しでもラクになる人がいればとても嬉しいです。
また、詳細が聞きたいことや質問などがコメントやTwitterで連絡してください。
よろしければサポートをお願いします。いただいたサポートは今後のスキルアップに使います。