Vietnam has 5,091 surplus teachers coexisting with a shortage of 62,877 in remote, mountainous areas. This means thousands of children never have access to subjects like English or IT.
TeachMap is an equitable teacher allocation optimization system for provincial education officers — built around a Min-Cost Max-Flow algorithm and a government-grade interface designed to replace Excel spreadsheets and phone calls.
"The localized surplus and shortage is not only at the provincial level — within a single school, there is structural mismatch."— National Assembly Chair Vương Đình Huệ
These are the jobs we designed for.
Hover each node for more details
| Field | Type | Why |
|---|---|---|
| teacher_id | HG001, LC001 | Province prefix multi-province pipeline compatible |
| name | string (romanized) | Encoding safe non-diacritic for Python/pandas safety |
| base_lat / base_lng | float | Distance cost input to MCMF solver |
| subjects | semicolon-separated | Flat CSV keeps structure flat, no nested arrays |
| capacity_hours_per_week | int | Capacity constraint for flow solver |
| Field | Type | Why |
|---|---|---|
| school_id | HG-S012 | Province prefix consistent with teacher ID system |
| priority | 1–5 scale | Remoteness weight in equity audit output |
| demand_Math | int (hours) | Flat columns not nested — simplifies solver ingestion |
| demand_English | int (hours) | Separate column per subject for direct query |
| lat / lng | float | Geographic distance calculation to teachers |
I authored the JSON schema as the contract between my frontend work and the algorithm team's solver. Both tracks ran in parallel throughout the sprint. No dependency bottlenecks.
The pitch opened with my personal experience learning English, contrasted with a highland child who has no English teacher because placement logic failed. Personal and verifiable — no fictional character.
| Stakeholder | Before | After TeachMap |
|---|---|---|
| Sở officer | 3–4 weeks making allocation calls manually with Excel and phone calls | Hours to run, review, adjust, and export decision |
| Remote school | Receives assignment based on who they know or luck | Receives assignment based on objective coverage priority score |
| Ethnic minority student | May not have English or IT teacher for the entire year | Higher probability of having one — priority-flagged schools go first |
| UNICEF / World Bank | Knows problem exists, no granular data to report | Province-level coverage maps, unmet demand by subject and location — exportable |
| MOET | Cannot see allocation quality across provinces | Could aggregate data nationally if multiple provinces adopt the system |
In 12 hours, we used the privilege of having learned English, learned to code, to try to build something for people who had neither. That asymmetry — between what we were given and what a child in a highland commune receives — is the gap TeachMap was designed to close.
We didn't have time to finish the UI. But every small decision — the CSV template with province-prefixed IDs, the unmet demand field surfaced explicitly, the priority score traceable to real data — was optimized for one specific user: the Sở officer who makes allocation calls that determine whether a child in Dìn Chin has an English teacher this year.
That officer is not a data scientist. They're someone who has been making these decisions with Excel and phone calls for years. Every product decision we made was in service of making their job — and through it, those children's chances — better.