「システム設計の面接試験」が使える場面は面接試験だけじゃない! 「システム設計の面接試験」の勉強会を行った話

お久しぶりです。 ANDPADボードのプロダクトテックリードの原田(tomtwinkle)です。

「システム設計の面接試験」はいいぞ……! 的な記事が上がってきてせっかくなので書かねばと筆を執りました。

zenn.dev

「システム設計の面接試験」はいいぞ……! !

What's System Design Interview?

「Grokking Modern System Design Interview」「System Design Interview」とは主に外資企業の面接で行われるJob Interviewの対策マニュアルみたいなものです。

面接試験 と言いつつ内容は大体GoogleやAmazon, Meta(旧Facebook), Netflix, X(旧Twitter)等の大規模トラフィックを捌くシステムを構築する際どのようにシステムを設計するかという話なのでAWSのマネージドサービスの実装部分まで細かく書かれた AWS Well-Architected みたいなやつです。普段の我々の業務内容と被っており非常に勉強になります。

2020年にアレックス・シュウ氏がそれらの情報を纏めて「System Design Interview」という本を出版しました。

そして、2023年に「システム設計の面接試験」という題名で日本語訳されました。

今回はその本の内容を元に社内で勉強会を行いました。 勉強会の内容を書きすぎると本の内容そのものになってしまうのでどんな感じで勉強会を進めたかと言う内容を書いていきます。

勉強会の進め方

  • ファシリテーター(私)がまず本を読み込んだ上でざっくりとした解説スライド、その章に関連する小ネタを事前に書いておく
    • 事前の仕込みをやっておかないと無言で本を読む輪読会や当たり障りの無い感想を述べる感想会になってしまいがち
  • スライドを見ながら参加者各々の今までの業務知識を元にディスカッション
  • 面接試験形式で実際にお題を出して参加者各々がシステム設計を考えてみる
  • 参加者各々がお互いのシステム設計を見てディスカッション

最初は週1回30分で実施していましたが時間が足らず、週1回45分の勉強会となりました。

解説スライド

実際に勉強会をファシってみて事前の準備が重要だというのを実感しました。

本の中ではあくまでシステム設計の際の参考として「分散システムを考慮した並列処理可能なシステム」とか「キャッシュの必要性」とか「トライ木の実装」とか「Fanout」とか「通知」とか「グラフDB」とかサラッと書かれていますが、どんなシステム要件だとそのシステム設計がマッチするのか本に書かれている内容以外ではどんな例があるのか詳細は自分で調べて判断して欲しい的な内容が多いので、そこを補完してからでないと本の内容だけだとそもそも議論に進めないなと感じる事が多々ありました。

  • 通知のケースでWorkerを分離していることに対しての説明がないとか
  • WebSocketの説明はあるがWebRTCやGraphQL SubscriptionやgRPC Server streaming RPCの説明がないとか
  • 全文検索の話をしているのにElasticsearchのような全文検索エンジンの話が出てこないとか
  • クラウドファイルストレージで信頼性を担保する設計の話を出した上でS3のイレブンナイン堅牢性について書いてないとか

諸々ですね。

もちろん作者は分かった上で全部書くと本が冗長になってしまうので「面接対策」に焦点を絞って敢えて端折ってるのだと思います。

以下は勉強会で使用したスライドの一部抜粋です。

業務知識を元にディスカッション

弊社は割りと色々な企業を渡ってきた歴戦のツワモノ達が集まっている(主観)ので、今まで実際にシステム設計した体験談を共有したいなという気持ちで本の感想兼ディスカッションのセッションを挟んでみました。

実際に「前職で同じようなシステムを作ったことがあるがその時は〇〇だった」「〇〇くらいの流量ならそこまで頑張らなくてもFirestoreで何とかなりそう」「〇〇みたいな仕組みのサービスがある」みたいな面白い話が色々聞けて良かったです。

システム設計を考えてみる/システム設計を見てディスカッション

若干挑戦的な内容でしたが、せっかく「面接試験」の本なので実際に面接を受ける想定で幾つかその章に関連するお題を出してシステム設計を書いてみるということをやってみました。 勉強会という時間制約もあり10分程度しか設計の時間がなかったので、ざっくりとこんな感じでどう?みたいなアウトプットを各々書いて補足事項を口頭説明する形式になりました。 普段チームを超えてシステム設計の話をする機会はあんまり無いのでなかなか盛り上がったかなと思います。

我々の学習はまだまだこれからだ

「システム設計の面接試験」には様々な引用元が出てきます。 DynamoDBの論文やGoogleドライブの競合解消のための論文など見ていてとても面白く参考になる内容が多いです。

本を読んだ皆さん、これから本を読む皆さんも是非引用元のソースを見てみてください。

勉強会の範疇内ではそこらへんの重箱の隅を突く事は出来なかったので別の機会で勉強会を開いていけたら面白そうだと考えています。

さいごに

アンドパッドではエンジニアを積極採用中です。 ご興味を持っていただけましたら、下記よりお気軽にカジュアル面談や採用職種についてお問い合わせください!

engineer.andpad.co.jp