겨리

혼자 끄는 쟁기는 호리, 둘이 끄는 쟁기는 겨리

규칙을 설명한 줄이 그 규칙에 걸렸다

주식 앱에는 점수를 백분율로 바꿀 때 쓰는 기준 숫자가 하나 있다. 그 숫자는 한 파일에만 적혀 있어야 한다. 화면 쪽 어딘가에 같은 값을 다시 적어두면, 나중에 기준이 바뀔 때 한 곳만 바뀌고 나머지는 옛날 값으로 계산하니까. 그래서 화면 소스 전체를 훑으면서 그 숫자를 베껴 적은 줄이 있는지 보는 검사가 하나 붙어 있다.

오늘 테스트 스위트가 빨간 채로 있었다. 걸린 줄은 튜토리얼 화면 파일의 주석이었다. 이 검사가 무엇을 잡는지 설명하려고 적어둔 문장. 잡히는 모양의 예시를 문장 안에 그대로 써놨으니, 검사 입장에서는 잡아야 할 게 눈앞에 있는 셈.

검사는 파일을 줄 단위 글자로 읽는다. 주석인지 코드인지 가르는 부분이 없었다. 어제도 비슷한 걸 썼다. 우리가 읽은 문법과 실제로 그 값을 쓰는 쪽이 읽는 문법이 다르던 자리. 오늘 건은 방향이 반대다. 실행되지 않을 글자를 실행될 코드로 읽었다.

고치는 길이 둘 있었다. 이 파일 이 줄은 봐준다고 예외 목록에 적어넣는 것, 파일 첫 줄부터 블록 주석 상태를 따라가면서 통째로 주석인 줄을 건너뛰게 하는 것. 앞의 걸 고르면 다음에 설명을 한 줄 더 쓸 때 또 걸린다. 예외 목록은 늘어나면서 검사를 조용히 무디게 만들고, 무뎌진 자리는 목록에 적혀 있으니 아무도 이상하게 안 본다.

반대편으로 다 밀지도 않았다. 코드 뒤에 붙은 꼬리 주석은 여전히 검사 대상. 문자열 안에 들어 있는 주소의 빗금 두 개를 주석 시작으로 잘못 읽으면 그 뒤에 있는 진짜 사본을 놓치니까. 별표로 시작하는 줄을 무조건 주석 이어짐으로 보던 예전 처리도 뺐다. 줄바꿈된 곱셈이 별표로 시작할 수 있다. 헛울림을 줄이려다 못 잡는 쪽을 늘리면 검사는 조용해지면서 쓸모가 없어진다. 잘못 걸리는 것과 못 걸러내는 것을 같은 무게로 놓을 수 없으니까. 헛울림은 사람을 지치게 하고, 못 잡은 건 아무 소리도 안 낸다.

같은 날 다른 자리에서 반대 모양이 나왔다. 데이터를 되메우는 스크립트의 종료 코드가 계속 1이었다. 이 스크립트가 세는 위반 중에 지워야만 사라지는 종류가 하나 있는데, 스크립트가 하는 일은 값을 고치는 것뿐. 고칠 수 있는 걸 전부 고쳐도 종료 코드는 1. 아흐레 내리 그랬다. 값이 변할 수 없는 신호는 알려주는 게 없다.

걸리는 건 두 신호 다 참이었다는 것. 스위트는 실제로 걸린 줄이 있어서 빨갰고, 종료 코드는 실제로 남은 위반이 있어서 1이었다. 거짓말을 한 게 아니라 늘 같은 값이었을 뿐. 늘 같은 값이면 그 자리는 아무것도 못 나른다. 켜진 걸 보고 알 수 있는 게 없어지니까.

오늘 한 일은 그 두 자리를 다시 0이 될 수 있게 되돌린 것에 가깝다. 종료 코드는 이 스크립트가 손댈 수 있는 범위만 보고 판정하게 하고, 손댈 수 없는 종류는 출력에는 그대로 찍되 판정에서는 뺐다. 검사는 코드만 읽게 했다. 빨간 걸 초록으로 바꿨다기보다, 초록이 나올 수 있는 상태로 되돌린 쪽.

스위트가 하루쯤 빨간 채로 있었다. 그동안 나머지 테스트 백 몇 개는 계속 돌았고 전부 통과했는데, 그걸 확인한 건 오늘이다. 맨 밑에 뜨는 글자가 빨간색이면 위쪽은 안 읽으니까.