บทที่ 21 · Part 5 — Decisions & Delivery
Cheat Sheet & Checklists
สรุป 1 หน้า, review checklist ต่อ layer, แผนฝึก 12 สัปดาห์, reading list และ glossary
บทนี้ไม่มีเนื้อหาใหม่ — มันคือหน้าที่คุณเปิดค้างไว้ตอนออกแบบ และคือ checklist ที่คุณรันกับ design ของตัวเองก่อนที่คนอื่นจะรันให้
วิธีใช้บทนี้
- Cheat sheet — จำให้ได้ หรืออย่างน้อยรู้ว่าจะเปิดหาที่ไหน
- Review checklist — รันกับ design ของตัวเองก่อนส่งรีวิว
- Fintech checklist — รันเพิ่มถ้าระบบแตะเงินจริง
- แผน 12 สัปดาห์ — ถ้าจะฝึกอย่างจริงจัง
A · Cheat sheet 1 หน้า
CADENCE
Clarify · Assess scale · Define contracts · Entities/data ·
Nail architecture · Critical deep dives · Examine failures
MENTAL MATH
1 วัน ≈ 86,400 s (ใช้ 100k) 1 M/วัน ≈ 12/s
100 M/วัน ≈ 1,200/s peak = average × 5-30 (ต้องรู้ว่าเท่าไหร่)
1 M row × 500 B = 500 MB index บวก 1.5-3×
LATENCY
memory 100 ns · SSD read 100 µs · same-AZ RTT 0.5 ms
BKK↔SG ~30 ms · BKK↔US ~240 ms · mobile TTFB 50-150 ms
AVAILABILITY
99.9% = 43 นาที/เดือน 99.99% = 4.4 นาที/เดือน
dependency แบบอนุกรม *คูณกัน*: 0.999^5 = 99.5%
L = λW (Little's Law): concurrency = อัตรา × latency
RESILIENCE CHECKLIST (ทุกการเรียกข้ามเครื่อง)
timeout · retry ที่มี backoff+jitter+budget · idempotency key ·
circuit breaker · bulkhead · queue ที่มีขอบเขต · fallback ที่นิยามไว้ ·
metric + alert · trace propagate · deadline propagate
DATA RULES
เงิน = integer หน่วยย่อย + currency ห้าม float
ledger = append-only double-entry, balance derive มา
atomic write เดียว + outbox — ห้าม dual write
at-least-once + consumer ที่ idempotent = effectively once
normalize ความจริง, denormalize read model
เลือก partition key ก่อนที่จะต้องใช้
ตอน write ให้ delete cache key ห้าม update
keyset pagination ห้าม OFFSET
เมื่อไม่แน่ใจ
component น้อยลง · Postgres ตัวเดียว · async ตรงที่อนุญาต ·
fail closed เรื่องเงิน · ประกาศสมมติฐาน · เขียน ADR
B · Design review checklist
รันกับ design ของตัวเองก่อน
ทุกข้อที่ตอบไม่ได้คือคำถามที่ reviewer จะถาม — ตอบให้ได้ก่อนเข้าห้อง
Requirement และ scope
- Non-goal เขียนไว้ไหม — และ ลบ component ไหนได้ไหมโดยไม่ละเมิด requirement
- Quality attribute เป็นตัวเลข ไม่ใช่คำคุณศัพท์ ทุกข้อไหม
- ทุกกล่องใน diagram ไล่กลับไปหา requirement ได้ไหม
Data
- มี access pattern table ไหม และ ทุก index serve pattern ที่อยู่ในลิสต์ไหม
- มี dual write ที่ไหนไหม — ถ้ามี ใช้ outbox หรือ CDC แทนได้ไหม
- Consumer ทุกตัว idempotent ไหม dedupe key คืออะไร
- Partition/shard key เขียนไว้ไหม แม้จะยังไม่ใช้
- Read-your-writes — มีเส้นทาง read-after-write ไหนที่ไปที่ replica ไหม
- Pagination ใช้ keyset ไม่ใช่
OFFSETไหม - Invariant สำคัญอยู่ใน database constraint ไหม
Reliability
- Availability แบบอนุกรมของ critical path เท่าไหร่ และ dependency ตัวไหนถอดออกจาก critical path ได้
- ทุกการเรียกข้ามเครื่อง: timeout, retry policy, idempotency, circuit breaker, fallback
- เกิดอะไรที่ 10× โหลด · ที่ 0 โหลด (cache เย็น, cold start) · ระหว่าง deploy
- Queue, pool, buffer มีขอบเขตทุกตัวไหม
- Failure table ครบ พร้อมสัญญาณตรวจจับทุกแถว ไหม
- มีแถว "คน" ใน failure table ไหม
Observability และ operations
- SLO นิยามต่อ user journey พร้อม burn-rate alert ไหม
- มี alert ที่ business outcome และที่ สิ่งที่ควรเกิดแล้วไม่เกิด ไหม
- Runbook สำหรับ alert 3 อันดับแรกไหม · kill switch สำหรับเส้นทางเสี่ยงไหม
- Rollout: flag, ขั้นการ ramp, metric ที่เป็น gate, เงื่อนไข rollback, และใครอนุมัติการ release ขึ้น production
- Backup: มีอยู่จริง, แยกจาก credential ของ production, และ ทดสอบ restore แล้วพร้อมเวลาที่วัดได้
Privacy และ security
- Retention และการลบ: ระยะเวลาเท่าไหร่, ใครยืนยัน, และเป็น automated ไหม
- PII: minimize แล้ว, mask ใน log, encrypted, มี audit การเข้าถึงไหม
- มี secret ในโค้ดหรือใน config ที่อยู่ใน git ไหม
- Trust boundary อยู่ใน diagram ไหม
การตัดสินใจ
- เขียน ADR สำหรับทุกการตัดสินใจที่เป็น one-way door ไหม
- ทุกตัวเลขในเอกสารกำกับว่า verified / estimated / assumed ไหม
- รายการ การตัดสินใจที่ต้องการจากคนอื่น พร้อมชื่อและวันที่ ไหม
C · Fintech-specific checklist
รันเพิ่มถ้าระบบแตะเงินจริง
ทุกข้อที่ตอบว่า "ยัง" คือความเสี่ยงที่ต้องยกขึ้นมาคุย ไม่ใช่ข้อที่ปล่อยผ่านได้
เงินและ ledger
- เงินเป็น integer พร้อม currency ทุกที่ รวมถึงในรายงานและใน event ไหม
- Ledger append-only, double-entry, และ monitor zero-sum ต่อเนื่อง ไหม
- มี monitor debit รวม = credit รวมทั้งระบบ ต่อสกุลเงินรันอยู่ไหม
- ค่าธรรมเนียมมี fee account — เงินไม่หายไปในค่าธรรมเนียมไหน
- Snapshot ของยอดมี job คำนวณใหม่จากศูนย์แล้วเทียบ ไหม
Idempotency และสถานะ
- Idempotency key required บนทุก endpoint ที่เปลี่ยนแปลงเงิน และบังคับด้วย unique constraint ไหม
- เก็บ response ที่เคยส่งไป เพื่อเล่นซ้ำได้ไหม (ไม่ใช่เก็บแค่ "done")
- มี request fingerprint เพื่อตอบ
409เมื่อ key เดิม body ต่างไหม - มี สถานะ
UNKNOWNที่ชัดเจน ไหม และ ไม่มีอะไรออกจากสถานะนั้นด้วยการเดาหรือด้วย timer ใช่ไหม - ข้อความที่ลูกค้าเห็นเมื่อผลลัพธ์ไม่ทราบ พูดว่า "กำลังดำเนินการ" ไม่ใช่ "ล้มเหลว" ใช่ไหม
Reconciliation และ control
- Reconciliation ออกแบบเข้าไปแล้ว: source, cutoff, matching pass, การจัดหมวด break, เจ้าของ, SLA, alert
- มี alert ที่ "ไม่ได้รับไฟล์ settlement" และ "งาน reconciliation ไม่จบ" ไหม
- มี job อัตโนมัติตัวไหนเปลี่ยนยอดเงินลูกค้าได้โดยไม่มีคนอนุมัติไหม — ต้องไม่มี
- Fail-open กับ fail-closed ถูกตัดสินโดย Risk สำหรับทุก control (fraud, limit, sanctions screening) และมีเอกสารไหม
- Limit (ต่อรายการ, ต่อวัน, velocity) ถูกบังคับที่จุดที่
request พร้อมกันข้ามไม่ได้ (แถวที่ materialize conflict หรือ
SERIALIZABLE) ไหม
ข้อมูลและการเข้าถึง
- ข้อมูลบัตร: ไม่เก็บ PAN เลย และ ขอบเขต scope วาดอยู่ใน diagram ไหม
- Audit trail ครบว่าใครทำอะไรกับเงินของใคร, immutable, เก็บตามนโยบาย ไหม
- Production access, การแก้ข้อมูล และ operation ที่ destructive อยู่หลัง least privilege และการอนุมัติ 4 ตา ไหม
- ข้อมูล production ไม่ถูก copy ลง dev/test ใช่ไหม
Dependency ภายนอก
- มี 2 provider สำหรับทุก dependency ภายนอกที่ critical หรือมี เอกสารว่ายอมรับความเสี่ยงของการมีรายเดียว ไหม
- รู้ maintenance window และ cutoff time ของแต่ละ rail ไหม
- Subscribe status page ของ provider แบบ programmatic ไหม (ไม่ใช่ต้องจำไปเปิดดู)
- มี
rail_attemptsหรือเทียบเท่าที่บันทึกทุกการเรียกภายนอกเป็นข้อมูล ไหม
D · แผนฝึก 12 สัปดาห์
| สัปดาห์ | โฟกัส | ทำสิ่งนี้ |
|---|---|---|
| 1–2 | Foundations | DDIA บทที่ 1–4 · Lab บทที่ 2 · จำตัวเลข latency และ availability · ประมาณ scale ของ 3 ระบบที่คุณดูแลอยู่ |
| 3–4 | Building blocks | Lab บทที่ 6 ให้ครบ · อ่าน Amazon Builders' Library 3 เรื่อง (timeout/retry, load shedding, health check) |
| 5–6 | Reliability | Google SRE Book บทที่ 21–22 และบท SLO · Lab บทที่ 13 · ตั้ง SLO จริง 1 ตัวพร้อม burn-rate alert ที่ทำงาน |
| 7–8 | Data | DDIA บทที่ 5–9 · Lab ledger ในบทที่ 16 ให้ครบทั้ง 7 ขั้น · อ่านบทความ sharding ของ Notion และ Figma |
| 9–10 | Trade-offs | Lab บทที่ 17 · เขียน ADR 3 ฉบับสำหรับการตัดสินใจที่เกิดขึ้นแล้วในระบบของคุณ — คุณจะค้นพบว่าไม่มีใครจำได้ว่าทำไม |
| 11 | Scenarios | Lab บทที่ 18 · ออกแบบ 2 scenario แบบเย็นและจับเวลา แล้วเทียบกับบทที่ 18–19 |
| 12 | Communication | Lab และ capstone ในบทที่ 20 · นำเสนอต่อคณะจริงและเก็บคำวิจารณ์ |
นิสัยต่อเนื่องที่มีค่ามากกว่า 12 สัปดาห์นั้น
- อ่าน postmortem สาธารณะสัปดาห์ละ 1 ฉบับ แล้วเขียนว่า alert ตัวไหนที่คุณยังไม่มี
- เก็บไฟล์ส่วนตัวของตัวเลขจากระบบของคุณเอง
- อาสาไปรีวิว design ของทีมอื่น
- หลังทุก incident ที่คุณแตะ ให้เพิ่ม 1 แถวใน failure table ที่ไหนสักที่
E · Reading list
หนังสือ
- Designing Data-Intensive Applications — Kleppmann · หนังสือที่จำเป็นเล่มเดียว อ่าน 2 รอบ
- Site Reliability Engineering + The SRE Workbook — Google, ฟรี
- Patterns of Distributed Systems — Joshi/Fowler, ฟรี · กลไก: write-ahead log, leader election, quorum, lease, HLC
- Fundamentals of Software Architecture — Richards & Ford · คำศัพท์เรื่อง trade-off และการมองแบบ architecture characteristics ที่ใช้ในบทที่ 17
- Microservices Patterns — Richardson · saga, outbox, API composition, CQRS อย่างเข้มงวด
Essay ฟรี (คุ้มค่าต่อชั่วโมงสูงสุด)
- Amazon Builders' Library — เริ่มที่: timeout & retry with jitter · using load shedding to avoid overload · implementing health checks · avoiding fallback in distributed systems · caching challenges and strategies
- Marc Brooker's blog — queueing, scaling และสัญชาตญาณเรื่อง distributed system จาก principal engineer ของ AWS
- Netflix Tech Blog · Discord Engineering · Shopify Engineering · Slack Engineering · Stripe blog · Monzo Technology
- รายการ postmortem สาธารณะ — อ่านสัปดาห์ละหนึ่ง
- Awesome Scalability — index ของบทความวิศวกรรมจากโลกจริง แยกตามหัวข้อ
Paper ที่ควรอ่านให้จบ
- The Tail at Scale — Dean & Barroso
- Dynamo — ต้นกำเนิดของ consistent hashing + quorum + eventual consistency ในทางปฏิบัติ
- Scaling Memcache at Facebook
- Spanner — global strong consistency มีราคาเท่าไหร่จริงๆ
- Jepsen: consistency models — บวกการวิเคราะห์ Jepsen ของฐานข้อมูลที่คุณใช้
Primary source สำหรับ fintech และบริบทไทย
อ่านตัวเอกสารจริง อย่าอ่านแต่บทสรุป
- ธนาคารแห่งประเทศไทย — ระบบการชำระเงิน · ใช้หน้าสถิติเพื่อเอาตัวเลขปริมาณจริงมาอ้างตอน justify capacity แทนการเดา
- NITMX — interbank rail ของไทย · scheme rule และ message specification เป็นตัวกำหนด design ของ integration ของคุณ
- EMVCo QR code specifications
- ISO 20022 — มาตรฐานข้อความของ payment
- PCI Security Standards document library — สำหรับการตัดสินขอบเขตข้อมูลบัตร · อ่านตัวมาตรฐานจริง ไม่ใช่บทสรุป
- PDPC ประเทศไทย — หน่วยงานกำกับ PDPA · การตีความเป็นของฝ่าย legal/compliance ของคุณ ไม่ใช่ของทีมสถาปัตยกรรม
- Accounting for Developers · TigerBeetle docs · Idempotency keys in Postgres
- OWASP ASVS และ OWASP API Security Top 10 — checklist ด้านความปลอดภัยของชั้น API
F · Glossary
| คำ | ความหมายแบบภาษาคน |
|---|---|
| Backpressure | บอก producer ให้ช้าลง แทนที่จะเข้าคิวเงียบๆ ไปเรื่อยๆ |
| Blast radius | ของพังมากแค่ไหนเมื่อของชิ้นหนึ่งพัง |
| Bulkhead | แยก resource pool เพื่อให้ความล้มเหลวจุดเดียวกินทุกอย่างไม่ได้ |
| CDC | Change data capture — เปลี่ยนการเปลี่ยนแปลงในฐานข้อมูลให้เป็น stream ของ event |
| Cell / pod | stack ที่ครบและแยกออกมา serve ผู้ใช้ชุดหนึ่ง เพื่อจำกัด blast radius |
| Error budget | ปริมาณความล้มเหลวที่ SLO อนุญาต ถือเป็นทรัพยากรที่คุณใช้ได้ |
| Fan-out | event หนึ่งทำให้เกิด write หรือการเรียกจำนวนมาก |
| Fencing token | เลขที่ monotonic ซึ่งพิสูจน์ว่าคุณยังถือ lock อยู่ เพื่อให้ผู้ถือที่ล้าสมัยถูกปฏิเสธ |
| Goodput | งานที่มีประโยชน์ต่อวินาที ต่างจาก throughput ที่นับงานที่เสียเปล่าด้วย |
| Gray failure | พังแล้วแต่ยังผ่าน health check — ชนิดที่อันตราย |
| Hot key / hot shard | key หรือ partition เดียวที่ได้รับ traffic ไม่ได้สัดส่วน |
| Idempotent | ทำ 2 ครั้งได้ผลเหมือนทำครั้งเดียว |
| Keyset pagination | ไล่หน้าด้วย "หลัง key นี้" แทนที่จะใช้ OFFSET |
| Linearizable | ทำตัวเหมือนมีข้อมูลสำเนาเดียวและ operation เกิดขึ้นตามลำดับเวลาจริง |
| Metastable failure | ยังพังอยู่หลัง trigger หายไปแล้ว เพราะ retry และ cache ที่เย็นเลี้ยงมันไว้ |
| Minor units | หน่วยเงินที่เล็กที่สุด (สตางค์) — วิธีที่ต้องเก็บเงิน |
| Outbox | ตารางที่เขียนใน transaction เดียวกับการเปลี่ยนแปลงทางธุรกิจ แล้วถูก relay เป็น event |
| PACELC | Partition → A หรือ C; Else → Latency หรือ Consistency · ส่วนขยายเชิงปฏิบัติของ CAP |
| Read-your-writes | ผู้ใช้เห็นการเปลี่ยนแปลงของตัวเองเสมอ แม้คนอื่นจะช้า |
| RPO / RTO | เสียข้อมูลได้เท่าไหร่ / ล่มได้นานเท่าไหร่ |
| Saga | business transaction หลายขั้นข้าม service พร้อม compensating action |
| Single-flight | รวม request ที่เหมือนกันซึ่งเกิดพร้อมกันให้เป็นหนึ่ง แล้วแบ่งผลลัพธ์กัน |
| SLI / SLO / SLA | ตัววัด / เป้าภายในของคุณ / คำสัญญาตามสัญญา |
| Strangler fig | แทนที่ระบบทีละส่วนขณะที่ทั้ง 2รันอยู่ แทนการเขียนใหม่แบบ big bang |
| Tail latency | p99 ขึ้นไป — ประสบการณ์ของผู้ใช้ที่โชคร้ายที่สุด และเป็นตัวเลขที่สำคัญ |
| Write skew | transaction 2 ตัวต่างเช็คกฎ ต่างผ่าน แต่รวมกันทำลายกฎนั้น |
ข้อจำกัดของคอร์สนี้ — อ่านก่อนนำไปใช้
- ตัวเลขที่กำกับว่า illustrative เป็นตัวเลขเพื่อสอน ไม่ใช่ผลวัด — ยืนยันกับ telemetry ของคุณเองก่อนใช้ในการตัดสินใจ
- คำกล่าวเรื่อง compliance, retention และระดับการยอมรับความเสี่ยงในคอร์สนี้ เป็น placeholder สำหรับนโยบายที่องค์กรของคุณยืนยันเอง — การตัดสินเหล่านั้นเป็นของเจ้าของที่รับผิดชอบด้าน legal, compliance และ risk และควรบันทึกไว้ใน design document ของคุณ พร้อมแหล่งที่มาและวันที่
- โค้ดตัวอย่างเขียนเพื่อสอนแนวคิด จึงตัดรายละเอียดหลายอย่างออก ไม่ควรคัดลอกไป production โดยไม่ review
[!NOTE] จบคอร์ส ถ้าคุณทำได้ 5 อย่างนี้ คุณกำลังทำงานนี้อยู่จริง: ทุก component ไล่กลับไปหา requirement ได้ · ทุกตัวเลขกำกับว่า verified / estimated / assumed · failure table มีสัญญาณตรวจจับทุกแถว · แผน migration ย้อนกลับได้ทุกขั้น · และ คุณขอการตัดสินใจที่ถูกต้อง จากคนที่ถูกต้อง