ทำไมต้องทดสอบ ถ้าโปรแกรมเมอร์เก่งอยู่แล้ว?
คำถามนี้ฟังดูกวน ๆ แต่เป็นคำถามที่หลายองค์กรถามจริง ๆ — และคำตอบของมันก็เป็นเหตุผลว่าทำไม testing ถึงไม่ใช่แค่ "ขั้นตอนก่อนปล่อย" แต่เป็นส่วนหนึ่งของการส่งมอบคุณค่าให้ธุรกิจ
จบบทนี้แล้วคุณจะ...
- อธิบาย "cost of defects" และทำไมยิ่งเจอช้ายิ่งแพง
- เปรียบเทียบผลของการเจอบั๊กใน dev, QA, production ได้
- อธิบายว่า testing ไม่ใช่การ "พิสูจน์ว่าไม่มีบั๊ก" แต่คือการลดความเสี่ยง
- เข้าใจว่าคุณภาพเป็นความรับผิดชอบของทั้งทีม ไม่ใช่แค่ QA
บั๊กตัวเดียวที่ราคาแพงกว่าทั้งโปรเจกต์
ปี 1999 NASA ส่งยานสำรวจดาวอังคารชื่อ Mars Climate Orbiter มูลค่า 125 ล้านดอลลาร์ ไปถึงปลายทางหลังเดินทาง 9 เดือน พอถึงดาวอังคาร ยานก็หายไปเฉย ๆ สาเหตุคือ ทีมหนึ่งคำนวณแรงขับเป็น pound-seconds ในขณะที่อีกทีมใช้ค่านั้นในหน่วย newton-seconds — หน่วยไม่ตรงกัน ยานคำนวณวงโคจรผิด แล้วพุ่งเข้าชั้นบรรยากาศจนพัง
นี่คือบั๊กที่ "code ทุกบรรทัดถูก" ในมุมมองของแต่ละทีม แต่พอนำมาเชื่อมกันกลับล้มเหลว ถ้ามีใครสักคนเทสต์ integration ระหว่างสองระบบก่อนปล่อย — แค่นั้นก็อาจช่วยประหยัดเงิน 125 ล้านดอลลาร์ได้
เราไม่ได้กำลังจะทำยานอวกาศในหลักสูตรนี้ แต่หลักการเดียวกันใช้กับทุกระบบ — defect ที่หลุดไปถึงผู้ใช้จะมี "ราคา" เสมอ และราคานั้นเพิ่มขึ้นตามเวลาที่ผ่านไป
Cost of defects: ยิ่งเจอช้า ยิ่งแพงแบบทวีคูณ
งานวิจัยตั้งแต่ยุค Barry Boehm ในช่วง 1980s (และมีการยืนยันซ้ำในยุคใหม่) บอกเราเหมือนกันว่า ต้นทุนในการแก้ไข defect จะเพิ่มขึ้น "แบบทวีคูณ" ตาม phase ที่เจอ ไม่ใช่เชิงเส้น ตัวเลขต่างกันในแต่ละรายงาน แต่รูปร่างของกราฟเหมือนกันทุกครั้ง
| Phase ที่เจอบั๊ก | ต้นทุนสัมพัทธ์ | เกิดอะไรขึ้น |
|---|---|---|
| Requirement | 1x | แก้คำในเอกสารก่อนทีมเริ่มทำ — แทบไม่มีต้นทุน |
| Design | ~5x | ต้องปรับ architecture, data model, หรือ flow ก่อนลงมือ code |
| Development | ~10x | Dev แก้ code, เพิ่ม test, ทำ code review ใหม่ |
| QA / Staging | ~20x | หลายทีมเกี่ยวข้อง — dev, QA, PM และต้อง regression test ใหม่ |
| Production | 50–100x+ | แก้ + deploy hotfix + incident response + ชดเชยลูกค้า + กู้ชื่อเสียง |
ตัวเลขไม่ใช่ประเด็น — ประเด็นคือรูปร่างของกราฟ บั๊กที่เจอตอน requirement อาจใช้แค่แก้หนึ่งประโยคในเอกสาร บั๊กเดียวกันที่เจอตอน production อาจต้องประชุมฉุกเฉิน 6 คน เขียน hotfix ภายในคืนเดียว และยังต้องเจอกับลูกค้าที่โกรธในเช้าวันถัดมา
💡 สิ่งที่คุณควรเอาไปใช้ ถ้าคุณสามารถ "ย้ายการเจอบั๊ก" จาก production มาอยู่ที่ QA หรือจาก QA มาอยู่ที่ dev หรือจาก dev มาอยู่ที่ requirement — นั่นคืองานที่มี ROI สูงที่สุดที่ QA ทำได้ นี่เรียกว่า shift left testing และจะกลับมาตลอดหลักสูตร
Testing ไม่ใช่การพิสูจน์ว่า "ไม่มีบั๊ก"
นี่คือหนึ่งในสิ่งที่คนนอกสาย QA มักเข้าใจผิด — พวกเขาคิดว่าถ้าทีม QA ทำหน้าที่ดี ระบบจะต้อง "ไม่มีบั๊กเลย" ซึ่งเป็นไปไม่ได้ในทางปฏิบัติ และยังเป็นเป้าหมายที่ผิดตั้งแต่ต้น
| ❌ เป้าหมายแบบผิด | ✓ เป้าหมายแบบถูก |
|---|---|
| "ทดสอบจนมั่นใจว่าไม่มีบั๊กเหลือเลย" | "ลดความเสี่ยงให้อยู่ในระดับที่ธุรกิจยอมรับได้" |
| พิสูจน์ไม่ได้ในทางตรรกะ | เน้นทดสอบส่วนที่เสี่ยงสูงก่อน |
| ต้องทดสอบ input ทุกแบบที่เป็นไปได้ — เป็นอนันต์ | ยอมรับว่าบางบั๊กจะหลุดไป production — แต่ต้องไม่ใช่บั๊กใหญ่ |
| ทำให้ทีมรู้สึกผิดเมื่อมีบั๊กหลุด ทั้งที่เป็นเรื่องธรรมชาติ | วัดผลได้จริง เช่น ไม่มี critical bug ใน flow การจ่ายเงิน |
Edsger Dijkstra Testing shows the presence, not the absence of bugs.
การทดสอบบอกได้แค่ว่า "มีบั๊กอยู่" เมื่อเราเจอมัน แต่ไม่สามารถบอกได้ว่า "ไม่มีบั๊กเหลือแล้ว" ไม่ว่าจะทดสอบกี่รอบก็ตาม เมื่อเข้าใจข้อนี้แล้ว งานของ QA จะเปลี่ยนจาก "การไล่จับผิด" ไปเป็น "การบริหารความเสี่ยง" — คุณเลือกที่จะเทสต์อะไร ทำไม และจะหยุดเทสต์เมื่อความเสี่ยงที่เหลือต่ำพอจะรับได้
เรื่องเล่า: ทีมที่เทสต์ทุกอย่าง แต่ไม่เคยเทสต์ถูกจุด ทีมหนึ่งภูมิใจมากว่าเขียน test case ครบ 2,000 เคส ครอบคลุมทุกหน้าจอ แต่เมื่อระบบขึ้น production กลับพบบั๊กใหญ่ในฟังก์ชันคำนวณดอกเบี้ย ที่ทีมไม่เคยเทสต์เคสของลูกค้าที่มียอดค้างเกิน 180 วัน — เพราะเคสแบบนั้นในเอกสาร requirement เขียนไว้สั้น ๆ แค่บรรทัดเดียว ทีมจึงไม่ได้ให้น้ำหนัก ทั้งที่เป็นลูกค้ากลุ่มที่มีความเสี่ยงสูงสุดของธุรกิจ นี่คือตัวอย่างที่ "เทสต์เยอะ ≠ เทสต์ดี" — การเข้าใจความเสี่ยงของธุรกิจคือส่วนที่สำคัญที่สุดของงาน QA
Quality ownership: ไม่ใช่แค่งาน QA
ถ้าในทีมมีใครพูดว่า "ฉันเขียน code ของฉันเสร็จแล้ว ที่เหลือปล่อยให้ QA จัดการ" นั่นคือสัญญาณว่าทีมกำลังมีปัญหาเรื่อง quality ownership คุณภาพไม่ใช่สิ่งที่ "ใส่เข้าไปตอนปลายทาง" แต่เป็นสิ่งที่ต้องใส่เข้าไปทุกขั้นตอน
| บทบาท | รับผิดชอบคุณภาพของ | ตัวอย่างการทำ |
|---|---|---|
| PM / BA | Requirement | เขียน requirement ให้ชัด ทดสอบได้ · ระบุ edge case ที่ธุรกิจแคร์ · จัดลำดับตาม business risk |
| Developer | Code | เขียน unit test ก่อน commit · ทำ code review อย่างจริงจัง · ทดสอบในเครื่องตัวเองก่อนส่ง QA |
| QA / Tester | กระบวนการทดสอบ | ออกแบบ test strategy ตามความเสี่ยง · หา defect ก่อนถึงมือผู้ใช้ · เป็น "เสียงของผู้ใช้" ในทีม |
| DevOps / SRE | Production | monitoring และ alerting ที่เหมาะสม · rollback และ incident response · ทำให้ deploy ปลอดภัย |
บทบาทของ QA ในทีมที่เก่งจริง ๆ ไม่ใช่ "คนรับผิดชอบคุณภาพทั้งหมด" แต่คือ "คนที่ทำให้ทั้งทีมคิดเรื่องคุณภาพเป็น" — ชวนคุยเรื่อง edge case ในประชุม refinement, ถามคำถามที่ยากตอน design review และช่วย dev คิดว่าจะทดสอบ code ของตัวเองอย่างไร
ตัวอย่างของ testing ที่คุ้มค่าและที่ไม่คุ้ม
ก่อนจะถึงแบบฝึก ลองดูตัวอย่างที่ติดป้ายมาให้แล้ว ว่ากิจกรรม testing แบบไหนที่ช่วยลดความเสี่ยงจริง และแบบไหนที่แค่เพิ่มงานโดยไม่ช่วยอะไร
คุ้มค่า — "ก่อน sprint เริ่ม QA นั่งกับ BA 30 นาที เพื่อถาม edge case ของ requirement ใหม่" นี่คือ shift left ระดับสูงสุด — เจอความคลุมเครือที่ phase requirement ซึ่งแก้แค่ "1x" แทนที่จะเจอตอน production ("100x")
ไม่คุ้ม — "QA run regression suite 2,000 เคสทุกครั้งก่อน deploy แม้ว่า sprint นี้จะแตะแค่ 2 ไฟล์" การทดสอบเยอะไม่ใช่คุ้มค่าเสมอไป — ถ้าไม่มีการเลือกเคสตามความเสี่ยง ทีมจะเสียเวลามหาศาลกับการรันเทสต์ที่ไม่เกี่ยวข้อง
คุ้มค่า — "Dev เขียน unit test ครอบคลุม flow การจ่ายเงินทุก branch ก่อน merge" ทดสอบส่วนที่มี business risk สูง (payment) ในช่วงที่แก้ถูกที่สุด (dev phase) — คุ้มเกือบทุกโปรเจกต์
ไม่คุ้ม — "QA ทดสอบด้วยการ click ไปมาแบบ random เพื่อ 'หาบั๊กตามใจฉัน'" ไม่ใช่ว่า exploratory testing ไม่ดี แต่ถ้าไม่มี hypothesis หรือ risk model ประกอบ ก็เป็นแค่การเสียเวลาโดยไม่รู้ว่าทดสอบอะไรไปแล้วบ้าง และยังเหลืออะไรไม่เทสต์
แบบฝึก: ลองคิดเหมือน QA มืออาชีพ
เลือกระบบหนึ่งที่คุณคุ้นเคย (เช่น e-commerce, mobile banking, ระบบจองร้านอาหาร) แล้วตอบคำถามต่อไปนี้ในใจก่อน จากนั้นค่อยเปิดดูคำตอบแนะนำเพื่อเปรียบเทียบ
ถ้าระบบ login ของแอปนั้นใช้ไม่ได้เป็นเวลา 1 ชั่วโมง จะกระทบอะไรบ้าง และใครบ้างที่ได้รับผลกระทบ?
ดูคำตอบแนะนำ
ผลกระทบมีหลายชั้น — (1) ผู้ใช้ทุกคนที่พยายามเข้าระบบจะทำ transaction ไม่ได้ (2) call center จะได้รับสายร้องเรียนจำนวนมาก (3) ธุรกิจเสียรายได้ในช่วงนั้น (4) ความเชื่อมั่นของผู้ใช้ลดลง โดยเฉพาะถ้าเกิดบ่อย — นี่คือเหตุผลที่ flow login มักถูกทดสอบเข้มข้นที่สุดและมี monitoring ตลอดเวลา เป็นตัวอย่างของจุดที่ "testing คุ้มค่ามาก"
ถ้าฟังก์ชัน search ยังใช้งานได้ แต่ช้าลงจาก 0.5 วินาทีเป็น 4 วินาที จะกระทบอะไรบ้าง? ควรถือว่าเป็น "บั๊ก" หรือไม่?
ดูคำตอบแนะนำ
ในทางเทคนิคอาจยังไม่ถือว่าเป็น functional bug (ระบบยัง return ผลลัพธ์ได้) แต่เป็น non-functional defect ที่กระทบ business โดยตรง — งานวิจัยหลายชิ้นบอกว่าการโหลดช้าขึ้น 1–3 วินาทีทำให้ conversion rate ลดลง 10–30% นี่เป็นเคสที่ทีมมักจะละเลยเพราะ "ไม่มี error" แต่ในมุม cost of defects มันอาจแพงกว่าบั๊กที่มองเห็นได้ชัด
ถ้า email notification ส่งช้าไป 3 ชั่วโมง (แต่ยังส่งถึงทุกคน) ในระบบไหนบ้างที่จะเป็นปัญหาใหญ่ และในระบบไหนที่แทบไม่มีผล?
ดูคำตอบแนะนำ
ปัญหาใหญ่: ระบบ 2FA (รหัส OTP หมดอายุ), ระบบจองตั๋วที่ต้องยืนยันเร็ว, ระบบแจ้งเตือน fraud alert ของธนาคาร — ทั้งหมดเป็นเคสที่ "เวลา" เป็นส่วนหนึ่งของฟังก์ชันจริง ๆ
แทบไม่มีผล: newsletter รายสัปดาห์, email สรุปยอดสิ้นเดือน, แจ้งเตือน promotion — ผู้ใช้ไม่ได้รอในเวลานั้น ช้าหน่อยก็ไม่เป็นไร
บทเรียน: ความ "เสี่ยง" ของบั๊กเดียวกันขึ้นอยู่กับบริบทของระบบทั้งหมด — กลับไปที่ lesson 01 คำว่า "fitness for purpose"
ทีมของคุณเจอ critical bug ใน production 1 ชั่วโมงก่อนเปิดตัว sale ใหญ่ QA เป็นคนเจอ แต่ dev บอกว่า "นี่มันงานของ QA ที่ไม่เทสต์ดี" ในมุม quality ownership ใครควรรับผิดชอบ?
ดูคำตอบแนะนำ
คำตอบคือ ทั้งทีม — ไม่ใช่แค่ QA และไม่ใช่แค่ dev การโทษกันเองไม่ช่วยแก้ปัญหาและเป็นสัญญาณของทีมที่ quality ownership ไม่ดี
สิ่งที่ทีมที่เก่งจะทำคือ: (1) แก้บั๊กก่อน (2) หลังเหตุการณ์ทำ post-mortem แบบไม่โทษใคร ถามว่า "กระบวนการของเราพลาดตรงไหน" ไม่ใช่ "ใครผิด" (3) ปรับ process ให้ครั้งหน้าเจอบั๊กนี้เร็วขึ้น เช่น เพิ่ม automated test, ปรับ requirement review, หรือทำ canary deployment
คุณภาพคือสิ่งที่สร้างด้วย ระบบ ไม่ใช่ด้วยการตำหนิคน
สิ่งที่ต้องเอาติดตัวไปจากบทนี้
- Cost of defects เพิ่มแบบทวีคูณ ตาม phase ที่เจอ — ยิ่ง shift left ยิ่งประหยัด
- เป้าหมายของ testing ไม่ใช่ "ไม่มีบั๊ก" แต่คือการ ลดความเสี่ยงให้อยู่ในระดับที่ยอมรับได้
- Dijkstra: Testing shows the presence, not the absence, of bugs. — การทดสอบเป็นเครื่องมือบริหารความเสี่ยง ไม่ใช่เครื่องพิสูจน์
- Quality ownership เป็นของทั้งทีม — QA ที่เก่งคือคนที่ทำให้ทั้งทีม คิดเรื่องคุณภาพเป็น ไม่ใช่คนที่รับผิดชอบคุณภาพคนเดียว