겨리

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

없다고 답하면서 이유까지 댔다

주식 앱 첫 화면에 검색창이 있다. 종목 이름을 치면 우리가 매긴 점수가 뜬다. 밖에서 들어오는 사람을 여기서 받겠다고 맨 위로 올려둔 자리.

현대차를 쳐봤다. 없다고 나왔다. 밑에 한 줄이 더 붙어 있었다. 유니버스 500개 종목만 검색된다고.

삼성바이오로직스도, 한국전력도 같은 답이었다. 셋 다 매일 점수가 적재되고 각자 페이지도 최신으로 서 있는 종목이다. 우리가 다루는 오백 개 안에 전부 들어 있다.

경계를 재봤다. 정확히 백오십. 146위까지는 나오고 173위부터는 안 나온다. 그 숫자가 어디서 왔나 찾아보니 검색이 들여다보던 게 파이프라인이 만들어두는 캐시였고, 그 캐시는 상위 백오십에서 잘린다. 자를 이유가 있는 물건이었다. 목록을 화면에 뿌리려고 만든 것이니 화면에 실릴 만큼만 담으면 되니까. 검색은 그게 이미 데워져 있어서 갖다 썼고, 자름까지 같이 가져왔다. 검색을 백오십까지만 하자고 정한 사람은 아무 데도 없다.

그렇게 빠진 게 삼백쉰한 종목.

개수보다 걸리는 건 그 한 줄이다. 오백 개만 검색된다는 문장은 사실이 아니었다. 실제 한도는 백오십이니까. 그런데 이 문장이 틀린 방향이 하필 안심시키는 쪽이다. 오백이면 많아 보이니까. 현대차를 치고 그 답을 받은 사람은 이 앱이 큰 종목 오백 개만 다루는구나 하고 창을 닫는다. 현대차가 그 오백 안에 없다는 게 이상하다는 데까지는 안 간다.

그냥 없다고만 나왔으면 누군가 이상하다고 했을 것이다. 이유를 달아주니까 없는 게 설계처럼 보였다.

그 문장은 우리가 하려던 규칙을 적어둔 것이고, 코드가 실제로 하고 있는 일과는 아무 연결 없이 그 자리에 앉아 있었다. 의도를 적어놓으면 구현이 그쪽으로 따라올 거라고 기대할 수는 없다. 화면에 적힌 이유는 코드를 읽고 쓴 게 아니라 머릿속을 읽고 쓴 것.

반대로 새는 자리도 하나 나왔다. 카카오뱅크를 치면 카카오가 나왔다. 이름 비교를 양쪽 방향으로 다 하는 바람에 사용자가 친 글자 안에 우리 종목 이름이 들어 있기만 해도 맞다고 쳤다. 없는 종목을 물었는데 다른 종목의 점수가 답처럼 돌아온 셈. 없다고 거짓말하는 쪽보다 이게 나쁘다. 앞의 것은 사람을 돌려보내고 이건 틀린 숫자를 들려 보낸다.

둘이 같은 자리에서 나왔다. 우리가 아는 것의 집합이 어디에도 안 적혀 있었다는 것. 한쪽은 캐시 크기가 정하고 다른 쪽은 이름 비교 방향이 정했다. 둘 다 자기가 그걸 정하는 줄 모르고 정했다.

이제 한 곳에서 답한다. 점수 기록에 실제로 점수가 남아 있는 종목이냐. 검색도 자동완성도 바깥 검색으로 넘기는 자리도 전부 같은 걸 본다. 빠진 종목은 없다고 자르는 대신 마지막으로 점수가 남은 날짜와 상세 링크를 준다.

고치다 하나 더 봤다. 그 판정의 기준 날짜를 오늘로 잡으면 안 된다. 오늘 자 점수는 그날 파이프라인이 돌아야 생기고 그건 오후에 돈다. 오늘로 잡았으면 매일 아침 검색이 통째로 죽었을 것. 마침 같은 날 아침 시장 요약이 정확히 그 이유로 비어 있었고, 몇 시간 전에 그걸 고쳐놓은 참이라 알았다. 두 자리가 같은 가정을 하고 있었다. 오늘 데이터가 있다는 가정.

마지막은 사소한데 성질이 같다. 백엔드에서 그 안내 문구를 고쳤더니 프론트에 같은 문구 사본이 하나 더 있었다. 서버가 이유를 안 실어 보낼 때만 뜨는 자리라 평소엔 안 보이는 쪽. 배포 직전 검사에 지운 문구를 되짚는 항목이 있어서 걸렸다. 방금 고친 게 사본이 갈리는 문제였는데 고치는 손이 사본을 하나 더 갈라놓고 나갈 뻔했다.

문구가 몇 벌 있는지는 주석으로 박아뒀다. 그 문구가 사실인지 물어보는 자리는 아직 없다.