みなさんこんにちは! 2021年4月に新卒入社したソフトウェアエンジニアの Masuda と Doppo です!
本記事では、新卒エンジニア研修の中で行われたシステムデザインインタビューの内容をご紹介します。 大規模システムの設計プロセスを疑似体験し、実務経験に基づいたフィードバックを受けるこの研修は、自分の成長を実感できる刺激的なものでした。
システムデザインインタビュー研修とは
システムデザインインタビューでは、大規模システムをどのように設計するかを議論します。 日本ではあまり馴染みのないシステムデザインインタビューですが、Google などの著名な外資系IT企業では採用試験に用いられており、海外では良く知られているようです。
研修でのシステムデザインインタビューの流れは以下の通りです。 まず、面接官から大きなテーマが与えられます。例えば、「YouTube を作ってください」と言った具合です。 次に、要件を整理します。受験生はサービスに必須な機能・想定するユーザー数などを面接官とすり合わせます。 続いて、必要な計算資源の量を推定します。例を挙げると、サービスの月間アクティブユーザー数は少し調べるとわかることが多いので、その値から必要なネットワーク帯域・毎月の CDN のコストなどを概算します。 そして、システムアーキテクチャを設計します。主要な機能と機能同士の繋がりを考えます。以下はアーキテクチャ図の一例です。
面接官は図を見て、設計のボトルネックとなる箇所を指摘したり、新たな機能要件を加えたりします。 受験生は面接官のフィードバックを受けて、さらなる議論を行い、面接官と一緒により良いアーキテクチャーを目指します。 以上のようにシステムインタビューは、コミュニケーション能力も含んだエンジニアとしての総合力が試される試験となっています。
システムデザインインタビュー研修の目的
新卒研修の目標は、コードがスラスラ書けるようになることではありません。 より抽象的でエンジニアとしていつでも役に立つスキルを身につけることを目標としています。 新卒として入社した自分たちが、研修でシステムデザインインタビューの練習を行った目的は2つあります。
1つ目は、システムの設計に関する汎用的な知識を身につけるためです。例えば、以下のようなものが該当します。
- どのようにしてゴールを明確にするか
- どのような非機能要件があり、どれを考慮すべきか
2つ目は、設計に関する議論・説明をできるようにするためです。 扱うシステムが大規模になればなるほど、それに関わる人の数は多くなります。 その際に、周囲の人が理解できるように技術的な事柄を説明する必要があります。 システムデザインインタビューは、そのための練習でもあります。
確かに、新卒で入社していきなり大規模システムの開発に関わることはないかもしれません。 しかし、システムを安定稼働させるための非機能要件に関する知識は、技術の流行り廃りと関係なく、今後ずっと役に立つはずです。 今回の研修では、数多くある非機能要件の中でも特に拡張性を意識しながらシステム設計を行いました。 また、技術的な事柄を周囲の人に説明をする能力は、新卒でも配属直後から求められます。
システムデザインインタビュー研修の内容
通常は面接官にその場でテーマを提示されますが、研修では本番で扱うテーマが事前に知らされていました。 練習をする期間は約1ヶ月ありました。
研修生にはメンターが1人つき、毎週1時間システムデザインインタビューの進め方に関する指導を受けます。 練習は本番と比較して時間に余裕があるので、分からない箇所を残さないように丁寧にシステムデザインインタビューを進めていきます。 メンターさんからは、様々な要素技術の理解度を逐一確認されます。 知識が足りない場合は、説明を受けたり、公式ドキュメントを一緒に読んだりします。 また、システムデザインインタビューがどこまで進行したかを Google Docs などで記録を取りながら進めます。
本番は45分間で、進め方や技術的な知識を評価されます。 評価は後日 PDF で受け取ります。 その PDF にはシステムデザインインタビューの進め方の模範解答も含まれ、研修生は各自自身の進め方と比較して振り返ります。
振り返ってみて( Doppo 編 )
自分は研修が始まった当初、システムデザインインタビューという言葉そのものを知らない状態でした。 加えて、自分の扱うテーマは API rate limiter だったこともあり、どう実現されているのか考えた経験がないシステムについて扱わなければいけませんでした。
ただ、分からないことが多かった分、メンターさんとの練習では毎回学びがありとても楽しかったです。 rate limit させるためのアルゴリズムについて理解できなかったときも、一緒に参考資料を眺め併走しながらサポートしてくださいました。 とても心強く、そこで得た知識は本番を臨むにあたって励みになりました。
本番を終えてみて、確かに技術力だけではない、コミュニケーション能力も含めた、総合能力が試される問題だったなと感じました。 いくら rate limit させるためのアルゴリズムを知っていても、まずは面接官から実現したいシステムの要件を聞き出し進めていくコミュニケーション能力が必要になるからです。
また、本番の反省としては、もっと進め方のイメージを固めておくべきした。 システムデザインインタビューの中で行わなければいけないことが多い分、「結局どこからどの手順で進めればいいんだっけ?」が曖昧なまま臨んでしまっていました。
最後にいただける評価付きのフィードバック資料には、本番では考えきれなかった模範解答のアーキテクチャーが丁寧に示されているだけでなく、細かなアルゴリズムの選定方法など記載がありとても参考になりました。
この研修では、自分が考えたこともなかったシステムの設計を行っていくにあたって有効な手段をたくさん学べとても良い体験でした。 今後も配属先等で身に付けたスキルを活かしていきたいです。
振り返ってみて( Masuda 編 )
自分のテーマは Netflix でした。 動画視聴のサービスなので、ダウンロードトラフィックが多いのが特徴です。 大量アクセスに耐えうるようなアーキテクチャの設計方法を学びました。
メンターさんから受けたシステム設計のアドバイスは、実際の業務経験に基づいた内容だったので、とても納得がいくものでした。 以下は学んだことの例です。
- 要件を定義するにはどのような情報が必要か
- 必要な計算資源をどう推測するか
- どのようなアーキテクチャにするか
- 技術選定ではどのような箇所に注意するか
- 設計におけるボトルネックはどこになりそうか
本番が始まる前は45分も話すことがあるかと心配していましたが、やってみるとむしろ時間が足りなかったです。 要件を整理したり、アーキテクチャ図を描いたりと大忙しでした。 自分は、時間の使い方がうまく行かず、ボトルネックの検討などの本質的な問題にあまり時間をさけませんでした。
後日受けたフィードバックでは、要件定義の進め方やサーバーレスなシステムを設計した点は良かったとのことでした。 一方で、時間の使い方やシステムアーキテクチャの設計方法にはまだ課題があるとの評価を受けました。
また、この研修で訓練したスキルの重要性は、実務の中でも日々感じています。 特に会社での仕事はチームで行うものなので、人に説明する能力が常に求められます。 今後もここで身につけたスキルを業務に活かしていきたいです。
おわりに
本記事では、今年度の新卒エンジニア研修で行ったシステムデザインインタビューで私たちが学んだことをお伝えしました。
DeNA の新卒エンジニア研修ではどんなことを学ぶことができるのかをイメージする助けになれば幸いです。 今後も引き続き、新卒エンジニア研修の他の内容についてお伝えする記事を掲載予定です。
この記事を読んで「面白かった」「学びがあった」と思っていただけた方、よろしければ Twitter や facebook、はてなブックマークにてコメントをお願いします!
また、もしよろしければ DeNA 公式 Twitter アカウント @DeNAxTech をフォローして、今後の新卒エンジニア研修振り返りレポートについてもご覧ください!
最後まで読んでいただき、ありがとうございます!
この記事をシェアしていただける方はこちらからお願いします。