Haskell로 UK 'Passport Application' 문제 해결하기
(jameshaydon.github.io)- 영국에서 여권 신청 절차를 퍼즐 게임처럼 바라보고, 이 복잡한 신청 과정을 Haskell로 프로그래밍하여 규칙화한 경험을 다룸
- 온라인 여권 신청은 다양한 문서 수집과 복잡한 규칙 해석, 그리고 예기치 못한 서브 퀘스트가 핵심 재미 요소임
- 신청 과정의 논리를 'Constructive Logic'과 연결해, 각각의 증명을 뒷받침하는 원본 문서가 필수임을 강조
- Haskell의 LogicT 모나드와 상태 관리(State)를 활용해, 필요한 문서 목록과 영국 시민권 증명의 논리적 경로를 추적함
- HMPO가 실제론 가장 복잡한 증명경로를 먼저 요구하는 경향이 있으며, 자동화 도구는 복잡한 법률 해석의 한계로 도입이 더딘 실정임
서론: 여권 신청을 게임처럼
- 최근 프로그래밍을 이용해 온라인 게임이나 퍼즐을 해결하는 트렌드가 증가하는 가운데, 영국의 Passport Application도 이런 시도로 다룸
- Passport Application은 약 £100의 비용과 철저한 미니멀 텍스트 기반 디자인을 가진, 영국인들이 10년마다 즐기는 일종의 "모험 퍼즐 문서 수집 게임"임
- 이 게임의 목표는 여러 관공서를 통해 여러 증빙 서류(artefacts) 를 모아 "이 지원자는 영국인임"을 복잡한 법적 기준 하에 증명하는 것임
- 게임의 보상은 여권 책자 한 권과 "다음 플레이가 가능한 날짜"임
게임의 구조와 난이도
- 종이 기반 오프라인 버전은 등기우편과 인증 절차로 진행되며, 각 단계별로 모아야 할 문서가 설명서 또는 표 형태로 안내됨
- 초기 절차는 비교적 쉽지만, 게임이 진행될수록 다양한 "사이드 퀘스트"와 난관이 등장함
- 예: 특정 직업을 가진 지인에게 신원확인을 의뢰, 외국어 서류의 인증 번역본 확보, 가족 협동플레이, 각 관공서의 고유한 행정 절차 탐험 등
체험기: '첫 해외출생 자녀' 난이도 도전
- 필자는 본인을 대신하여 어린 딸의 '첫 해외출생 아동' 난이도에 도전, 이미 다수의 경험이 있어 상당한 난이도를 예상함
- 초기 문서요구 중 절반은 불필요한 것임이 나중에 확인되며, 서류 요구 사항과 설명이 상당히 모호하거나 혼란스럽게 설계됨
- 담당 심사관(examiner)은 직접 소통 불가하고, 오직 상담 중계 에이전트를 통해 비공식적 조력만 받을 수 있음
- 반복적으로 요구 문서가 생기고, 때로는 존재하지 않는 서류까지 요구되며, 희귀한 가족 선조의 출생/혼인증명서 제출 요청 등 난도가 점점 높아짐
HMPO의 논리: Bureaucratic Logic
- 여권 신청의 논리는 Constructive Logic(구성적 논리)에서 파생된 Bureaucratic Logic(관료 논리) 로 볼 수 있음
- 단순한 "참/거짓" 증명 대신, 각 규칙에 해당하는 원본 서류 증빙을 직접 제출해야만 함
- 비배제적 중간(Excluded Middle)이 허용되지 않으므로, "어느 시나리오든 하나가 맞음"으로 증명 불가, 반드시 한 경로만 따라 서류를 제출해야만 함
- 특히 "Britishness"는 부모의 국적에 의존하며, 문서 요청이 가족 트리 형태로 재귀적으로 진행됨
- 베이스 케이스: 1983년 이전 영국 출생, 귀화 등 부모 증빙이 필요 없는 경우
Haskell 코드로 규칙 모델링
- 규칙 모듈화와 추론 자동화 목적에서 Haskell(특히 LogicT 모나드 활용)로 신청 로직 프로토타이핑
- Person/Document/Proof 등 타입을 선언하여, 각 조건에 따른 다양한 증빙 문서 경로 모델링
- Britishness 증명 함수는 input(각 person에 대한 정보)과 함께 가능한 여러 증명 경로(Set of Proofs) 를 탐색
- Proof 트리를 따라 필요한 최소 문서 조합(Set of Set Document) 을 산출
- StateT 및 LogicT IO 조합으로 인터랙티브 질의 및 상태 공유, "알고 있는 정보"에 따라 분기 & 백트래킹
- 영국 시민권 구조 분석 로직:
- 귀화 증거 단일 경로
- 1983년 이전 영국 출생시 조건부(베이스) 경로
- 부모를 통한 재귀적 증명(합법적 혼인 등 추가 조건 포함)
- 부모가 BOTBD(British Otherwise Than By Descent)인지 여부에 따른 특례 경로 신설
- Crown Service 등 예외 규정도 코드에서 처리
예시 실행 및 증명 경로
- ghci를 통해 실질적 입력(신청자 출생지, 부모의 국적 등)에 따라 총 3가지 증명(Proof) 경로 자동 도출
- 각 증명 경로마다 요구 문서(combination of certificates, marriage certificates 등) 목록 산출
- 가장 복잡한 경로에서는 조상까지 거슬러 올라가는 재귀적 증명과 혼인 관계 입증이 필요함을 확인
논의 및 결론
- 현실에선 HMPO가 일부러 가장 복잡한 증명경로를 먼저 요구하는 듯하며, 실제 법적 모순이나 미세 규정은 별도의 가이드라인이나 "balance of probabilities" 원칙에 따름
- 자동화 도구가 보급된다면, 신청인들은 자신의 증명 경로와 필요한 문서를 훨씬 쉽게 파악 가능함
- 그러나 법률이 워낙 미묘하고 가변적이어서 "컴퓨터가 yes/no verdict" 내리는 단순 자동화에는 위험이 있음
- 필자는 현재 두 번째, 세 번째 경로로 증명을 시도하는 중임
참고 코드 및 문서 구조 요약
- Haskell 코드 전체는 GitHub에서 확인 가능
- 다양한 타입, 증명 경로, 모듈 구조 및 질의 함수 등 Haskell 로직 상세 구현 확인 가능
Hacker News 의견
- 지난 10년 동안 다양한 대형 영국 정부 시스템에서 일했던 경험 이야기 영국 정부 소프트웨어를 개발하는 건 수백 년의 의회법을 코드화하는 과정이라는 설명 HMPO 여권 시스템처럼 법률이 변경되면 각 시스템에서 그 법이 영향을 끼친 부분을 모두 찾아 고쳐야 한다는 어려움이 있음 정부는 이 작업을 비싼 컨설팅 회사에 외주를 주는데, 이들은 계약을 최대한 길게 끌고 고객사로부터 이윤을 최대치로 뽑아내는 데 동기 부여가 됨 그 과정에서 시스템 품질과 유연성은 제각각이고, 법이 또 바뀌면 다시 이 복잡한 절차 반복 중앙에서 의사 결정을 내려 이 문제를 조율하는 기관이 부족한 이유로 정부 서비스가 비싸짐
- 정부 외주가 누군가에게 실제로 잘 작동한 사례가 있었는지 궁금증, 정부가 뭔가를 외주로 맡겨서 성공한 이야기를 한 번도 들어본 적 없음
- 외주업체들에게 ‘작동하는 시스템’에 대해 계약상 의무가 없어 보이는 이유에 대한 질문 있어 보이는 시스템을 만들면서 실질적으로 정상 동작하지 않는 시스템에 대해 지나치게 과금하는 현상에 대한 궁금증
- 최근 프랑스에서 여권을 갱신한 경험 공유 모든 서류를 위한 새로운 플랫폼이 있어 온라인 폼 한 장 작성, 오프라인 방문은 한 번만으로 끝 10분 만에 완료, 여권도 신속하게 배송됨 영국도 절망할 상황은 아니며 실제 개발자를 정규직으로 채용해 개발을 직접 진행해야 한다는 생각
- DSL을 이용해 네덜란드 세법을 자동화 및 코드화한 사례가 떠오름 관련 자료로 Jetbrains DSL 케이스 프리젠테이션 추천
- ‘base case’란 시민권 판정 구조를 설명하는 데서, 1983년 이전 영국 출생자는 부모와 무관하게 시민 자격을 갖는다는 예시 소개 본인은 시민권이 SQL 테이블에서 SELECT 한 번이면 끝나는 나라 출신인데 이런 구조가 믿기지 않음
- Haskell의 문법이 직관적이라는 평가에 대해, 누군가 설명해주고 나면 직관적이지만 그 전까지는 직관적이지 않다는 의견 Haskell은 연산자가 지나치게 많고, 코드를 봐도 바로 의미 파악이 어려운 예시로 Haskell 연산자 튜토리얼 링크 공유
- Haskell에서 실제 사용하는 연산자 개수를 거칠게 세어보니, JavaScript와 거의 비슷하거나 2배 정도 되는 수준이라는 주장 Haskell이 초기 진입장벽은 있지만 Java, Python 등 처음 배우는 언어도 나름 복잡하며, 배워서 몸에 익히면 쉽게 느껴질 뿐임 Python의 기초 문법 :와 =도 초심자에겐 혼동 포인트이므로 직관성은 익숙함의 결과라는 의견
- 누가 설명해주고 나면 직관적이 된다는 건 결국 직관적이란 것에 가까운 개념이라는 토론
- Larry Wall이 Perl에 관해 비슷한 말을 했다는 내용, 실상은 구문 문제가 아니라 Haskell의 고유 개념(모나드, 렌즈 등)을 모르면 아무리 구문이 단순해도 이해 자체가 어려움
- 링크에 있는 연산자들 대부분은 프로그래밍 초보자에겐 평범한 부분이라는 지적 자바 프로그램이나 수학 공식을 아무 맥락 없이 봐도 마찬가지로 이해하지 못함 기준은, 기본 지식을 배우고 튜토리얼을 몇 번 해본 뒤 얼만큼 이해할 수 있는지가 되어야 함
- 이 콘텐츠는 처음엔 패러디처럼 시작하지만 점점 진지하고 우아한 솔루션으로 발전함 마지막엔 나도 실제로 이 “게임”을 플레이해보고 싶어짐
- 실제로도 플레이 가능하지만 후반 엔딩 구간은 훨씬 어렵다는 코멘트
- 일본에서 실제로 영국 여권 관련 서류를 제출한 경험 공유 상황에 따라 제출 서류가 달라질 수 있고, 본인은 본인 및 자녀의 출생증명서, 일본 가족 등본 원본, 번역본, 출생신고 수리증명서 등 다수의 서류를 준비 각 페이지마다 컬러 복사, 타인의 여권 사본까지 요구 절차가 매우 불분명하고, 결국 요구가 충족될 때까지 계속 서류를 내야 하는 구조
- 코멘트 작성자의 아버지가 영국 출생이긴 한데, 조부가 외국 출생이어서 더 복잡해진 상황 설명
- 일본에서는 부모 출생증명서 요구가 없었다는 점. 본인은 헝가리와 영국의 국적을 갖고 헝가리 거주 중인데, 양측 부모와 조부모 4인의 출생증명서를 요청받음 아내와 친척 관계가 소원해 사유서를 첨부해 수용된 경험, 내 국적에서 엄마 쪽 국적/출신은 사실상 중요하지 않는데도 불구, 가족 친구(법조인)에게 온라인 확인을 요청했던 상황 공유
- 자녀 일본 여권의 모든 페이지를 컬러 복사로 제출한 이유가 궁금함
- 영국 여권 신청은 온라인으로 전부 처리 가능하며 새 시민(입양, 귀화, 혈통)을 위한 신규 신청 역시 모바일 기기만으로, 별도 앱 없이 사진 촬영까지 가능 내 경험상 효율적이고 빠르며 직관적인 과정임
- 최근 온라인 여권 갱신 시스템을 썼는데 수년간 접한 웹사이트 중 최고라는 평가 구형 컴퓨터, 오래된 브라우저에서도 완벽하게 동작, 매우 단순하고 누구나 접근하기 쉬운 UI, 친절한 단계별 네비게이션 비즈니스 분야에도 이런 설계가 더 확산됐으면 하는 바람, HMPO 찬사
- 최근 온라인 시스템을 처음 이용해봤는데, 미국 캘리포니아에서도 2주 만에 매우 빠르게 여권 수령 캐나다 여권 갱신 경험은 4개월이나 걸렸고, 까다로운 절차와 서류 필요 스마트폰 기반 디지털 갱신 파일럿이 확대 도입되길 희망
- 일본에서 딸 여권 준비하며 출생증명서의 부모 성씨 불일치 문제 등으로 큰 고생함 결국 내가 영국 출생이고 시민권(여권) 보유하므로 직계 자녀도 이를 이어갈 수 있다고 설득 표준 요구 서류와는 불일치하지만 그래도 그나마 고생이 덜한 편이라고 함
- ‘패스포트 어플리케이션’ 게임을 대리 경험했던 경험담 ‘mutable history’ 룰이 흥미로움 특정 서류의 사실관계가 짧은 동안에도 변경될 수 있어 이미 스캔된 문서도 다시 제출·스캔해야 하는 경우가 있음 이 과정은 판관들이 평행우주(multiverse)를 암묵적으로 인정하는 걸로 볼 수 있다는 우스갯소리 “NPC” 역할의 상담원들과 실무자들 간의 소통은 일방적 기도(prayer) 같은 느낌, 전달이 잘 안 됨 OP가 Mornington Crescent라는 게임의 팬 같다는 추측, 패스포트 신청과 규칙이 유사함
- 영국 시스템에서는 이름을 자유롭게 바꿀 수 있어서 내 어머니조차 세 번째 결혼의 성으로 내 출생등록 가능 출생증명서도 일부 항목만 불변이어서 완전히 불변인 건 아님 패스포트 오피스는 이전 이력도 잊는 경우가 있어서 내 여권 관련 성씨 불일치는 이전에 설명하고도 다시 문제 됨 상담원(NPC)들에게 전화, 이메일, 문의할 때마다 서로 다른 답변만 받음 GPT처럼 일관성이 없었음 같은 서류를 내더라도 한 딸은 추가 요청을 받고, 다른 딸은 아무 문제 없이 발급받은 사건 발생 이를 엄마가 국회의원에게 항의해 하루 만에 해결됨
- 몇 년 전 패스포트 어플리케이션 ‘게임’을 해본 경험 공유 본인은 영국 출생, 영국인 아버지였지만 부모가 미혼이고 1983년 이후 2006년 규정 개정 전 출생이라 초기에는 시민이 아니었음 2010년대쯤 2006년 법이 소급 적용되어 시민 인정을 받음 주요 “퀘스트”는 아버지 출생증명서 원본 제출이었고, 마지막에는 ‘여왕에 대한 충성 선서식’ 강제 참석까지 해야 했던 이상함
- 최소한 엔딩 크레딧은 받는다는 농담