見出し画像

GAFAに入るためのシステムデザインの勉強法

前回はYoutubeでLeetcodeの解き方を話ししたところ、システムデザインの方もと聞かれたので、その穴を埋めす。この記事は私がやって効果的だったことです。コンフィデンシャルな情報はありません。また面接の最新情報や直接のアドバイスはリクルータに聞いてください。

  1. 例としてどんな問題が聞かれるの?

  2. システムデザインセッションの目的

  3. どんな能力が見られているか

  4. システムデザインインタビューの流れ

  5. 勉強中に注意すること

  6. 勉強に定番のマテリアル

  7. 普段できること

どんな問題が聞かれるの?

例えばtwitter, Uberなどよく知られているシステムのデザインが聞かれるインタビューです。例はググればたくさん出てきます。

システムデザインセッションの目的

このオフィシャルの動画通りです。
https://www.youtube.com/watch?v=Gg318hR5JY0&t=18s

システムデザインは候補者がどのくらいシニアなのかを決めるためのセッションです。シニアのポジションであればあるほど、ウェイトが大きくなります。会社によってエントリーポジションにも聞くことがあるので、リクルータに確認する必要があります。またコーディング面接がとてもうまく行ったので、リクルータの方から追加面接でシステムデザインをオファーしてくれることもあります。理想はこれまでの仕事や趣味での経験でいろんなシステムをデザインしてきてそこで得られる知恵を生かせることですね。

どんな能力が見られているか


システムデザインのインタービューは候補者の複雑なシステムをデザインする能力を見ます。ブレイクダウンすると、
複雑な問題を小さなタスクたちにブレイクダウンする能力
選択肢のトレードオフを考察する能力
議論をリードする能力

具体的なツールの使い方ではなく、コンセプトをしっかりわかっている必要があります。例えばデータ構造、スケーラビリティ、キャッシュなど。

システムデザインインタビューの流れ

  1. インタビューアーが問題を出す

  2. デザインするスコープを確認する

  3. 問題をブレイクダウンする

  4. パーツごとにデザインをする(ダイアグラムを書いたりすることで)

  5. その都度選択肢を上げてpros&consを考察する

  6. スケーラビリティ(もしユーザー数がOO以上ならどうするか)

  7. フォローアップの質問に答える

私に効果があった勉強の仕方


データ構造、スケーラビリティ、シャードなどのコンセプトをしっかり理解して使えるようにする。
そして例題を実際読んで、全てのコンポーネンツがどうしてそうなっているのかについてよくわかるようにする。
スケーラビリティーやデータ構造などは通用するコンセプトなので、一つの例題について完全によく理解できたら他のシステムにも通用できるようにする。
本番は自分が主体となって議論をすすめるのが求められるので、その練習もしましょう。

勉強に定番のマテリアル

Scalability

CS75 (Summer 2012) Lecture 9 Scalability Harvard Web Development David Malan

このハーバードのレクチャーは大事な要素がたくさん詰まっているので、何回も聞いて全部頭に入れて使えるようにしましょう。

Githubで使えるサイトをまとめた人がいます。大事そうなものを拾って読んでみましょう。

Youtubeにダイアグラムを書いて教えてくれる動画もたくさんあるので、利用してみてください。

あとは自分が好きなプロダクトや気になるシステムを見たときに、ソフトウェアエンジニアとして自然とそのシステムがどう動いているか(データがどう保存されていて、どうやってリアルタイムを達成できているのかなど)について考えますよね。その都度で疑問に思うことを調べておくといつか点で学んだ知識が線としてつながる日がきます。

この記事が気に入ったらサポートをしてみませんか?