มหากาพย์ NullPointerException: ความผิดพลาดพันล้านดอลลาร์ และวิธีที่ Kotlin มาเช็ดขี้เช็ดเยี่ยวให้เรา
⏱️ ใช้เวลาอ่านประมาณ: 4 นาที 30 วินาที
คืนวันศุกร์ เวลา 21:58 น. คุณกำลังจะพับจอโน้ตบุ๊กเพื่อไปชนแก้วกับเพื่อน ทันใดนั้นเสียง Alert บนมือถือก็ดังรัวเป็นจังหวะสามช่า... Production พังเรียบร้อย
พอเปิด Log ดูก็พบกับบรรทัดที่คุ้นเคยจนแทบร้องไห้:
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.getAddress() != null) {
if (user.getAddress().getCity() != null) {
return user.getAddress().getCity();
}
}
}
โค้ดทรง "ปิรามิดแห่งความหวาดระแวง" ที่ dev ทุกคนเกลียดเข้าไส้ พอยุคใหม่มี Optional เข้ามาช่วย บรรเทาไปได้หน่อยแต่ก็ยังแอบเยิ่นเย้ออยู่ดี
จนกระทั่ง Kotlin เดินเข้ามาในวงสนทนา แล้วบอกว่า: "ทำไมต้องรอให้บึ้มตอน Runtime วะ? กั้นตั้งแต่ตอนพิมพ์โค้ด (Compile-time) ไปเลยสิ!"
Kotlin จัดการแบ่ง Type ออกเป็น 2 เผ่าพันธุ์ชัดเจน:
- Non-nullable: ประกาศเฉยๆ (
var name: String) ห้ามใส่ null เด็ดขาด ถ้าเผลอใส่ IDE จะด่าทันทีตั้งแต่ยังไม่ทันกดเซฟ - Nullable: ถ้าอยากให้มี null ต้องมีเครื่องหมายคำถามกำกับ (
var name: String?)
และปิรามิด 7 บรรทัดของ Java เมื่อกี้ Kotlin ย่อเหลือแค่นี้:
ด้วยเครื่องหมาย ?. (Safe Call) คู่กับ ?: (Elvis Operator ที่หน้าตาเหมือนทรงผม Elvis Presley ปาดข้าง) สั้น จบ และไม่มีทางพ่น NPE ออกมาให้โดนด่าคืนวันศุกร์แน่นอน
💡 5-Min Takeaway
null ไม่ใช่ปีศาจร้าย แต่ความเลินเล่อที่ไม่รู้ว่าตรงไหนเป็น null ได้ต่างหากที่อันตราย การย้ายปัญหาจาก Runtime Exception มาเป็น Compile Error แบบที่ Kotlin ทำ คือหนึ่งในการปฏิวัติวงการเขียนโค้ดที่ช่วยเซฟเวลานอนของโปรแกรมเมอร์ได้มากที่สุดในประวัติศาสตร์