ЁЯПл The SchoolтА║ЁЯПЕ Engineering LeadershipтА║ЁЯзй рдзрдбрд╛ 09 тАФ Team topologies рдЖрдгрд┐ Conway's law: team рдкреНрд░рдХрд╛рд░ рдЖрдгрд┐ cognitive load
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯзй рдзрдбрд╛ 09 тАФ Team topologies рдЖрдгрд┐ Conway's law: team рдкреНрд░рдХрд╛рд░ рдЖрдгрд┐ cognitive load

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 09 ┬╖ рдорд╛рдЧрдЪрд╛: lesson-08-delivery-metrics ┬╖ рдкреБрдврдЪрд╛: lesson-10-incidents-decisions


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

рдзрдбрд╛ 08, рдЖрдгрд┐ рдЯреАрдореНрд╕рдЪреА рд░рдЪрдирд╛. Conway's law (systems рддреНрдпрд╛рдВрдирд╛ рдмрдирд╡рдгрд╛рд▒реНрдпрд╛ рд╕рдВрд╕реНрдереЗрдЪреНрдпрд╛ рд╕рдВрд╡рд╛рдж-рд░рдЪрдиреЗрдЪреА рдирдХреНрдХрд▓ рдХрд░рддрд╛рдд), рдорд╛рдгрд╕рд╛рдВрдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдкреЗрдХреНрд╖рд╛ рдЦреВрдк рд╡реЗрдЧрд╛рдиреЗ рд╡рд╛рдврдгрд╛рд░реЗ рд╕рдВрд╡рд╛рджрд╛рдЪреЗ рдорд╛рд░реНрдЧ, Team Topologies рдЪреЗ рдЪрд╛рд░ team рдкреНрд░рдХрд╛рд░, рдЖрдгрд┐ cognitive load тАФ рдПрдХ рдЯреАрдо рдПрдХрд╛ рд╡реЗрд│реА рдбреЛрдХреНрдпрд╛рдд рдХрд┐рддреА рдареЗрд╡реВ рд╢рдХрддреЗ. topologies() lead/demo.py рдордзреНрдпреЗ; paths(), handoffs() рдЖрдгрд┐ cognitive_load() lead/models.py рдордзреНрдпреЗ.

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

рд╢рд╛рд│рд╛ рдореЛрдареА рд╣реЛрддреЗ. рдХрддрд░рд┐рдирд╛рдЪреНрдпрд╛ рд╡рд┐рднрд╛рдЧрд╛рдд рдЖрддрд╛ 12 рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рдЖрд╣реЗрдд, рдЖрдгрд┐ рддреНрдпрд╛ рд╕рдЧрд│реНрдпрд╛ рдПрдХрд╛рдЪ рдореЛрдареНрдпрд╛ staff meeting рдордзреНрдпреЗ рдмрд╕рддрд╛рдд. ЁЯЧгя╕П рдкреНрд░рддреНрдпреЗрдХреАрд▓рд╛ рдкреНрд░рддреНрдпреЗрдХреАрд╢реА рдмреЛрд▓рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ. 12 рдЬрдгреАрдВрдордзреНрдпреЗ рдмреЛрд▓рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдкрдбреВ рд╢рдХрдгрд╛рд▒реНрдпрд╛ 66 рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдЬреЛрдбреНрдпрд╛ рд╣реЛрддрд╛рдд!

рдореНрд╣рдгреВрди рд╢рд╛рд│рд╛ рд╢рд┐рдХреНрд╖рд┐рдХрд╛рдВрдЪреА рд╡рд┐рднрд╛рдЧрдгреА рдХрд░рддреЗ. рдкрд╣рд┐рд▓реА рдХрд▓реНрдкрдирд╛: рдХрд╛рдорд╛рдЪреНрдпрд╛ рдкреНрд░рдХрд╛рд░рд╛рдиреБрд╕рд╛рд░ тАФ рдПрдХ рдЧрдЯ рдкреНрд░рд╢реНрди рд▓рд┐рд╣рд┐рддреЛ, рдПрдХ рдЧрдЯ рдкреЗрдкрд░ рдЫрд╛рдкрддреЛ, рдПрдХ рдЧрдЯ рддреЗ рддрдкрд╛рд╕рддреЛ. рдкрдг рдЖрддрд╛ рдкреНрд░рддреНрдпреЗрдХ рдирд╡реНрдпрд╛ рдкрд░реАрдХреНрд╖реЗрд▓рд╛ рддрд┐рдиреНрд╣реА рдЧрдЯ рд▓рд╛рдЧрддрд╛рдд. рдкреНрд░рддреНрдпреЗрдХ рдЧрдЯ рдЗрддрд░рд╛рдВрдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рддреЛ. ЁЯРМ

рджреБрд╕рд░реА рдХрд▓реНрдкрдирд╛: рдЗрдпрддреНрддреЗрдиреБрд╕рд╛рд░. рдЗрдпрддреНрддрд╛ 7 рдЪреА рдЯреАрдо рдЗрдпрддреНрддрд╛ 7 рд╕рд╛рдареА рд╕рдЧрд│реЗ рдХрд╛рд╣реА рдХрд░рддреЗ тАФ рдкреНрд░рд╢реНрди, рдЫрдкрд╛рдИ, рддрдкрд╛рд╕рдгреА. рдЗрдпрддреНрддрд╛ 7 рдЪреНрдпрд╛ рдирд╡реНрдпрд╛ рдкрд░реАрдХреНрд╖реЗрд▓рд╛ рдлрдХреНрдд рдЗрдпрддреНрддрд╛ 7 рдЪреА рдЯреАрдо рд▓рд╛рдЧрддреЗ. ЁЯОп

рдЖрдгрд┐ photocopier, рдХрд╛рдЧрдж рдЖрдгрд┐ рдЫрдкрд╛рдИрдЪреЗ рдирд┐рдпрдо? рдПрдХ рдЫреЛрдЯреА support team рддреЗ рд╕рд╛рдВрднрд╛рд│рддреЗ, рдЖрдгрд┐ рддреЗ рдЗрддрдХреЗ рд╕реЛрдкреЗ рдХрд░рддреЗ рдХреА рдЗрдпрддреНрддрд╛рдВрдЪреНрдпрд╛ рдЯреАрдореНрд╕ рддреЗ рдлрдХреНрдд рд╡рд╛рдкрд░рддрд╛рдд тАФ рд╡рд╛рдЯ рдкрд╛рд╣рдгреЗ рдирд╛рд╣реА.

рдХрддрд░рд┐рдирд╛рд▓рд╛ рдЖрдгрдЦреА рдПрдХ рдЧреЛрд╖реНрдЯ рджрд┐рд╕рддреЗ: рд╢рд╛рд│рд╛ рд╢рд┐рдХреНрд╖рд┐рдХрд╛рдВрдЪреА рд╡рд┐рднрд╛рдЧрдгреА рдЬрд╢реА рдХрд░рддреЗ, рддрд╢реАрдЪ рд╢реЗрд╡рдЯреА рддрд┐рдЪреНрдпрд╛ рдкрд░реАрдХреНрд╖рд╛рдВрдЪреА рд░рдЪрдирд╛ рд╣реЛрддреЗ. рдорд╛рдгрд╕рд╛рдВрдЪрд╛ рдЖрдХрд╛рд░рдЪ рдХрд╛рдорд╛рдЪрд╛ рдЖрдХрд╛рд░ рдмрдирддреЛ.

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

flowchart LR
    o["ЁЯСе one team of 12<br/>66 communication paths"] --> t["two teams of 6<br/>30 paths + one interface"]
    c["ЁЯз▒ component teams<br/>frontend ┬╖ backend ┬╖ data ┬╖ platform"] --> c1["team-waits 14<br/>5/6 features need >1 team"]
    s["ЁЯОп stream-aligned + platform"] --> s1["team-waits 9 ┬╖ 3/6"]
    ss["ЁЯЫая╕П stream-aligned + SELF-SERVICE platform"] --> s2["team-waits 5 ┬╖ 0/6"]
    l["ЁЯза cognitive load<br/>grades team 4 ┬╖ 'everything' team 10"]

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

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

ЁЯдФ рдХрд╛

рдХрд╛рд░рдг engineering рдЪреНрдпрд╛ рд╡рд╛рдЯрдгрд╛рд▒реНрдпрд╛ рдЕрдиреЗрдХ delivery рд╕рдорд╕реНрдпрд╛ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдЯреАрдордЪреНрдпрд╛ рд░рдЪрдиреЗрдЪреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рдЕрд╕рддрд╛рдд: рдЪрд╛рд░ рдЯреАрдореНрд╕ рд▓рд╛рдЧрдгрд╛рд░реА features, рддреНрдпрд╛рдВрдЪреНрдпрд╛рдордзреАрд▓ tickets рдЪреНрдпрд╛ рд░рд╛рдВрдЧрд╛, рдЖрдгрд┐ рдЕрд╢реА system рдЬрд┐рдЪреЗ рд╕рд╛рдВрдзреЗ org chart рдЪреНрдпрд╛ рд╕рд╛рдВрдзреНрдпрд╛рдВрдЪреНрдпрд╛ рдЕрдЧрджреА рдЬрд╛рдЧреАрдЪ рдЕрд╕рддрд╛рдд. Lead рдЪрд╛ рдЯреАрдордЪреНрдпрд╛ рд╕реАрдорд╛ рдЖрдгрд┐ рдорд╛рд▓рдХреАрд╡рд░ рддрд┐рд▓рд╛ рд╡рд╛рдЯрддреЗ рддреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдкреНрд░рднрд╛рд╡ рдЕрд╕рддреЛ тАФ рдЖрдгрд┐ рддреНрдпрд╛ рдмрджрд▓рд▓реНрдпрд╛рдиреЗ рдЕрд╢реА рд╡рд╛рдЯ рдкрд╛рд╣рдгреЗ рд╕рдВрдкреВ рд╢рдХрддреЗ рдЬреНрдпрд╛рд▓рд╛ рдХреЛрдгрддреАрд╣реА process рд╕реБрдзрд╛рд░рдгрд╛ рд╕реНрдкрд░реНрд╢рд╣реА рдХрд░реВ рд╢рдХрд▓реА рдирд╕рддреА.

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

lead/models.py рдордзреАрд▓ paths(n) рдореНрд╣рдгрдЬреЗ n(nтИТ1)/2. handoffs(features, owner, self_service=()) рдкреНрд░рддреНрдпреЗрдХ feature рдХреЛрдгрддреНрдпрд╛ components рдирд╛ рд╕реНрдкрд░реНрд╢ рдХрд░рддреЗ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ component рдЪреА рдорд╛рд▓рдХ рдЯреАрдо рдХреЛрдгрддреА рд╣реЗ рдШреЗрддреЗ, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ feature рд▓рд╛ рдХреЛрдгрддреНрдпрд╛ рдЯреАрдореНрд╕рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рд╛рд╡реА рд▓рд╛рдЧрддреЗ рддреЗ рдкрд░рдд рджреЗрддреЗ тАФ self_service рдореНрд╣рдгреВрди рджрд┐рд▓реЗрд▓реНрдпрд╛ рдЯреАрдореНрд╕ рд╡рдЧрд│реВрди, рдХрд╛рд░рдг рддреНрдпрд╛рдВрдЪрд╛ platform рддреНрдпрд╛рдВрдЪреА рд╡рд╛рдЯ рди рдкрд╛рд╣рддрд╛ рд╡рд╛рдкрд░рддрд╛ рдпреЗрддреЛ. cognitive_load(domains) domain рдЧреБрдгрд╛рдВрдЪреА рдмреЗрд░реАрдЬ рдХрд░рддреЗ. lead/demo.py рдордзреАрд▓ topologies() рд╕рд╣рд╛ features рддреАрди org рд░рдЪрдирд╛рдВрд╡рд░ рдЪрд╛рд▓рд╡рддреЗ. рд╣реЗ model рдкреНрд░рддреНрдпреЗрдХ component рдЪрд╛ рдПрдХрдЪ рдорд╛рд▓рдХ рдЖрдгрд┐ self-service рдЦрд░реЛрдЦрд░ рдЪрд╛рд▓рддреЗ рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рддреЗ: рд╡рд┐рдЪрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреЗ рд╕рд╛рдзрди, рд▓реЛрдХрд╛рдВрд╕рд╛рдареАрдЪреЗ рд╕реВрддреНрд░ рдирд╡реНрд╣реЗ.

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

python3 lead/demo.py topologies
python3 - <<'EOF'
import sys; sys.path.insert(0, "lead"); from models import paths, handoffs
for n in (3, 5, 7, 9, 12, 20):
    print(f"team of {n:>2} тЖТ {paths(n):>3} paths")
feats = {"predicted grades": ["grades-ui", "grades-api", "grades-db"], "parent SSO login": ["auth", "parents-ui"]}
owner = {"grades-ui": "frontend", "grades-api": "backend", "grades-db": "data", "auth": "platform", "parents-ui": "frontend"}
for f, teams in handoffs(feats, owner).items():
    print(f"{f} waits for: {teams}")
EOF

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

topologies рд╣реЗ рдЫрд╛рдкрддреЗ:

тФАтФА one team of 12: 66 communication paths ┬╖ two teams of 6: 30 paths inside teams, plus one agreed interface between them
   component teams (frontend/backend/data/platform)   team-waits 14 ┬╖ features needing >1 team 5/6
   stream-aligned teams + a platform team             team-waits  9 ┬╖ features needing >1 team 3/6
   stream-aligned + a SELF-SERVICE platform           team-waits  5 ┬╖ features needing >1 team 0/6
   cognitive load (simple 1 ┬╖ complicated 2 ┬╖ complex 3): grades team         4 across 2 domains
   cognitive load (simple 1 ┬╖ complicated 2 ┬╖ complex 3): 'everything' team  10 across 5 domains

рддреБрдордЪрд╛ snippet рд╣реЗ рдЫрд╛рдкрддреЛ:

team of  3 тЖТ   3 paths
team of  5 тЖТ  10 paths
team of  7 тЖТ  21 paths
team of  9 тЖТ  36 paths
team of 12 тЖТ  66 paths
team of 20 тЖТ 190 paths
predicted grades waits for: ['frontend', 'backend', 'data']
parent SSO login waits for: ['platform', 'frontend']

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

рдорд╛рд░реНрдЧ рдорд╛рдгрд╕рд╛рдВрдкреЗрдХреНрд╖рд╛ рдЦреВрдк рд╡реЗрдЧрд╛рдиреЗ рд╡рд╛рдврддрд╛рдд: 5 рд▓реЛрдХрд╛рдВрдЪреНрдпрд╛ 10 рдЬреЛрдбреНрдпрд╛, 12 рдЪреНрдпрд╛ 66, 20 рдЪреНрдпрд╛ 190. 12 рдЬрдгрд╛рдВрдирд╛ 6 рдЪреНрдпрд╛ рджреЛрди рдЯреАрдореНрд╕рдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧрд▓реНрдпрд╛рд╡рд░ 30 рдорд╛рд░реНрдЧ рдЖрдгрд┐ рдард░рд╡рд╛рдпрдЪрд╛ рдПрдХ interface рдЙрд░рддреЛ. Component teams рдордзреНрдпреЗ 6 рдкреИрдХреА 5 features рдирд╛ рдПрдХрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЯреАрдо рд▓рд╛рдЧрд▓реА (рдПрдХреВрдг 14 team-waits); stream-aligned рдЯреАрдореНрд╕рдиреА рддреЗ 6 рдкреИрдХреА 3 рд╡рд░ рдЖрдгрд▓реЗ; рдЖрдгрд┐ self-service platform рдиреЗ тАФ рдЬреЛ ticket рди рдЯрд╛рдХрддрд╛ рд╡рд╛рдкрд░рддрд╛ рдпреЗрддреЛ тАФ рддреЗ 6 рдкреИрдХреА 0 рд╡рд░ рдЖрдгрд▓реЗ. рджрд░рдореНрдпрд╛рди рдкрд╛рдЪ domains рд╡рд╛рд╣рдгрд╛рд▒реНрдпрд╛ "everything" рдЯреАрдордЪрд╛ load score 10 рд╣реЛрддрд╛, рддрд░ рд▓рдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд grades рдЯреАрдордЪрд╛ 4.

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

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

рдорд╛рд▓рдХреА рд▓рд┐рд╣реВрди рдареЗрд╡рд╛, рдореНрд╣рдгрдЬреЗ Conway's law рддреБрдордЪреНрдпрд╛ рдмрд╛рдЬреВрдиреЗ рдХрд╛рдо рдХрд░реЗрд▓. Service catalogue рдордзреАрд▓ рдПрдХ рдиреЛрдВрдж:

# catalog-info.yaml тАФ one per service (this layout follows Backstage's format)
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
  name: gradebook-api
spec:
  type: service
  owner: team-grades          # a stream-aligned team
  lifecycle: production
  system: grades

Team API тАФ рдЗрддрд░ рдЯреАрдореНрд╕ рддреБрдордЪреНрдпрд╛рд╕реЛрдмрдд рдХрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛рдд тАФ рд╣реА interaction modes рд╕реНрдкрд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА Team Topologies рдЪреА рд╕реВрдЪрдирд╛ рдЖрд╣реЗ:

## Team Grades тАФ team API
- We own: gradebook-api, gradebook-ui, grades-db
- Ask us: #team-grades, or an issue on the gradebook repo (we answer within 1 working day)
- We use as-a-service: platform CI, auth, notifications
- Collaborating now (until week 20): the platform team, on the new storage service

рджрд░ рддрд┐рдорд╛рд╣реАрд▓рд╛ рд╣реА рд░рдЪрдирд╛ рд╡рд╛рд╕реНрддрд╡рд╛рд╢реА рддрд╛рдбреВрди рдкрд╛рд╣рд╛: рдХреЛрдгрддреНрдпрд╛ features рдирд╛ рдПрдХрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЯреАрдо рд▓рд╛рдЧрд▓реА, рдЖрдгрд┐ рддреНрдпрд╛рдВрдиреА рдХрд┐рддреА рд╡реЗрд│ рд╡рд╛рдЯ рдкрд╛рд╣рд┐рд▓реА? System Design school рдпрд╛рдЪ рд╕реАрдорд╛рдВрдЪреА architecture рдмрд╛рдЬреВ рд╢рд┐рдХрд╡рддреЗ.

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рд╣рд│реВ delivery рд╕реБрдзрд╛рд░рдгреНрдпрд╛рд╕рд╛рдареА process рдЬреЛрдбрдгреНрдпрд╛рдЖрдзреА, рдПрдХрд╛ рд╕рд╛рдорд╛рдиреНрдп feature рд▓рд╛ рдХрд┐рддреА рдЯреАрдореНрд╕ рд▓рд╛рдЧрддрд╛рдд рддреЗ рдореЛрдЬрд╛. рдЙрддреНрддрд░ рддреАрди рдХрд┐рдВрд╡рд╛ рдЪрд╛рд░ рдЕрд╕реЗрд▓, рддрд░ рдорд╛рд▓рдХреА рдмрджрд▓рд╛ рдХрд┐рдВрд╡рд╛ self-service platform рдмрдирд╡рд╛ тАФ org chart рд╣рд╛ architecture рдЪрд╛рдЪ рднрд╛рдЧ рдЖрд╣реЗ.

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

рдиреАрдЯ рд░рдЪрд▓реЗрд▓реНрдпрд╛ рдЯреАрдореНрд╕рдЪреЗрд╣реА рд╡рд╛рдИрдЯ рджрд┐рд╡рд╕ рдпреЗрддрд╛рдд. рдкреБрдвреЗ: incidents рдЖрдгрд┐ рдХрдареАрдг рдирд┐рд░реНрдгрдпрд╛рдВрдордзреНрдпреЗ рдиреЗрддреГрддреНрд╡ тАФ рдЖрдгрд┐ рдЙрд▓рдЯрддрд╛ рдпреЗрдгрд╛рд░реЗ рдирд┐рд░реНрдгрдп рди рдЙрд▓рдЯрддрд╛ рдпреЗрдгрд╛рд▒реНрдпрд╛рдВрдкрд╛рд╕реВрди рд╡реЗрдЧрд│реЗ рдУрд│рдЦрдгреЗ.

git checkout lesson-10-incidents-decisions

ЁЯзй Lesson 09 тАФ Team topologies and Conway's law: team types and cognitive load

ЁЯУН You are here: Lesson 09 of 12 ┬╖ Previous: lesson-08-delivery-metrics ┬╖ Next: lesson-10-incidents-decisions


ЁЯУж What's in this branch

Lesson 08, plus the shape of teams. Conway's law (systems copy the communication structure of the organisation that builds them), communication paths that grow much faster than headcount, the four Team Topologies team types, and cognitive load тАФ how much one team can hold in its head. topologies() in lead/demo.py; paths(), handoffs() and cognitive_load() in lead/models.py.

ЁЯзТ Explain like I'm 5

The school grows. Katrina's department now has 12 teachers, and they all sit in one big staff meeting. ЁЯЧгя╕П Everyone needs to talk to everyone. With 12 people, that is 66 different pairs who might need to talk!

So the school splits the teachers. First idea: by job type тАФ one group writes the questions, one group prints the papers, one group marks them. But now every new exam needs all three groups. Each one waits for the others. ЁЯРМ

Second idea: by year group. The Year 7 team does everything for Year 7 тАФ questions, printing, marking. A new Year 7 exam needs only the Year 7 team. ЁЯОп

And the photocopier, the paper and the printing rules? A small support team looks after those, and makes them so easy to use that the year teams just use them тАФ no waiting.

Katrina notices something else: the way the school splits its teachers ends up being the way its exams are organised. The shape of the people becomes the shape of the work.

ЁЯЧ║я╕П Diagram

flowchart LR
    o["ЁЯСе one team of 12<br/>66 communication paths"] --> t["two teams of 6<br/>30 paths + one interface"]
    c["ЁЯз▒ component teams<br/>frontend ┬╖ backend ┬╖ data ┬╖ platform"] --> c1["team-waits 14<br/>5/6 features need >1 team"]
    s["ЁЯОп stream-aligned + platform"] --> s1["team-waits 9 ┬╖ 3/6"]
    ss["ЁЯЫая╕П stream-aligned + SELF-SERVICE platform"] --> s2["team-waits 5 ┬╖ 0/6"]
    l["ЁЯза cognitive load<br/>grades team 4 ┬╖ 'everything' team 10"]

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

тЭУ What

ЁЯдФ Why

Because many delivery problems that look like engineering problems are team-shape problems: features that need four teams, queues of tickets between them, and a system whose seams sit exactly where the org chart's do. A lead often has more influence over team boundaries and ownership than she thinks тАФ and changing them can remove waiting that no process improvement would touch.

ЁЯФз How (in this repo)

paths(n) in lead/models.py is n(nтИТ1)/2. handoffs(features, owner, self_service=()) takes the components each feature touches and the team that owns each component, and returns the teams each feature must wait for тАФ skipping teams listed as self_service, whose platform can be used without waiting for them. cognitive_load(domains) adds up the domain scores. topologies() in lead/demo.py runs six features against three org designs. The model assumes one owner per component and that self-service really works: a thinking tool, not a formula for people.

ЁЯзк Try it

python3 lead/demo.py topologies
python3 - <<'EOF'
import sys; sys.path.insert(0, "lead"); from models import paths, handoffs
for n in (3, 5, 7, 9, 12, 20):
    print(f"team of {n:>2} тЖТ {paths(n):>3} paths")
feats = {"predicted grades": ["grades-ui", "grades-api", "grades-db"], "parent SSO login": ["auth", "parents-ui"]}
owner = {"grades-ui": "frontend", "grades-api": "backend", "grades-db": "data", "auth": "platform", "parents-ui": "frontend"}
for f, teams in handoffs(feats, owner).items():
    print(f"{f} waits for: {teams}")
EOF

тЬЕ Verify тАФ what you should see

topologies prints:

тФАтФА one team of 12: 66 communication paths ┬╖ two teams of 6: 30 paths inside teams, plus one agreed interface between them
   component teams (frontend/backend/data/platform)   team-waits 14 ┬╖ features needing >1 team 5/6
   stream-aligned teams + a platform team             team-waits  9 ┬╖ features needing >1 team 3/6
   stream-aligned + a SELF-SERVICE platform           team-waits  5 ┬╖ features needing >1 team 0/6
   cognitive load (simple 1 ┬╖ complicated 2 ┬╖ complex 3): grades team         4 across 2 domains
   cognitive load (simple 1 ┬╖ complicated 2 ┬╖ complex 3): 'everything' team  10 across 5 domains

Your snippet prints:

team of  3 тЖТ   3 paths
team of  5 тЖТ  10 paths
team of  7 тЖТ  21 paths
team of  9 тЖТ  36 paths
team of 12 тЖТ  66 paths
team of 20 тЖТ 190 paths
predicted grades waits for: ['frontend', 'backend', 'data']
parent SSO login waits for: ['platform', 'frontend']

ЁЯПБ What you just proved

Paths grow much faster than people: 5 people have 10 pairs, 12 have 66, 20 have 190. Splitting 12 into two teams of 6 leaves 30 paths plus one interface to agree on. With component teams, 5 of 6 features needed more than one team (14 team-waits in total); stream-aligned teams cut that to 3 of 6; and a self-service platform тАФ one you use without filing a ticket тАФ brought it to 0 of 6. Meanwhile an "everything" team carrying five domains had a load score of 10, against 4 for a focused grades team.

тЪая╕П Common mistakes

ЁЯПн In production

Write the ownership down, so Conway's law works for you. A service catalogue entry:

# catalog-info.yaml тАФ one per service (this layout follows Backstage's format)
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
  name: gradebook-api
spec:
  type: service
  owner: team-grades          # a stream-aligned team
  lifecycle: production
  system: grades

A team API тАФ how other teams work with you тАФ is Team Topologies' suggestion for making interaction modes explicit:

## Team Grades тАФ team API
- We own: gradebook-api, gradebook-ui, grades-db
- Ask us: #team-grades, or an issue on the gradebook repo (we answer within 1 working day)
- We use as-a-service: platform CI, auth, notifications
- Collaborating now (until week 20): the platform team, on the new storage service

Check the shape against reality every quarter: which features needed more than one team, and how long did they wait? The System Design school covers the architecture side of the same boundaries.

ЁЯПн Why this matters in production: before you add a process to fix slow delivery, count how many teams a typical feature needs. If the answer is three or four, change ownership or build a self-service platform тАФ the org chart is part of the architecture.

тПня╕П Next

Well-shaped teams still have bad days. Next: leading through incidents and hard decisions тАФ and telling the reversible ones from the irreversible.

git checkout lesson-10-incidents-decisions
тЖР Previousdelivery metricsNext тЖТincidents decisions

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