PlusMagi's Blog By Pitt Phunsanit Histories,Java,Programming,Security ความผิดพลาดพันล้านดอลลาร์

ความผิดพลาดพันล้านดอลลาร์

Sir Tony Hoare 6 มีนาคม 2569 , เคมบริดจ์, สหราชอาณาจักร จะเคยเรียกสิ่งที่เขาสร้างขึ้นว่าเป็น “ความผิดพลาดพันล้านดอลลาร์” (The Billion Dollar Mistake) แต่ปฏิเสธไม่ได้เลยว่าแนวคิดนี้ได้วางรากฐานและสร้างความท้าทายให้โปรแกรมเมอร์ทั่วโลกมานานกว่าครึ่งศตวรรษ


“ความผิดพลาดพันล้านดอลลาร์”

คำว่า “The Billion Dollar Mistake” ไม่ใช่คำกล่าวเกินจริง แต่มันคือการยอมรับผิดอย่างจริงใจของ Sir Tony Hoare (ผู้คิดค้นภาษา ALGOL W) ในงานคอนเฟอร์เรนซ์เมื่อปี 2009 ครับ

เขาสารภาพว่าการใส่ Null Reference เข้าไปในภาษาโปรแกรมในปี 1965 คือความผิดพลาดที่สร้างความเสียหายมหาศาลให้กับอุตสาหกรรมซอฟต์แวร์ตลอดหลายทศวรรษที่ผ่านมา


ทำไมมันถึงมูลค่าสูงขนาดนั้น ?

ความเสียหาย “พันล้านดอลลาร์” ไม่ได้มาจากการถูกปรับเงิน แต่มันมาจาก “ต้นทุนแฝง” ที่สะสมมานานกว่า 50 ปี

  • โปรแกรมพัง : บั๊กยอดฮิตอย่าง NullPointerException หรือ Segmentation Fault เกิดจากการที่โปรแกรมพยายาม “เรียกใช้” ข้อมูลในจุดที่เป็น Null
  • เสียเวลาแก้บั๊ก : โปรแกรมเมอร์ทั่วโลกใช้เวลาหลายล้านชั่วโมงในการไล่หาว่า “ทำไมค่านี้ถึงกลายเป็น Null?” แทนที่จะเอาเวลาไปฟีเจอร์ใหม่ ๆ
  • ความปลอดภัย : แฮกเกอร์มักใช้ช่องโหว่จากการจัดการ Null ที่ไม่รัดกุมในการเจาะเข้าระบบหรือทำลาย Memory

เปรียบเทียบกับ “สวิตช์ไฟที่หายไป”

ถ้าโปรแกรมมิ่งคือการสร้างบ้าน

  • 0: คือสวิตช์ไฟที่ปิดอยู่
  • Null: คือเรา “ลืมติดสวิตช์” แต่แปลนบ้านดันเขียนบอกให้คนไปกดสวิตช์ตรงนั้น!

พอมีคนพยายามจะไปกดสวิตช์ที่ไม่มีอยู่จริง ระบบก็เกิดอาการ “เอ๋อ” และพังโครมลงมาทันที


มรดกของ Null กับความรับผิดชอบที่เหลืออยู่

เมื่อผู้สร้างไม่อยู่แล้ว สิ่งที่ทิ้งไว้คือบทเรียนสำคัญในการออกแบบระบบ

  • ความว่างเปล่าที่มีราคา: Null ทำให้เกิด NullPointerException ซึ่งเป็นสาเหตุหลักของระบบล่มมหาศาล แต่มันก็สอนให้เรารู้จักการเขียน Code แบบรัดกุม
  • การจัดการกับ Null หากเราไม่เตรียม “ค่าเริ่มต้น” ไว้ให้ดี เมื่อระบบเจอ Null มันอาจจะพังโครมลงมาได้
  • วิวัฒนาการ: ภาษาโปรแกรมยุคใหม่พยายาม “กำจัด” หรือ “ควบคุม” Null ให้ดีขึ้น เพื่อปิดตำนานความผิดพลาดพันล้านดอลลาร์นี้

ยุคสมัยแห่งการเยียวยา

ปัจจุบัน ภาษาโปรแกรมรุ่นใหม่ ๆ พยายามแก้ความผิดพลาดนี้ด้วยวิธีที่เข้มงวดขึ้น

  1. บังคับเช็ค: ถ้าตัวแปรมีโอกาสเป็น Null คอมพิวเตอร์จะด่าเราตั้งแต่ตอนเขียน Code เลยว่า “เฮ้ย! เช็คก่อนหรือยังว่ามันมีค่าไหม ?”
  2. ห้ามเป็น Null: กำหนดไปเลยว่าตัวแปรนี้ “ห้ามว่าง”

อ่านเพิ่มเติม