การตรวจสอบหมายเลข คือการตอบคำถามว่าเลขชุดหนึ่งสอดคล้องกับกฎที่ระบบนั้นประกาศไว้หรือไม่ โดยแยกคำตอบออกเป็นหลายระดับแทนที่จะตอบเพียงว่าใช้ได้หรือใช้ไม่ได้ เรื่องนี้กลายเป็นคำถามที่พบบ่อยเมื่อทีมต้องตัดสินใจว่าฟอร์มกรอกข้อมูลควรปฏิเสธอะไรได้บ้าง และการปฏิเสธที่ผิดพลาดจะสร้างความเสียหายมากกว่าการปล่อยผ่านหรือไม่ ในบทความนี้คุณจะได้เห็นว่าการตรวจหนึ่งครั้งประกอบด้วยชั้นอะไรบ้าง ทำไมรูปแบบที่ถูกต้องจึงยังไม่เพียงพอต่อการสรุปว่าหมายเลขนั้นมีอยู่จริง และเหตุใดเครื่องมือที่ซื่อสัตย์จึงต้องแยกคำตอบออกเป็นสี่แบบ
การตรวจสอบหมายเลขคืออะไร?
หัวใจของการตรวจสอบหมายเลขอยู่ที่การเทียบข้อมูลนำเข้ากับกฎที่เขียนไว้ล่วงหน้า กฎชุดหนึ่งประกอบด้วยสามชั้น ได้แก่ ชุดอักขระที่ยอมรับได้ ความยาวที่ยอมรับได้ และความสัมพันธ์ทางคณิตศาสตร์ระหว่างหลักต่าง ๆ ที่เรียกว่าหลักตรวจสอบ ทั้งสามชั้นต้องผ่านพร้อมกันจึงจะเรียกว่าค่าหนึ่งสอดคล้องกับกฎนั้น
สิ่งที่ต้องเข้าใจตั้งแต่ต้นคือการตรวจไม่เคยตัดสินความจริงของหมายเลข มันตัดสินเพียงว่าชุดอักขระที่ได้รับมาเข้าข่ายรูปแบบที่ระบบรู้จักหรือไม่ และในกรณีที่มีสูตรเปิดเผย ก็ตัดสินเพิ่มอีกหนึ่งข้อว่าค่าที่ได้คำนวณสอดคล้องกับหลักสุดท้ายหรือไม่เท่านั้น
เครื่องมือตรวจสอบบนไซต์นี้จึงไม่เพียงบอกว่าผ่านหรือไม่ผ่าน แต่แยกผลลัพธ์ออกเป็นสี่แบบ และแสดงหลักฐานที่ใช้ตัดสินทุกครั้งที่ทำได้ เพื่อให้คุณตรวจสอบย้อนกลับได้ว่าข้อสรุปนั้นมาจากกฎข้อใด
สามชั้นที่กรองคนละแบบ
แต่ละชั้นจับความผิดพลาดคนละชนิด จึงไม่มีชั้นใดที่แทนอีกชั้นหนึ่งได้ ชั้นแรกคือชุดอักขระ ซึ่งจับกรณีที่ผู้ใช้พิมพ์ตัวอักษรเข้าไปในช่องที่ควรมีแต่ตัวเลข หรือคัดลอกข้อความที่มีอักขระแปลกปลอมติดมา ชั้นที่สองคือความยาว ซึ่งจับกรณีที่พิมพ์ขาดหรือเกินไปหนึ่งถึงสองหลัก ชั้นที่สามคือหลักตรวจสอบ ซึ่งจับกรณีที่จำนวนหลักถูกต้องและมีแต่ตัวเลข แต่มีค่าใดค่าหนึ่งพิมพ์ผิด
| ชั้นที่ตรวจ | ความผิดพลาดที่จับได้ | ความผิดพลาดที่ยังหลุด |
|---|---|---|
| ชุดอักขระ | มีอักขระที่ไม่ใช่ตัวเลขปนมา | ตัวเลขที่ผิดค่าแต่รูปแบบถูก |
| ความยาว | พิมพ์ขาดหรือเกินหลัก | ตัวเลขที่สลับตำแหน่งภายในความยาวเดิม |
| หลักตรวจสอบ | หลักเดียวผิด และการสลับบางแบบ | การสลับที่ผลรวมถ่วงน้ำหนักไม่เปลี่ยน |
ประเด็นที่คนมักมองข้ามคือเมื่อสองชั้นแรกผ่าน ชั้นที่สามจะจับได้เฉพาะความผิดพลาดที่ทำให้ผลรวมไม่ลงตัว ความผิดพลาดแบบอื่นยังคงผ่านเข้าไปถึงระบบปลายทางได้ตามปกติ การมีหลักตรวจสอบจึงเป็นตัวกรองเพิ่มขึ้น ไม่ใช่การรับประกัน
ทำไมรูปแบบถูกต้องจึงยังไม่แปลว่าหมายเลขจริง?
เพราะการคำนวณหลักตรวจสอบเป็นเรื่องของคณิตศาสตร์ล้วน ๆ ใครก็ตามที่รู้สูตรสามารถสร้างชุดตัวเลขที่ผ่านสูตรได้ภายในเวลาไม่กี่วินาที การที่ชุดหนึ่งผ่านจึงบอกได้เพียงว่ามันถูกสร้างตามกฎเดียวกับหมายเลขอื่นในระบบ ไม่ได้บอกว่าใครเป็นผู้ออกให้ หรือผู้ออกให้ยังมีอยู่หรือไม่
การยืนยันว่าหมายเลขหนึ่งมีอยู่จริงต้องอาศัยการสอบถามไปยังทะเบียนหรือฐานข้อมูลของผู้ออกหมายเลขนั้น ซึ่งเป็นคนละงานคนละชั้นกับการคำนวณ และมักมีเงื่อนไขด้านสิทธิ์การเข้าถึง เวลารอ และข้อจำกัดจำนวนครั้งที่สอบถามได้
เมื่อสองเรื่องนี้ถูกนำมาปนกัน ระบบจะเริ่มให้ข้อสรุปที่รุนแรงเกินจริง เช่นปฏิเสธลูกค้าที่กรอกหมายเลขถูกต้องเพียงเพราะหมายเลขนั้นยังไม่ถูกนำเข้าฐานข้อมูลอ้างอิงของฝ่ายหนึ่ง หรือในทางกลับกันคือปล่อยผ่านหมายเลขที่ไม่มีอยู่จริงเพราะผลรวมลงตัวพอดี
หมายเลขหนึ่งอาจเข้าได้กับหลายระบบ
ชุดอักขระชุดเดียวกันอาจสอดคล้องกับกฎของหลายระบบพร้อมกันได้ เพราะหลายระบบใช้ความยาวและชุดอักขระแบบเดียวกัน และบางระบบก็ใช้สูตรหลักตรวจสอบแบบเดียวกัน ตัวอย่างที่เห็นได้บ่อยคือชุดตัวเลขแปดหลักที่เข้าได้กับเอกชนหลายประเทศ หรือชุดเลขเก้าหลักที่ผ่านสูตรแบบเดียวกับที่ใช้กันในสองประเทศที่ห่างกันคนละทวีป
เมื่อเกิดกรณีนี้ วิธีที่ถูกต้องคือแสดงผลลัพธ์ของทุกระบบที่เป็นไปได้พร้อมกัน ไม่ใช่เลือกประเทศเดียวให้ผู้ใช้ เพราะการเดาประเทศเป็นสิ่งที่ระบบทำได้แย่กว่ามนุษย์ที่รู้ว่าตนกรอกข้อมูลของประเทศใด
ในทางกลับกัน หากไม่พบระบบใดที่ตรงเลย คำตอบที่ถูกต้องคือบอกว่ายังไม่มีกฎสำหรับข้อมูลชุดนี้ ซึ่งแตกต่างจากการกล่าวหาว่าหมายเลขนั้นปลอม ประโยคหลังนี้เป็นข้อกล่าวหาที่ระบบไม่มีหลักฐานเพียงพอจะกล่าว
ปรับรูปแบบก่อนตรวจ: ช่องว่าง ขีดกลาง และตัวพิมพ์
ก่อนจะตรวจอะไรได้ ระบบต้องทำความสะอาดข้อมูลนำเข้าก่อน ขั้นตอนนี้ไม่ได้เปลี่ยนความหมายของหมายเลข แต่ทำให้การเปรียบเทียบเป็นไปได้จริง กฎที่ใช้บ่อยคือตัดช่องว่าง ขีดกลาง จุด และเครื่องหมายทับออกทั้งหมด แล้วจึงเทียบกับรูปแบบมาตรฐาน
- ตัดอักขระคั่นที่ใช้เพื่อการอ่านออกทุกชนิด เช่นช่องว่างและขีดกลาง
- ตัดอักขระที่โปรแกรมตารางมักติดมา เช่นเครื่องหมายคำพูดเดี่ยวที่วางไว้หน้าตัวเลขเพื่อไม่ให้ตีความเป็นตัวเลข
- ปรับตัวอักษรให้เป็นพิมพ์เล็กหรือพิมพ์ใหญ่แบบเดียวกันทั้งชุด เพราะการเทียบตัวอักษรนั้นไม่คำนึงถึงตัวพิมพ์
- ตัดช่องว่างหัวท้ายที่ติดมาจากการคัดลอกวาง
หากข้ามขั้นตอนนี้ หมายเลขเดียวกันที่ผู้ใช้พิมพ์ต่างรูปแบบกันจะถูกมองเป็นสองค่าที่ไม่เหมือนกัน ซึ่งทำให้เกิดทั้งการปฏิเสธที่ผิดและการนับรายการซ้ำที่ผิดพลาดในเวลาเดียวกัน
คำตอบสี่แบบที่ต้องแยกให้ออก
ผลลัพธ์ของการตรวจไม่ควรมีแค่ผ่านกับไม่ผ่าน การรวมทุกอย่างไว้ในสองช่องจะบังคับให้ระบบต้องโกหกในกรณีที่มันไม่รู้จริง ๆ เครื่องมือบนไซต์นี้จึงใช้สี่คำตอบที่แยกความหมายจากกันชัดเจน
- ถูกต้อง หมายถึงค่าผ่านสูตรหลักตรวจสอบที่ระบบนั้นประกาศไว้
- ไม่ถูกต้อง หมายถึงรูปแบบเข้าเกณฑ์ แต่ผลการคำนวณหลักตรวจสอบไม่สอดคล้อง
- รูปแบบเท่านั้น หมายถึงระบบนั้นไม่มีสูตรหลักตรวจสอบที่เปิดเผย จึงยืนยันได้แค่ความยาวและชุดอักขระ
- ไม่มีกฎ หมายถึงยังไม่มีระบบใดในเครื่องมือที่รองรับข้อมูลชุดนี้
สองคำตอบหลังคือส่วนที่ระบบจำนวนมากเลือกจะไม่พูด แต่เป็นส่วนที่ผู้ใช้ต้องการที่สุด เพราะมันบอกว่าควรไปตรวจต่อที่ใด หรือควรหยุดพักการตัดสินไว้ก่อน ลองวางหมายเลขที่คุณสงสัยลงในเครื่องมือตรวจสอบเพื่อดูว่าระบบตอบกลับด้วยคำตอบแบบใด
สำหรับนักพัฒนา: แบ่งชั้นของขั้นตอนตรวจสอบ
สิ่งที่ช่วยลดงานซ้ำได้มากที่สุดคือการแยกขั้นตอนออกเป็นช่วงที่ชัดเจน แล้วให้แต่ละช่วงคืนค่าที่บอกได้ว่าตนเองตรวจอะไรไปแล้วบ้าง ลำดับที่แนะนำคือปรับรูปแบบก่อน ตรวจชุดอักขระและความยาวต่อ และคำนวณหลักตรวจสอบเป็นขั้นสุดท้าย เพราะการคำนวณแพงกว่าการนับความยาวมาก
อีกข้อที่ควรทำคือให้ผลลัพธ์บอกได้ว่าใช้กฎของระบบใดและกฎนั้นมาจากไหน เมื่อมีเพียงประโยคว่าข้อมูลไม่ถูกต้อง ผู้ใช้จะแก้ไม่ถูก จุดที่ควรระวังคือการเขียนกฎของแต่ละระบบไว้ในตรรกะทางธุรกิจโดยตรง ซึ่งทำให้การปรับปรุงกฎในภายหลังต้องแก้หลายที่และเสี่ยงต่อความไม่ตรงกัน
สุดท้ายคือแยกส่วนที่ใช้สร้างหมายเลขออกจากส่วนที่ใช้ตรวจหมายเลขให้เป็นคนละหน้าที่ เพราะทั้งสองฝ่ายใช้ความรู้เรื่องสูตรชุดเดียวกัน การแยกให้ชัดทำให้ทดสอบทั้งสองทางได้ง่ายขึ้น และลดโอกาสที่การแก้ฝ่ายหนึ่งจะทำอีกฝ่ายพังโดยไม่มีใครรู้ ภาพรวมของการแบ่งความรับผิดชอบแบบนี้มีอยู่ในวิธีตรวจสอบที่ขอบของระบบ
ก้าวต่อไป
เริ่มจากการตรวจว่าฟอร์มของคุณตอบกลับด้วยคำตอบกี่แบบ หากยังมีเพียงผ่านกับไม่ผ่าน ให้ลองเพิ่มอีกสองกรณีที่เหลือก่อน เพราะการเพิ่มคำตอบที่ตรงกับความจริงช่วยลดทั้งการปฏิเสธที่ผิดและการตัดสินใจผิดของเจ้าหน้าที่
จากนั้นลองอ่านเรื่องภาพรวมอัลกอริทึมหลักตรวจสอบเพื่อดูว่าสูตรที่ใช้กันอยู่นั้นต่างกันตรงพารามิเตอร์ใด และถ้าคุณต้องรับมือกับหมายเลขที่ไม่เปิดเผยสูตรเลย บทความเรื่องหมายเลขที่ไม่มีหลักตรวจสอบอธิบายวิธีบอกผู้ใช้อย่างตรงไปตรงมาโดยไม่ทำให้เข้าใจผิด
หมายเลขทุกชุดที่ยกมาในบทความนี้เป็นตัวอย่างที่สร้างขึ้นเพื่ออธิบายหลักการตรวจสอบเท่านั้น ไม่ตรงกับหมายเลข บัญชี หรือเอกสารจริงใด และใช้ได้เฉพาะกับงานทดสอบซอฟต์แวร์