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

ЁЯдЭ рдзрдбрд╛ 03 тАФ Delegation рдЖрдгрд┐ ownership: рд╕реНрддрд░, RACI рдЖрдгрд┐ bus factor

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдорд╛рдЧреЗ: lesson-02-one-on-ones ┬╖ рдкреБрдвреЗ: lesson-04-hiring


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

рдзрдбрд╛ 02, рдЖрдгрд┐ рдХрд╛рдо рдиреАрдЯ рд╕реЛрдкрд╡рдгреЗ. рд╕рд╛рдд delegation levels ("рдореА рддреБрд▓рд╛ рд╕рд╛рдВрдЧрддреЗ" рдкрд╛рд╕реВрди "рддреВ рдард░рд╡" рдкрд░реНрдпрдВрдд), RACI (рдХреЛрдг Responsible, Accountable, Consulted, Informed), рдЖрдгрд┐ bus factor тАФ рдПрдЦрд╛рджреНрдпрд╛ рдХрд╛рдорд╛рд▓рд╛ рдХрд░реВ рд╢рдХрдгрд╛рд░реЗ рдХреЛрдгреАрдЪ рдЙрд░рдгрд╛рд░ рдирд╛рд╣реА рддреНрдпрд╛рдЖрдзреА рд╡рд┐рднрд╛рдЧ рдХрд┐рддреА рд▓реЛрдХ рдЧрдорд╛рд╡реВ рд╢рдХрддреЛ. lead/demo.py рдордзрд▓реЗ delegation(); lead/models.py рдордзрд▓реЗ bus_factor(), raci_check() рдЖрдгрд┐ DELEGATION.

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

рдХрддрд░рд┐рдирд╛ рдПрдХ рдпрд╛рджреА рд▓рд┐рд╣рд┐рддреЗ: рдЧрдгрд┐рдд рд╡рд┐рднрд╛рдЧрд╛рддреАрд▓ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдо, рдЖрдгрд┐ рддреЗ рдорджрддреАрд╢рд┐рд╡рд╛рдп рдХреЛрдг рдХрд░реВ рд╢рдХрддреЗ. ЁЯУЭ

рдордЧ рддреА рдПрдХ рднреАрддреАрджрд╛рдпрдХ рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рддреЗ: "рдкрд░реАрдХреНрд╖реЗрдЪреНрдпрд╛ рдЖрдард╡рдбреНрдпрд╛рдд рдореА рдЖрдЬрд╛рд░реА рдкрдбрд▓реЗ рддрд░?" ЁЯдТ рджреЛрди рдХрд╛рдорд╛рдВрд╕рд╛рдареА рдХреЛрдгреАрдЪ рдирд╕реЗрд▓. рддреА рд╕рдВрдЦреНрдпрд╛ тАФ рдПрдЦрд╛рджреНрдпрд╛ рдХрд╛рдорд╛рд▓рд╛ рдХреЛрдгреАрдЪ рдЙрд░рдгреНрдпрд╛рдЖрдзреА рдХрд┐рддреА рд▓реЛрдХ рдЧреИрд░рд╣рдЬрд░ рдЕрд╕реВ рд╢рдХрддрд╛рдд тАФ рдореНрд╣рдгрдЬреЗ bus factor. рдЗрдереЗ рддреЛ 1 рдЖрд╣реЗ. рдПрдХ рд╡реНрдпрдХреНрддреА рдЧреИрд░рд╣рдЬрд░, рдЖрдгрд┐ рд╡рд┐рднрд╛рдЧ рдЕрдбрдХрддреЛ.

рдореНрд╣рдгреВрди рдХрддрд░рд┐рдирд╛ рдХрд╛рдореЗ рд╕реЛрдкрд╡реВ рд▓рд╛рдЧрддреЗ. "рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА рд╣рд╛ рднрд╛рдЧ рдХрд░" рдЕрд╕реЗ рдирд╛рд╣реА, рддрд░ "рд╣реЗ рдЖрддрд╛ рддреБрдЭреЗ рдЖрд╣реЗ". рджреАрдкрд┐рдХрд╛ рдХрд╛рд╣реА рдЖрдард╡рдбреЗ рдХрддрд░рд┐рдирд╛рд╕реЛрдмрдд рд╡реЗрд│рд╛рдкрддреНрд░рдХ рдмрдирд╡рддреЗ, рдордЧ рдПрдХрдЯреА. рдРрд╢реНрд╡рд░реНрдпрд╛ рдкрд░реАрдХреНрд╖реЗрдЪреНрдпрд╛ рджрд┐рд╡рд╕рд╛рдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛ рддрд╛рдмреНрдпрд╛рдд рдШреЗрддреЗ. рдПрдХрд╛ рд╕рддреНрд░рд╛рдирдВрддрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдорд╛рд╕рд╛рдареА рдХрд┐рдорд╛рди рджреЛрди рдЬрдгреА рдЖрд╣реЗрдд. Bus factor 2 рдЖрд╣реЗ.

рддреА рдХрд┐рддреА рд╕реЛрдкрд╡рддреЗ рдЖрд╣реЗ рд╣реЗ рд╕рд╛рдВрдЧрд╛рдпрд▓рд╛рд╣реА рддреА рд╢рд┐рдХрддреЗ: "рддреВ рдард░рд╡, рдЖрдгрд┐ рдирдВрддрд░ рдорд▓рд╛ рд╕рд╛рдВрдЧ" рд╣реЗ "рдорд▓рд╛ рддреБрдЭреА рдХрд▓реНрдкрдирд╛ рд╕рд╛рдВрдЧ, рдЖрдгрд┐ рдореА рдард░рд╡рддреЗ" рдпрд╛рдкреЗрдХреНрд╖рд╛ рдЦреВрдк рд╡реЗрдЧрд│реЗ рдЖрд╣реЗ.

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

flowchart LR
    m["ЁЯУЭ who can do each job alone<br/>release: Katrina only<br/>runbooks: Katrina only"] --> b1["ЁЯЪМ bus factor 1"]
    b1 -->|"a quarter of pairing"| p["ЁЯдЭ Dipika runs releases<br/>Aishwarya owns runbooks<br/>Meera learns the database"]
    p --> b2["ЁЯЪМ bus factor 2"]
    r["ЁЯУЛ RACI check<br/>weekly release: 2 accountable<br/>gradebook migration: 0 accountable"] --> f["тЬЕ exactly one A,<br/>at least one R"]

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

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

ЁЯдФ рдХрд╛

рдХрд╛рд░рдг рдирд╡реА lead рд╕рд╣рд╕рд╛ рдЯреАрдордордзреАрд▓ рд╕рд░реНрд╡рд╛рдд рдХреБрд╢рд▓ рд╡реНрдпрдХреНрддреА рдЕрд╕рддреЗ, рдореНрд╣рдгреВрди рдХреЛрдгрддреЗрд╣реА рдХрд╛рдо рдкреВрд░реНрдг рдХрд░рд╛рдпрдЪрд╛ рд╕рд░реНрд╡рд╛рдд рдЬрд▓рдж рдорд╛рд░реНрдЧ рдореНрд╣рдгрдЬреЗ рддреЗ рд╕реНрд╡рддрдГ рдХрд░рдгреЗ. рд╣реЗ рдПрдХ рдорд╣рд┐рдирд╛ рдЪрд╛рд▓рддреЗ. рдордЧ рдкреНрд░рддреНрдпреЗрдХ рдЕрд╡рдШрдб рд╕рдорд╕реНрдпрд╛ рддрд┐рдЪреНрдпрд╛ рджрд╛рд░рд╛рдд рд░рд╛рдВрдЧ рд▓рд╛рд╡рддреЗ, рддреА рд╕рд╛рдВрднрд╛рд│рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ systems рдЯреАрдо рдХрдзреАрдЪ рд╢рд┐рдХрдд рдирд╛рд╣реА, рдЖрдгрд┐ рддрд┐рдЪреА рд╕реБрдЯреНрдЯреА рдзреЛрдХрд╛ рдмрдирддреЗ. Delegation рдореБрд│реЗрдЪ рдЯреАрдордЪреА рдХреНрд╖рдорддрд╛ lead рдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рддрд╛рд╕рд╛рдВрдЪреНрдпрд╛ рдкрд▓реАрдХрдбреЗ рд╡рд╛рдврддреЗ тАФ рдЖрдгрд┐ рддреЗрдЪ рд╕рдВрдкреВрд░реНрдг рдХрд╛рдо рдЖрд╣реЗ (рдзрдбрд╛ 01). RACI рдЖрдгрд┐ bus factor рд▓рдкрд▓реЗрд▓реЗ single points рджреГрд╢реНрдп рдХрд░рддрд╛рдд.

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

lead/models.py рдордзрд▓реЗ bus_factor(matrix, level=2) {person: {skill: 0..3}} рдШреЗрддреЗ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХреМрд╢рд▓реНрдпрд╛рдЪреЗ рдзрд╛рд░рдХ (level рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рд╡рд░реАрд▓ рд▓реЛрдХ) рдЖрдгрд┐ bus factor (рд╕рд░реНрд╡рд╛рдд рд▓рд╣рд╛рди рдзрд╛рд░рдХ рд╕рдВрдЦреНрдпрд╛) рдкрд░рдд рджреЗрддреЗ. raci_check(raci) {task: {person: letters}} рдШреЗрддреЗ рдЖрдгрд┐ рдиреЗрдордХрд╛ рдПрдХ A рдирд╕рд▓реЗрд▓реЗ рдХрд┐рдВрд╡рд╛ рдПрдХрд╣реА R рдирд╕рд▓реЗрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдо рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ. DELEGATION рдордзреНрдпреЗ Appelo рдпрд╛рдВрдЪреЗ рд╕рд╛рдд рд╕реНрддрд░ рдЖрд╣реЗрдд. lead/demo.py рдордзрд▓реЗ delegation() рдПрдХрд╛ рддрд┐рдорд╛рд╣реАрдЪреНрдпрд╛ pairing рдЖрдзреА рдЖрдгрд┐ рдирдВрддрд░рдЪрд╛ рдХрддрд░рд┐рдирд╛рдЪрд╛ рд╡рд┐рднрд╛рдЧ рдЪрд╛рд▓рд╡рддреЗ. Levels (0тАУ3) рд╣реЗ рд╕реНрд╡рддрдГ рдХреЗрд▓реЗрд▓реЗ рдЕрдВрджрд╛рдЬ рдЖрд╣реЗрдд: рд╡рд┐рдЪрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреЗ рд╕рд╛рдзрди, рдорд╛рдгрд╕рд╛рдВрд╕рд╛рдареАрдЪреЗ рд╕реВрддреНрд░ рдирд╛рд╣реА.

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

python3 lead/demo.py delegation
python3 - <<'EOF'
import sys; sys.path.insert(0, "lead"); from models import bus_factor, raci_check, DELEGATION
m = {"Katrina": {"gradebook": 3, "release": 3, "runbooks": 3},
     "Dipika": {"gradebook": 2, "release": 1, "runbooks": 1},
     "Aishwarya": {"gradebook": 2, "release": 0, "runbooks": 1}}
for level in (1, 2, 3):
    holders, bf = bus_factor(m, level)
    print(f"counting level {level}+ as 'can do it' тЖТ bus factor {bf} ┬╖ release: {holders['release']}")
print(raci_check({"weekly release": {"Dipika": "RA", "Katrina": "C", "Aishwarya": "I"}}) or "RACI ok")
print(raci_check({"exam timetable": {"Katrina": "RA", "Dipika": "RA"}}))
print(" ┬╖ ".join(DELEGATION))
EOF

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

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

   release    1 ┬╖ Katrina
   runbooks   1 ┬╖ Katrina
   bus factor 1 ┬╖ if Katrina is out: ['release', 'runbooks'] have nobody
тФАтФА after a quarter of pairing (Dipika runs releases, Aishwarya owns runbooks, Meera learns the database) тЖТ bus factor 2
тФАтФА RACI check: weekly release: 2 accountable (Katrina, Dipika) ┬╖ weekly release: nobody responsible ┬╖ gradebook migration: 0 accountable (nobody)
   delegation level for 'which test framework the gradebook uses': 7 delegate
   delegation level for 'the exam-week release freeze': 4 agree
   delegation level for 'the hiring bar': 3 consult

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

counting level 1+ as 'can do it' тЖТ bus factor 2 ┬╖ release: ['Katrina', 'Dipika']
counting level 2+ as 'can do it' тЖТ bus factor 1 ┬╖ release: ['Katrina']
counting level 3+ as 'can do it' тЖТ bus factor 1 ┬╖ release: ['Katrina']
RACI ok
['exam timetable: 2 accountable (Katrina, Dipika)']
1 tell ┬╖ 2 sell ┬╖ 3 consult ┬╖ 4 agree ┬╖ 5 advise ┬╖ 6 inquire ┬╖ 7 delegate

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

Delegation рдЖрдзреА рджреЛрди рдХрд╛рдорд╛рдВрд╕рд╛рдареА тАФ release рдЖрдгрд┐ runbooks тАФ рдлрдХреНрдд рдХрддрд░рд┐рдирд╛ рд╣реЛрддреА, рдореНрд╣рдгреВрди bus factor 1 рд╣реЛрддрд╛. рдПрдХрд╛ рддрд┐рдорд╛рд╣реАрдЪреНрдпрд╛ рдЬрд╛рдгреАрд╡рдкреВрд░реНрд╡рдХ pairing рдиреЗ рддреЛ 2 рдХреЗрд▓рд╛. рддреБрдореНрд╣реА "рдХрд░реВ рд╢рдХрддреЗ" рдореНрд╣рдгреВрди рдХрд╛рдп рдореЛрдЬрддрд╛ рдпрд╛рд╡рд░рд╣реА bus factor рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЛ: level 1 рд╡рд░ (рдорджрддреАрдиреЗ рдХрд░реВ рд╢рдХрддреЗ) рджреАрдкрд┐рдХрд╛ releases рд╕рд╛рдареА рдореЛрдЬрд▓реА рдЬрд╛рддреЗ рдЖрдгрд┐ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдирд┐рд░реЛрдЧреА рджрд┐рд╕рддреЗ. RACI рдиреЗ рдПрдХрд╛ рдХрд╛рдорд╛рд╡рд░ рджреЛрди A рдЖрдгрд┐ рджреБрд╕рд▒реНрдпрд╛рд╡рд░ рдПрдХрд╣реА рдирд╛рд╣реА рд╣реЗ рдкрдХрдбрд▓реЗ тАФ рджреЛрдиреНрд╣реАрдВрдЪрд╛ рдЕрд░реНрде "рдЦрд░реЗ рддрд░ рдХреЛрдгреАрдЪ accountable рдирд╛рд╣реА".

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

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

рдЯреАрдордЪреНрдпрд╛ docs рдордзреНрдпреЗ рдПрдХ RACI рддрдХреНрддрд╛, рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдорд┐рдд рдЬрдмрд╛рдмрджрд╛рд░реАрд╕рд╛рдареА рдПрдХ row:

| Task                    | Katrina | Dipika | Aishwarya | Meera | Leela |
|-------------------------|---------|--------|-----------|-------|-------|
| Weekly release          | C       | A/R    | I         | R     | I     |
| Gradebook migration     | I       | A      | R         | C     | I     |
| Hiring loop             | A       | R      | R         | I     | I     |
| On-call runbooks        | C       | I      | A/R       | R     | I     |

Code рдордзреАрд▓ knowledge concentration рдЪрд╛ рдвреЛрдмрд│ рд╕рдВрдХреЗрдд: рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧрд╛рдд рдХреЛрдгреА commit рдХреЗрд▓реЗ рдЖрд╣реЗ. рдЦрд▒реНрдпрд╛ repository рд╡рд░ (рд╣реЗ commits рдореЛрдЬрддреЗ, рд╕рдордЬ рдирд╡реНрд╣реЗ тАФ рдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд░рд╛, рд▓реЛрдХрд╛рдВрдЪреЗ рдореВрд▓реНрдпрдорд╛рдкрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╛рд╣реА):

git shortlog -sn --since="12 months ago" -- services/gradebook/
git shortlog -sn --since="12 months ago" -- deploy/

CODEOWNERS file (GitHub рдЖрдгрд┐ GitLab рджреЛрдиреНрд╣реА support рдХрд░рддрд╛рдд) ownership рд╕реНрдкрд╖реНрдЯ рдХрд░рддреЗ, рдореНрд╣рдгрдЬреЗ reviews рдПрдХрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рд╡реНрдпрдХреНрддреАрдВрдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрддрд╛рдд:

/services/gradebook/   @school/maths-dipika @school/maths-aishwarya
/deploy/               @school/maths-dipika @school/maths-meera

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рддреБрдореНрд╣реА рджреЛрди рдЖрдард╡рдбреЗ рджреВрд░ рдЕрд╕рд╛рд▓ рддрд░ рдмрд┐рдШрдбрддреАрд▓ рдЕрд╢рд╛ рдкрд╛рдЪ рдЧреЛрд╖реНрдЯреАрдВрдЪреА рдпрд╛рджреА рдХрд░рд╛. рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ рддреБрдореНрд╣реА рдЕрдЬреВрди рди рдХреЗрд▓реЗрд▓реЗ delegation. рдПрдХ рдирд┐рд╡рдбрд╛, рддреНрдпрд╛рдЪрд╛ рд╕реНрддрд░ рд╕рд╛рдВрдЧрд╛, рдЖрдгрд┐ рдпрд╛ рдорд╣рд┐рдиреНрдпрд╛рдд рддреНрдпрд╛рд╡рд░ pairing рдХрд░рд╛.

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

Delegation рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд▓реЛрдХрд╛рдВрдордзреНрдпреЗ рдХрд╛рдо рд╡рд╛рдЯрддреЗ. рд▓рд╡рдХрд░рдЪ рдХрд┐рдВрд╡рд╛ рдЙрд╢рд┐рд░рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдгрдЦреА рд▓реЛрдХ рд▓рд╛рдЧрддрд╛рдд тАФ рдЖрдгрд┐ hiring рд╣рд╛ рдЙрд▓рдЯрд╛рдпрд▓рд╛ рдорд╣рд╛рдЧ рдкрдбрдгрд╛рд▒реНрдпрд╛ рдореЛрдЬрдХреНрдпрд╛ рдирд┐рд░реНрдгрдпрд╛рдВрдкреИрдХреА рдПрдХ рдЖрд╣реЗ.

git checkout lesson-04-hiring

ЁЯдЭ Lesson 03 тАФ Delegation and ownership: levels, RACI and the bus factor

ЁЯУН You are here: Lesson 03 of 12 ┬╖ Previous: lesson-02-one-on-ones ┬╖ Next: lesson-04-hiring


ЁЯУж What's in this branch

Lesson 02, plus giving work away properly. The seven delegation levels (from "I tell you" to "you decide"), RACI (who is Responsible, Accountable, Consulted, Informed), and the bus factor тАФ how many people the department can lose before some job has nobody who can do it. delegation() in lead/demo.py; bus_factor(), raci_check() and DELEGATION in lead/models.py.

ЁЯзТ Explain like I'm 5

Katrina writes a list: every job in the maths department, and who can do it without help. ЁЯУЭ

Then she asks a scary question: "What if I am ill on exam week?" ЁЯдТ Two jobs would have nobody. That number тАФ how many people can be away before a job has nobody тАФ is the bus factor. Here it is 1. One person away, and the department is stuck.

So Katrina starts giving jobs away. Not "do this bit for me", but "this is yours now". Dipika makes the timetable with Katrina for a few weeks, then alone. Aishwarya takes over the exam-day plan. After one term, every job has at least two people. The bus factor is 2.

She also learns to say how much she is giving away: "you decide, and tell me after" is very different from "tell me your idea, and I decide".

ЁЯЧ║я╕П Diagram

flowchart LR
    m["ЁЯУЭ who can do each job alone<br/>release: Katrina only<br/>runbooks: Katrina only"] --> b1["ЁЯЪМ bus factor 1"]
    b1 -->|"a quarter of pairing"| p["ЁЯдЭ Dipika runs releases<br/>Aishwarya owns runbooks<br/>Meera learns the database"]
    p --> b2["ЁЯЪМ bus factor 2"]
    r["ЁЯУЛ RACI check<br/>weekly release: 2 accountable<br/>gradebook migration: 0 accountable"] --> f["тЬЕ exactly one A,<br/>at least one R"]

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

тЭУ What

ЁЯдФ Why

Because a new lead is usually the most skilled person on the team, so the fastest way to get anything done is to do it herself. That works for a month. Then every hard problem queues at her door, the team never learns the systems she holds, and her holiday becomes a risk. Delegation is how the team's capacity grows beyond the lead's own hours тАФ which is the whole job (lesson 01). RACI and the bus factor make hidden single points visible.

ЁЯФз How (in this repo)

bus_factor(matrix, level=2) in lead/models.py takes {person: {skill: 0..3}} and returns the holders of each skill (people at level or above) and the bus factor (the smallest holder count). raci_check(raci) takes {task: {person: letters}} and lists every task without exactly one A or without any R. DELEGATION holds Appelo's seven levels. delegation() in lead/demo.py runs Katrina's department before and after a quarter of pairing. The levels (0тАУ3) are self-assessed guesses: a thinking tool, not a formula for people.

ЁЯзк Try it

python3 lead/demo.py delegation
python3 - <<'EOF'
import sys; sys.path.insert(0, "lead"); from models import bus_factor, raci_check, DELEGATION
m = {"Katrina": {"gradebook": 3, "release": 3, "runbooks": 3},
     "Dipika": {"gradebook": 2, "release": 1, "runbooks": 1},
     "Aishwarya": {"gradebook": 2, "release": 0, "runbooks": 1}}
for level in (1, 2, 3):
    holders, bf = bus_factor(m, level)
    print(f"counting level {level}+ as 'can do it' тЖТ bus factor {bf} ┬╖ release: {holders['release']}")
print(raci_check({"weekly release": {"Dipika": "RA", "Katrina": "C", "Aishwarya": "I"}}) or "RACI ok")
print(raci_check({"exam timetable": {"Katrina": "RA", "Dipika": "RA"}}))
print(" ┬╖ ".join(DELEGATION))
EOF

тЬЕ Verify тАФ what you should see

delegation prints:

   release    1 ┬╖ Katrina
   runbooks   1 ┬╖ Katrina
   bus factor 1 ┬╖ if Katrina is out: ['release', 'runbooks'] have nobody
тФАтФА after a quarter of pairing (Dipika runs releases, Aishwarya owns runbooks, Meera learns the database) тЖТ bus factor 2
тФАтФА RACI check: weekly release: 2 accountable (Katrina, Dipika) ┬╖ weekly release: nobody responsible ┬╖ gradebook migration: 0 accountable (nobody)
   delegation level for 'which test framework the gradebook uses': 7 delegate
   delegation level for 'the exam-week release freeze': 4 agree
   delegation level for 'the hiring bar': 3 consult

Your snippet prints:

counting level 1+ as 'can do it' тЖТ bus factor 2 ┬╖ release: ['Katrina', 'Dipika']
counting level 2+ as 'can do it' тЖТ bus factor 1 ┬╖ release: ['Katrina']
counting level 3+ as 'can do it' тЖТ bus factor 1 ┬╖ release: ['Katrina']
RACI ok
['exam timetable: 2 accountable (Katrina, Dipika)']
1 tell ┬╖ 2 sell ┬╖ 3 consult ┬╖ 4 agree ┬╖ 5 advise ┬╖ 6 inquire ┬╖ 7 delegate

ЁЯПБ What you just proved

Before delegation, two jobs тАФ release and runbooks тАФ had only Katrina, so the bus factor was 1. A quarter of deliberate pairing raised it to 2. The bus factor also depends on what you count as "can do it": at level 1 (can do it with help) Dipika counts for releases and the number looks healthier than it is. RACI caught two A's on one task and none on another тАФ both mean "nobody is really accountable".

тЪая╕П Common mistakes

ЁЯПн In production

A RACI table in the team's docs, one row per recurring responsibility:

| Task                    | Katrina | Dipika | Aishwarya | Meera | Leela |
|-------------------------|---------|--------|-----------|-------|-------|
| Weekly release          | C       | A/R    | I         | R     | I     |
| Gradebook migration     | I       | A      | R         | C     | I     |
| Hiring loop             | A       | R      | R         | I     | I     |
| On-call runbooks        | C       | I      | A/R       | R     | I     |

A rough signal of knowledge concentration in code: who has committed to each area. On a real repository (it counts commits, not understanding тАФ use it to ask questions, not to judge people):

git shortlog -sn --since="12 months ago" -- services/gradebook/
git shortlog -sn --since="12 months ago" -- deploy/

A CODEOWNERS file (GitHub and GitLab support one) makes ownership explicit, so reviews reach more than one person:

/services/gradebook/   @school/maths-dipika @school/maths-aishwarya
/deploy/               @school/maths-dipika @school/maths-meera

ЁЯПн Why this matters in production: list the five things that would break if you were away for two weeks. Each one is a delegation you have not made yet. Pick one, name its level, and pair on it this month.

тПня╕П Next

Delegation spreads the work across the people you have. Sooner or later you need more people тАФ and hiring is one of the few decisions that is expensive to undo.

git checkout lesson-04-hiring
тЖР Previousone on onesNext тЖТhiring

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