สิ่งที่ว่างเปล่าเวลาเขียนโปรแกรม

Tae Keerati Jearjindarat
3 min readApr 29, 2021
generate from https://imgflip.com/memegenerator

ช่วงนี้ได้รีวิวโค้ดบ่อยและเกิดสงสัยเรื่องหนึ่งขึ้นมาว่าสิ่งนั้นมันมาได้ยังไง ทำไมต้องมี และ ผสมกับการทำงานไปสักพักหนึ่งผมเริ่มเห็นความต่างบางอย่างระหว่างคนที่เขียนโปรแกรมใหม่ ๆ และคนที่มีประสบการณ์แล้วอยู่ข้อหนึ่งครับวันนี้จะมาเล่าให้ฟัง

เวลาเราเรียนในมหาลัย เราก็มักจะฝึกเขียนพวก Algorithm หรือ Datastructure ใช่ไหมครับ ซึ่งพวกนี้มันจะมี pseudo code มาให้อยู่แล้วว่าต้องเขียนอะไรยังไง ซึ่งมันไม่ใช่เรื่องผิดครับเพียงแต่ว่า เราอาจจะลืม concerns อะไรบางอย่างเมื่อเราเปลี่ยนมาคิด Business Logic ด้วยตัวเอง อาจจะเปลี่ยน Requirement ไป หรือ อาจจะต้องไปทำ Feature ต่อจากโค้ดเก่าซึ่งมักจะมีคนทำอะไรบางอย่างไว้แล้วคนที่ทำต่อไม่ได้เช็คให้ดี

ที่จะบอกคือสำหรับคนเขียนโปรแกรมใหม่ ๆ หรือเด็กจบใหม่อาจจะชอบลืมเงื่อนไขที่สำคัญข้อหนึ่งไปนั่นคือการเช็คค่าว่าง เช่น null, nil หรือ undefined ซึ่งเป็นที่มาของบล็อคนี้ เพราะสิ่งเหล่านี้คือความว่างเปล่านั่นเอง

Null History

จากความสงสัยว่า Null มาได้ยังไง ทำให้ผมไปเจอความตลกร้ายมาครับ

สิ่งนี้เริ่มที่ปี 1965 มีคนที่ชื่อ Tony Hoare ได้ริเริ่มเรื่อง Null Reference ขึ้นมาในภาษา ALGOL W ครับ ด้วยความคิดตั้งต้นที่อยากให้มี type ครอบคลุมเวลาเขียนโปรแกรมแบบ Object Oriented Language ซึ่งเป้าหมายที่แท้จริงคืออยากให้ทุก references ใช้ได้อย่างปลอดภัย โดยให้ complier เป็นคนคอยเช็คให้ และ อยากให้การเขียนโปรแกรมมัน predictable แต่ด้วยความที่ null เอาไปใช้ได้ง่ายกว่าและไม่ยาก ก็เลยหลงผิดคิดใช้ null เป็นค่าเริ่มต้นของ references ตั้งแต่บัดนั้นมา

ทำให้ปี 2009 เค้าได้ออกมาพูดในงาน conferences เพื่อประกาศว่าตัวเองคิดผิดเรื่องการริเริ่ม null references ขึ้นมา และเค้าเรียกเรื่องนี้ว่า “Billion-dollar mistake”

ซึ่งสิ่งที่เค้าพูดมาส่วนตัวผมเห็นด้วยเพราะจากปัญหาที่เกริ่นไปตั้งแต่ต้น มันกลายเป็นว่าเราต้องใช้ประสบการณ์แทนที่จะสนใจเรื่อง Business Logic มากกว่าเมื่อเราหันมาเขียน High Level Language แต่ทุกวันนี้ ภาษาใหม่ ๆ ก็เอาเรื่องนี้มาเป็น feature เต็มไปหมด ซึ่งก็อาจจะมองว่าเพราะมันง่ายและชินกันไปแล้วครับ

Null is evil

จากประวัติที่เกริ่นมา ทำให้เกิดปัญหาใหญ่ ๆ อยู่ 3 ข้อครับคือ

Innumerable errors

ก็คือทำให้เกิด Errors มากมายเวลาเขียนโปรแกรม เพราะ null อยู่ได้ทุกที่ เนื่องจาก null ไม่มี type แค่เราสร้างตัวแปรที่ไม่ใช่ primitive เราก็โดน null มาหลอกหลอนแล้วครับ ซึ่งมันทำให้ Developer เจอปัญหาดังนี้

  1. คนเขียนโปรแกรมใหม่ ๆ เจออาจจะบ่อยมาก คือน่าจะเกือบทุกคนจะเจอว่า “เอ้า ทำไม Object นี้ใช้ไม่ได้” หรือ “เอ้า Error อะไรเนี่ย ก็เขียนถูกแล้วนี่นา” ทั้งที่จริงแล้วคือ ตัว references เป็น null แล้วดันเกิด Exception
  2. Debug ยาก เพราะเราต้องไปไล่หาว่าเอ๊ะตัวไหนที่พัง ยิ่งระบบที่ซับซ้อน ไม่ต้องพูดถึงเลย ใครเขียนอะไรไว้ก็ไม่รู้ แล้ว Entity ส่วนใหญ่ก็เป็น Object ซึ่งมันมีโอกาส Null ได้ตลอดเวลา
  3. ต้องมานั่งเช็ค null ตลอดเวลา ทำให้เกิดโค้ดที่ Duplicate เต็มไปหมด Search ดูก็ได้ครับ ตอนนี้ Project / Product เขียน if-else เช็คเกี่ยวกับ null ไปกี่บรรทัดแล้วครับ

Vulnerabilities

เกิดช่องโหว่ในระบบที่ Hacker ใช้ประโยชน์จาก Null Pointer เพื่อ bypass security และทำการเจาะระบบไปได้ เนื่องจาก Null Pointer มักจะเป็นสิ่งที่เราลืมไป แต่เมื่อ Hacker เจอสิ่งนี้ อาจจะสามารถใช้เพื่อ Debug ต่อและคิดการโจมตีต่อไปได้ครับ เรียกว่า Null-pointer dereferences ซึ่งวิธีแก้มีประมาณนี้ครับ

Solution 1 ควรเช็ค null ให้ถูกต้องตลอด ซึ่งอาจใช้ process บังคับให้คน review code ช่วยกันดูก็ได้

Solution 2 Wrapper Class ครอบเอาไว้อีกทีหนึ่งเหมือน Java จะมี Optional Class เป็น Util เอาไว้ให้ใช้ได้ครับ จะไม่เป็น null และทำให้เราสามารถจัดการ null ได้ผ่านตัว Wrapper ตัวนี้ โค้ดก็จะประมาณนี้

Solution 3 Null Object Pattern เป็น Design pattern ตัวหนึ่งที่ใช้จัดการได้ ก็คือสร้าง NullObject เอาไว้และใช้แทนค่า null ไปเลย ซึ่งจะทำได้ต้องเป็นภาษาที่ทำ interface ให้ implement หรือ inheritance ได้นะครับ ตัวอย่างแบบ Java ก็ประมาณนี้

System crashes

ทำให้ระบบพัง แบบพังไปเลย ถ้านึกไม่ออก ขอยกตัวอย่างเช่น

  • Transaction ไม่สำเร็จ ทำให้สั่งซื้อสินค้าไม่ได้
  • Process ข้อมูลบางอย่างไม่ได้ ทำให้ข้อมูล Out sync
  • แสดงข้อมูลบางอย่างไม่ได้ เช่น User Interface แดงๆ เต็มไปด้วย Error จนบัง Information

ซึ่งปัญหาเหล่านี้กระทบต่อ User Experience คิดสภาพว่าสิ่งที่ User กดๆ ไป เค้าก็กดตาม UI ที่เราออกแบบและ lead ให้เค้าทำแท้ ๆ แล้วดันมาเจอ Error อะไรก็ไม่รู้ จะทำให้ User รู้สึกไม่ดี สับสน และทำอะไรต่อไม่ถูกหากเราไม่ Handle เอาไว้ให้ดีนั่นเอง ซึ่งมันเกิดขึ้นได้ทุกภาษาของการเขียนโปรแกรมที่ยอดฮิตในตอนนี้ ทั้ง JS ก็มี undefined และ null / Go ก็มี nil / Java ก็มี null ขอให้ระวังในการใช้ความว่างเปล่านี้นะครับ

So what next?

ผมคิดว่าเราน่าจะทำได้เท่าที่ผมบอกไป และอาจจะทำอะไรไม่ได้ไปมากกว่านี้จนกว่าจะมีภาษาใหม่ที่แก้ปัญหาเรื่องนี้ได้อย่างดีเยี่ยม และตอนนี้ทำได้แค่ อย่า ลืม เช็ค null ในโค้ดที่เราเขียนไป ไม่งั้นเราอาจจะทำให้ระบบพังโดยไม่รู้ตัวก็ได้ครับ สิ่งที่พอทำได้ง่ายที่สุดอีกอย่างก็คือพยายามช่วยกันรีวิวโค้ดให้ดี อย่าให้หลุดกรณีนี้ไปนั่นเอง ฉะนั้น จำให้ขึ้นใจนะครับ

แนะนำให้ไปดูคลิปที่ Tony พูดไว้ใน conferences ใน Link ด้านล่างครับ สนุกดี บอกที่มาที่ไปอย่างละเอียด เพลินๆ ใช้เวลา 1 ชั่วโมงครับ ส่วนตัวก็ฟังไม่ได้เข้าใจความทั้งหมดแต่พอเข้าใจบ้าง

หากบล็อคนี้มีอะไรผิดไป สามารถแนะนำติชมกันได้นะครับจะได้แก้ไขและได้ความรู้ใหม่ไปด้วยกัน :D

ข้อมูลเพิ่มเติม

ขอบคุณทาง depa และ คณะเทคโนโลยีสารสนเทศ มจธ.
ที่มอบทุนการศึกษาเพชรพระจอมเกล้าเพื่อพัฒนาเทคโนโลยีและนวัตกรรมดิจิทัล และทำให้ได้ความรู้เพิ่มสำหรับใช้ทำงานจริงครับ

เรื่องนี้ตอนหาข้อมูลเพิ่มเติมก็สนุกดี ขอบคุณที่อ่านจนจบครับ 🙏

--

--

Tae Keerati Jearjindarat

Hi, I'm Tae, Associate Engineering Manager at LINEMAN Wongnai. Thanks for following <3