แก้ปัญหา ‘Passport Application’ ของสหราชอาณาจักรด้วย Haskell
(jameshaydon.github.io)- กรณีศึกษาที่มองขั้นตอนขอหนังสือเดินทางสหราชอาณาจักรเป็นปริศนาการรวบรวมเอกสารแบบราชการ และคำนวณชุดเอกสารที่ต้องใช้เพื่อพิสูจน์สัญชาติด้วยการค้นหาเชิงตรรกะใน Haskell
- คำขอเอกสารของ HMPO อาจไล่ย้อนแบบเวียนเกิดไปตามผังเครือญาติได้ ขึ้นอยู่กับสถานที่เกิดและวันเกิดของผู้ยื่นคำขอ พ่อแม่ และปู่ย่าตายาย รวมถึงสัญชาติ สถานะการตั้งถิ่นฐาน และการสมรสของพ่อแม่
- ในการขอหนังสือเดินทางครั้งแรกของเด็กที่เกิดต่างประเทศ มีการขอถึงสูติบัตรและทะเบียนสมรสของทวดฝ่ายพ่อ และการเวียนเกิดจะหยุดก็ต่อเมื่อเจอกรณีฐาน เช่น เกิดในสหราชอาณาจักรก่อนปี 1983
- การนำไปใช้จริงเปลี่ยนจาก Prolog มาใช้ LogicT และ
StateT Claims IOของ Haskell เพื่อไล่เรียงProofที่เป็นไปได้สำหรับการพิสูจน์สัญชาติ และคำนวณSet Documentที่ต้องใช้ในแต่ละเส้นทาง - แม้คำขอเดียวกันจะมีหลายเส้นทางในการพิสูจน์ แต่คำขอจริงอาจยืดยาวกว่าแม้ยังมีเส้นทางที่ง่ายกว่าอยู่ และระบบอัตโนมัติอาจช่วยทั้งในการเตรียมเอกสารและทำความเข้าใจว่าทำไมจึงถูกขอเอกสารเหล่านั้น
มอง Passport Application เป็นเกมเก็บเอกสาร
- Passport Application ของสหราชอาณาจักรคือกระบวนการยื่นคำขอออนไลน์ที่ดำเนินการโดย HMPO โดยเวอร์ชันออนไลน์มาตรฐานมีค่าเริ่มต้นราว £100
- เป้าหมายคือรวบรวมเอกสารต้นฉบับที่กระจัดกระจายอยู่ตามหน่วยงานราชการต่าง ๆ เพื่อพิสูจน์ข้อความว่า “ผู้ยื่นคำขอเป็น British”
- รางวัลสุดท้ายคือสมุดเล่มเล็กที่มีวันที่ให้กลับมายื่นใหม่ได้อีก นั่นคือหนังสือเดินทาง
- แบบยื่นบนกระดาษก็ใกล้เคียงกับโหมด “ฮาร์ดคอร์” ที่ต้องพึ่งพาการส่งทางไปรษณีย์
คำขอเอกสารที่ต่อเนื่องจากการยื่นจริง
- กรณีศึกษานี้คือการยื่นออนไลน์แทนลูกสาว โดยเลือกความยาก “first child passport born abroad”
- คำขอจะถูกดำเนินการโดย “examiner” แต่ผู้ยื่นจะสอบถามได้ผ่าน advice agent ทางแชตหรือโทรศัพท์เท่านั้น
- คำแนะนำจาก advice agent ไม่ใช่การตัดสินใจอย่างเป็นทางการ
- หากให้ส่งคำถามต่อไปถึง examiner จะต้องรอหลายวัน โดยในกรณีนี้นานสุดราว 10 วัน
- ในคำขอเอกสารช่วงแรก ราว 50% ถูกบริการแชตบอกว่าไม่จำเป็น และหลังจากนั้นก็ยังมีการขอเอกสารเพิ่มเติมต่อเนื่อง
- อีเมลคำขอมี
__APPLICANT_NAME__ที่ดูเหมือนเทมเพลตพัง ๆ และเงื่อนไขการพิสูจน์ parental responsibility ก็ไม่ชัดเจน - ท้ายที่สุดมีการขอเอกสารที่พบไม่บ่อย คือ สูติบัตรและทะเบียนสมรสของทวดฝ่ายพ่อ
- คำว่า “applicant's Paternal great grandfather” อาจกำกวมได้ว่าหมายถึงคนใดในสองคน
- ผู้เขียนตีความเป็น
applicant's father's father's father's birth certificate
ตีความตรรกะของ HMPO เป็นปัญหาการพิสูจน์แบบเวียนเกิด
- ตรรกะของ HMPO มองได้ว่าเป็น Bureaucratic Logic ที่อิงเอกสาร
- ต่างจาก Constructive Logic ที่ความเป็นไปได้เชิงตรรกะเพียงอย่างเดียวไม่เพียงพอ
- การพิสูจน์ต้องมี “พยาน” ที่เป็นเอกสารต้นฉบับ
- ไม่สามารถใช้กฎตัดสินตรงกลาง
P ∨ ¬Pได้ตรง ๆ- เช่น จะบอกว่า “ปู่ฝ่ายพ่อเกิดในสหราชอาณาจักรหรือไม่ก็ไม่ได้เกิด” แล้วส่งเอกสารของทั้งสองสถานการณ์ไปพร้อมกันไม่ได้
- ต้องเลือกทางเลือกเดียวและส่งเอกสารที่สอดคล้องกับทางเลือกนั้น
- ตามคำอธิบายของ HMPO ผู้ที่เกิดนอกสหราชอาณาจักรหลังวันที่ 31 ธันวาคม 1982 โดยทั่วไปจะเป็น British citizen ได้ก็ต่อเมื่อพ่อหรือแม่คนใดคนหนึ่ง ณ เวลาที่เกิดเป็น “British citizen otherwise than by descent”
- เนื่องจาก HMPO ไม่ใช้บันทึกหนังสือเดินทางเดิมของตนเองเพื่อพิสูจน์ความเป็น British ในบางคำขอจึงเกิดการไล่ขอเอกสารแบบเวียนเกิดย้อนขึ้นไปทางพ่อแม่และปู่ย่าตายาย
- การเวียนเกิดจะหยุดเมื่อไปถึงบรรพบุรุษที่ความเป็น British ไม่ได้ขึ้นกับพ่อแม่ของเขาอีก
- เช่น ผู้ที่ได้รับสัญชาติโดยการแปลงสัญชาติ
- เช่น ผู้ที่เกิดในสหราชอาณาจักรก่อนปี 1983 ซึ่งเป็นกรณีฐานที่เป็น British โดยไม่ขึ้นกับพ่อแม่
ลำดับคำขอในกรณีศึกษา
- วันที่ HMPO ได้รับเอกสารชุดแรกคือ 7 มิถุนายน ซึ่งรวมสูติบัตรของผู้ยื่นและสูติบัตรของพ่อผู้ยื่น
- คำขอวันที่ 12 มิถุนายน:
- มีการแจ้งว่าเพราะพ่อของผู้ยื่นเกิดหลังวันที่ 1 มกราคม 1983 จึงต้องมีหลักฐานการอ้างสิทธิ British citizenship ของพ่อ
- ผลคือมีการขอสูติบัตรของพ่อของพ่อผู้ยื่น
- คำขอวันที่ 26 มิถุนายน:
- มีการแจ้งว่าปู่ของผู้ยื่นเกิดต่างประเทศ จึงต้องมีหลักฐานการอ้างสิทธิ British citizenship
- จึงมีการขอเอกสารของทวดฝ่ายพ่อของผู้ยื่น
- เอกสารที่ต้องใช้คือสูติบัตรและทะเบียนสมรส
- การเวียนเกิดนี้เกิดขึ้นในรูปแบบคำขอทางอีเมล
โครงสร้างการนำไปใช้ใน Haskell
- โค้ดทั้งหมดอยู่ใน GitHub
- ตอนแรกเข้ารหัสกฎด้วย Prolog ก่อนจะเปลี่ยนมาใช้
LogicTmonad ของ Haskell - เป้าหมายไม่ใช่รายชื่อเอกสารชุดเดียว แต่คือการหาได้หลายชุดที่เป็นไปได้
- เพราะมีหลายวิธีในการอ้างสิทธิด้านสัญชาติ จึงมีหลายชุดเอกสารที่อาจต้องใช้
- ในเชิงแนวคิดจึงต้องการ
Set (Set Document)
- โมเดลเอกสารใช้ type เพื่อแทนผู้ยื่น บรรพบุรุษ และชนิดของเอกสาร
Parent = Mother | FatherPerson = Applicant | Parent Parent PersonDocument = BirthCertificate Person | MarriageCertificate Person Person | NaturalizationCertificate Person | Passport Person
- การมีเพียงรายชื่อเอกสารอย่างเดียวทำให้ยากจะเข้าใจว่าทำไมถึงเพียงพอ จึงปฏิบัติกับปัญหานี้เป็น การค้นหาการพิสูจน์
- ใช้
LogicTไล่เรียงProofทั้งหมดของความเป็น British ของผู้ยื่น - แล้วคำนวณชุดเอกสารที่ต้องใช้สำหรับแต่ละ
Proof
- ใช้
Proof และสถานะความรู้
- type ของการพิสูจน์ประกอบด้วย 3 รูปแบบ
ViaParent Person Proof: อนุมานความเป็น British ผ่านพ่อหรือแม่And Proof Proof: รวมข้ออ้างสองข้อเข้าด้วยกันEvidence Predicate: หลักฐานพื้นฐาน
- คำถามที่ต้องใช้จะถามผู้ใช้ระหว่างรัน และคำตอบก่อนหน้าจะถูกนำกลับมาใช้ซ้ำในทุกกิ่งและทุกการ backtracking
- เพื่อทำเช่นนี้จึงรวม
IO,State, และLogicTเข้าด้วยกันtype Claims = Map Predicate Knowledgetype M a = LogicT (StateT Claims IO) a
Knowledgeแบ่งเป็นSureYes,SureNo,UnsurePredicateแทนเงื่อนไขที่ต้องใช้ในการตัดสินตามกฎIsBritish PersonSettled PersonBornBefore Int PersonBornInUK PersonBornAfter Int PersonNaturalized PersonYears3LivingInUK PersonIsBritOtbd PersonMarried Person Person
แกนสำคัญของกฎการตัดสินสัญชาติ
- ฟังก์ชัน
britคือฟังก์ชันรากที่ใช้ตัดสินว่าบุคคลหนึ่งเป็น British หรือไม่- เริ่มจากตรวจ
IsBritish p - แล้วค้นหาเส้นทางความเป็น British จากการเกิดและจากการแปลงสัญชาติ
- เริ่มจากตรวจ
- การแปลงสัญชาติเป็นเส้นทางที่เรียบง่าย โดยมี ใบรับรองการแปลงสัญชาติ เป็นเอกสารหลัก
- ผู้ที่เกิดในสหราชอาณาจักรแบ่งคร่าว ๆ ได้เป็น 2 กรณี
- เกิดในสหราชอาณาจักรก่อนปี 1983 จะได้ความเป็น British เป็นกรณีฐาน
- หากเกิดหลังจากนั้น ต้องตรวจว่าพ่อหรือแม่คนใดคนหนึ่งเป็น British หรือมีสถานะ settled ในขณะนั้นหรือไม่
- กรณีเกิดนอกสหราชอาณาจักรซับซ้อนกว่า
- ต้องตรวจว่าพ่อหรือแม่เป็น British otherwise than by descent หรือไม่
- หรือพ่อหรือแม่เป็น British และมีหลักฐานว่าอาศัยอยู่ในสหราชอาณาจักรต่อเนื่อง 3 ปี
- “British otherwise than by descent” หมายถึงกรณีที่ไม่ได้เป็น British เพียงเพราะรับต่อมาจากพ่อแม่
- เช่น การแปลงสัญชาติ
- เช่น การเกิดในสหราชอาณาจักร
- เช่น เกิดต่างประเทศแต่พ่อหรือแม่ปฏิบัติงานใน “Crown Service” อยู่
การส่งต่อผ่านพ่อแม่และเงื่อนไขปี 2006
viaParentใช้แทนกรณีที่ลูกได้รับความเป็น British ผ่านพ่อหรือแม่- ระบบจะสำรวจทั้งเส้นทางผ่านแม่และผ่านพ่อ แต่เส้นทางผ่านพ่อมีเงื่อนไขเพิ่ม
- ถ้าลูกเกิดหลังปี 2006 ก็ใช้เส้นทางผ่านพ่อได้ตรง ๆ
- ถ้าเกิดก่อนปี 2006 ต้องตรวจว่าพ่อกับแม่สมรสกันตอนเกิดหรือไม่
- การนำไปใช้ยังไม่รวมเส้นทางอ้อมอย่าง “registration” และข้อกำหนดทางประวัติศาสตร์บางส่วนที่มีลักษณะเลือกปฏิบัติทางเพศ
- กฎหมายที่ปัจจุบันไม่ใช้แล้วก็อาจยังมีผลในเชิงประวัติศาสตร์เมื่อใช้ตัดสินความเป็น British ของบรรพบุรุษ
ผลการรันและ 3 เส้นทางการพิสูจน์
- การรัน
run (brit Applicant)ดำเนินไปในรูปแบบถามตอบแบบโต้ตอบ- เช่น ผู้ยื่นเกิดในสหราชอาณาจักรหรือไม่
- เช่น พ่อเป็น British otherwise than by descent หรือไม่
- เช่น ปู่ย่าตายายมีสถานะ settled หรือไม่
- ในกรณีนี้มีคำถามรวม 37 ข้อ
- ผู้ใช้ตอบ
dkได้หากไม่รู้ และระบบจะสำรวจสาขานั้นต่อ - ผลลัพธ์แสดงว่าผู้ยื่นมี 3 Britishness proof
- Proof 1:
- ผู้ยื่นเกิดหลังปี 2006
- ได้ความเป็น British ผ่านพ่อ
- พ่อเกิดในสหราชอาณาจักร
- แม่ของพ่อมีสถานะ settled ตอนพ่อเกิด
- เอกสารที่ต้องใช้คือสูติบัตรของผู้ยื่น สูติบัตรของพ่อ และเอกสารสถานะ settled ของแม่ของพ่อ
- Proof 2:
- เป็นเส้นทางที่แม่ของพ่อของพ่อเป็นผู้เกิดในสหราชอาณาจักรก่อนปี 1983
- เอกสารที่ต้องใช้รวมถึงสูติบัตรของผู้ยื่น พ่อ ปู่ แม่ของปู่ และทะเบียนสมรสของปู่ย่า
- Proof 3:
- เป็นเส้นทางที่พ่อของพ่อของพ่อ กล่าวคือทวดฝ่ายพ่อ เกิดในสหราชอาณาจักรก่อนปี 1983
- เอกสารที่ต้องใช้รวมถึงสูติบัตรของผู้ยื่น พ่อ ปู่ ทวดฝ่ายพ่อ และทะเบียนสมรสสองรุ่น
- คำขอของ HMPO ที่ว่า
Birth certificate for Applicant's Father's Father's Fatherปรากฏอยู่ในเส้นทางนี้
Crown Service และเส้นทางที่ซับซ้อนยิ่งขึ้น
- ในกรณีนี้ สถานะ Crown Service ของทวดฝ่ายพ่อทำให้สับสน แต่จากผลการรันพบว่าไม่จำเป็นต่อการพิสูจน์นี้
- สถานะ British otherwise than by descent ของพ่อสรุปได้อยู่แล้วจากการเกิดในสหราชอาณาจักรและความเป็น British แบบธรรมดาของปู่
- อย่างไรก็ดี ความเป็น British แบบธรรมดาของปู่ยังต้องพิสูจน์ต่อ จึงทำให้การเวียนเกิดลงไปถึงรุ่นปู่
- เพื่อพิสูจน์ “legitimacy” ของปู่ จึงต้องใช้ทะเบียนสมรสด้วย
- เส้นทางที่ HMPO เลือกคือ Proof 3 ซึ่งยาวและซับซ้อนที่สุดในสามทาง
- Proof 1 ง่ายกว่า เพราะต้องพิสูจน์เพียงสถานะ settled ของบรรพบุรุษคนเดียว
- การได้สัญชาติผ่านบรรพบุรุษที่ settled แต่ไม่ใช่ British อาจง่ายกว่าเพราะไม่เกิดการเวียนเกิดต่อ
- อย่างไรก็ดี การพิสูจน์สถานะ settled ณ ช่วงเวลาหนึ่งก็อาจทำได้ยากในตัวมันเอง
ข้อจำกัดของการนำไปใช้และมุมมองต่อระบบอัตโนมัติ
orElseจะไม่สำรวจสาขาที่สองหากสาขาแรกสำเร็จ แต่<|>จะสำรวจทั้งสองสาขา- ในบางกฎ ถ้าใช้
<|>จะได้เส้นทางพิสูจน์สัญชาติมากขึ้น แต่ดูเหมือนว่า HMPO จะพยายามไล่ใช้เส้นทางเฉพาะบางทางให้สุดก่อน - การนำไปใช้ยังติดตามเงื่อนไข ณ เวลาหนึ่งได้ไม่ละเอียดพอ
- เช่น กรณีที่สถานะการสมรสหรือสถานะ settled ต้องเป็นจริง ณ ตอนบุคคลอีกคนเกิด
- ผู้เขียนมองว่าส่วนนี้เพิ่มได้ไม่ยาก
- โค้ดนี้ไม่ได้ครอบคลุมกฎหมายสัญชาติสหราชอาณาจักรทั้งหมด แต่เข้ารหัสเฉพาะส่วนที่เกี่ยวกับกรณีนี้หรือที่น่าสนใจ
- หากจะทำให้ครบทั้งหมดจะต้องมีโค้ดมากกว่านี้มากและมีข้อยกเว้นจำนวนมาก
- หากมีซอฟต์แวร์ลักษณะนี้ ก็น่าจะช่วยจัดชุดเอกสารที่ถูกต้องได้เร็วขึ้น และช่วยให้เข้าใจว่าทำไมคำขอจึงซับซ้อนขึ้น
- แต่การทำให้เป็นอัตโนมัติทั้งหมดก็มีความเสี่ยง
- ถ้าโปรแกรมให้ false positive ก็อาจเกิดการโต้แย้งว่า “คอมพิวเตอร์บอกว่าทำได้”
- การใช้ระบบอัตโนมัติแทนผู้เชี่ยวชาญมนุษย์อาจนำไปสู่สถานการณ์ที่การขอสัญชาติถูกปฏิเสธเพราะ “คอมพิวเตอร์บอกว่าทำไม่ได้”
- ปัจจุบันคำขอนี้ยังไม่เสร็จสิ้น และมีแผนจะเดินหน้า Proof 2 กับ Proof 3 ไปพร้อมกัน แล้วถ้าล้มเหลวจึงค่อยลอง Proof 1
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ตลอด 10 ปีที่ผ่านมา ผมเคยดูแล ระบบขนาดใหญ่ของรัฐบาลสหราชอาณาจักร หลายระบบ และบทความนี้แสดงให้เห็นได้ดีว่าทำไมเวลาเราสร้างบริการ/ซอฟต์แวร์ภาครัฐถึงมักได้ผลลัพธ์แปลก ๆ
โดยเนื้อแท้แล้ว ซอฟต์แวร์ภาครัฐคือการแปลง กฎหมายของรัฐสภา ที่สั่งสมมาหลายร้อยปีให้กลายเป็นโค้ด ถ้าสร้างระบบหนังสือเดินทางของ HMPO แล้วกฎหมายที่เป็นฐานของระบบนั้นเปลี่ยนหรือถูกยกเลิก ก็ต้องมีใครสักคนไปไล่หาว่าส่วนไหนในทุกระบบได้รับผลกระทบจากกฎหมายนั้น แล้วแก้ไข
แถมรัฐบาลยังมักจ้างเอาต์ซอร์สบริษัทที่ปรึกษาราคาแพง และบริษัทเหล่านั้นก็มีแรงจูงใจที่จะขยายสัญญา ปักหลักอยู่ต่อ และดึงมูลค่าสูงสุดจากลูกค้า พอสร้างระบบที่คุณภาพและความยืดหยุ่นไม่สม่ำเสมอ กระบวนการเดิมก็เกิดซ้ำทุกครั้งที่กฎหมายเปลี่ยน
เมื่อก่อนยังมีอำนาจตัดสินใจส่วนกลางอย่าง Spend Controls แต่ตอนนี้ไม่มีศูนย์กลางมาประสานปัญหานี้แล้ว ต้นทุนการให้บริการของภาครัฐจึงแพงขนาดนี้
ในความเป็นจริง พวกเขาสร้างอะไรสักอย่างที่ใกล้เคียงกับคำว่าใช้งานได้ แล้ว คิดเงินเกินจริงประมาณ 1,000 เท่า สำหรับผลงานที่ดูเหมือนนักพัฒนาจูเนียร์คนเดียวทำ 3 เดือนก็น่าจะได้ แต่กลับเหมือนได้รับเงินราวกับระบบนั้นใช้งานได้จริง
แบบฟอร์มทำตามได้ง่าย จากนั้นไปที่สำนักงานครั้งเดียวเพื่อปิดขั้นตอน ใช้เวลาแค่ 10 นาที แล้วหนังสือเดินทางก็ถูกส่งมาให้ ถือว่าเป็นกระบวนการที่เจ็บปวดน้อยที่สุดเท่าที่จะเป็นไปได้
ไม่ว่าสถานการณ์ในสหราชอาณาจักรจะเป็นอย่างไร ก็ไม่ได้น่าสิ้นหวัง รัฐบาลควรเลิกกลัวการจ้างพนักงานจริง ๆ และควร นำงานพัฒนาทั้งหมดกลับมาทำภายในองค์กร
อย่างที่ชี้ไว้ งานเทคนิคทั้งหมดถูกเอาต์ซอร์สออกไป จึงดูเหมือนว่าส่วนหนึ่งของช่องว่างคือการขาดความสามารถภายในองค์กรที่จะจินตนาการและลงมือออกแบบใหม่ในระดับที่ค่อนข้างปฏิวัติ
น่าหงุดหงิดมากที่รัฐบาลใช้เงินหลายสิบล้านไปกับค่าผู้รับเหมาช่วงในโครงการ IT แต่กลับจ่ายค่าตัวตามราคาตลาดให้วิศวกรภายในที่ระยะยาวอาจถูกกว่าไม่ได้
แทนที่จะกระจายเงื่อนไขข้อยกเว้นไปทั่วโค้ด คงดีถ้ามีระบบที่แค่ป้อน “แพตช์” เข้าไปแบบเพิ่มอย่างเดียวก็พอ
ภาษาโปรแกรมเชิงตรรกะบางภาษาทำได้ในระดับหนึ่ง แต่ปัญหาจริง ๆ น่าจะอยู่ที่การไม่มี งบประมาณสำหรับหนี้ทางเทคนิค และทนายความที่ทำงานกับกฎหมายเองก็อาจได้ประโยชน์จากความซับซ้อนด้วย คงดีถ้ามีคนที่รับผิดชอบโดยเฉพาะในการทำให้กฎหมายเรียบง่ายที่สุดเท่าที่เป็นไปได้
ไวยากรณ์ของ Haskell น่าสนใจ พอมีคนอธิบายให้ฟังแล้วก็รู้สึกเป็นธรรมชาติ แต่ก่อนอธิบายกลับไม่ค่อยเป็นธรรมชาตินัก
ผมไม่คิดว่าเป็นแค่เพราะคุ้นกับภาษาตระกูล Algol (เช่น C, Python) เท่านั้น โค้ด Haskell ที่เคยเห็นมาจนถึงตอนนี้มี โอเปอเรเตอร์ ที่พยายามทำให้โค้ดกระชับมากเกินไป และดูด้วยตาเปล่าแล้วไม่ชัดว่ามันทำอะไร: https://academy.fpblock.com/haskell/tutorial/operators/
นานมาแล้วเลยไม่อยากทำซ้ำ แต่ถึงจะนับให้ฝั่ง JavaScript แบบใจกว้าง โอเปอเรเตอร์ที่ต้องใช้ใน Haskell ภาคปฏิบัติก็ไม่ได้มากกว่า JavaScript ภาคปฏิบัติ 10 เท่า แต่เป็นระดับ ประมาณ 2 เท่า
Haskell มีความซับซ้อนประกอบที่ต้องยอมรับในช่วงแรก แต่ไม่ใช่ความต่างคนละชนิดกับภาษาเริ่มต้นยอดนิยม เป็นเพียงความต่างด้านระดับเท่านั้น เรามักลืมง่ายมากว่าเราเรียนรู้เกี่ยวกับภาษาแบบ Algol มาแล้วมากแค่ไหน และซึมซับมันเข้าไปจนไม่รู้ตัว
ผมเคยสอน Java และ Python ให้เด็กมัธยมต้น/ปลายที่เพิ่งเริ่มเขียนโปรแกรม โดยเฉพาะเวลาสอนตัวต่อตัว พวกเขามักติดตรงสิ่งที่ผมเองลืมไปแล้วด้วยซ้ำว่าจำเป็นต้องอธิบาย เช่น วาง
:ใน Python ผิดตำแหน่ง หรือไม่เข้าใจว่า=ทำงานอย่างไรแม้แต่ไวยากรณ์ “พื้นฐาน” อย่าง
:และ=ก็ซับซ้อนกว่าที่เราคิดมาก คล้ายกับที่เจ้าของภาษาอังกฤษไม่รู้ตัวถึง กฎลำดับคำคุณศัพท์ ใน “big red ball” กับ “red big ball” แต่ผู้เรียนกลับชนเข้ากับมันเหมือนกำแพงถ้าหยิบโปรแกรม Java แบบสุ่มขึ้นมาโดยไม่รู้เรื่องการเขียนโปรแกรมเลย ก็แทบจะไม่เข้าใจเหมือนกัน เช่นเดียวกับการพยายามอ่านสมการโดยไม่เคยเรียนคณิตศาสตร์สักคาบ ไม่ว่าจะเป็นโอเปอเรเตอร์หรืออะไรก็ไม่เข้าใจทั้งนั้น
เกณฑ์ควรเป็นว่า หลังจากเรียนพื้นฐานและลองทำตามบทเรียนไม่กี่บทแล้ว เข้าใจได้มากแค่ไหน
คำว่าเป็นธรรมชาติน่าจะหมายถึงการเข้าใจหรือเรียนรู้ได้ง่ายแม้ไม่มีความรู้พื้นฐานหรือคำอธิบายมากกว่า
สิ่งที่ถูกบ่นจริง ๆ ก็ดูเหมือนไม่ใช่ไวยากรณ์ด้วยซ้ำ องค์ประกอบบางส่วนของ Haskell อ้างอิงโมเดลเฉพาะอย่าง monad หรือ lens และถ้าผู้อ่านไม่มีความรู้นั้นอยู่แล้ว ไวยากรณ์แบบไหนก็ไม่สามารถยัดความรู้นั้นให้ได้
ผมชอบบทความนี้ ตอนแรกเริ่มเหมือนพาโรดี แต่ค่อย ๆ กลายเป็นวิธีแก้ปัญหาที่จริงจังและงดงามสำหรับ “เกม” นั้น
พอถึงตอนจบ ถึงขั้นทำให้ผมอยากลองเล่นเอง
การยื่นขอหนังสือเดินทางสหราชอาณาจักรสามารถทำให้เสร็จทั้งหมดทางออนไลน์ได้ ยกเว้นแค่การส่งเอกสารที่จำเป็นไปยัง HMPO ทางไปรษณีย์
แม้ในกรณีที่กลายเป็นพลเมือง “ใหม่” ผ่านการรับบุตรบุญธรรม การแปลงสัญชาติ หรือสายโลหิต ก็สามารถยื่นขอ หนังสือเดินทางเล่มแรก จากนอกสหราชอาณาจักรได้ด้วยอุปกรณ์มือถือเพียงเครื่องเดียว รวมถึงการถ่ายรูป โดยไม่ต้องดาวน์โหลดแอปแยกต่างหาก
จะลองเล่น “โหมดยาก” ด้วยกระดาษกับปากกาเล่น ๆ ก็ได้ แต่จากประสบการณ์ของผม มันมีประสิทธิภาพมาก รวดเร็ว และเรียบง่าย
มันทำงานได้สมบูรณ์แบบแม้บนคอมพิวเตอร์เก่าและเบราว์เซอร์ “โบราณ” สี ข้อความ ปุ่ม ช่องกรอกข้อมูล และข้อกำหนดทั้งหมดเรียบง่าย เข้าถึงได้ง่าย และชัดเจน การนำทางทีละขั้นตอนก็เรียบง่ายและเป็นมิตรจริง ๆ
น่าเสียดายที่บริษัทจำนวนมากกว่านี้ไม่ใส่ใจลูกค้ามากพอจนลงทุนกับเว็บไซต์ที่ออกแบบมาดีแบบนี้ HMPO ทำได้ดีมาก
เทียบกันแล้ว ตอนต่ออายุหนังสือเดินทางแคนาดาจากแคลิฟอร์เนีย เป็นหนังสือเดินทางที่เสียหายหลังใช้มา 3 ปี และใช้เวลาถึง 4 เดือน กระบวนการเป็นกระดาษล้วน ๆ และมีเงื่อนไขไร้สาระ เช่น ต้องมีผู้รับรองและตราประทับของช่างภาพบนรูปถ่าย
ผมรู้ว่ามีโครงการนำร่องดิจิทัลอยู่ แต่ควรนำมาใช้เต็มรูปแบบให้เร็วที่สุด
ต้องมีการสัมภาษณ์ตัวต่อตัว และต้องมีลายเซ็นของ บุคคลที่มีความรับผิดชอบ ซึ่งหลายคนเข้าถึงไม่ได้ ตัวอย่างเช่น แพทย์ไม่ถูกยอมรับ
สำหรับคนที่ทำขั้นตอนนี้ในญี่ปุ่น เอกสารที่ผมต้องส่งมีดังนี้ รายการอาจแตกต่างกันตามสถานการณ์ และโดยเฉพาะอย่างยิ่ง ผู้เขียนก็ดูเหมือนจะเกิดนอกสหราชอาณาจักร จึงอาจต้องใช้เอกสารอื่นหรือเอกสารมากกว่านี้
สิ่งที่ส่งไปคือสำเนารับรองสูติบัตรที่สั่งจาก General Register Office ของสหราชอาณาจักร, ทะเบียนครอบครัวญี่ปุ่นฉบับจริงและฉบับแปล, ใบรับรองการรับแจ้งเกิดฉบับจริงและฉบับแปล, ทะเบียนสมรสฉบับจริงและฉบับแปล, สำเนาสีทุกหน้าของหนังสือเดินทางญี่ปุ่นของเด็ก และสำเนาหนังสือเดินทางของพลเมืองสหรัฐฯ หรือสหราชอาณาจักรที่ยืนยันว่าเด็กเป็นบุตรของผม
ขั้นตอนค่อนข้างไม่ชัดเจน และโดยรวมดูเหมือนเป็นโครงสร้างที่ต้องส่งเอกสารไปเรื่อย ๆ จนกว่าเจ้าหน้าที่จะพอใจ
applicant's fatherหรือก็คือผม เกิดในสหราชอาณาจักร แต่applicant's father's fatherไม่ได้เกิดในสหราชอาณาจักร และนั่นเป็นสาเหตุของความซับซ้อนเพิ่มเติมผมเป็นคนอังกฤษ ภรรยาเป็นชาวฮังการี และเราอาศัยอยู่ในฮังการี พวกเขาขอสูติบัตรของพ่อแม่ทั้งสองฝ่ายและสูติบัตรของปู่ย่าตายายทั้งสี่คนทั้งหมด
ภรรยาไม่ได้ติดต่อกับพ่อของเธอ เราจึงต้องส่งจดหมายชี้แจงสถานการณ์ประกอบไป และก็ได้รับการยอมรับ แต่ถึงอย่างนั้น ในเมื่อสัญชาติอังกฤษของลูกชายผมมาจากสัญชาติอังกฤษของผมอยู่แล้ว ผมก็ไม่ค่อยเข้าใจว่าทำไมสัญชาติของภรรยาและสัญชาติของพ่อแม่ภรรยาถึงเกี่ยวข้อง
ไม่จำเป็นต้องถ่ายสำเนาหนังสือเดินทางของคนอื่น แต่ต้องให้เพื่อนครอบครัวยืนยันทางออนไลน์ เพื่อนครอบครัวคนนั้นเป็นทนายความในสหราชอาณาจักร จึงอยู่ในรายชื่ออาชีพที่ได้รับอนุมัติ
เพราะลูกสาวเกิดในสหรัฐฯ ผมจึงต้องยื่น คำขอ MN1 เนื่องจากทั้งผมและคู่สมรสต่างก็เกิดในต่างประเทศ
อย่างที่ต้นเรื่องบอกเป็นนัย นี่เป็นเหมือน side quest ประเภท “การลงทะเบียน” และถ้าไม่ทำก่อนเด็กอายุ 18 ปี ก็จะเลยกำหนดไป แน่นอน ผมเข้าใจว่าแม้ในสถานการณ์แบบนี้ก็ยังมีเส้นทางบางอย่างในการได้สัญชาติอยู่
ส่วนที่ยากที่สุดของกระบวนการคือการหาคนมารับรองเอกสารหลักฐานของผม ซึ่งเวอร์ชันนี้ของ Passport Application ไม่ได้ครอบคลุม แต่ดูเหมือนจะเป็นสิ่งที่จะโผล่มาใน DLC pack ในอนาคต ระบุให้ส่งต้นฉบับ แต่เพราะเขาจะเก็บเอกสารไว้ 3–6 เดือน รวมถึงหนังสือเดินทางด้วย จึงไม่สมจริงสำหรับผู้พำนักในต่างประเทศ
ผมจำกฎที่แน่ชัดไม่ได้ แต่ใช้โนตารีพับลิกของสหรัฐฯ หรือกระบวนการรับรองโดยทนายความทั่วไปไม่ได้ สุดท้ายต้องไปที่สำนักงานเขต
ผมโทรไปประมาณห้าเขต ทุกแห่งบอกว่าไม่รู้ขั้นตอนหรือข้อกำหนด สุดท้ายไปเจอคนที่ Islington Council ซึ่งช่วยเหลือดีมาก ถึงอย่างนั้นก็ยังจัดอยู่ในกลุ่มประสบการณ์ติดต่อกับรัฐบาลสหราชอาณาจักรที่น่าหงุดหงิดกว่าครั้งอื่น ๆ ของผม
ผมก็เคยสนุกกับเกม Passport Application ในฐานะตัวแทนเหมือนกัน
กฎที่น่าสนใจข้อหนึ่งที่ต้นเรื่องไม่ได้กล่าวถึงคือกฎ ประวัติศาสตร์แปรผัน ข้อเท็จจริงในเอกสารหนึ่งฉบับสามารถเปลี่ยนแปลงได้แม้ในช่วงเวลาสั้น ๆ ดังนั้นเอกสารที่ถูกสแกนเข้าไปในระบบบันทึกข้อเท็จจริงของผู้ตรวจสอบแล้ว อาจต้องถูกส่งกลับมาเพื่อสแกนใหม่ภายหลัง
ว่ากันว่าการตรวจสอบว่าข้อเท็จจริงในเอกสารไม่ได้เปลี่ยนไป หมายความว่าเผ่าพันธุ์ผู้ตรวจสอบยอมรับโดยปริยายถึงการมีอยู่ของพหุจักรวาล
ช่องทางสื่อสารระหว่างเจ้าหน้าที่คอลเซ็นเตอร์ “NPC” กับผู้ตรวจสอบดูคล้ายการสวดภาวนา และสิ่งที่ได้รับจริง ๆ มีเพียงการอนุมานที่คลุมเครือ
อีกอย่าง ผู้เขียนต้นเรื่องอาจเป็นแฟนของ Mornington Crescent ก็ได้ เป็นเกมที่ดูเหมือนมี topology ของกฎคล้ายกับ Passport Application ที่กล่าวถึงข้างต้น
สูติบัตรเองก็ในบางแง่เปลี่ยนไม่ได้ แต่ไม่ใช่ทุกอย่างที่เขียนอยู่ในนั้นจะเปลี่ยนไม่ได้โดยสิ้นเชิง
แถมสำนักงานหนังสือเดินทางยังลืมคำตัดสินเกี่ยวกับหนังสือเดินทางครั้งก่อนของผมที่เคยอธิบายและปล่อยผ่านความไม่ตรงกันของนามสกุลนี้ไปแล้วด้วยซ้ำ กระทั่งหนังสือเดินทางเล่มหนึ่งยังมีชื่อผมอยู่ในหน้าหนึ่งของหนังสือเดินทางแม่ด้วย
พวก NPC ทำให้โมโหมาก ทุกครั้งที่โทรหรือส่งอีเมลไป คำตอบไม่เหมือนกันเลย เหมือน โมเดลภาษาขนาดใหญ่ ห่วย ๆ
หลังยื่นคำขอแล้ว ผมต้องอธิบายให้แม่ฟังว่า ในชุดคำขอเดียวกัน ลูกสาวคนหนึ่งต้องใช้เอกสารอังกฤษเพิ่มเติม แต่อีกคนไม่ต้องใช้และได้หนังสือเดินทางออกมาแล้ว เพียงเพราะคนหนึ่งเกิดในสหราชอาณาจักร ส่วนอีกคนไม่ได้เกิดที่นั่น
แม่ผมระเบิดอารมณ์อย่างที่ควรจะเป็น ยกเรื่องไปถึงสมาชิกรัฐสภา และได้รับการแก้ไขภายในหนึ่งวัน
ผมเพิ่งผ่านขั้นตอนนรกนี้มาเพราะลูกสาวคนหนึ่ง ลูกสาวเกิดที่ญี่ปุ่น และผมลำบากมากกับการทำให้นามสกุลของแม่ตรงกับที่ระบุในสูติบัตรของผม
พูดสั้น ๆ คือ ในเมื่อผมพิสูจน์แล้วว่าผมเกิดในอังกฤษและมีสัญชาติ หรือก็คือมีหนังสือเดินทาง ไม่ว่าจะพิจารณาความเป็นไปได้แบบไหน ก็ดูควรเป็นสถานะที่ส่งต่อให้ลูกสาวได้ แม้จะไม่ตรงกับแนวทางเอกสารที่กำหนด แต่ผมเห็นว่าเป็นวิธีที่เจ็บปวดน้อยกว่ามาก
ส่วนที่ว่า “base case คืออะไร? base case คือบรรพบุรุษที่สถานะความเป็นชาวอังกฤษไม่ได้ขึ้นกับพ่อแม่ เช่น คนที่แปลงสัญชาติ หรือเกิดในอังกฤษก่อนปี 1983 ยิ่งไกลจากปี 1983 ไปสู่อนาคต call stack นี้ก็ยิ่งลึกขึ้น” นั้น จากมุมมองของคนที่มาจากประเทศซึ่งมีฐานข้อมูลกลางของพลเมืองและผู้อยู่อาศัยชาวต่างชาติ และการตรวจสอบสัญชาติเป็นแค่
SELECTเดียวในตาราง SQL ดูเหมือนเรื่องบ้ามากคนที่เกิดในต่างประเทศก็มักเป็นพลเมืองได้ และสหราชอาณาจักรผ่าน การเปลี่ยนแปลงดินแดน ที่ส่งผลต่อสัญชาติมามากอย่างเหลือเชื่อ
พลเมืองปัจจุบันบางส่วนมีสัญชาติเพราะเกิดที่ Bombay หรือก็คือ Mumbai และบางส่วนมีสัญชาติเพราะเกิดที่ Hong Kong
ถ้าจะรักษารายชื่อพลเมืองที่เชื่อถือได้ ก็ต้องมีการลงทะเบียนเป็นระยะ และต้องให้ผู้ที่ไม่ลงทะเบียนสูญเสียสัญชาติ
SELECTเดียวในตาราง SQL ได้ ต่อให้อัตราต่อรองเสียเปรียบผมสุด ๆ ผมก็ยินดีพนันเมื่อหลายปีก่อนผมเคยเล่นเกมนี้
แม้จะเกิดในสหราชอาณาจักรจากพ่อชาวอังกฤษ แต่ตัวละครของผมเมื่อก่อนก็ยังไม่ใช่ชาวอังกฤษ เพราะพ่อแม่ไม่ได้แต่งงานกัน และผมเกิดหลังปี 1983 แต่ก่อนการเปลี่ยนกฎในปี 2006
ผมไม่แน่ใจเวลาที่แน่นอน แต่ดูเหมือนว่าในช่วงใดช่วงหนึ่งของทศวรรษ 2010 การอัปเดตปี 2006 ถูกบังคับใช้ย้อนหลัง ทำให้ตัวละครของผมเล่นได้ด้วย ผมไม่ได้ทำ side quest มากนัก สิ่งสำคัญคือการหาใบสูติบัตรของพ่อ
ตัวละครของผมก็ต้องเข้าร่วมพิธี endgame และสาบานความจงรักภักดีต่อราชินีด้วย ซึ่งรู้สึกแปลกสำหรับคนที่เกิดในประเทศนี้และใช้ชีวิตที่นี่มาตลอด