Upgrade to Pro — share decks privately, control downloads, hide ads and more …

採用面接をエンジニアリングする

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 採用面接をエンジニアリングする

採用面接の設計・構造をエンジニアリングする

Avatar for shoki-kitajima

shoki-kitajima

February 07, 2026

More Decks by shoki-kitajima

Other Decks in Business

Transcript

  1. git branch: feature/hiring-process commit: 8a2f9c1 recruitment_engineering.slide Engineering The Interview 採⽤⾯接を

    エンジニアリングする 候補者の『関数の裏側』を⾒抜く技術 Presented by 北島 翔貴
  2. ~/presentation / whoami 北島 翔貴 @kitajima_shoki 過去の役割 エンジニア・経営・新⼈育成 組織課題の解決とエンジニアの成⻑⽀援に従事 バックグラウンド

    エンジニア採⽤担当 & 転職活動直後 「採⽤する側」と「採⽤される側」の両視点を持つ。 直近で⾃⾝の転職活動を経て、⾯接構造への関⼼を深める。 興味・関⼼領域 #面接設計 #評価の再現性 #組織学習 #HumanOps
  3. Recruitment Engineering / Issue #1 転職活動で気づいたこと constrealization = newInsight(); const

    realization newInsight ⾃分の思考プロセスが最適化されすぎていく感覚... 01 ⾯接で同じ質問を何度もされる 「⾃⼰紹介をお願いします」「なぜ転職を?」「強み は?」 複数の企業で、あるいは同じ企業の別の⾯接官から、 判で押したように同じ⼊⼒を受け取る。 02 ⾃分の答えが「関数化」されていく 最初は悩みながら答えていた内容が、回数を重ねるごとに バグフィックスされ、リファクタリングされ、 最適化された「出⼒」へと固定化されていく。 「機械が⾃動応答しているような感覚」 質問(⼊⼒)に対して、即座に淀みなく回答(出⼒)が出る。 しかし、そこに「その場の思考」は存在しない。 まるでAPIサーバーのような状態。 functionanswerQuestion(input) { =/ キャッシュされた回答を返す if(cache.has(input)) { returncache.get(input); } ==. return"定型化された回答"; } > _
  4. 4 / 22 ステートレス/ステートフルなコミュニケーション communication .mode Stateless ステートレス ⽂脈(状態)を保持しない Input

    A Output A Input A Output A ⼊⼒に対して常に同じ出⼒を返す 前の会話(リクエスト)を覚えていない 「関数的」な応答 Stateful ステートフル ⽂脈(状態)を保持・更新する Context (State) ⽂脈を蓄積し、次の回答に反映する 履歴と意図を踏まえた「深い対話」 関係性によって出⼒が変化する VS Input A Output A Input B Output A' Insight システム設計の概念ですが、これは⼈間の対話にも適⽤可能です。 採⽤⾯接にも応⽤できるのでは?
  5. 論点1:⾯接のグラデーション構造 structure.map((phase) => phase.analyze()) ⾯接のフェーズが進むにつれて、質問の性質と測定したい対象が変化していく構造。 Phase / Stage Question Type

    Measurement Target 1 ⼀次⾯接 First Interview Stateless ⽂脈を保持しない、事実確認中⼼ 経歴・スキル 履歴書の内容、技術スタックの確認 2 ⼆次⾯接 Tech / Manager Interview Stateless + 背景 関数的な答えの裏側(Why)を探る 思想・体験 なぜその技術を選んだか、どう考えたか 3 最終⾯接 Final Interview Stateful ⽂脈を共有した上での深い対話 思考・⽂化適合 ⾃社の⽂脈でどう⾏動するか、価値観の⼀致 const interviewFlow = new GradientProcess(); 5 / 22 const new
  6. Recruitment EngineeringLayered Approach なぜグラデーションか? constdepth = ['Past', 'Present', 'Future']; const

    depth 'Past' 'Present' 'Future' Measurement Depth 経歴は「履歴書」で測れる 情報の再提⽰ ステートレス 「何をしてきたか」という事実は、書⾯や職務経歴書で確認可能。⾯接で時間をかけて事実確 認だけを⾏うのは⾮効率。 思考は「対話」で測る 因果と判断 インタラクティブ なぜその選択をしたのか?どう判断したのか?というプロセスの深さは、問いかけと応答の往 復(キャッチボール)でしか⾒えない。 ⽂化適合は「⽂脈」を与えて測る その場の選択 ステートフル 「もし弊社のこの状況ならどう動く?」という独⾃の⽂脈(コンテキスト)を与え、その場で どう振る舞うかをシミュレーションする。 Surface 経歴・スキル Information 1 Process 思考・判断 Logic & Reasoning 2 Core 価値観・⽂化 Context & Values 3
  7. Building Relationships 7 / 22 メタ的なステート:関係の⽣成 while(interviewing) { relationship=+ }

    while relationship ⾯接は単なる「テスト」ではなく、進⾏とともに候補者と企業の関係性が⽴ち上がるプロセスです。 この関係値(State)の変化に合わせて、質問の解像度を変える必要があります。 ⼀次⾯接 Phase 1: Initial Contact 「まあ受けてみるか」 様⼦⾒・情報収集 ⼆次⾯接 Phase 2: Deep Dive 「相互理解が進む」 共通⾔語の確⽴ 最終⾯接 Phase 3: Commitment 「ここに⼊りたい」 志望度の最⼤化
  8. Recruitment Engineering / Psychological Factors ⼼理的要因 constpsychology = awaitrelationship.build(); const

    psychology await relationship build プロセスが進むほど 「後戻りできない」⼼理が形成される サンクコスト効果(投資の正当化) 選考に時間を投下すればするほど、「この時間を無駄にしたくない」という ⼼理が働く。志望度が後付けで強化され、オファー受諾率に影響する。 相互理解の深化(プロトコル確⽴) 対話を重ねることで共通⾔語(コンテキスト)が共有される。摩擦係数の低 いスムーズな通信が可能になり、⼼理的安全性が関係性の中に実装される。 期待値の形成(未来のインスタンス化) 「もし⼊社したら」という仮定の話を繰り返すことで、未来の像が具体的に なる。脳内でシミュレーションが完了し、現実の⼊社意欲へと変換される。 # 面接プロセスの進行状況 > Initializing Connection==. ✓ Protocol Handshake: OK OK > Investing Time Resources==. Total Cost: 8.5h > Calculate Commitment==. result: "High" =/ Sunk Cost Effect Detected > Resolving Future==._
  9. Recruitment Engineering / Summary #1 論点1まとめ constsummary = awaitfinalizeArg1(); constsummary

    await finalizeArg1 段階的に深度を増すプロセス設計 ⾯接 = グラデーション構造 いきなり核⼼(ステートフル)には⾄れない。 ステートレス(機能的確認)から始まり、 徐々にステートフル(⽂脈的対話)へと シームレスに移⾏する設計が必要。 ⾯接⾃体が「関係構築」のプロセス 単なる「選考(Testing)」ではない。 対話を重ねることで、候補者と企業の間に 共通⾔語と信頼関係(State)を⽣成する場である。 ➜~analyze_interview_process Initializing analysis==. [PHASE 1] Stateless ✓ Checking Skills & Specs [PHASE 2] Mixed Context ✓ Checking Background & Thoughts [PHASE 3] Stateful ✓ Checking Culture Match Building relationship graph==. SUCCESS: Connection Established. > _
  10. function evaluateResponse() { return quality; } function return 10 /

    22 ⼀次⾯接 ─ 関数の品質を測る const quality = measure(candidate.response); quality measure Standard Input (質問例) =/ 基本的な自己紹介 $ ask "自己紹介をお願いします " =/ 経歴の確認 $ ask "これまでの経歴の概要は? " =/ 志望動機 $ ask "なぜ弊社を選びましたか? " これらの質問は「準備可能」であり、 一種の定型処理(関数)として実行される。 Quality Metrics (評価観点) スムーズさ (Latency) 質問に対して即座に、迷いなく答えられているか。 Expected: Low Latency response 簡潔さ (Complexity) 要点がまとまっているか。冗⻑な情報を省き、構造化されているか。 Expected: O(1) ~ O(n) complexity, No infinite loops ⼀貫性 (Consistency) 提出書類や過去の発⾔と⽭盾がないか。論理が通っているか。 Expected: Data integrity verified 測定の狙い 「答えの内容」そのものよりも、準備の周到さと⾃⼰理解の度合いを測る。 ⾼品質な関数(回答)を⽤意できている候補者は、⼊社後の業務遂⾏能⼒も⾼い傾向にある。
  11. Quality Assurance Phase 優秀な候補者の特徴 constisHighPerformer = (candidate)=>candidate.quality > THRESHOLD; const

    isHighPerformer (candidate )=>candidate quality THRESHOLD Refactored Output: 質問に対して最短距離で最適解を返す 洗練された「関数」で答える 冗⻑な前置きや「えーと」といったノイズが極限まで除去されている。 質問の意図(⼊⼒引数)を正確に理解し、期待されるフォーマットで スムーズに出⼒する処理能⼒を持つ。 準備能⼒の⾼さ(事前コンパイル) 話す内容が既に頭の中で構造化・編集されている。 「聞かれたらこう答える」というシミュレーションが完了しており、 実⾏時エラー(答えに詰まる、論理破綻)が起きない。 ⾃⼰理解の深さ(ドキュメンテーション) ⾃分の⾏動に対して「なぜそうしたのか」という仕様(意図)が 完全に⾔語化されている。 再現性のある意思決定ができることの証明。 CleanCode.ts =/ ノイズがなく、意図が明確 publicexplainCareer():Story{ constcontext=this.getBackground(); constaction=this.getAction(context); returnformat(action.result); } Compiled Successfully 0ms Latency
  12. Recruitment Engineering / Phase 2: Debugging ⼆次⾯接 ─ 関数の裏側を探る constdeepDive

    = async (surface) => await surface.traceSource(); const deepDive async surface await traceSource 綺麗な「出⼒」の⽣成プロセスにバグはないか? 01 関数化された答えの「背景」を掘る ⽤意された回答は「ブラックボックス化された関数」です。 その関数が「どのようなロジック」で実装されているか、 ソースコード(原体験や思考プロセス)を⾒に⾏きます。 因果関係のトレース ⾏動の結果だけでなく、そこに⾄る変数の変化を追跡します。 Event 出来事 Decision 判断 Action 行動 Result 結果 出来事 判断 行動 結果 Debugger: Paused =/ Surface output (Public API) return"リーダーとしてチームを改善しました "; =/ Internal State Inspection (Private) this._internalState = { motive: "評価のため仕方なく ==.", conflict: "メンバーAと対立", compromise: true, actualWork: ["ドキュメント整理"] }; > step_into()
  13. Deep Dive Patterns 13 / 22 深堀りパターン import { Patterns

    } from'./interview-core'; import Patterns from'./interview-core' 体験の深堀り Behavioral =/ 具体的なアクションを取得 getAction(context); > "具体的にどう行動しましたか?" 抽象的な「頑張りました」「調整しました」という⾔葉 を許さず、その時物理的に何をしたか(誰にメールした か、コードをどう書いたか)を問う。 再現性の⾼いスキルを確認 思想の深堀り Philosophy =/ 価値観の源泉を解析 why(thought); > "なぜそう思うようになったのですか?" ⾏動の裏にある「判断基準」や「価値観」のルーツを探 る。技術選定の理由や、キャリア選択の軸など、思考の OSを理解する。 ⽂化適合と学習プロセスを確認 ⼀ステップ追跡 Step Trace =/ 処理を一行ずつ実行 debugger; stepInto(); > "その場で具体的にどんな質問をしますか?" 時間を⽌め、細かい粒度でシミュレーションを⾏う。 「会議で反対意⾒が出た直後、最初の第⼀声は何と⾔い ますか?」など。 実際の現場での挙動を予測
  14. Assessment Metrics 14 / 22 測定ポイント(⼆次) constmetrics = ['Depth', 'Specificity',

    'Flow']; const metrics 'Depth' 'Specificity' 'Flow' METRIC_01 思考の深さ 表⾯的な事象だけでなく、構造的な理解まで到達してい るか。 Level 1: 事象 (What) Level 2: 理由 (Why) Level 3: 構造 (Structure) VALIDATION_CHECK: 「前提→仮説→検証」のループが回っているか METRIC_02 体験の具体性 曖昧な⾔葉に逃げず、⾼解像度で事実を語れているか。 =/ Bad: "頑張りました" =/ Good: 具体的なパラメータ { who: "営業部長と", when: "Q3の初日に", what: "SQLを3本書いて" } VALIDATION_CHECK: 固有名詞・数値・時系列が含まれているか METRIC_03 思考の流れ 論理の⾶躍がなく、因果関係が滑らかに接続されている か。 Issue Plan Action Result VALIDATION_CHECK: 論点の接続(Linkage)と論理的整合性
  15. Recruitment Engineering / Summary of Argument 2 論点2まとめ constsummary =

    awaitfinalizeArg2(); constsummary await finalizeArg2 「綺麗な出⼒」だけでなく、「それを⽣成するロジック」を⾒る =/ 1. 表面的な出力(Interface) interfaceAnswer{ clarity:High;=/ 簡潔さ consistency:Boolean;=/ 一貫性 } =/ 2. 実装の詳細(Implementation) classCandidateCore{ privatevalues:Values; privatehistory:Experience[]; protectedthink() { ==. } } 関数の品質 = 準備能⼒の指標 スムーズで簡潔な応答は、⾼い⾔語化能⼒と事前のリハーサルの成 果。 これはビジネスパーソンとしての「基礎的なデリバリー能⼒」を測 るのに適している。 01 関数の裏側 = ⼈間性の総体 なぜその関数(回答)が実装されたのか? その背景にある「思考プロセス」「価値観」「具体的な経験」こそ が、再現性のある候補者の実⼒である。 02
  16. Final Phase / Stateful Interaction p. 16 最終⾯接 ─ ステートフルな質問

    constfinalStage = newStatefulSession(); constfinalStage newStatefulSession ⼊⼒(質問)に対して、⽂脈(State)を付与する 01 ⽂脈を与えて「その場での思考」を⾒る 「あなたの強みは?」という静的な問いではなく、「もしXという状況でYが起きたら?」とい う動的なシミュレーションを⾏う。事前に準備できない問いに対し、CPU(脳)がどう回るかを リアルタイムで観察する。 02 ⾃社の「現実」で意思決定してもらう 架空のケーススタディではなく、⾃社が実際に抱える泥臭い課題や制約条件(技術的負債、組織 の壁など)を前提変数として渡す。「正解」のない問いに対して、どのような変数を⾒て、どう 優先順位をつけるかを⾒る。 関数化されていない「素」を⾒る ⾯接⽤にラップされた「よそ⾏きのAPI」を剥がし、現場で隣に座って働くときの⽣の思考回路 にアクセスする。これが最終⾯接における「マッチング」の本質。 interactive_mode.ts =/ 候補者のリアルタイムな思考処理 async functiondeepDive(candidate, context) { =/ 1. 準備された回答(キャッシュ)を無効化 candidate.bypassCache(); =/ 2. 複雑な文脈を注入 constreality = { issue: "Legacy System Migration", budget: "Limited", teamState: "Exhausted" }; =/ 3. その場での判断を観測 constdecision = awaitcandidate.think(reality); returndecision; =/ 生の思考プロセス } > _
  17. Scenario Injection Protocol 17 / 22 ⽂脈付与型の質問 const context =

    await company.fetchSpecificContext(); const await fetchSpecificContext scenario_injection.js =/ 1. 企業固有の複雑な文脈を定義( Preparation) constscenario = { team: "Payment Platform Div", mission: "Microservices Migration", constraint: "Cannot stop legacy system", resources: "Shortage of Go engineers" }; =/ 2. この文脈下での行動を問う( Injection) Prompt: 「あなたがこのチームのLeadだとして、 最初の1ヶ月で具体的にどのようなアクションプランを立てますか? また、どのリスクを最優先で潰しに行きますか?」 準備不可能な問い ⼀般的な「強み・弱み」は準備できますが、その企業固有の複雑な⽂ 脈(技術負債、組織構造、予算制約)は検索しても出てきません。 これにより「借りてきた⾔葉(⼀般論)」を封じることができます。 素の判断プロセスを⾒る 正解のない問いに対して、候補者が: ・どの変数を重要視するか ・どうトレードオフを解消するか という「思考のOS」をリアルタイ ムで観測します。
  18. IF STATELESS MODE ANY // よくある二項対立の質問 const choice = select([

    "Management", "Expert" ]); 「将来はマネジメント志向ですか? それともスペシャリストですか?」 この問いは「関数化」されやすい。 候補者は⾃分の本当の欲求ではなく、 「この会社が求めている役割」に合わせてボタンを押すだけ。 STATEFUL MODE // 制約条件(Role)を解除して実行 const desire = await user.revealCoreDrive(null); 「もしチームに何も役割定義がないとしたら、 真っ先に何を始めますか?」 役割という「型」を外すことで、 その⼈が⾃然と取ってしまう⾏動(Habit)や 根源的な欲求(Want)があぶり出される。 VS 意識スイッチング型の質問 switch (mindset) switch mindset Mindset Switching Protocol 18 / 22
  19. Key Insight: ⽭盾の中にこそ⼈格が宿る 「AもBも⼤切」という綺麗な⾔葉ではなく、「AとBが対⽴した時にどちらを捨てるか(トレードオフ)」の判断にこそ、エンジニアとしての価値観が現れる。 19 / 22 ⽭盾探索型の質問 assert.deepEqual(words, actions);

    assert deepEqual words actions PUBLIC INTERFACE (建前) RUNTIME BEHAVIOR (本⾳) constpolicy = { teamwork: "Highest Priority", communication: "Open & Frequent" }; 「チームワーク重視です」 候補者は⾯接⽤に最適化された「正解」を提⽰する。ここでの⾔動は 準備されたスクリプトであり、⽭盾がないのは当然である。 Status: Validated INJECT EDGE CASE =/ 矛盾状況を注入して例外処理を見る try { workAlone({ interruption: "Colleague asking help" }); } catch (reaction) { ==. } 「⼀⼈で集中したい時は どう環境を整えますか?」 ⽭盾への対処を聞くことで、スクリプトの外側にある「素の⾏動原 理」が漏れ出る。 「イヤホンをして無視します」 → ソロ志向の発露 「カレンダーに集中時間を明記して共有」 → 仕組み化志向
  20. Will/Want Matching Matrix 20 / 22 Will vs Want のマッチング

    const alignment = match(will, want); const match FUNCTIONAL キャリアプラン(外形) 「今のスキルを活かしたい」「リーダー経験を積みたい」など、職務経歴書に 書ける論理的な説明。 ⾯接で最もよく語られるが、差別化が難しい領域。 return "Contribution"; INTEREST 知的好奇⼼・衝動 「実はRustを書いてみたい」「この技術的負債を解消したい」など、今この瞬 間に⼼が動く具体的な対象。 エンジニアとしての「鮮度」が⾼いモチベーション。 return "Curiosity"; VISION 理想のキャリアパス 「3年後にVPoEになりたい」「フルスタックになりたい」など、社会的に望ま しいとされる⽬標。 本⾳と乖離している場合があり、離職リスクの要因になる。 return "Goal"; ESSENTIAL 本当の願望(Want) 「ユーザーに直接感謝されたい」「⾃分の城を持ちたい」「静かにコードに没 頭したい」など、飾らない根源的欲求。 ここが企業と合致すると、最強のエンゲージメントが⽣まれる。 return "Life"; SHORT TERM (現在・短期) LONG TERM (未来・長期) WILL / FORMALITY (建前・関数化) WANT / AUTHENTICITY (本音・素)
  21. Conclusion / Argument #3 論点3まとめ constconclusion = awaitmatch(candidate, company); const

    conclusion await match candidate company 関数化された「正解」をバイパスし、 本質のコードにアクセスする ステートフルな質問 = 候補者の「素」を⾒る装置 単なる質疑応答(APIコール)ではなく、⽂脈を共有した対話を⾏ うことで、準備された「関数」を無効化する。 その場で⽣成される「⽣の思考プロセス」こそが、⼊社後のパ フォーマンスを予測する最⼤の鍵となる。 本⾳のWantで 企業とのマッチングを測る 綺麗に整えられたキャリアプラン(Will/建前)よりも、 根源的な欲求(Want/本⾳)が組織の⽅向性と合致するか。 「個⼈の欲望」と「組織の課題」が噛み合った時、持続的なエンジ ニアリング組織が⽣まれる。 =/ 最終的なマッチング判定ロジック async functionevaluate(person) { =/ 1. 文脈を与えて「素」を見る constrealSelf = person.reactTo( newContext("Unpredictable") ); =/ 2. 建前(Will)ではなく本音(Want)で照合 if(realSelf.want === OUR_CULTURE) { return"MATCH_FOUND"; } returnnull; } > Executing==.
  22. Engineering Recruitment v1.0 22 / 22 まとめ RECAP & KEY

    TAKEAWAYS export defaultSummary; export default Summary 1 ステートレスからステートフルへ ⾯接は「経歴確認(関数的)」から始まり、「相互理解(対話的)」へと深まるグラ デーション構造を持つ。段階に応じた適切なモード切り替えが重要。 2 候補者の「関数の裏側」を⾒抜く 準備された美しい回答(出⼒)だけでなく、その結論に⾄った思考プロセスや価値観 (ロジック)を、⽂脈付与や⽭盾探索によってデバッグする。 3 ⾯接は関係構築のプロセス ⼀⽅的な選考ではなく、共同作業のシミュレーション。本⾳(Want)を共有し合うこ とで、⼊社後の信頼関係とエンゲージメントの基盤を作る。 main.ts — Recruitment Logic 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import { Trust, Insight } from'./core-values'; import { Stateless, Stateful } from'./interview-modes'; export default async functionrecruitmentProcess(candidate) { // 1. Gradient Structure constphases = [Stateless, Stateful]; // 2. Inspect "Behind the Function" for (constPhaseofphases) { constresponse = awaitcandidate.interview(newPhase()); Insight.analyze(response.logic); =/ Not just output } // 3. Build Relationship returnnewTrust({ match: candidate.want === Company.mission, future: "Shared Success" }); }