category: software engineeringdate: 13 Nov 2026read: 4 min readsource: posts/why-writing-correct-software-is-hard.mdxtrending
ทำไมการเขียนซอฟต์แวร์ให้ "ถูกต้อง" ถึงยากอย่างที่คิด: Halting Problem กับข้อจำกัดของการพิสูจน์
สรุปบทความ Why Writing Correct Software Is Hard ของ pron.github.io เรื่อง halting problem ที่บอกว่าไม่มีอัลกอริทึมไหนตัดสินได้ว่าโปรแกรมจะจบหรือไม่จบ พร้อมตัวอย่างโค้ด 10 บรรทัดที่พิสูจน์ไม่ได้เพราะเท่ากับ Goldbach conjecture
มีบทความเก่าที่กลับมาติดเทรนด์อีกครั้งในเวลานี้ คือ Why Writing Correct Software Is Hard ของ Ron M"or (pron.github.io) เขียนครั้งแรกปี 2016 จาก talk ที่งาน Curry On
G(y) := IF H(y, y) = FALSE THEN TRUE ELSE loop forever
แล้วเอา G ไปรันด้วย G เอง → ขัดแย้ง เพราะถ้า G บอกว่า H(G, G) เป็น FALSE แปลว่า G จะวนไม่จบ แต่ในกรณีนั้น H บอกว่า G จบ ซึ่งขัดกันเอง
ที่สวยงามคือ Halting Theorem ให้ corollary ที่ใกล้เคียงกับการเขียนโค้ดมากกว่าที่คิด เช่น Reachability: ไม่มีโปรแกรม R ที่รับโปรแกรม M, สถานะเริ่มต้น I แล้วบอกได้ว่า M จะไปถึงสถานะ S หรือเปล่า
int foo(int x) { if (x <= 2 || (x & 1) != 0) return 0; for (int i = x; i > 0; i--) if (bar(i) && bar(x - i)) return i; crash(); // reachable?}boolean bar(int x) { for (int i = x - 1; i >= 2; i--) for (int s = x; s >= 0; s -= i) if (s == 0) return false; return true;}
แต่ประเด็นคือ foo จะ crash ก็ต่อเมื่อ Goldbach's conjecture เป็นเท็จ เพราะ bar เป็นการตรวจว่าเลขเป็น prime หรือไม่ (ถ้า ignore bug ใน implementation จริง ๆ)
Model checkers — อัตโนมัติสำหรับ FSM ที่เล็ก ปัญหาคือ state explosion ที่โปรแกรม 30 บรรทัดก็มี state space ใหญ่มาก (ภาพของ alternating-bit protocol กับ CAN bus ช่วยให้เห็นภาพ)
แล้วบทความก็ปิดท้ายด้วยคำของ Fred Brooks: "Complexity is the business we are in, and complexity is what limits us" — ถ้าคุณรู้สึกว่าความซับซ้อนเป็นแค่เรื่องของเครื่องมือที่ยังไม่ดีพอ ลองอ่านเรื่องนี้อีกที
เพราะมันเป็นบทความที่ตอบคำถามที่ทุกคนในวงการถามแต่ไม่กล้าหาคำตอบ: "ถ้าเรามี type system ดี ๆ, static analysis ดี ๆ, AI ช่วยเขียนโค้ดแล้ว เราจะได้โค้ดที่ถูกต้องไหม"