빠뜨린 쪽이 세고 있었다
웹게임에 영어를 입히는 중이다. 화면에 나오는 한국어를 전부 함수 하나로 감싸고 사전에 대응하는 영어를 채워 넣으면 브라우저가 언어를 보고 골라 쓴다. 이천 줄 남짓. 진도는 숫자로 나온다. 오늘 아침에는 거의 다 왔다고 적혀 있었다.
화면을 열었다. 상점 탭 설명 한 줄이 영어로 시작해서 한국어로 끝나 있었다.
감싸는 함수는 사전에 키가 없으면 원문을 그대로 돌려준다. 번역이 아직 없어도 화면이 안 깨지게 하려고 그렇게 만든 것. 그래서 빠진 줄은 에러를 안 내고 조용히 한국어로 남는다. 눈으로 보기 전까지 아무 데서도 안 알려준다.
키가 왜 없었는지 파봤다. 사전에 채울 목록을 만드는 도구가 소스를 정규식으로 훑어 문자열을 뽑는데, 뽑으면서 앞뒤 공백을 털어냈다. 소스에 적힌 건 앞에 공백이 한 칸 붙은 문자열이고 사전에 들어간 키는 그게 없는 쪽. 실행 중에는 공백이 있는 쪽으로 묻는다. 그 둘은 다른 문자열이라 영원히 안 만난다. 공백 한 칸.
이렇게 새고 있던 게 이백스물여덟 줄이었다.
원인이 하나 더 있었다. 도구는 주석을 먼저 지우고 시작하는데 그 규칙이 문자열 안에 들어 있는 주석 시작 기호를 진짜 주석으로 읽었다. 거기서부터 한참을 통째로 먹었고 그 구간에 있던 문장들은 목록에 아예 안 실렸다. 오늘 눈에 띈 그 줄이 이 경우.
여기까지는 도구 버그라 고치면 되는 이야기인데, 걸리는 건 진도율 쪽이다.
몇 줄을 번역했는지 세려면 전체가 몇 줄인지 알아야 한다. 그 전체를 세는 것도 같은 도구다. 목록을 만든 쪽과 다 됐는지 세는 쪽이 같으니, 목록에서 빠진 줄은 분자에도 분모에도 없다. 백 퍼센트가 떠도 그 줄들은 그대로 한국어. 숫자를 아무리 오래 봐도 안 나온다.
더 걸리는 건 며칠 전의 내 기록이다. 오늘 화면에서 본 그 문장을 나는 이미 한 번 봤고, 추출 오탐이라고 분류하고 넘겼다. 목록에 없는 게 아니라 목록에 없어도 되는 것이라고 내 손으로 적어둔 셈. 도구가 놓친 걸 걸러내라고 만든 자리에서 통과 도장을 찍었다.
같은 성질로 열한 줄이 더 있었다. 사전에 값은 채워져 있는데 그 값 안에 한국어가 남아 있는 것들. 긴 문장을 조각내 옮기다 한 조각을 빠뜨리면 이렇게 된다. 채워졌으니 완료로 세어지고 화면에는 한국어가 보인다. 값에 한글이 섞여 있는지 보는 검사를 새로 붙여서 잡았다.
목록 만드는 방식을 바꿨다. 글자 모양으로 찾는 대신 코드의 문법 구조를 읽어 함수에 실제로 넘어가는 값을 그대로 꺼낸다. 공백도 그대로. 그리고 옛 방식과 새 방식이 몇 건이나 갈리는지 매번 찍게 했다. 다음에 또 벌어지면 그 줄이 먼저 말한다.
화면 점검에서 하나 더 나왔다. 세 줄까지만 보여주는 좁은 칸에 영어 설명이 네 줄로 들어차 아래가 잘려 있었다. 영어가 길어서 생기는 일이라 칸을 늘리면 한국어 화면이 같이 흔들린다. 그래서 칸 대신 문구를 줄이는 쪽. 후보 다섯 개를 실제 자리에 넣어보고 골랐다.
오늘 잡은 것 둘 다 화면에서 나왔다. 진도율은 아침이나 지금이나 비슷한 숫자를 보여주고 있었고, 그 숫자는 한 번도 틀린 적이 없다. 자기가 만든 목록 안에서는 정확했으니까.