本文へ移動

ホーム / Data / 第6部 面接の実践

第6部 面接の実践・第15章

設計・SQL の実技の面接

★★★ 必須11トピック・面接 5問

データ基盤の設計面接と SQL のライブコーディングの進め方、よく出るお題と回答例を押さえる。

ひとことで

「EC の売上分析基盤を設計して」に、要件・鮮度・取り込み・モデリング・品質・コストの順で答える。

設計面接では「EC の売上分析基盤を設計して」「アプリの行動ログを集めて、日次の KPI を出す仕組みを作って」「レコメンド用の特徴量を毎時更新して」のようなお題が出ます。正解は1つではなく、要件から判断を説明できるかが見られます。

答え方の型:次の順番で話すと抜けが減ります。

順番話すこと例(EC の売上分析)
1. 要件誰が何を決めるために使うか、データの量、指標の定義経営と営業が日次の売上を見る。注文は1日数十万件
2. 鮮度どれくらい新しい必要があるか(日次・毎時・数秒)翌朝 8時までに前日分。セール中だけ毎時
3. 取り込みバッチか CDC か、元はどこか注文 DB は CDC、広告の費用は SaaS の API を日次で
4. 保存・変換レイクか DWH か、層の分け方、冪等性DWH に生データ → dbt で staging・mart。MERGE で増分
5. モデリングファクトの粒度、ディメンション、履歴注文明細のファクト、顧客は SCD Type 2
6. 品質・運用テスト、監視、障害時の対応、バックフィル主キーの一意、件数の急変、鮮度の監視
7. コスト・権限料金の見積もり、パーティション、個人情報日付でパーティション、個人情報の列は隠す
EC の売上分析基盤(例)注文 DB広告の APICDC日次バッチDWHraw生データstaging整えるmart注文明細dbt:MERGE で増分・テストBI翌朝 8時までオーケストレーター・監視鮮度・件数・失敗の通知
EC の売上分析基盤の構成例(設計面接で描く図)

最初に質問で要件を固めること、そして各段階で「別の案(たとえばストリーム処理)もあるが、今回は鮮度が日次で足りるので、作りと運用が簡単なバッチにした」のように選ばなかった案と理由を言うことが評価につながります。時間が余ったら、データが10倍になったら・リアルタイムが必要になったら、の拡張を話します。

面接ではこう答える

データ基盤の設計面接では、正解は1つではなく、要件から判断を説明できるかが見られます。まず誰が何を決めるために使うか、量と鮮度を質問で固め、次に取り込み、保存と変換、モデリング、品質と運用、コストと権限の順に話します。各段階で「ストリームもあるが、鮮度が日次で足りるのでバッチにした」のように、選ばなかった案と理由を言うことが評価につながります。

45分の設計面接の時間配分(目安)0分8分15分35分45分要件の確認見積もり全体の構成と深掘り拡張・まとめ
最初の要件の確認を飛ばさないことが最も大事
時間することコツ
0〜8分要件の確認利用者・用途・鮮度・量・指標の定義を質問する。前提を書き出して合意する
8〜15分見積もり1日の件数・大きさ・1年の量。DWH で足りるか、分散処理が要るか
15〜35分全体の構成と深掘り箱と矢印の図を描き、面接官の興味のある所(冪等性・遅れ・品質)を深める
35〜45分拡張・まとめ量が10倍、鮮度が数分になったら何を変えるか。障害のときの動き

話しながら図を描くと伝わりやすくなります。オンラインなら、ホワイトボードのツールを事前に触っておきます。

分類質問の例
利用者と用途誰が、何を決めるために使うか。ダッシュボードか、分析か、ML か、業務への書き戻しか
指標の定義売上は税込か、キャンセルを引くか、日付は注文日か。日本時間か
鮮度何時までに必要か。毎日・毎時・数分。遅れたら何が困るか
量1日の件数、1件の大きさ、過去何年分を持つか、増え方
元のデータ業務 DB・SaaS・アプリのイベント・ファイル。誰が持ち主か
正確さ請求に使うほど正確さが要るか、傾向が分かればよいか
制約既存の DWH や道具、予算、チームの人数、個人情報の有無

全部を聞く時間はないので、設計を大きく変える質問(鮮度・量・正確さ)を先に聞き、残りは「〜と仮定します」と宣言して進めます。

データ基盤の設計面接の見積もりは、件数×大きさ×期間のかけ算です。細かい正確さより、桁と計算の道筋を声に出すことが大事です。

1日1億件のイベントの見積もり(例)1日 1億件1件 約1KB平均 約1,200件/秒生のまま約100GB/日ピークは平均の数倍1年約36TB365日分Parquet圧縮で数分の1列を選べばさらに少なく読む
桁が合っていればよい。計算の道筋を声に出す
覚えておくと便利な数値
1日の秒数86,400秒(約 10万秒)
1日 100万件のときの平均約 12件/秒
1日 1億件のときの平均約 1,200件/秒
1KB × 1億件約 100GB
1年365日(月はおよそ 30日)

見積もりの結果から、「1日 100GB なら DWH で十分。ピークの毎秒数千件はキューで受けてまとめて書く」のように、設計の判断につなげて話します。列指向の圧縮がどれくらい効くかはデータによるので、「数分の1程度と仮定します」と前提として言います。

15.5よく出るお題

★★★ 必須
お題見られる論点
EC の売上分析基盤CDC かバッチか、明細の粒度、SCD、売上の定義、遅れて届く返品
アプリの行動ログと日次 KPIイベントの設計、遅れて届くデータ、ユニーク数、継続率
リアルタイムのダッシュボード・不正検知ストリームかバッチか、ウォーターマーク、速報と確定
ML の特徴量を毎時更新学習と推論で同じ定義、時点の正しさ(未来の情報を混ぜない)
古い DWH からの移行並行稼働と突き合わせ、切り替えの手順、利用者への告知
SaaS のデータを集めるAPI の制限、差分の取り方、スキーマの変化

お題:「アプリの行動ログを集めて、DAU と7日後の継続率を毎朝出す仕組みを作ってください。」

回答例:アプリの行動ログから日次 KPI を出す構成アプリイベント送信収集の窓口検証・時刻付与レイク届いた日で保存dbt起きた日で集計KPI の martDAU・継続率
毎回直近3日を作り直して、遅れて届いた分を取り込む
段階回答の例
要件経営とプロダクトが毎朝見る。翌朝 9時までに前日分。1日 5,000万件と仮定
イベントevent_id・event_name・起きた時刻・届いた時刻・user_id。トラッキングプランを作る
取り込み収集の窓口からキューを経てレイクへ。届いた日でパーティション
変換event_id で重複を除き、起きた日(日本時間)で集計。直近3日をルックバックで作り直す
指標DAU は(日, user_id)の1日1行の表から数える。継続率は初回の日のコホートごとに分子と分母を持つ
品質件数の前週比、NULL の割合、鮮度。3日前より古い数字は確定
コストイベントは日付のパーティションとクラスタリング。集計は増分

お題:「セールの間、売上と在庫の動きを数分以内に見られるようにしてください。」

回答例:セール中の売上をリアルタイムで見る構成注文 DBbinlogCDCDebeziumKafkaorder_id がキーストリーム集計1分ごとダッシュボード速報値
確定の数字は、従来どおり日次のバッチで作り、速報と区別して見せる
論点回答の例
本当に要るかセール中に広告の停止や在庫の補充を判断するため、数分の鮮度が要る、と確かめる
方式注文 DB から CDC で Kafka へ。数分でよいなら短い間隔のバッチも候補だが、今回はストリームで1分ごとに集計
順番と重複order_id をキーにして注文ごとの順番を守る。少なくとも1回なので、注文 ID で重複を除く
遅れ起きた時刻のウィンドウとウォーターマーク。遅れたものは確定のバッチで吸収
速報と確定ダッシュボードに「速報値」と表示。キャンセルを含む確定値は翌朝のバッチ
監視コンシューマーラグと、最新のイベントの時刻の遅れ

お題:「レコメンドのモデルのために、ユーザーごとの直近の行動の特徴量を毎時更新してください。」

回答例:特徴量を毎時更新する構成イベント・DB元のデータ毎時のバッチ特徴量を計算特徴量の表時点つきで保存学習過去の時点で JOIN推論最新の値を読む
学習と推論で同じ計算のコードを使い、学習では「その時点で分かっていた値」だけを使う
論点回答の例
定義の一致学習と推論で同じ SQL・コードから特徴量を作る(別々に書くとずれる)
時点の正しさ学習データでは、予測した時点より後の情報を混ぜない。特徴量に「いつ時点の値か」を持たせ、その時点以前の最新と JOIN する
鮮度毎時のバッチで直近の行動を集計。より新しさが要る特徴量だけストリームにする
保存学習用は履歴つきで DWH・レイクに。推論用は最新の値だけを速く読める場所に
品質特徴量の分布の変化、NULL の割合、更新の遅れを監視
SQL のライブコーディングの4ステップ1 確かめる粒度・キー・NULL2 段階に分けるCTE で1段ずつ3 検算する小さな例で手で4 付け足す大きいときどうするか
書く前の質問と、書いた後の検算が評価の差になる

SQL のライブコーディングは、画面共有やオンラインのエディタで、テーブルの定義を見ながら書きます。コツは次のとおりです。

  • 書き始める前に、粒度とキー(1行が何か、何が一意か)と、同点・NULL・データがない日の扱いを質問して確かめる。
  • いきなり1本で書かず、CTE で段階に分け、各段階で「ここまでで何が出るか」を声に出す。
  • 書いたら小さな例で手で確かめ、最後に「大きなテーブルならどこが重いか、どう速くするか」を自分から付け足す。

ウィンドウ関数(ROW_NUMBER・LAG・SUM OVER)、自己結合、条件つき集計の3つは、何も見ずに書けるようにしておきます。このサイトの DB ラボで実際に流して練習できます。

お題解き方の型詳しく
ユーザーごとの最新の注文ROW_NUMBER で新しい順に番号をふり、1番を残す重複の除去
7日移動平均・前日比・累計AVG・LAG・SUM の OVER。日付の穴を埋めてからウィンドウ関数
連続ログイン日数日付から連番を引いてかたまりを作るgaps and islands
一度も購入していない人LEFT JOIN して右が NULL、または NOT EXISTSJOIN と NULL
カテゴリごとの売上の上位3商品RANK か ROW_NUMBER を PARTITION BY カテゴリでウィンドウ関数
月別×カテゴリの表(横持ち)条件つき集計(SUM(CASE …))ピボット
継続率(コホート)初回の月を求め、各月の活動と JOIN して分子と分母を数える足せない指標

別のページで開く →

DBラボを読み込んでいます…

15.11よくある失敗

★★★ 必須
失敗どうすればよいか
要件を聞かずに道具の名前から話し始める最初の数分は質問に使う。鮮度と量で設計が大きく変わる
何でもリアルタイム・何でも Spark要件を満たすいちばん簡単な方式を選び、理由を言う
冪等性・再実行・遅れて届くデータに触れない「失敗してやり直したら」を自分から話す
品質とコストの話がないテストを置く場所と、読む量・費用の見積もりを入れる
黙って考え込む・黙って SQL を書く考えていることを声に出す。行き詰まったら仮定を置いて進む
指摘を受けて意固地になる「その観点は抜けていました。そうすると〜に変えます」と取り込む

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • 要件(利用者・鮮度・量)を質問で固めてから設計する
  • 取り込み・保存・変換・品質・コストの順に、選ばなかった案と理由も話す
  • SQL は粒度とキーを確かめ、段階に分けて書き、検算する

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1アプリの行動ログから、DAU と7日後の継続率を毎朝出す仕組みを設計してください。

模範回答

まず要件として、誰が何時までに見るか、1日の件数、継続率の定義(初回の日から7日後に1回でも使ったか)を確かめます。ここでは翌朝 9時までに前日分、1日数千万件と仮定します。

アプリからは event_id・起きた時刻・届いた時刻・user_id を持つイベントを送り、収集の窓口からレイクに届いた日のパーティションで保存します。dbt で event_id の重複を除き、起きた日(日本時間)で(日, user_id)の1日1行の表を作り、DAU はそこから数えます。継続率は初回の日のコホートごとに分子と分母を持つ表にします。遅れて届く分のために毎回直近3日を作り直し、3日より前は確定とします。品質は件数の前週比と鮮度を見張ります。

深掘りされたら

  • ユーザーが端末を変えたら、どう数えますか?
  • データが10倍になったら、どこを変えますか?

見られているポイント要件の確認、遅れて届くデータ、足せない指標の扱い

Q2設計面接の最初の数分で、何を確かめますか?

模範回答

設計を大きく変える3つを先に聞きます。鮮度(何時までに、どの間隔で要るか)、量(1日の件数と大きさ、何年分持つか)、正確さ(請求に使うほどか、傾向が分かればよいか)です。あわせて、誰が何を決めるために使うかと、主な指標の定義を聞きます。

全部を聞くと時間が足りないので、残りは「既存の DWH があり、個人情報は含むと仮定します」のように宣言して進め、前提を図の横に書いておきます。前提が変われば設計のどこが変わるかも、最後に話せるようにします。

深掘りされたら

  • 面接官が「お任せします」と言ったらどうしますか?

見られているポイント設計を左右する要件を優先して確かめられるか

Q31日1億件のイベントを保存するとして、1年でどのくらいの容量になりますか?

模範回答

1件を約1KB と仮定すると、1日 1億件で約 100GB、1年で約 36TB です。Parquet などの列指向で圧縮すると、データによりますが数分の1程度になると見込みます。平均の流量は 1億 ÷ 約 10万秒で毎秒 約 1,000件、ピークはその数倍と見ます。

この量なら、保存はオブジェクトストレージか DWH で問題なく、読むときは日付のパーティションで期間を絞ることが前提になります。受け口はピークの毎秒数千件をキューで受け、まとめて書き込む構成にします。古いデータは集計済みのテーブルだけ残して、生データは保存期間で安い保存先に移すことも考えます。

深掘りされたら

  • 1件の大きさはどう見積もりますか?

見られているポイント桁の正しさと、見積もりを設計の判断につなげられるか

Q4リアルタイムのダッシュボードを求められました。バッチとストリームのどちらで作りますか?

模範回答

まず何分以内に、何を判断するのかを確かめます。数時間〜翌朝の判断なら日次や毎時のバッチ、10〜15分で足りるなら短い間隔のバッチを選びます。今の SQL と道具がそのまま使え、遅れて届く分も作り直しで吸収できるからです。

数秒〜数分で反応する必要がある場合だけ、CDC と Kafka、ストリーム処理を使います。その場合はウォーターマーク、重複の除去、コンシューマーラグの監視が要り、運用の負担が増えることを説明します。どちらでも、確定の数字は日次のバッチで作り、速報と区別して見せる形にします。

深掘りされたら

  • ストリームとバッチの数字がずれたら、どちらを正としますか?

見られているポイント鮮度の要件から、いちばん簡単な方式を選べるか

Q5SQL のライブコーディングで、問題文があいまいなときはどうしますか?

模範回答

書き始める前に質問します。特に、テーブルの1行が何か(粒度)と、何が一意か、同点のときの扱い、NULL やデータのない日の扱い、日付のタイムゾーンを確かめます。答えが返らなければ「同点は ID の小さいほうを取ると仮定します」と宣言して進めます。

書くときは CTE で段階に分け、各段階で何が出るかを声に出し、最後に小さな例で手で検算します。時間が残れば、大きなテーブルで重くなる所と、その直し方を自分から付け足します。

深掘りされたら

  • 書いた SQL が遅いと言われたら、どこを直しますか?

見られているポイント前提を確かめる姿勢と、考えを声に出す進め方