P Y T H O N

ข้อผิดพลาด Python 7 อย่างที่ทำให้โปรเจกต์พังในโปรดักชัน

ข้อผิดพลาด Python 7 อย่างที่ทำให้โปรเจกต์พังในโปรดักชัน

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

1. ตัวแปรค่าเริ่มต้นที่เปลี่ยนแปลงได้ (Mutable Default Arguments)

เป็นหนึ่งในข้อผิดพลาดหน้าตา innocent ที่สุด แต่สร้างผลลัพธ์ประหลาดที่สุด ลองดูโค้ดสั้นๆ นี้

def เพิ่มสินค้า(item, รายการ=[]):
รายการ.append(item)
return รายการ

หลายคนคิดว่าทุกครั้งที่เรียกฟังก์ชันนี้โดยไม่ส่งรายการ จะได้ลิสต์ใหม่เปล่าๆ แต่ความจริงคือ Python สร้างลิสต์นั้นครั้งเดียวตอนนิยามฟังก์ชัน แล้วทุกการเรียกใช้จะแชร์ลิสต์เดียวกัน การเรียกครั้งแรกได้ [A] ครั้งที่สองได้ [A, B] แทนที่จะได้ [B] วิธีแก้คือตั้งค่าเริ่มต้นเป็น None แล้วสร้างลิสต์ใหม่ข้างในฟังก์ชันแทน

2. คิดว่า float คือตัวเลขสำหรับเรื่องเงิน

ข้อผิดพลาดที่สร้างความเสียหายต่อธุรกิจมากที่สุดในหมวดนี้ ลองรัน 0.1 + 0.2 ใน Python ดูผลลัพธ์คือ 0.30000000000000004 ตัวเลขทศนิยมถูกเก็บแบบเลขฐานสอง ซึ่งไม่สามารถแทนทศนิยมได้เป๊ะทุกค่า หากระบบบัญชี ระบบราคา หรือส่วนลดใช้ float สะสมไปเรื่อยๆ ยอดจะเพี้ยนจากความเป็นจริงทุกวัน ทีมงานมืออาชีพจึงใช้ decimal.Decimal สำหรับเรื่องเงิน หรือเก็บเป็นตัวเลขจำนวนเต็มของหน่วยย่อย (เช่น สตางค์) เสมอ

3. จับข้อยกเว้นแล้วกลืนมันทิ้ง

โค้ดแบบนี้มักเกิดขึ้นเพราะอยากให้โปรแกรมไม่เด้ง:

try:
update_total_sales(data)
except Exception:
pass

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

4. ลืมเรื่อง Encoding กับข้อมูลที่มาจากอุปกรณ์จริง

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

Industrial IoT คืออะไร และทำไมต้องรู้จักมัน

Industrial IoT (IIoT) คือการนำแนวคิดของ Internet of Things มาประยุกต์กับภาคอุตสาหกรรม นั่นคือการติดตั้งเซนเซอร์และอุปกรณ์เชื่อมต่อกับเครื่องจักร โรงงาน คลังสินค้า หรือระบบสาธารณูปโภค เพื่อให้ข้อมูลสถานะเครื่องจักร อุณหภูมิ ความชื้น กระแสไฟฟ้า และค่าอื่นๆ ถูกส่งมายังระบบส่วนกลางแบบเรียลไทม์

ในโลกของ IIoT ข้อมูลจากเซนเซอร์จะถูกส่งผ่านโปรโตคอลอย่าง Modbus, MQTT หรือ OPC-UA เข้าสู่ระบบที่เขียนด้วย Python แล้วนำไปสร้าง Dashboard หรือแจ้งเตือนอัตโนมัติ ข้อผิดพลาดที่พบบ่อยในงานลักษณะนี้คือ:

  • ถอดรหัส bytes จากอุปกรณ์ผิด format ค่าที่อ่านได้จึงไกลจากความเป็นจริงหลายเท่า
  • ไม่ตรวจค่า None หรือค่า null เมื่อเซนเซอร์ตัดสัญญาณชั่วคราว ทำให้ระบบคำนวณผิดพลาดทั้งสาย
  • ไม่ตั้ง timeout ตอนเชื่อมต่ออุปกรณ์ ทำให้โปรแกรมรอคอยตลอดกาลเหมือนเครื่องหยุดทำงาน
  • โค้ดประมวลผลแบบ blocking จนพลาดรอบการเก็บข้อมูลตามกำหนดเวลา

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

เมื่อ Python พัง ธุรกิจจ่ายแพงกว่าคนแก้โค้ดเสียอีก

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

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

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

ลดข้อผิดพลาดด้วยเครื่องมือ ไม่ใช่ความจำ

แนวทางปฏิบัติง่ายๆ ที่ช่วยลดข้อผิดพลาดกลุ่มนี้ได้จริงคือ ใช้ type hints เพื่อประกาศชนิดข้อมูล, ใช้ linter อย่าง Ruff ตรวจโค้ดอัตโนมัติ, เขียน test ให้ครอบคลุมกรณีขอบ (edge case) เช่น ค่า None หรือข้อมูลว่าง และบันทึก error อย่างมีระบบเพื่อให้แก้ไขได้ทันที ไม่ปล่อยให้เงียบซ่อนปัญหา

ข้อผิดพลาดไม่ใช่เรื่องน่ากลัว ถ้ามีคนที่เคยเจอมาแล้ว

ข้อผิดพลาด Python ทั้ง 7 ข้อในบทความนี้แก้ได้ด้วยพื้นฐานที่ดีและการทดสอบที่จริงจัง ไม่มีใครเก่งโดยไม่เคยพลาด แต่ในโปรเจกต์จริงยังมีอีกชั้นหนึ่งที่เกินกว่าไวยากรณ์ เช่น การออกแบบระบบให้รองรับข้อมูลจากเซนเซอร์หน้าโรงงานได้จริง หรือการวางสถาปัตยกรรมให้บำรุงรักษาง่ายเมื่อธุรกิจเติบโต หากทีมของคุณกำลังติดหล่มอยู่กับข้อผิดพลาดซ้ำๆ แบบนี้ หรืออยากพัฒนาระบบ IoT และระบบอัตโนมัติให้ธุรกิจ ทีมงานผู้เขียนโปรแกรมด้วย Python-Django และพัฒนาระบบ AI อัตโนมัติ จาก pythonthailand.com โดย Para-Studio เชียงใหม่ ยินดีช่วยออกแบบและเขียนระบบให้ตรงกับงบประมาณจริงของธุรกิจคุณ แลกเปลี่ยนกันได้ที่หน้า /contact ครับ


หากชอบบทความดีๆ โปรดติดตามพวกเราด้วยนะคะ 🙏