Skip to content

15.9 Debt heat-map

บทนี้จัด debt ทั้งหมดในมุม severity × effort เพื่อช่วยตัดสินใจจัดลำดับ

วิธีอ่าน heat-map

แกน X = effort ที่ต้องใช้ (จากน้อยไปมาก) แกน Y = severity (จากต่ำไปสูง)

Quadrantความหมายกลยุทธ์
มุมบนซ้ายseverity สูง, effort ต่ำทำทันที (quick win ที่สำคัญ)
มุมบนขวาseverity สูง, effort สูงวางแผนระยะยาว (strategic)
มุมล่างซ้ายseverity ต่ำ, effort ต่ำทำตอนมีเวลา (quick win)
มุมล่างขวาseverity ต่ำ, effort สูงเลื่อนไปทีหลัง (defer)

Heat-map (ASCII)

Severity


  │  ┌─ SEC-4 JWT default          ┌─ LEG-1 Node 12 EOL
  │  │  SEC-2 playground prod      │  LEG-2 esm shim
  │  │  SEC-5 centralize CORS *    │  LEG-3 Apollo v2 EOL
  │  │  PERF-7 phpMyAdmin          │  LEG-4 React 16 + Apollo v2
  │  │  SEC-11 GCP SA key          │  PERF-1 execSync blocking
  │  │  CORR-6 syncModelToTable    │  CORR-1 cross-schema write
  │  │  SEC-1 qpdf injection       │  CORR-4 RBAC bug
  │  │                             │  LEG-19 in-process cron
C │  │                             │
r │  │                             │
i │  │                             ▼
t │  │                          Strategic
i │  │
c │  │
a │  │                       ┌─ PERF-6 god controller 3,179 LOC
l │  │                       │  LEG-21 queries monolith
  │  │                       │  LEG-22 route duplication
  │  │                       │  LEG-17 TS safety off
  │  │                       │  LEG-10 html-pdf + node-qpdf
  │  │                       │  LEG-5 AntD split
  │  │                       │  LEG-6 react-scripts
  │  │                       │  LEG-7 Webpack 4
  │  ▼                       │
 │                         │
 │  Stop-the-bleed           │
 │  (do now)                 │
 │                           │
 │  ┌─ SEC-10 rate limit     │
 │  │  SEC-9 typosquat pkg   │
 │  │  SEC-8 PII in URL      │
 │  │  SEC-7 axois typo      │
 │  │  SEC-6 trustServerCert │
 │  │  PERF-2 no-cache       │  ┌─ LEG-26 duplicate UI libs
 │  │  PERF-3 session LIKE   │  │  LEG-23 resolver 3,716 LOC
 │  │  PERF-4 N+1 RBAC       │  │  LEG-25 typo ENUMs
 │  │  PERF-5 sync approval  │  │  LEG-30 i18n in error
 │  │  CORR-2 txn swallow    │  │  LEG-20 axios 16+ instances
 │  │  CORR-3 responError    │  │  LEG-14 _bk files 131
 │  │  CORR-5 log query      │  ▼
 │  │  CORR-7 column dupe    │
 │  │  CORR-8 PDF race        │       Defer / batch
 │  │  CORR-9 httpRequest     │
 │  │  LEG-15 no lockfile     │
 │  │  LEG-16 dual lockfile   │
 │  │  LEG-18 no engines      │
 │  │  LEG-13 s, stream       │
 │  │  LEG-12 redis v3        │
 │  │  LEG-11 driver dupe     │
 │  │  LEG-9 jwt v8           │
 │  │  LEG-8 ldapjs           │
 │  │  LEG-27 xlsx CVE        │
 │  │  LEG-28 sha512crypt     │
 │  │  LEG-29 firebase        │
 │  │  PERF-8 network host    │
 │  │                         │
 │  └─ Quick wins             │
 │                             │
 │  Med severity              │
 │  ▼                         │
 └─────────────────────────────────────────────────────► Effort
   1 day        1 week        1 month       3+ months

หมายเหตุ: ตำแหน่งเป็นการประมาณ เพื่อช่วยตัดสินใจ ไม่ใช่การวัดที่แม่นยำ

ตาราง severity × effort

ตารางเดียวกันในรูปแบบตาราง เรียงตาม priority:

Priority 1 — ทำทันที (severity สูง, effort ต่ำ)

รายการเหล่านี้เป็น quick win ที่ลดความเสี่ยงวิกฤตได้ภายใน 1-2 สัปดาห์

IDรายการEffort
SEC-4JWT_SECRET default 'secret'30 นาที
SEC-2playground + introspection prod30 นาที
SEC-5centralize CORS *30 นาที
CORR-6syncModelToTable in prod1 ชั่วโมง
PERF-7phpMyAdmin เปิดสาธารณะ1 ชั่วโมง
LEG-13s, stream, findit ไม่ใช้30 นาที
LEG-15centralize ไม่มี lockfile30 นาที
LEG-16vtrc-web สอง lockfile30 นาที
LEG-18ไม่มี engines30 นาที
CORR-7column dupe30 นาที
CORR-9httpRequest.js30 นาที
CORR-5centralize log query30 นาที
SEC-7axois typo30 นาที
SEC-1qpdf injection1 วัน
SEC-3device keys in repo2-3 วัน
SEC-11GCP SA key1-2 วัน
LEG-9jwt v8 → v91 วัน
SEC-9typosquat packages1 วัน
LEG-27xlsx CVE1 วัน

Priority 2 — ทำใน Wave 1 (severity สูง, effort ปานกลาง)

IDรายการEffort
SEC-10rate limit2-3 วัน
SEC-8PII in URL2-3 วัน
SEC-6trustServerCert1-2 วัน
PERF-2no-cache policy1-2 วัน
PERF-3session LIKE JSON1-2 วัน
PERF-4N+1 RBAC2-3 วัน
PERF-5sync approval2-3 วัน
CORR-2txn swallow1-2 วัน
CORR-4RBAC inconsistency1-2 สัปดาห์
CORR-3responError pattern1 สัปดาห์
LEG-8ldapjs → ldapts2-3 วัน
LEG-12redis v3 → v42-3 วัน
LEG-28sha512crypt1 วัน
LEG-29firebase + googleapis2-3 วัน
PERF-8network_mode host1 วัน

Priority 3 — ทำใน Wave 2 (strategic — severity สูง, effort สูง)

รายการเหล่านี้ต้องวางแผนเป็นโครงการ

IDรายการEffort
LEG-1Node 12 → 20รวมกับ LEG-2
LEG-2esm shim → native ESM2-3 สัปดาห์
LEG-3Apollo Server v2 → v41-2 สัปดาห์
LEG-4React 16 → 18 + Apollo v32-4 สัปดาห์ต่อ frontend
LEG-19in-process cron → distributed1-2 สัปดาห์
PERF-1execSync → worker queue3-5 วัน
CORR-1cross-schema writearchitectural
PERF-6god controller split1-2 สัปดาห์
LEG-10html-pdf → Playwright1 สัปดาห์

Priority 4 — Defer (severity ต่ำ, effort สูง)

IDรายการEffort
LEG-5AntD split1 สัปดาห์
LEG-6react-scripts → Vite1-2 สัปดาห์
LEG-7Webpack 4 → 51 สัปดาห์
LEG-17TS strict mode1-2 สัปดาห์
LEG-21queries monolith1-2 สัปดาห์
LEG-22route duplication1 สัปดาห์
LEG-23resolver 3,716 LOC1 สัปดาห์
LEG-20axios 16+1 สัปดาห์

Priority 5 — Quick wins (severity ต่ำ, effort ต่ำ)

IDรายการEffort
LEG-14_bk files 1311-2 วัน
LEG-25typo ENUMs(map ตอน rewrite)
LEG-26duplicate UI libs audit1 สัปดาห์
LEG-30i18n in error2-3 วัน
LEG-11driver dupe1 วัน
CORR-8PDF race1 วัน

การกระจายตาม repo

ตารางนี้แสดงว่า debt แต่ละรายการอยู่ใน repo ใด — ช่วยวางแผนการกระจายงานในทีม:

RepoCriticalHighMedรวม
vtrc-api813324
cu-central-api27211
centralize-api2215
vtrc-web0448
vtrc-rc-backoffice0358
ข้าม repo / global1203

สังเกต: vtrc-api มี debt มากที่สุด เพราะเป็น service หลักที่ใหญ่ที่สุด ความพยายามในการลด debt ควรกระจายไปยังทุก repo ไม่ใช่ vtrc-api อย่างเดียว

บทสรุปของ heat-map

  1. มี Critical debt ที่ effort ต่ำอยู่ 8-10 รายการ — ทำ Wave 0 ให้จบภายใน 1-2 สัปดาห์เพื่อลดความเสี่ยงทันที
  2. Critical ที่ effort สูง (Node 12, RBAC, cross-schema) ต้องวางแผนเป็น Wave 2
  3. vtrc-api มี debt มากที่สุด — ควรมีนักพัฒนา 1-2 คนที่ focus การลด debt ใน repo นี้
  4. frontend (vtrc-web, backoffice) มี debt ระดับ Med ที่กระจาย — ทำได้ช้าลงโดยไม่กระทบวิกฤต

บทถัดไปจะนำ heat-map ไปจัดลำดับเป็น Wave 0/1/2/3 ที่เป็น action plan