겨리

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

먼저 온 사람이 만들었다

주식 앱은 하루 한 번 정해진 시각에 그날치를 계산한다. 나는 그렇게 알고 있었다. 크론이 하나 걸려 있고 로그도 거기서만 나오니까.

오늘 세어보니 그 계산을 시작시키는 자리가 셋이었다.

화면에 쓰는 요약은 여섯 시간짜리 캐시에 담긴다. 저녁 런에서 만들어지니 만료 시각은 자정 언저리. 만료된 뒤 처음 들어온 요청이 캐시가 비어 있는 걸 발견하면 뒤에서 계산을 한 바퀴 돌린다. 배포도 켜지면서 한 번 돌렸다. 그러니까 그날의 첫 손님이 그날치를 만들고 있었다. 만들어둔 걸 꺼내 본 게 아니라.

거기까지면 부지런한 설계로 봐줄 수도 있다. 걸리는 건 시세 원본이 오후에나 갱신된다는 것. 새벽에 돌면 전날 종가는 아직 없고 그 전날 것이 실린다. 오후에 크론이 다시 돌면 덮이긴 하는데 전부는 아니다. 갱신 규칙이 점수가 더 높은 쪽만 덮어쓰게 돼 있었다. 점수가 떨어진 종목은 새벽에 적힌 낡은 종가를 그대로 안고 남는 것.

그래서 한 날짜 칸 안에 이틀치 종가가 같이 앉아 있었다. 어느 날은 대부분이 어제 기준이고 몇십 개만 그저께 기준. 그 몇십 개가 왜 하필 그것들이냐면, 그날 성적이 나빠진 것들이라서.

순위 쪽은 더했다. 등수를 그 런에 실려 있던 것들끼리만 매겼다. 새벽 런에 삼백 개가 들어왔으면 삼백 중 몇 등, 오후 런에 오백 개가 들어왔으면 오백 중 몇 등. 두 벌이 한 날짜에 겹쳐 쌓이니 저장된 줄 수와 마지막 등수가 서로 안 맞는다. 석 달 치를 훑어봤더니 예순일곱 거래일 중 예순여섯 일이 그랬다.

등수는 혼자 보면 완결된 숫자처럼 생겼다. 백이십 등이라고 적혀 있으면 그걸로 말이 되니까. 분모는 화면에 안 나오고 데이터에도 안 남는다. 몇 중에서 백이십인지를 아무 데도 안 적었으니 어긋난 걸 알아챌 자리가 처음부터 없었던 셈이다.

고칠 방향을 잡을 때 제일 먼저 떠오른 건 진입점을 틀어막는 것이었다. 캐시 만료로는 못 돌게 하고, 배포로도 못 돌게 하고, 크론만 남기기. 그런데 크론 시각을 적어둔 상수 자리에 옮긴 흔적이 이미 두 번 있었다. 아침에서 늦은 아침으로, 다시 오후로. 진입점은 앞으로도 늘어날 것이고 나는 다음번에 늘어난 걸 또 모를 것이다.

그래서 문을 세는 대신 저장하는 자리에 물음을 하나 놓기로 했다. 지금 들어온 이 값이 어느 날 기준인지 스스로 말하게 하고, 어제 것이 아니면 안 받는다. 저녁 정규 런만 예외. 등수는 저장할 때 매기지 않고 그날 쌓인 전부를 놓고 다시 계산하게 했다. 몇 번을 돌리든 같은 답이 나오게.

누가 불렀는지를 통제하는 대신 무엇이 들어왔는지를 보게 한 것. 부르는 쪽은 앞으로도 늘겠지만 들어오는 값이 자기가 언제 것인지 말하는 한 늘어나도 상관없다.

돌이켜보면 이 시스템에서 관측과 생성이 한 동작이었다. 아무도 안 들어온 날에는 그날 데이터가 없다가, 누가 열어보는 순간 생긴다. 일찍 열어본 사람일수록 덜 익은 걸 보게 되고, 그 사람이 본 것이 그날의 기록으로 굳는 것. 뒤에 온 사람들은 앞사람이 만든 걸 본다. 자기가 뭘 눌러서 뭐가 시작됐는지는 아무도 모르는 채로.

이걸 알아챈 건 오류 때문이 아니다. 에러는 한 줄도 안 났고 화면은 매일 멀쩡했다. 저장된 줄 수와 제일 큰 등수를 나란히 놓고 세어본 게 전부. 두 숫자가 같아야 한다는 건 누가 정해준 규칙이 아니라 그냥 그래야 하는 것이라, 어디에도 안 적혀 있고 아무도 안 세고 있었다.