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