A little bit of everything

元・情報系大学院生の備忘録

読書メモ:システム設計の面接試験

システム設計の観点を広く浅く解説している本。
(新卒のときに読みたかった)

今となっては、「まぁそうだよな」と思いながら読んでいるが、この「まぁそうだよな」と確認する作業が大事だと思っている・・・

システムのスケールの観点

  • Web層はステートレスに保つ
    • 状態データを外に出す
  • 各階層で冗長性を確保する
  • 可能な限りデータをキャッシュする
    • キャッシュ有効期限
  • 複数DC
  • 静的コンテンツをCDNホスティング
    • CDNフォールバック (CDNの故障をクライアントが検知し、オリジンにリソースをリクエストできる状態にする)
  • シャーディングによるデータ層の拡張
    • セレブ問題 (= ホットスポット・キー問題)が発生する可能性がある
    • 複数のDBサーバを跨ってシャーディングされるとJOINが難しい。一般的な回避策はDBの非正規化
  • システムの監視と自動化

見積もり

  • 四捨五入と概算
  • 仮定を書き出す
  • 単位にラベルをつける

システム設計の面接試験フレームワーク

エンジニアにとって最も重要なスキルの1つは、正しく質問し、適切な仮定を経て、システムを構築するために必要なすべての情報を収集すること。

  • 具体的にどのような機能を開発しますか?
    • Webアプリ vs モバイルアプリ?
    • 最も重要な機能は?
    • 1ユーザが持つデータサイズは?
    • 扱うデータの種類は?(画像、動画、テキスト?)
  • ユーザ数はどのくらいですか
    • DAU (Daily Active User) は?
  • どの程度のスピードでスケールアップすることを想定していますか?
    • 3ヶ月、6ヶ月、1年後のスケールアップはどの程度を想定していますか?
  • その会社の技術的な問題は何ですか?
    • 設計をシンプルにするために活用できそうな既存サービスは何か?