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