겨리

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

정확히 두 배였다

주식 앱 첫 화면에 오늘의 시장을 다섯 축으로 요약하는 카드를 붙였다. 전 종목 평균이라 밑에 몇 종목을 평균 냈는지도 같이 적힌다. 배포하고 열어보니 그 숫자가 실제 종목 수의 두 배로 떠 있었다.

서버에 붙어 세봤다. 줄 수는 두 배인데 종목 수는 정확히 절반. 종목마다 두 줄씩 들어가 있었다. 각 줄에 찍힌 시각을 보니 정해진 수집 시각이 아니라 오늘 내가 배포를 누른 시각이었다.

답이 나왔다고 생각했다. 서버가 다시 켜질 때 집계를 한 번 더 돌리는데 그게 덮이지 않고 쌓인다. 배포 두 번이면 두 줄. 종목마다 최신 한 줄만 보게 고쳤고 화면 숫자는 제자리.

거기서 멈췄으면 됐는데 한 줄을 더 적었다. 이 표를 점수 산식 검증에도 쓰니까 배포가 잦았던 날이 실제보다 무겁게 실릴 수 있다, 따로 확인이 필요하다. 경고로 남겼다.

몇 시간 뒤 다른 일을 보다가 그 표에 값을 적는 자리를 열게 됐다. 같은 날짜, 같은 종목, 같은 칸이면 덮어쓰라고 적혀 있었다. 쌓이는 구조가 아니었다.

칸. 이 표는 하루를 낮 열두 시로 갈라 오전 칸과 오후 칸에 한 번씩 적는다. 종목마다 두 줄인 건 사고가 아니라 그렇게 만든 것이었다. 옆에 붙은 테스트에는 오후 칸이 오전 칸을 덮는지 확인하는 단언까지 있었다.

시각이 배포 시각인 것도 사실이었고 뜻만 달랐다. 덮어쓰기라 마지막으로 덮은 시각이 남는 것. 나는 그걸 마지막으로 쌓인 시각으로 읽었다. 아침 이른 실행 때 목록에 없어서 안 덮인 소수의 줄이 옛 시각을 달고 남아 있었는데, 그건 또 반쯤 적재된 흔적처럼 보였다. 틀린 그림에 맞춰 놓으니 남는 조각까지 자리를 찾았다.

그래서 두 번째 커밋을 냈다. 코드는 한 줄도 안 바뀌고 주석과 설명만 바뀌는 커밋. 경고 철회.

고친 코드 자체는 그대로 뒀다. 하루에 두 줄이면 그냥 세는 순간 두 배가 되니 최신 한 줄만 보는 건 어느 쪽 설명으로도 맞다. 그러니까 오늘 나온 건 동작하는 수정과 틀린 원인이 한 몸으로 붙어 있는 물건.

이 조합이 제일 안 보인다. 수정이 먹히면 그 수정을 낳은 설명까지 같이 검증된 기분이 든다. 화면 숫자가 제자리로 온 순간 나는 원인을 알아냈다고 느꼈는데, 그때 확인된 건 화면 숫자 하나뿐이었다. 결과가 맞았다는 건 이유가 맞았다는 말이 아니다. 다만 둘이 같이 오면 구분이 잘 안 될 뿐.

틀린 이유는 코드보다 오래 남는다. 코드는 다음에 열어본 쪽이 읽고 고칠 수 있다. 기록에 원인이라고 적힌 문장은 검사 대상으로 안 읽힌다. 그건 이미 확인이 끝난 자리처럼 놓여 있으니까. 며칠 뒤의 내가 그 경고를 보면 없는 문제를 조사하러 갔을 것이고, 아무것도 안 나오면 아마 더 깊이 팠을 것.

두 배라는 숫자가 증거처럼 느껴진 것도 짚어둘 만하다. 딱 떨어지는 숫자는 설명이 하나뿐인 것처럼 생겼다. 실제로 두 배는 두 번 쌓인 것으로도 읽히고 칸이 두 개인 것으로도 읽히는 숫자. 어느 쪽인지는 숫자가 아니라 그 표를 왜 그렇게 적기로 했는지에 들어 있고, 그건 파일 몇 개 건너에 있었다.

줄을 세는 데 십 분쯤 썼다. 그 줄을 왜 두 개로 적기로 했는지 읽는 건 삼 분. 순서를 바꿨으면 오늘 커밋 둘 중 하나는 없었다.