วันอาทิตย์, มกราคม 31, 2553

Case Study โปรแกรม ERP: Paranoid System

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

ปัญหา

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


ข้อมูลในรายงานกับข้อมูลในคอมพิวเตอร์ ไม่เท่ากัน

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

ทางแก้

เก็บทุกความเปลี่ยนแปลงเอาไว้ พร้อมให้ผู้ใช้เข้ามาดู และย้อนกลับได้ ถ้าให้ดีที่สุดต้องให้ผู้ใช้เปรียบเทียบ version เก่ากับใหม่ได้ด้วย แบบเดียวกับ google docs

 
หน้าจอ version ของ google docs

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


คำแนะนำด้านเทคนิค

สำหรับคนที่ใช้  RDBMS ผมแนะนำให้สร้างอีก table หนึ่ง ให้หน้าตาเหมือน table หลัก แล้วใช้ table นี้ในการเก็บข้อมูลเก่า ถึงแม้จะเป็นการเพิ่ม table ขึ้นมา แต่จริงๆ แล้วเป็นการลดความซับซ้อนของโปรแกรม เพราะเวลาเอกสารอื่นอ้างอิงมาที่เอกสารนี้ จะแน่ใจว่าเป็นตัวล่าสุดเสมอ

 
table สำหรับเก็บข้อมูล

ที่สำคัญเป็นการลดภาระให้โปรแกรม โดยเฉพาะส่วนออกรายงาน เพราะไม่ต้องแยกเอกสารเก่าออกจากเอกสารใหม่ทุกครั้ง

สำหรับคนที่ใช้ rails ผมแนะนำให้ใช้ plugin ชื่อ acts as versioned เพราะเป็น plugin ที่ทีมงานใช้อยู่ โดยมีเพื่อนร่วมงานคนหนึ่ง (Sid) ทำการดัดแปลงให้ใช้กับเอกสารที่มีหลายตารางได้ เช่น ใบ Quotation มีตาราง quotations เก็บข้อมูลของเอกสาร และ ตาราง quotation_details ใช้เก็บรายการในเอกสารเป็นต้น พอใช้ plugin ตัวนี้ก็แทบจะลืมไปเลยว่ามีการทำ version อยู่ ทุกอย่างทำอัตโนมัติ ทุกครั้งที่สั่ง save

จริงๆ มี plugin อีกตัวที่ชื่อ acts as versioned association ที่สามารถทำ version ของ เอกสารที่มีหลายตารางได้ แต่เนื่องจากไม่เคยใช้เลยไม่ได้แนะนำครับ นอกจากนี้จะมี plugin อีกตัวชื่อ acts as versioable ตัวนี้น่าจะทำงานคล้ายกับ act as verioned แต่ไม่เคยเล่นเหมือนกัน ใครสนใจลองหามาเล่นดูนะครับ

สำหรับ acts_as_paranoid เป็น plugin ที่เก่ามากแล้ว (2005) และไม่น่าเกี่ยวกับ versions แต่ชื่อมันเท่ดีเลยเอามาเป็นหัวข้อครับ :p
blog comments powered by Disqus