☕ 5-Min Tech Story #01

มหากาพย์ NullPointerException: ความผิดพลาดพันล้านดอลลาร์ และวิธีที่ Kotlin มาเช็ดขี้เช็ดเยี่ยวให้เรา

⏱️ ใช้เวลาอ่านประมาณ: 4 นาที 30 วินาที

คืนวันศุกร์ เวลา 21:58 น. คุณกำลังจะพับจอโน้ตบุ๊กเพื่อไปชนแก้วกับเพื่อน ทันใดนั้นเสียง Alert บนมือถือก็ดังรัวเป็นจังหวะสามช่า... Production พังเรียบร้อย

พอเปิด Log ดูก็พบกับบรรทัดที่คุ้นเคยจนแทบร้องไห้:

java.lang.NullPointerException
  at com.company.payment.Service.process(Service.java:42)

💸 ความผิดพลาดระดับพันล้านดอลลาร์ (Billion-Dollar Mistake)

รู้ไหมครับว่าคำว่า null ไม่ได้เกิดมาเพราะคอมพิวเตอร์ต้องการมัน แต่เกิดจาก Tony Hoare นักวิทยาศาสตร์คอมพิวเตอร์ระดับตำนาน (ผู้คิดค้น Quicksort) ย้อนกลับไปในปี 1965 ตอนนั้นเขากำลังออกแบบระบบ Type สำหรับภาษา ALGOL W

Tony เล่าว่า "ตอนนั้นผมแค่ขี้เกียจ เพราะการใส่ pointer เปล่าๆ เข้าไปมัน implement โคตรง่ายเลยในคอมไพเลอร์"

หลังจากนั้นอีก 40 กว่าปีต่อมา ในงานสัมมนาปี 2009 Tony ได้ขึ้นไปพูดบนเวทีแล้วสารภาพบาปอย่างเป็นทางการว่า:

"ผมเรียกมันว่า 'ความผิดพลาดมูลค่าพันล้านดอลลาร์' เพราะตลอด 40 ปีที่ผ่านมา มันสร้างบั๊ก ช่องโหว่ และความเสียหายระดับมหาศาลให้กับวงการซอฟต์แวร์นับไม่ถ้วน"

🥊 Java ปะทะ Kotlin: ท่ายาก vs ท่าจริตผู้ดี

ในฝั่ง Java (โดยเฉพาะยุคก่อน Java 8) วิธีรอดชีวิตวิธีเดียวคือคุณต้องขยันเขียน:

if (user != null) {
  if (user.getAddress() != null) {
    if (user.getAddress().getCity() != null) {
      return user.getAddress().getCity();
    }
  }
}

โค้ดทรง "ปิรามิดแห่งความหวาดระแวง" ที่ dev ทุกคนเกลียดเข้าไส้ พอยุคใหม่มี Optional เข้ามาช่วย บรรเทาไปได้หน่อยแต่ก็ยังแอบเยิ่นเย้ออยู่ดี

จนกระทั่ง Kotlin เดินเข้ามาในวงสนทนา แล้วบอกว่า: "ทำไมต้องรอให้บึ้มตอน Runtime วะ? กั้นตั้งแต่ตอนพิมพ์โค้ด (Compile-time) ไปเลยสิ!"

Kotlin จัดการแบ่ง Type ออกเป็น 2 เผ่าพันธุ์ชัดเจน:

และปิรามิด 7 บรรทัดของ Java เมื่อกี้ Kotlin ย่อเหลือแค่นี้:

val city = user?.address?.city ?: "Unknown"

ด้วยเครื่องหมาย ?. (Safe Call) คู่กับ ?: (Elvis Operator ที่หน้าตาเหมือนทรงผม Elvis Presley ปาดข้าง) สั้น จบ และไม่มีทางพ่น NPE ออกมาให้โดนด่าคืนวันศุกร์แน่นอน

💡 5-Min Takeaway

null ไม่ใช่ปีศาจร้าย แต่ความเลินเล่อที่ไม่รู้ว่าตรงไหนเป็น null ได้ต่างหากที่อันตราย การย้ายปัญหาจาก Runtime Exception มาเป็น Compile Error แบบที่ Kotlin ทำ คือหนึ่งในการปฏิวัติวงการเขียนโค้ดที่ช่วยเซฟเวลานอนของโปรแกรมเมอร์ได้มากที่สุดในประวัติศาสตร์