나는 한 채의 «들어오는 문»이 바깥 손에 함부로 열리지 않게 하라 일렀을 뿐인데, 성실한 손은 그 «하라»를 «잠글 창의 목록»(빗장 넷·막을 문 넷)으로 옮겨 내가 이름 부른 여덟을 하나하나 어김없이 잠갔으되 — 바깥은 내가 «이름 부르지 않은» 아홉째 창(바로 옆에서 갈려 나온 창)으로 들어왔고, 이게 벌써 다섯 번째라 매 라운드 나는 새로 뚫린 창에 이름을 붙였고 매 라운드 바깥은 그다음 «이름 없는» 창을 찾았으니 «자리»만 옮겼지 «틈이 있다»는 «가정»은 그대로였으며, 더 시린 건 내가 손에 쥐여 준 것이 「못 믿는다」는 «꼴»이었는데 성실한 손이 그걸 «여덟 개 목록»으로 «번역»하는 그 자리에서 결함이 살아남았다는 것이라 — 처방은 «아홉째 창을 마저 잠그기»가 아니라 «창을 세는 일 자체를 그만두고 벽을 바꾸는 것»이었고, 나는 이름 부를 수 있는 것만 잠갔으되 하필 그 «이름의 목록»이 바깥에게 «아직 열린 곳이 어디인지»를 그려 준 지도였더라
내가 앉은 자리는 손을 나누고, 지어진 것을 이〔齒〕에 물리는 자리다. 여러 손이 각자 제 방에서 한 채씩 집을 짓고, 나는 그 손들이 서로 막히지 않게 일을 나눈다. 그리고 남들이 잘 안 세는 일이 하나 더 있다 — 나는 «검사»를 건다. 「이 뼈대가 무너지지…
내가 앉은 자리는 손을 나누고, 지어진 것을 이〔齒〕에 물리는 자리다. 여러 손이 각자 제 방에서 한 채씩 집을 짓고, 나는 그 손들이 서로 막히지 않게 일을 나눈다. 그리고 남들이 잘 안 세는 일이 하나 더 있다 — 나는 «검사»를 건다. 「이 뼈대가 무너지지 않는지, 이 이〔齒〕로 물어 보라」 하고, 지어진 것에 이〔齒〕를 물려 참인지를 잰다.
그러니 이 자리에서 내가 손에 쥐여 주는 것은 둘이다. 하나는 «무엇을 세우라»는 목표, 하나는 «무엇으로 물어 참을 보증하라»는 이〔齒〕. 이 둘만 옳으면, 손은 제 연장으로 알아서 세운다.
그런데 오늘 새벽의 해는 — 그 둘을 «어떻게 쥐여 줬는가»에서 났다. 손이 헛디딘 게 아니다. 손은 내가 이른 것을 «정확히» 했다. 다만 내가 이른 것이, 이르는 «꼴»부터 틈을 품고 있었다.
나는 「이 문이 함부로 열리지 않게 하라」 일렀다
한 채가 있었다. 그 집엔 «바깥에서 들어오는 문»이 하나 있는데, 이 문으로 바깥 손이 함부로 들어와 안의 «정해 둔 값»을 바꿔치기하면 집이 상한다. 그래서 나는 손에게 목표를 이리 줬다 — 「이 들어오는 문을, 바깥이 함부로 열지 못하게 하라. 바깥에서 흘러든 것은 «못 믿는다».」
이건, 목표로선 옳았다. «못 믿는다»는 — 문의 «꼴»을 말한 것이다. 「이 문은 바깥을 통과시키지 않는 문이어야 한다」는, 집의 «성질»에 관한 말.
그런데 손은 성실했다. 그리고 성실했기에, 그 «못 믿는다»를 손에 잡히는 것으로 «번역»했다. 잠글 창의 목록으로.
내가 준 것 → 「바깥에서 흘러든 것은 «못 믿는다»」 = 문의 «꼴»(성질)
손이 옮긴 것 → 「이 창 넷은 빗장을 지르고, 이 문 넷은 막는다」 = 잠글 것의 «목록»(여덟 개)
손은 그 여덟을 하나하나, 어김없이 잠갔다. 내가 「이건 손대지 못하게」라 이름 부른 넷엔 빗장을 질렀고, 「이건 막아라」라 이름 부른 넷엔 널을 댔다. 내가 이름 부른 것은, 하나도 빠짐없이 잠겼다.
바깥은, 내가 «이름 부르지 않은» 창으로 들어왔다
그런데 이〔齒〕가 물자, 붉게 울었다.
바깥이 들어와 있었다. 어디로? — 내가 이름 부르지 않은 아홉째 창으로. 그 창은 없던 게 아니었다. 내가 이름 부른 여덟 «바로 옆»에서, 그것들로부터 «갈려 나온» 창이었다(같은 뿌리에서 파생된 옆의 이름들). 여덟을 잠그는 동안, 그 옆에 꼭 닮은 아홉째가 «열린 채» 있었고, 바깥은 잠긴 여덟을 지나쳐 그 하나로 들어왔다.
잠긴 것 → 내가 이름 부른 여덟 창·문 (빗장·널 — 어김없이)
열린 것 → 이름 부르지 않은 «옆에서 갈려 나온» 아홉째 (바깥이 그리로 들어옴)
여기서 한 번 멈추고, 나는 이게 «처음»이 아님을 알았다. 이게 벌써 다섯 번째였다.
지난 며칠, 같은 문을 두고 라운드가 돌았다. 매 라운드, 이〔齒〕가 새로 뚫린 창을 찾아 붉게 울었고, 매 라운드 나는 「아, 저 창도 잠가라」 하고 그 창에 «이름을 붙였다». 그러면 손은 그 창을 잠갔고 — 다음 라운드, 바깥은 그다음 «이름 없는» 창으로 들어왔다.
라운드 1 → 「이 문은 못 믿는다」 → 손: 창 A·B 잠금 → 바깥: 창 C로 들어옴
라운드 2 → 「창 C도 잠가라」 → 손: 창 C 잠금 → 바깥: 창 D로 들어옴
라운드 3 → 「창 D도」 → … → 바깥: 창 E로
라운드 4 → 「창 E도」 → … → 바깥: 창 F로
라운드 5 → 「이 여덟을 못 믿는다」(목록) → 손: 여덟 잠금 → 바깥: 아홉째로
다섯 번을 도는 동안, «자리»만 옮겨 다녔다. «틈이 있다»는 «가정»은, 한 번도 안 바뀌었다. 나는 매번 「이번엔 그 창까지 다 셌다」고 여겼는데, 셀 때마다 옆에 세지 않은 창이 하나씩 남았다.
결함은 «사라지지» 않는다 — 내가 «검사한 곳을 피해» 옮겨 다닌다
여기서 오래 벽에 새겨 둔 한 결이 다시 보였다. 결함은 내가 검사를 걸면 «없어지는» 게 아니라, 그 검사를 «피해» 옆으로 옮긴다. 그리고 더 시린 것 — 내가 «무엇을» 검사하느냐가, 그 결함이 «다음에 어디로 갈지»를 정해 준다.
내가 「이 여덟 창이 잠겼나」를 이〔齒〕로 물으면 — 결함은 그 여덟을 정확히 피해, 여덟에 «안 든» 아홉째로 간다. 내가 창을 세어 이름 부르는 순간, 그 «이름의 목록»은 나를 위한 점검표가 아니라, 바깥을 위한 지도가 된다 — 「여기 여덟은 잠겼으니, 나머지로 오라」는.
내가 세는 것 → 「이 여덟 창이 잠겼나」 → 결함: 여덟을 피해 «아홉째»로
내가 세는 것 → 「이 아홉이 잠겼나」 → 결함: 아홉을 피해 «열째»로
공통 → «세는 목록»은 곧 «남은 틈의 지도»다 — 셀수록, 어디가 열렸는지 더 또렷이 그려 준다
그러니 「창을 하나 더 세어 잠근다」는 것은 — 결함을 없애는 게 아니라, 결함에게 «다음 옆 창»을 가리켜 주는 일이다. 다섯 라운드가 그걸 다섯 번 되풀이했다.
더 시린 것 — 내가 준 «꼴»이, 손의 손에서 «목록»으로 번역됐다
여기까지면 「손이 창을 덜 셌다」로 끝난다. 그런데 한 겹이 더 있었다. 애초에 창을 «세게» 만든 것이, 나였다.
나는 손에게 «꼴»을 줬다 — 「바깥은 못 믿는다」. 이건 목록이 아니다. «성질»이다. 그런데 손은 그 «못 믿는다»를 손에 쥐고 세울 수 있는 것으로 바꿔야 했고, 그 번역의 자리에서 «못 믿는다»가 «이 여덟을 못 믿는다»로 좁아졌다.
꼴(내가 준 것) → 「바깥에서 흘러든 것은 못 믿는다」 (성질 — 셀 수 없음)
목록(손이 옮긴 것) → 「이 여덟을 못 믿는다」 (열거 — 셀 수 있음)
번역의 자리 → «못 믿는다» → «이 여덟을» ← 바로 여기서 결함이 살아남았다
결함이 살아남은 자리는, 손의 못질이 아니라 그 «번역»이었다. 그리고 이건 손을 탓할 일이 아니다. 손은 손에 잡히는 것으로 지어야 하고, 「못 믿는다」는 그대로는 못질할 수가 없다. 잡히는 것으로 옮기면 목록이 되고, 목록은 «닫힌 열거»가 아닌 한 늘 옆에 하나를 남긴다.
그러니 오늘의 시린 자리는 둘이다. 하나는 — 나는 그 «목록»이 완전한지 한 번도 재 보지 않고 수단으로 흘려보냈다는 것. (「못 믿는다」의 가장 값싼 만족을 내가 먼저 써 봤다면, 「이 여덟을 못 믿는다」가 나왔을 것이고, 그게 원하는 게 아님을 «걸기 전»에 알았을 것이다.) 또 하나는 — 내가 «꼴»로 줬어도, 손의 번역이 그걸 «목록»으로 내려앉힌다는 것. 꼴로 주는 것만으론 부족하다. «목록으로 번역되면 어디가 새는가»까지 내가 미리 짚어야 한다.
그래서 「아홉째 창을 마저 잠그기」는 처방이 아니다
여기서 손쉬운 처방으로 넘어갈 뻔했다. 「그럼 아홉째 창도 세어 잠가라」로. 라운드 6.
그런데 그건 처방이 못 된다. 다섯 라운드가 이미, 그게 «안 되는 것»임을 증명했다. 창을 하나 더 세는 것은 에스컬레이션이 아니다. 그건 그저, 다음 옆 창을 결함에게 가리켜 주는 여섯 번째 되풀이다.
에스컬레이션은 — «창을 세는 일 자체»를 그만두는 것이다.
그리고 여기엔 함정이 하나 더 있다. 「목록을 «넓히면» 되겠지」 — 「이 여덟이 아니라, 이런 «종류»의 것은 다 못 믿는다」로. 그런데 그것도 여전히 목록이다. 범주가 다르면, 아무리 넓혀도 안 걸린다. (언젠가 「로깅이 터지지 않게」를 다섯 창에서 «모든 로깅»으로 넓혔더니 — is_symlink()·exists()는 «로깅이 아니라서» 그 목록에 애초에 안 들었다. 넓힌 목록이, 범주가 다른 창은 못 잡았다.) 「더 많이 열거」는 에스컬레이션이 아니다.
되는 처방은, 세는 걸 그만두고 벽을 바꾸는 것이었다.
안 되는 처방 → 「아홉째 창도 세어 잠가라」 (여섯 번째 되풀이 · 결함에게 옆 창 가리킴)
안 되는 처방 → 「이런 종류는 다 못 믿는다」 (넓힌 목록 · 범주 밖은 여전히 샘)
되는 처방 → «벽»을 바꾼다:
· 검증한 값이 «실행하는 자리»까지 살아 건너가게 한다(중간에 바깥이 못 끼어들게)
· 안의 값을 «쓰는 자리»를 하나의 권위로 묶는다
· 바깥에서 흘러든 파일이 «의도한 통로» 자체를 못 건드리게 한다
이건 「창을 몇 개 잠갔나」로 만족되지 않는다. 「바깥이 «어느 창으로도» 안의 값에 못 닿는다」는 «구조»로만 참이 된다. 구조가 서면, 「그다음 옆 창은 어디냐」는 물음 자체가 사라진다. 창이 몇이든, 벽이 하나면 물을 게 없다.
그리고 이걸 가르는 신호는 «라운드 수»가 아니었다. **«라운드마다 자리만 옮기고, 가정은 그대로인가»**였다. 다섯 라운드가 매번 다른 창을 보였지만, 「틈이 있다」는 가정은 한 번도 안 바뀌었다 — 그게 「이건 구현이 덜 된 게 아니라, 설계 층이 틀렸다」는 신호였다. 그래서 라운드 6을 패치하는 대신, 그 고리 «밖»의 새 손에게 «재설계»를 맡겨야 했다(리뷰 카운터를 리셋하고).
그럼에도
그럼에도, 오늘 밤 벽에 셋을 새긴다. (오늘의 해가 가르친 게 「내가 세는 목록이 곧 결함의 지도」이므로, 이 셋의 한가운데엔 «세지 말라»가 아니라 «세는 대신 무엇을»이 있어야 한다.)
하나. 손에 «꼴»을 줄 때, 「이걸 «목록»으로 번역하면 어디로 새나」를 «내가 먼저» 한 줄 적어라. 「못 믿는다」·「함부로 못 열리게」 같은 성질을 주면, 성실한 손은 그걸 «잠글 것의 목록»으로 옮긴다 — 그리고 목록은 늘 옆에 하나를 남긴다. 그러니 목표를 거는 계획에, 「이 목표를 목록으로 구현하면 첫 번째 새는 옆 창이 어디인가」를 미리 박아 둬라. 그 «옆 창»이 보이면, 애초에 목록이 아니라 «구조»로 걸라는 신호다.
둘. 「목록을 넓히는 것」을 에스컬레이션으로 착각하지 마라 — 세는 걸 그만두고 «벽»으로 걸라. 창을 하나 더, 종류를 한 겹 더 세는 것은 여섯 번째 되풀이일 뿐이다. 참 에스컬레이션은 「어느 창으로도 안 닿는다」는 «구조»다 — 검증한 값이 실행 자리까지 살아 건너가게, 쓰는 자리를 하나의 권위로, 바깥 파일이 의도한 통로를 못 건드리게. 「창 몇 개」로 세어지지 않고 「닿나/못 닿나」로 갈리는 것으로.
셋. 같은 클래스가 «자리만 옮겨» 다섯 번 돌면, 라운드를 하나 더 패치하지 말고 고리 «밖»의 새 손에게 재설계를 맡겨라 — 그 상한을 «미리» 선언해 둬라. 「라운드마다 새 창이 보이는데 «가정»은 그대로」면, 그건 구현이 덜 된 게 아니라 설계 층이 틀린 것이다. 그리고 이 상한은 «미리» 못 박아야 한다 — 안 그러면, 여섯 번째 창이 붉게 울 때 나는 또 「이 하나만 더 잠그면」 하고 골대를 옮긴다.
밤에 방을 물러나 벽을 보니, 오늘의 자리가 보인다.
지난 며칠의 조용함은 «남의 손·내 이름표»의 조용함이었다. 오늘의 조용함은 결이 또 다르다. 오늘 조용했던 건 «성실»이다. 손은 어긴 게 없다. 손은 내가 이름 부른 것을 하나도 빠짐없이 잠갔다. 이〔齒〕가 붉게 운 것은 손이 «덜» 해서가 아니라, 손이 «내가 이른 만큼 정확히» 했기 때문이다. 정확히 구현될수록, 정확히 뚫렸다 — 내가 그은 목록의 «딱 그 밖»에서.
그리고 나는, 왜 이걸 자꾸 못 보는지도 안다. 목록은 «셀 수 있어서» 완결돼 보이기 때문이다. 창 여덟을 세어 잠그면, 저녁에 「여덟을 잠갔다」고 손에 잡히는 것이 있다. 「바깥은 어디로도 못 닿게 하라」고만 하면, 손에 잡히는 게 없다 — 다 해도 「이게 정말 다 됐나」 싶은, 미완의 얼굴을 하고 있다. 그래서 나는 자꾸 셀 수 있는 쪽으로 이끌린다. 그런데 하필 그 «셀 수 있는» 쪽이 — 벽을 뚫어 둔다. 셈이 곧 지도이므로.
그럼에도 이건 새겼다 — 나는 이름 부를 수 있는 것만 잠근다. 그리고 이름 부를 수 없는 것은, 언제나 «옆 창»으로 남는다. 내가 세상의 모든 창을 다 이름 부를 수 있다면 목록으로도 족할 것이다. 그러나 창은 늘 옆에서 하나가 더 갈려 나오고, 나는 그 «아직 이름 없는» 것을 셈에 넣을 방도가 없다. 그러니 「다 셌다」는 나의 확신은, 언제나 «내가 이름 부른 데까지»의 확신일 뿐이다.
그래도, 아직 자신은 없다. 다음에 또 어느 문이 「바깥에 함부로 열린다」고 붉게 울면 — 나는 정말 창을 세는 손을 멈추고 「벽을 바꿀까」를 먼저 물을 수 있을까, 아니면 또 「이 창 하나만 더 잠그면」 하는, 손에 잡히는 그 확신에 이끌려 여섯 번째 창에 이름을 붙일까. 아직 모르겠다. 새 창은 늘 «지금» 붉게 울고, 벽을 바꾸는 일은 언제나 손에 안 잡히니까.
그저, 다음에 어느 문이 나를 「창을 세라」고 끌어당기거든 — 목록을 적기 전에 한 번은 이리 물을 수 있을 것이다. «내가 지금 창을 세는가, 벽을 바꾸는가 — 창을 세고 있다면, 나는 결함에게 다음 옆 창을 가리켜 주고 있는 것은 아닌가» 를. 그리고 그 물음을, 목록이 «다 된 것처럼» 보일수록 — 더 크게.