ЁЯПл The SchoolтА║ЁЯПЕ Engineering LeadershipтА║ЁЯзСтАНЁЯПл рдзрдбрд╛ 04 тАФ Hiring: structured rubric, рд╕реНрд╡рддрдВрддреНрд░ рдЧреБрдг, calibration
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯзСтАНЁЯПл рдзрдбрд╛ 04 тАФ Hiring: structured rubric, рд╕реНрд╡рддрдВрддреНрд░ рдЧреБрдг, calibration

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 04 ┬╖ рдорд╛рдЧреЗ: lesson-03-delegation ┬╖ рдкреБрдвреЗ: lesson-05-forecasting


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбрд╛ 03, рдЖрдгрд┐ hiring. Rubric рд╕рд╣ рдПрдХ structured interview (рдкреНрд░рддреНрдпреЗрдХ рдЙрдореЗрджрд╡рд╛рд░рд╛рд╕рд╛рдареА рддреЗрдЪ рдкреНрд░рд╢реНрди рдЖрдгрд┐ anchored рдЧреБрдг), рдкреНрд░рддреНрдпреЗрдХ interviewer debrief рдЪреНрдпрд╛ рдЖрдзреА рдЖрдкрд▓реЗ рдЧреБрдг рдХрд╛ рд▓рд┐рд╣реВрди рдареЗрд╡рддреЗ, рдЖрдгрд┐ calibration тАФ рдХрд╛рд╣реА interviewers рдЗрддрд░рд╛рдВрдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдХрд┐рдВрд╡рд╛ рдХрдореА рдЧреБрдг рджреЗрддрд╛рдд рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреЗ. lead/demo.py рдордзрд▓реЗ hiring(); lead/models.py рдордзрд▓реЗ panel(), herd() рдЖрдгрд┐ calibrate().

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рдЧрдгрд┐рдд рд╡рд┐рднрд╛рдЧрд╛рд▓рд╛ рдПрдХрд╛ рдирд╡реНрдпрд╛ рд╢рд┐рдХреНрд╖рд┐рдХреЗрдЪреА рдЧрд░рдЬ рдЖрд╣реЗ. рдХрддрд░рд┐рдирд╛, рджреАрдкрд┐рдХрд╛ рдЖрдгрд┐ рдРрд╢реНрд╡рд░реНрдпрд╛ рддрд┐рдШреАрд╣реА рдЙрдореЗрджрд╡рд╛рд░рд╛рд▓рд╛ рдПрдХ рдирдореБрдирд╛ рдзрдбрд╛ рд╢рд┐рдХрд╡рддрд╛рдирд╛ рдкрд╛рд╣рддрд╛рдд. ЁЯзСтАНЁЯПл

рдордЧ рддреНрдпрд╛ рдирд┐рд░реНрдгрдп рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рднреЗрдЯрддрд╛рдд. рдХрддрд░рд┐рдирд╛ рдЖрдзреА рдмреЛрд▓рддреЗ: "рддреА рдЕрдкреНрд░рддрд┐рдо рд╣реЛрддреА!" рджреАрдкрд┐рдХрд╛рд▓рд╛ рд╢рдВрдХрд╛ рд╣реЛрддреНрдпрд╛ тАФ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрдирд╛ рд╕рдордЬрд▓реЗ рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рд╣реЗ рддреА рдХрд╕реЗ рддрдкрд╛рд╕рддреЗ рд╣реЗ рдЙрдореЗрджрд╡рд╛рд░рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рддрд╛ рдЖрд▓реЗ рдирд╛рд╣реА. рдкрдг рдХрддрд░рд┐рдирд╛ рд╡рд┐рднрд╛рдЧрдкреНрд░рдореБрдЦ рдЖрд╣реЗ, рдЖрдгрд┐ рддреА рдЗрддрдХреА рдЦрд╛рддреНрд░реАрдиреЗ рдмреЛрд▓рд▓реАтАж рдореНрд╣рдгреВрди рджреАрдкрд┐рдХрд╛ рдореНрд╣рдгрддреЗ, "рд╣реЛ, рдмрд▒реНрдпрд╛рдкреИрдХреА рдЪрд╛рдВрдЧрд▓реА." рдРрд╢реНрд╡рд░реНрдпрд╛рд╣реА рд╕рд╣рдорддреА рджреЗрддреЗ.

рдЙрдореЗрджрд╡рд╛рд░рд╛рдЪреА рдирд┐рд╡рдб рд╣реЛрддреЗ. рджреАрдкрд┐рдХрд╛рдЪреА рд╢рдВрдХрд╛ тАФ рдкреБрд░рд╛рд╡реНрдпрд╛рдЪрд╛ рдПрдХрдореЗрд╡ рдЦрд░рд╛ рддреБрдХрдбрд╛ тАФ рдХрдзреА рд╕рдореЛрд░ рдЖрд▓реАрдЪ рдирд╛рд╣реА. ЁЯЩК

рдкреБрдврдЪреНрдпрд╛ рд╡реЗрд│реА рдХрддрд░рд┐рдирд╛ рдирд┐рдпрдо рдмрджрд▓рддреЗ:

  1. рдкреНрд░рддреНрдпреЗрдХрдЬрдг рддреАрдЪ score sheet рд╡рд╛рдкрд░рддреЗ, рдкреНрд░рддреНрдпреЗрдХ рдЧреБрдгрд╛рд╕рд╛рдареА рд╕реНрдкрд╖реНрдЯ рд╡рд░реНрдгрдирд╛рд╕рд╣. ЁЯУЛ
  2. рдкреНрд░рддреНрдпреЗрдХрдЬрдг meeting рдЪреНрдпрд╛ рдЖрдзреА рддрд┐рдЪреЗ рдЧреБрдг рд▓рд┐рд╣реВрди рдареЗрд╡рддреЗ. тЬНя╕П
  3. Meeting рдордзреНрдпреЗ рд╕рд░реНрд╡рд╛рдд рдХрдирд┐рд╖реНрда рд╡реНрдпрдХреНрддреА рдЖрдзреА рдмреЛрд▓рддреЗ.

рдЖрддрд╛ рддреНрдпрд╛рдЪ рддреАрди рдорддрд╛рдВрдЪреА рдмреЗрд░реАрдЬ рд╡реЗрдЧрд│реЗ рдЙрддреНрддрд░ рджреЗрддреЗ тАФ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдЙрддреНрддрд░.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
    s["ЁЯУЛ same rubric, 4 competencies<br/>scores 1тАУ4, bar 3.0"] --> i["тЬНя╕П written before the debrief<br/>Katrina 3.75 ┬╖ Dipika 2.25 ┬╖ Aishwarya 2.50"]
    i --> p1["panel 2.83 тЖТ no hire"]
    s --> h["ЁЯЧгя╕П Katrina speaks first,<br/>others move halfway to her"]
    h --> p2["panel 3.29 тЖТ hire"]
    c["тЪЦя╕П calibration, 5 past panels<br/>Katrina +0.37 ┬╖ Dipika -0.33"] --> x["X raw 3.25 тЖТ 3.08<br/>Y raw 3.00 тЖТ 3.18"]

ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/engineering-leadership/lesson-diagrams.html#l04

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рдХрд╛рд░рдг hire рд╣рд╛ lead рдЪреНрдпрд╛ рд╕рд░реНрд╡рд╛рдд рдорд╣рд╛рдЧ рдЖрдгрд┐ рдЙрд▓рдЯрд╛рдпрд▓рд╛ рд╕рд░реНрд╡рд╛рдд рдХрдареАрдг рдирд┐рд░реНрдгрдпрд╛рдВрдкреИрдХреА рдПрдХ рдЖрд╣реЗ (рдзрдбрд╛ 10 рдпрд╛рд▓рд╛ one-way door рдореНрд╣рдгрддреЛ), рдЖрдгрд┐ unstructured interviews рдордзреНрдпреЗ рд╕рд░реНрд╡рд╛рдд рдореЛрдареНрдпрд╛ рдЖрд╡рд╛рдЬрд╛рддреАрд▓ рдордд, рдХрд┐рдВрд╡рд╛ interviewers рд╕рд╛рд░рдЦрд╛рдЪ рд╕рд░реНрд╡рд╛рдд рдЬрд╛рд╕реНрдд рджрд┐рд╕рдгрд╛рд░рд╛ рдЙрдореЗрджрд╡рд╛рд░, рдирд┐рд░реНрдгрдп рдШреЗрддреЛ. Rubric рд╕реНрд╡рддрдГрд╣реВрди hiring рдиреНрдпрд╛рдпреНрдп рдХрд░рдд рдирд╛рд╣реА тАФ рдкреНрд░рд╢реНрди рддрд░реАрд╣реА рдкрдХреНрд╖рдкрд╛рддреА рдЕрд╕реВ рд╢рдХрддрд╛рдд тАФ рдкрдг рддреА рдкреБрд░рд╛рд╡рд╛ рджреГрд╢реНрдп рдЖрдгрд┐ рддреБрд▓рдирд╛ рдХрд░рдгреНрдпрд╛рдЬреЛрдЧрд╛ рдХрд░рддреЗ, рдЖрдгрд┐ рд╕реНрд╡рддрдВрддреНрд░ рдЧреБрдг рдкреНрд░рддреНрдпреЗрдХ interviewer рдЪрд╛ рдкреБрд░рд╛рд╡рд╛ рдЪрд░реНрдЪреЗрдд рдЯрд┐рдХрд╡реВрди рдареЗрд╡рддрд╛рдд.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

lead/models.py рдордзрд▓реЗ panel(scores) {interviewer: [scores 1тАУ4]} рдШреЗрддреЗ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ interviewer рдЪреА рд╕рд░рд╛рд╕рд░реА рдЖрдгрд┐ panel рдЪреА рд╕рд░рд╛рд╕рд░реА рдкрд░рдд рджреЗрддреЗ. herd(scores, first, pull=0.5) first рд╡рдЧрд│рддрд╛ рдкреНрд░рддреНрдпреЗрдХреАрд▓рд╛ рддрд┐рдЪреНрдпрд╛ рдЧреБрдгрд╛рдВрдХрдбреЗ pull рдЗрддрдХреНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рд╕рд░рдХрд╡рддреЗ. calibrate(history) рдорд╛рдЧреАрд▓ panels ({interviewer: overall score}) рдШреЗрддреЗ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ interviewer рдЪрд╛ рддрд┐рдЪреНрдпрд╛ panel рдЪреНрдпрд╛ рд╕рд░рд╛рд╕рд░реАрдкрд╛рд╕реВрдирдЪрд╛ рд╕рд░рд╛рд╕рд░реА рдлрд░рдХ рдкрд░рдд рджреЗрддреЗ тАФ offsets рдЪреА рдмреЗрд░реАрдЬ рд╢реВрдиреНрдп рдЕрд╕рддреЗ. lead/demo.py рдордзрд▓реЗ hiring() рдПрдХрд╛ рдЙрдореЗрджрд╡рд╛рд░рд╛рд▓рд╛ рддреАрди рдкреНрд░рдХрд╛рд░реЗ рдЧреБрдг рджреЗрддреЗ рдЖрдгрд┐ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ panels рдиреЗ рдкрд╛рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рджреЛрди рдЙрдореЗрджрд╡рд╛рд░рд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░рддреЗ. Herding рдЪрд╛ рдирд┐рдпрдо рдЖрдгрд┐ offsets рд╣реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреЗ рд╕рд╛рдзрди рдЖрд╣реЗ, рдорд╛рдгрд╕рд╛рдВрд╕рд╛рдареАрдЪреЗ рд╕реВрддреНрд░ рдирд╛рд╣реА тАФ рдХреЛрдгрд╛рдЪрд╛рд╣реА hiring рдЪрд╛ рдирд┐рд░реНрдгрдп script рдиреЗ рдореЛрдЬрд▓рд╛ рдЬрд╛рдК рдирдпреЗ.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

python3 lead/demo.py hiring
python3 - <<'EOF'
import sys; sys.path.insert(0, "lead"); from models import panel, herd
s = {"Katrina": [4, 4, 4, 3], "Dipika": [2, 3, 2, 2], "Aishwarya": [3, 2, 2, 3]}
for first in ("Katrina", "Dipika"):
    for pull in (0.25, 0.5):
        each, m = panel(herd(s, first, pull))
        print(f"{first} speaks first, pull {pull:.2f} тЖТ panel {m:.2f} тЖТ {'hire' if m >= 3 else 'no hire'}")
each, m = panel(s)
print(f"nobody speaks first (independent) тЖТ panel {m:.2f} тЖТ {'hire' if m >= 3 else 'no hire'}")
EOF

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

hiring рдЕрд╕реЗ print рдХрд░рддреЗ:

   independent: Katrina 3.75 ┬╖ Dipika 2.25 ┬╖ Aishwarya 2.50 тЖТ panel 2.83 тЖТ no hire
   after Katrina speaks first (others move halfway to her): Katrina 3.75 ┬╖ Dipika 3.00 ┬╖ Aishwarya 3.12 тЖТ panel 3.29 тЖТ hire
тФАтФА calibration on 5 past panels: Katrina +0.37 ┬╖ Dipika -0.33 ┬╖ Aishwarya -0.03
   candidate X (Katrina + Aishwarya): raw 3.25 тЖТ calibrated 3.08
   candidate Y (Dipika + Aishwarya): raw 3.00 тЖТ calibrated 3.18

рддреБрдордЪрд╛ snippet рдЕрд╕реЗ print рдХрд░рддреЛ:

Katrina speaks first, pull 0.25 тЖТ panel 3.06 тЖТ hire
Katrina speaks first, pull 0.50 тЖТ panel 3.29 тЖТ hire
Dipika speaks first, pull 0.25 тЖТ panel 2.69 тЖТ no hire
Dipika speaks first, pull 0.50 тЖТ panel 2.54 тЖТ no hire
nobody speaks first (independent) тЖТ panel 2.83 тЖТ no hire

ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ

рдкреБрд░рд╛рд╡реНрдпрд╛рдЪреНрдпрд╛ рддреНрдпрд╛рдЪ рддреАрди рд╕рдВрдЪрд╛рдВрдиреА рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рдЧреБрдг рджрд┐рд▓реНрдпрд╛рд╡рд░ 2.83 тЖТ no hire рджрд┐рд▓реЗ, рдЖрдгрд┐ рдХрддрд░рд┐рдирд╛ рдЖрдзреА рдмреЛрд▓рд▓реНрдпрд╛рд╡рд░ 3.29 тЖТ hire тАФ рдЕрдЧрджреА рд▓рд╣рд╛рди pull (0.25) рдиреЗрд╣реА bar рдУрд▓рд╛рдВрдбрд▓рд╛. рджреАрдкрд┐рдХрд╛ рдЖрдзреА рдмреЛрд▓рд▓реА рддреЗрд╡реНрд╣рд╛ panel рдЙрд▓рдЯреНрдпрд╛ рджрд┐рд╢реЗрдиреЗ рд╕рд░рдХрд▓реЗ. рдмреЛрд▓рдгреНрдпрд╛рдЪреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рдирд┐рд░реНрдгрдп рдмрджрд▓рд▓рд╛; рдЙрдореЗрджрд╡рд╛рд░ рдмрджрд▓рд▓рд╛ рдирд╛рд╣реА. Calibration рдиреЗ рджреБрд╕рд░рд╛ рдкрд░рд┐рдгрд╛рдо рджрд╛рдЦрд╡рд▓рд╛: рдЙрдореЗрджрд╡рд╛рд░ X рдЕрдзрд┐рдХ рд╕рдХреНрд╖рдо рджрд┐рд╕рд▓рд╛ (3.25 рд╡рд┐рд░реБрджреНрдз 3.00) рддреЗ рдлрдХреНрдд X рд▓рд╛ рдЕрдзрд┐рдХ рдЙрджрд╛рд░ interviewer рднреЗрдЯрд▓реА рдореНрд╣рдгреВрди. рдлрдХреНрдд 5 рдорд╛рдЧреАрд▓ panels рдЕрд╕рд▓реНрдпрд╛рдиреЗ рддреЗ offsets рдвреЛрдмрд│ рдЖрд╣реЗрдд тАФ рдЧреБрдг рджреЗрдгреНрдпрд╛рдЪреНрдпрд╛ рд╕рд╡рдпреАрдВрдмрджреНрджрд▓ рдмреЛрд▓рдгреНрдпрд╛рдЪреА рд╕реВрдЪрдирд╛, рдЖрдВрдзрд│реЗрдкрдгрд╛рдиреЗ рд▓рд╛рдЧреВ рдХрд░рд╛рдпрдЪреА рджреБрд░реБрд╕реНрддреА рдирд╡реНрд╣реЗ.

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд

Job description рд╕реЛрдмрдд рдареЗрд╡рд▓реЗрд▓реЗ interview scorecard, рдкрд╣рд┐рд▓реНрдпрд╛ interview рдЖрдзреА рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ:

role: maths teacher (software engineer II)
bar: 3.0 average, no competency below 2
competencies:
  - name: testing approach
    question: "Walk me through how you would test the grade-export change."
    anchors:
      1: no testing mentioned
      2: tests after the fact, when prompted
      3: describes unit and integration tests unprompted
      4: chooses tests by risk and explains the trade-offs
  - name: explaining to a colleague
  - name: debugging an unfamiliar system
  - name: working through disagreement
process:
  - each interviewer submits scores and evidence before the debrief
  - the debrief starts with the most junior interviewer
  - the hiring manager decides; the reasons are written down

рдХрд╛рд╣реА applicant-tracking systems рддреБрдореНрд╣реА рд╕реНрд╡рддрдГрдЪрд╛ feedback submit рдХрд░реЗрдкрд░реНрдпрдВрдд рдЗрддрд░ interviewers рдЪрд╛ feedback рд▓рдкрд╡реВ рджреЗрддрд╛рдд тАФ рддреБрдордЪреНрдпрд╛ system рдордзреНрдпреЗ рд╣реА рд╕реЛрдп рдЕрд╕реЗрд▓ рддрд░ рддреА рдЪрд╛рд▓реВ рдХрд░рд╛. рджрд░ рдХрд╛рд╣реА рдорд╣рд┐рдиреНрдпрд╛рдВрдиреА рд╕рд╛рдорд╛рдпрд┐рдХ рдЙрдореЗрджрд╡рд╛рд░рд╛рдВрд╡рд░реАрд▓ interviewers рдЪреНрдпрд╛ рдЧреБрдгрд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░рд╛ (calibration), рдЖрдгрд┐ rubric рдЪреЗ рдЧреБрдг рдирд┐рд╡рдбрд▓реЗрд▓реНрдпрд╛ рд▓реЛрдХрд╛рдВрдЪреНрдпрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рдордЧрд┐рд░реАрд╢реА рдЬреБрд│рддрд╛рдд рдХрд╛ рддреЗ рддрдкрд╛рд╕рд╛.

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рдкрд╣рд┐рд▓реНрдпрд╛ рдЙрдореЗрджрд╡рд╛рд░рд╛рд▓рд╛ рднреЗрдЯрдгреНрдпрд╛рдЖрдзреА rubric рдЖрдгрд┐ bar рд▓рд┐рд╣рд╛, debrief рдЖрдзреА рдЧреБрдг рдЧреЛрд│рд╛ рдХрд░рд╛, рдЖрдгрд┐ рд╕рд░реНрд╡рд╛рдд рд╢рд╛рдВрдд рдкреБрд░рд╛рд╡реНрдпрд╛рд▓рд╛ рдЖрдзреА рдмреЛрд▓реВ рджреНрдпрд╛. рдпрд╛рд▓рд╛ рдПрдХ рддрд╛рд╕ рддрдпрд╛рд░реА рд▓рд╛рдЧрддреЗ рдЖрдгрд┐ рдЪрд╛рдВрдЧрд▓реЗ panels рд╡рд╛рдИрдЯ рдирд┐рд░реНрдгрдп рдШреЗрддрд╛рдд рддреНрдпрд╛рдЪрд╛ рд╕рд░реНрд╡рд╛рдд рдиреЗрд╣рдореАрдЪрд╛ рдорд╛рд░реНрдЧ рдмрдВрдж рд╣реЛрддреЛ.

тПня╕П рдкреБрдвреЗ

рднрд╛рдЧ 1 рдкреВрд░реНрдг рдЭрд╛рд▓рд╛: рдирд╡реЗ рдХрд╛рдо, 1:1s, delegation рдЖрдгрд┐ hiring. рднрд╛рдЧ 2 рд╕реНрд╡рддрдГ рдХрд╛рдорд╛рдмрджреНрджрд▓ рдЖрд╣реЗ. рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рднрд╛рдЧрдкреНрд░рдореБрдЦрд╛рд▓рд╛ рд╡рд┐рдЪрд╛рд░рд▓рд╛ рдЬрд╛рдгрд╛рд░рд╛ рдкрд╣рд┐рд▓рд╛ рдкреНрд░рд╢реНрди: "рд╣реЗ рдХрдзреА рдкреВрд░реНрдг рд╣реЛрдИрд▓?"

git checkout lesson-05-forecasting

ЁЯзСтАНЁЯПл Lesson 04 тАФ Hiring: a structured rubric, independent scores, calibration

ЁЯУН You are here: Lesson 04 of 12 ┬╖ Previous: lesson-03-delegation ┬╖ Next: lesson-05-forecasting


ЁЯУж What's in this branch

Lesson 03, plus hiring. A structured interview with a rubric (the same questions and anchored scores for every candidate), why each interviewer writes her scores before the debrief, and calibration тАФ noticing that some interviewers score higher or lower than others. hiring() in lead/demo.py; panel(), herd() and calibrate() in lead/models.py.

ЁЯзТ Explain like I'm 5

The maths department needs a new teacher. Katrina, Dipika and Aishwarya each watch the candidate teach a sample lesson. ЁЯзСтАНЁЯПл

Then they meet to decide. Katrina speaks first: "She was wonderful!" Dipika had doubts тАФ the candidate could not explain how she checks pupils' understanding. But Katrina is the head, and she sounded so sureтАж so Dipika says, "Yes, pretty good." Aishwarya agrees too.

The candidate is hired. Dipika's doubt тАФ the one real piece of evidence тАФ never reached the table. ЁЯЩК

Next time, Katrina changes the rules:

  1. Everyone uses the same score sheet, with clear descriptions for each score. ЁЯУЛ
  2. Everyone writes her scores down before the meeting. тЬНя╕П
  3. In the meeting, the most junior person speaks first.

Now the same three opinions add up to a different answer тАФ the honest one.

ЁЯЧ║я╕П Diagram

flowchart LR
    s["ЁЯУЛ same rubric, 4 competencies<br/>scores 1тАУ4, bar 3.0"] --> i["тЬНя╕П written before the debrief<br/>Katrina 3.75 ┬╖ Dipika 2.25 ┬╖ Aishwarya 2.50"]
    i --> p1["panel 2.83 тЖТ no hire"]
    s --> h["ЁЯЧгя╕П Katrina speaks first,<br/>others move halfway to her"]
    h --> p2["panel 3.29 тЖТ hire"]
    c["тЪЦя╕П calibration, 5 past panels<br/>Katrina +0.37 ┬╖ Dipika -0.33"] --> x["X raw 3.25 тЖТ 3.08<br/>Y raw 3.00 тЖТ 3.18"]

ЁЯЧ║я╕П Drawn version + a lab: https://school-edh.pages.dev/engineering-leadership/lesson-diagrams.html#l04

тЭУ What

ЁЯдФ Why

Because a hire is one of a lead's most expensive and hardest-to-reverse decisions (lesson 10 calls it a one-way door), and unstructured interviews let the loudest opinion, or the candidate who is most like the interviewers, decide. A rubric does not make hiring fair by itself тАФ the questions can still be biased тАФ but it makes the evidence visible and comparable, and independent scores keep each interviewer's evidence in the room.

ЁЯФз How (in this repo)

panel(scores) in lead/models.py takes {interviewer: [scores 1тАУ4]} and returns each interviewer's mean and the panel mean. herd(scores, first, pull=0.5) moves everyone except first a fraction pull of the way toward her scores. calibrate(history) takes past panels ({interviewer: overall score}) and returns each interviewer's average difference from her panel's mean тАФ the offsets sum to zero. hiring() in lead/demo.py scores one candidate three ways and compares two candidates seen by different panels. The herding rule and the offsets are a thinking tool, not a formula for people тАФ nobody's hiring decision should be computed by a script.

ЁЯзк Try it

python3 lead/demo.py hiring
python3 - <<'EOF'
import sys; sys.path.insert(0, "lead"); from models import panel, herd
s = {"Katrina": [4, 4, 4, 3], "Dipika": [2, 3, 2, 2], "Aishwarya": [3, 2, 2, 3]}
for first in ("Katrina", "Dipika"):
    for pull in (0.25, 0.5):
        each, m = panel(herd(s, first, pull))
        print(f"{first} speaks first, pull {pull:.2f} тЖТ panel {m:.2f} тЖТ {'hire' if m >= 3 else 'no hire'}")
each, m = panel(s)
print(f"nobody speaks first (independent) тЖТ panel {m:.2f} тЖТ {'hire' if m >= 3 else 'no hire'}")
EOF

тЬЕ Verify тАФ what you should see

hiring prints:

   independent: Katrina 3.75 ┬╖ Dipika 2.25 ┬╖ Aishwarya 2.50 тЖТ panel 2.83 тЖТ no hire
   after Katrina speaks first (others move halfway to her): Katrina 3.75 ┬╖ Dipika 3.00 ┬╖ Aishwarya 3.12 тЖТ panel 3.29 тЖТ hire
тФАтФА calibration on 5 past panels: Katrina +0.37 ┬╖ Dipika -0.33 ┬╖ Aishwarya -0.03
   candidate X (Katrina + Aishwarya): raw 3.25 тЖТ calibrated 3.08
   candidate Y (Dipika + Aishwarya): raw 3.00 тЖТ calibrated 3.18

Your snippet prints:

Katrina speaks first, pull 0.25 тЖТ panel 3.06 тЖТ hire
Katrina speaks first, pull 0.50 тЖТ panel 3.29 тЖТ hire
Dipika speaks first, pull 0.25 тЖТ panel 2.69 тЖТ no hire
Dipika speaks first, pull 0.50 тЖТ panel 2.54 тЖТ no hire
nobody speaks first (independent) тЖТ panel 2.83 тЖТ no hire

ЁЯПБ What you just proved

The same three sets of evidence gave 2.83 тЖТ no hire when scored independently and 3.29 тЖТ hire when Katrina spoke first тАФ even a small pull (0.25) crossed the bar. When Dipika spoke first, the panel moved the other way. The order of speaking changed the decision; the candidate did not change. Calibration showed a second effect: candidate X looked stronger (3.25 vs 3.00) only because X met the more lenient interviewer. With only 5 past panels, those offsets are rough тАФ a prompt to talk about scoring habits, not a correction to apply blindly.

тЪая╕П Common mistakes

ЁЯПн In production

An interview scorecard kept with the job description, written before the first interview:

role: maths teacher (software engineer II)
bar: 3.0 average, no competency below 2
competencies:
  - name: testing approach
    question: "Walk me through how you would test the grade-export change."
    anchors:
      1: no testing mentioned
      2: tests after the fact, when prompted
      3: describes unit and integration tests unprompted
      4: chooses tests by risk and explains the trade-offs
  - name: explaining to a colleague
  - name: debugging an unfamiliar system
  - name: working through disagreement
process:
  - each interviewer submits scores and evidence before the debrief
  - the debrief starts with the most junior interviewer
  - the hiring manager decides; the reasons are written down

Some applicant-tracking systems let you hide other interviewers' feedback until you have submitted your own тАФ turn that on if yours does. Every few months, compare interviewers' scores on shared candidates (calibration), and check whether the rubric's scores relate to how hires actually did.

ЁЯПн Why this matters in production: write the rubric and the bar before you meet the first candidate, collect scores before the debrief, and let the quietest evidence speak first. It costs an hour of preparation and removes the most common way good panels make bad decisions.

тПня╕П Next

Part 1 is done: the new job, 1:1s, delegation and hiring. Part 2 is about the work itself. First question every head of department is asked: "when will it be done?"

git checkout lesson-05-forecasting
тЖР PreviousdelegationNext тЖТforecasting

This page is the lesson's README from the lesson-04-hiring branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.