1 คะแนน โดย GN⁺ 2025-06-29 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • กรณีศึกษาที่มองขั้นตอนขอหนังสือเดินทางสหราชอาณาจักรเป็นปริศนาการรวบรวมเอกสารแบบราชการ และคำนวณชุดเอกสารที่ต้องใช้เพื่อพิสูจน์สัญชาติด้วยการค้นหาเชิงตรรกะใน 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 ก่อนจะเปลี่ยนมาใช้ LogicT monad ของ Haskell
  • เป้าหมายไม่ใช่รายชื่อเอกสารชุดเดียว แต่คือการหาได้หลายชุดที่เป็นไปได้
    • เพราะมีหลายวิธีในการอ้างสิทธิด้านสัญชาติ จึงมีหลายชุดเอกสารที่อาจต้องใช้
    • ในเชิงแนวคิดจึงต้องการ Set (Set Document)
  • โมเดลเอกสารใช้ type เพื่อแทนผู้ยื่น บรรพบุรุษ และชนิดของเอกสาร
    • Parent = Mother | Father
    • Person = Applicant | Parent Parent Person
    • Document = 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 Knowledge
    • type M a = LogicT (StateT Claims IO) a
  • Knowledge แบ่งเป็น SureYes, SureNo, Unsure
  • Predicate แทนเงื่อนไขที่ต้องใช้ในการตัดสินตามกฎ
    • IsBritish Person
    • Settled Person
    • BornBefore Int Person
    • BornInUK Person
    • BornAfter Int Person
    • Naturalized Person
    • Years3LivingInUK Person
    • IsBritOtbd Person
    • Married 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 ความคิดเห็น

 
GN⁺ 2025-06-29
ความคิดเห็นจาก Hacker News
  • ตลอด 10 ปีที่ผ่านมา ผมเคยดูแล ระบบขนาดใหญ่ของรัฐบาลสหราชอาณาจักร หลายระบบ และบทความนี้แสดงให้เห็นได้ดีว่าทำไมเวลาเราสร้างบริการ/ซอฟต์แวร์ภาครัฐถึงมักได้ผลลัพธ์แปลก ๆ
    โดยเนื้อแท้แล้ว ซอฟต์แวร์ภาครัฐคือการแปลง กฎหมายของรัฐสภา ที่สั่งสมมาหลายร้อยปีให้กลายเป็นโค้ด ถ้าสร้างระบบหนังสือเดินทางของ HMPO แล้วกฎหมายที่เป็นฐานของระบบนั้นเปลี่ยนหรือถูกยกเลิก ก็ต้องมีใครสักคนไปไล่หาว่าส่วนไหนในทุกระบบได้รับผลกระทบจากกฎหมายนั้น แล้วแก้ไข
    แถมรัฐบาลยังมักจ้างเอาต์ซอร์สบริษัทที่ปรึกษาราคาแพง และบริษัทเหล่านั้นก็มีแรงจูงใจที่จะขยายสัญญา ปักหลักอยู่ต่อ และดึงมูลค่าสูงสุดจากลูกค้า พอสร้างระบบที่คุณภาพและความยืดหยุ่นไม่สม่ำเสมอ กระบวนการเดิมก็เกิดซ้ำทุกครั้งที่กฎหมายเปลี่ยน
    เมื่อก่อนยังมีอำนาจตัดสินใจส่วนกลางอย่าง Spend Controls แต่ตอนนี้ไม่มีศูนย์กลางมาประสานปัญหานี้แล้ว ต้นทุนการให้บริการของภาครัฐจึงแพงขนาดนี้

    • สงสัยว่าทำไมตามสัญญาแล้วผู้รับเหมาช่วงดูเหมือนไม่มีหน้าที่ต้องสร้าง ระบบที่ใช้งานได้จริง
      ในความเป็นจริง พวกเขาสร้างอะไรสักอย่างที่ใกล้เคียงกับคำว่าใช้งานได้ แล้ว คิดเงินเกินจริงประมาณ 1,000 เท่า สำหรับผลงานที่ดูเหมือนนักพัฒนาจูเนียร์คนเดียวทำ 3 เดือนก็น่าจะได้ แต่กลับเหมือนได้รับเงินราวกับระบบนั้นใช้งานได้จริง
    • เมื่อไม่นานมานี้ผมต่ออายุหนังสือเดินทางในฝรั่งเศส มีแพลตฟอร์มค่อนข้างใหม่ที่ใช้ยื่นขอเอกสารทั้งหมดที่ต้องใช้ได้ และกรอกแบบฟอร์มออนไลน์เพียงชุดเดียวก็พอ
      แบบฟอร์มทำตามได้ง่าย จากนั้นไปที่สำนักงานครั้งเดียวเพื่อปิดขั้นตอน ใช้เวลาแค่ 10 นาที แล้วหนังสือเดินทางก็ถูกส่งมาให้ ถือว่าเป็นกระบวนการที่เจ็บปวดน้อยที่สุดเท่าที่จะเป็นไปได้
      ไม่ว่าสถานการณ์ในสหราชอาณาจักรจะเป็นอย่างไร ก็ไม่ได้น่าสิ้นหวัง รัฐบาลควรเลิกกลัวการจ้างพนักงานจริง ๆ และควร นำงานพัฒนาทั้งหมดกลับมาทำภายในองค์กร
    • ผมคิดว่าอาจมีโอกาสสำหรับ ระบบกฎแบบโอเพนซอร์สที่นำกลับมาใช้ซ้ำได้ รัฐบาลทุกระดับน่าจะใช้ระบบที่กำหนดกฎได้อย่างมีพลังในการแสดงออก และทำเวอร์ชันคอนโทรลได้
      อย่างที่ชี้ไว้ งานเทคนิคทั้งหมดถูกเอาต์ซอร์สออกไป จึงดูเหมือนว่าส่วนหนึ่งของช่องว่างคือการขาดความสามารถภายในองค์กรที่จะจินตนาการและลงมือออกแบบใหม่ในระดับที่ค่อนข้างปฏิวัติ
      น่าหงุดหงิดมากที่รัฐบาลใช้เงินหลายสิบล้านไปกับค่าผู้รับเหมาช่วงในโครงการ IT แต่กลับจ่ายค่าตัวตามราคาตลาดให้วิศวกรภายในที่ระยะยาวอาจถูกกว่าไม่ได้
    • ปัญหาที่กฎหมายโดยเนื้อแท้กลายเป็นเหมือน รีโพซิทอรีแบบเพิ่มอย่างเดียว ที่มีการแก้ไขเพิ่มเติมต่อไปเรื่อย ๆ ไม่ใช่เรื่องของสหราชอาณาจักรประเทศเดียว
      แทนที่จะกระจายเงื่อนไขข้อยกเว้นไปทั่วโค้ด คงดีถ้ามีระบบที่แค่ป้อน “แพตช์” เข้าไปแบบเพิ่มอย่างเดียวก็พอ
      ภาษาโปรแกรมเชิงตรรกะบางภาษาทำได้ในระดับหนึ่ง แต่ปัญหาจริง ๆ น่าจะอยู่ที่การไม่มี งบประมาณสำหรับหนี้ทางเทคนิค และทนายความที่ทำงานกับกฎหมายเองก็อาจได้ประโยชน์จากความซับซ้อนด้วย คงดีถ้ามีคนที่รับผิดชอบโดยเฉพาะในการทำให้กฎหมายเรียบง่ายที่สุดเท่าที่เป็นไปได้
    • การเอาต์ซอร์สเคยสำเร็จจริง ๆ สำหรับใครบ้างไหม? แทบไม่เคยได้ยินเรื่องที่รัฐบาลเอาต์ซอร์สอะไรสักอย่างแล้วประสบความสำเร็จเลย
  • ไวยากรณ์ของ Haskell น่าสนใจ พอมีคนอธิบายให้ฟังแล้วก็รู้สึกเป็นธรรมชาติ แต่ก่อนอธิบายกลับไม่ค่อยเป็นธรรมชาตินัก
    ผมไม่คิดว่าเป็นแค่เพราะคุ้นกับภาษาตระกูล Algol (เช่น C, Python) เท่านั้น โค้ด Haskell ที่เคยเห็นมาจนถึงตอนนี้มี โอเปอเรเตอร์ ที่พยายามทำให้โค้ดกระชับมากเกินไป และดูด้วยตาเปล่าแล้วไม่ชัดว่ามันทำอะไร: https://academy.fpblock.com/haskell/tutorial/operators/

    • เมื่อก่อนผมเคยนับคร่าว ๆ แล้ว จำนวนโอเปอเรเตอร์ที่เจอในโค้ด Haskell “ทั่วไป” ที่หลีกเลี่ยง lens หรือไลบรารีเฉพาะโดเมน ค่อนข้างใกล้เคียงกับจำนวนโอเปอเรเตอร์ที่เจอใน JavaScript
      นานมาแล้วเลยไม่อยากทำซ้ำ แต่ถึงจะนับให้ฝั่ง JavaScript แบบใจกว้าง โอเปอเรเตอร์ที่ต้องใช้ใน Haskell ภาคปฏิบัติก็ไม่ได้มากกว่า JavaScript ภาคปฏิบัติ 10 เท่า แต่เป็นระดับ ประมาณ 2 เท่า
      Haskell มีความซับซ้อนประกอบที่ต้องยอมรับในช่วงแรก แต่ไม่ใช่ความต่างคนละชนิดกับภาษาเริ่มต้นยอดนิยม เป็นเพียงความต่างด้านระดับเท่านั้น เรามักลืมง่ายมากว่าเราเรียนรู้เกี่ยวกับภาษาแบบ Algol มาแล้วมากแค่ไหน และซึมซับมันเข้าไปจนไม่รู้ตัว
      ผมเคยสอน Java และ Python ให้เด็กมัธยมต้น/ปลายที่เพิ่งเริ่มเขียนโปรแกรม โดยเฉพาะเวลาสอนตัวต่อตัว พวกเขามักติดตรงสิ่งที่ผมเองลืมไปแล้วด้วยซ้ำว่าจำเป็นต้องอธิบาย เช่น วาง : ใน Python ผิดตำแหน่ง หรือไม่เข้าใจว่า = ทำงานอย่างไร
      แม้แต่ไวยากรณ์ “พื้นฐาน” อย่าง : และ = ก็ซับซ้อนกว่าที่เราคิดมาก คล้ายกับที่เจ้าของภาษาอังกฤษไม่รู้ตัวถึง กฎลำดับคำคุณศัพท์ ใน “big red ball” กับ “red big ball” แต่ผู้เรียนกลับชนเข้ากับมันเหมือนกำแพง
    • โอเปอเรเตอร์ส่วนใหญ่ในลิงก์นั้นเป็นของมาตรฐานมาก ๆ และเป็นหนึ่งในส่วนที่น่าสนใจน้อยที่สุดเมื่อพูดถึง Haskell
      ถ้าหยิบโปรแกรม Java แบบสุ่มขึ้นมาโดยไม่รู้เรื่องการเขียนโปรแกรมเลย ก็แทบจะไม่เข้าใจเหมือนกัน เช่นเดียวกับการพยายามอ่านสมการโดยไม่เคยเรียนคณิตศาสตร์สักคาบ ไม่ว่าจะเป็นโอเปอเรเตอร์หรืออะไรก็ไม่เข้าใจทั้งนั้น
      เกณฑ์ควรเป็นว่า หลังจากเรียนพื้นฐานและลองทำตามบทเรียนไม่กี่บทแล้ว เข้าใจได้มากแค่ไหน
    • ผมว่า “พออธิบายแล้วเป็นธรรมชาติ แต่ก่อนอธิบายไม่ใช่” ค่อนข้างใกล้กับความหมายของคำว่าเป็นธรรมชาติอยู่นะ
      คำว่าเป็นธรรมชาติน่าจะหมายถึงการเข้าใจหรือเรียนรู้ได้ง่ายแม้ไม่มีความรู้พื้นฐานหรือคำอธิบายมากกว่า
    • ผมจำได้ว่า Larry Wall เคยพูดทำนองเดียวกันเกี่ยวกับ Perl บางอย่างจะเป็นธรรมชาติได้ก็ต่อเมื่อเรียนรู้แล้ว
      สิ่งที่ถูกบ่นจริง ๆ ก็ดูเหมือนไม่ใช่ไวยากรณ์ด้วยซ้ำ องค์ประกอบบางส่วนของ Haskell อ้างอิงโมเดลเฉพาะอย่าง monad หรือ lens และถ้าผู้อ่านไม่มีความรู้นั้นอยู่แล้ว ไวยากรณ์แบบไหนก็ไม่สามารถยัดความรู้นั้นให้ได้
  • ผมชอบบทความนี้ ตอนแรกเริ่มเหมือนพาโรดี แต่ค่อย ๆ กลายเป็นวิธีแก้ปัญหาที่จริงจังและงดงามสำหรับ “เกม” นั้น
    พอถึงตอนจบ ถึงขั้นทำให้ผมอยากลองเล่นเอง

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

    • ปีที่แล้วผมได้ลองใช้ระบบต่ออายุหนังสือเดินทางออนไลน์ของสหราชอาณาจักร และมันเป็นหนึ่งในเว็บไซต์ที่ดีที่สุดที่ผมได้ใช้ในรอบนานมาก ๆ สดใหม่จริง ๆ
      มันทำงานได้สมบูรณ์แบบแม้บนคอมพิวเตอร์เก่าและเบราว์เซอร์ “โบราณ” สี ข้อความ ปุ่ม ช่องกรอกข้อมูล และข้อกำหนดทั้งหมดเรียบง่าย เข้าถึงได้ง่าย และชัดเจน การนำทางทีละขั้นตอนก็เรียบง่ายและเป็นมิตรจริง ๆ
      น่าเสียดายที่บริษัทจำนวนมากกว่านี้ไม่ใส่ใจลูกค้ามากพอจนลงทุนกับเว็บไซต์ที่ออกแบบมาดีแบบนี้ HMPO ทำได้ดีมาก
    • เพิ่งลองต่ออายุผ่านระบบออนไลน์เป็นครั้งแรกเมื่อไม่นานนี้ และกระบวนการทั้งหมดรวดเร็วเป็นพิเศษ ผมยื่นจากแคลิฟอร์เนียและได้รับหนังสือเดินทางคืนภายใน ไม่ถึง 2 สัปดาห์
      เทียบกันแล้ว ตอนต่ออายุหนังสือเดินทางแคนาดาจากแคลิฟอร์เนีย เป็นหนังสือเดินทางที่เสียหายหลังใช้มา 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 และสาบานความจงรักภักดีต่อราชินีด้วย ซึ่งรู้สึกแปลกสำหรับคนที่เกิดในประเทศนี้และใช้ชีวิตที่นี่มาตลอด

    • แต่ก็ยังได้ bonus ending credits นะ!