読書メモ:システム設計の面接試験
システム設計の観点を広く浅く解説している本。
(新卒のときに読みたかった)
今となっては、「まぁそうだよな」と思いながら読んでいるが、この「まぁそうだよな」と確認する作業が大事だと思っている・・・
システムのスケールの観点
- Web層はステートレスに保つ
- 状態データを外に出す
- 各階層で冗長性を確保する
- 可能な限りデータをキャッシュする
- キャッシュ有効期限
- 複数DC
- 静的コンテンツをCDNでホスティング
- シャーディングによるデータ層の拡張
- セレブ問題 (= ホットスポット・キー問題)が発生する可能性がある
- 複数のDBサーバを跨ってシャーディングされるとJOINが難しい。一般的な回避策はDBの非正規化
- システムの監視と自動化
見積もり
- 四捨五入と概算
- 仮定を書き出す
- 単位にラベルをつける
システム設計の面接試験フレームワーク
エンジニアにとって最も重要なスキルの1つは、正しく質問し、適切な仮定を経て、システムを構築するために必要なすべての情報を収集すること。
- 具体的にどのような機能を開発しますか?
- Webアプリ vs モバイルアプリ?
- 最も重要な機能は?
- 1ユーザが持つデータサイズは?
- 扱うデータの種類は?(画像、動画、テキスト?)
- ユーザ数はどのくらいですか
- DAU (Daily Active User) は?
- どの程度のスピードでスケールアップすることを想定していますか?
- 3ヶ月、6ヶ月、1年後のスケールアップはどの程度を想定していますか?
- その会社の技術的な問題は何ですか?
- 設計をシンプルにするために活用できそうな既存サービスは何か?