행인로 개인 작업실

움직이지 않게 된 환율

매일 아침 아홉 시에 자동으로 나가는 작은 뉴스레터가 있다. 시장 지표 몇 개와 전일 대비 변화율이 들어간다. 그런데 세 호 연속으로 환율 줄이 0.00%였다. 빠진 것도 아니고 오류 표시도 아닌, 자신만만한 0이. 매일 움직이는 숫자에서, 사흘 내리.

그리고 생성된 코멘트는 0을 받아 든 생성 코멘트가 늘 하는 일을 했다 — 환율이 정체되었다고 썼다. 뉴스레터가 사실 하나를 빠뜨린 게 아니라, 거짓 하나를 문장으로 독자에게 주장한 것이다.

값을 비교한 게 아니라 파일을 비교했다

스냅샷 수집기는 하루에 파일 하나를 쓰고, 세 시간마다 값을 덧붙인다. 변화율 계산은 오늘 파일의 마지막 값과 어제 파일의 마지막 값을 가져다 썼다. 맞는 말처럼 들리고, 발행 시각이 그날 값들이 다 찍힌 뒤라면 실제로 맞다. 내 발행은 아침 제일 먼저다.

원천 자료는 하루에 한 번, 11시 40분쯤 갱신된다. 그 전에 찍힌 값은 전부 전날 값을 그대로 들고 있다. 그러니 아침 아홉 시에 “오늘 파일의 마지막 값”과 “어제 파일의 마지막 값”은 구조적으로 같은 숫자인 경우가 잦았다.

찍힌 시각값
02:40 / 05:40 / 08:401409.64 ← 09:00 발행이 비교한 값
11:40 이후 ~ 23:401417.00

환율은 움직였다. 비교가 갱신 전 값의 사본 두 벌을 들여다보며, 둘 사이에 차이가 없다고 정확하게 보고했을 뿐이다.

고치는 길 셋, 그리고 가장 안 똑똑한 것을 고른 이유

첫째, 원천이 갱신된 뒤로 발행을 늦춘다. 기각 — 발행 시각이 모든 상류 자료원의 갱신 일정에 종속되고, 자료원을 추가할 때마다 다시 맞춰야 한다.

둘째, 파일 비교를 그만두고 값이 실제로 바뀐 가장 최근 지점과 비교한다. 채택.

셋째, 그저께와 비교한다. 기각 — 같은 값이 두 번 연속 찍히면 다시 0으로 돌아온다.

둘째를 구현한다는 건, 스냅샷을 날짜별 파일 더미가 아니라 날짜 경계를 넘어 이어지는 하나의 연속 계열로 다루고, 그 계열을 발행 시점에서 잘라내는 일이었다. 잘라내야 과거 호를 다시 만들었을 때 원래 나갔던 내용이 그대로 재현된다. 기분 좋은 부수 효과도 있었다 — “기준 시점”이 이제 그 파일이 어느 날짜냐가 아니라 값 자신의 시각에서 나오게 되면서, 지난 호에 잘못 붙어 있던 날짜가 조용히 고쳐졌다.

멀쩡해 보였던 기간을 다시 돌려 회귀를 확인했다. 다시 계산한 수치가 실제로 발행되었던 것과 자릿수까지 일치했다. 새 로직이 그냥 다른 방식으로 틀린 게 아니라는 증거는 그것뿐이다.

그날 아침의 다른 실패 둘

아홉 시 실행은 아예 실패하기도 했는데, 무관한 이유 둘이 겹쳐 있었다. 몇 달 전에 50센트로 걸어둔 비용 상한 옵션이 지금 버전의 도구에서는 한 단어짜리 요청마저 거부하고 있었다 — 단단하고 재현되는 실패. 그리고 손으로 다시 돌린 시도가 모델 출력의 형식 불일치로 한 번 죽고 두 번째에 성공했는데, 이건 일간 발행물을 보관 기록의 구멍으로 바꿔놓는 종류의 불안정함이다. 지금은 두 번 시도가 기본이다.

시간을 가장 많이 잡아먹은 세부는 둘 중 어느 것도 아니었다. 실패 이유가 빈 문자열로 기록되고 있었다는 것, 그것도 매번. 도구는 오류를 표준 출력으로 쓰는데 내 감싸개는 표준 에러만 붙잡고 있었다. 로그의 모든 실패가 exit 1: 뒤에 아무것도 없었다. 나는 원래 문제를 처음부터 다시 조사해야 했다 — 로그가 “무언가 잘못되었다”는 사실만 충실히 기록하고 무엇이 잘못되었는지는 아무것도 남기지 않았기 때문에.

밑줄 칠 곳

버그는 데이터에도, 수집기에도, 원천에도 없었다. 함수 이름 두 개에 구워져 들어간 전제에 있었다 — “어제 파일”과 “어제 값”이 같은 것이라는 전제. 오후에는 같다.

그리고 생성 요약은 무엇을 건네든 그것을 서사로 만들어 준다. 잘못된 0을 주면 안정세에 대한 그럴듯한 문단을 쓴다. 프롬프트를 어떻게 쓰든 여기서는 막을 수 없다. 방어는 상류에, 잘못된 0을 건네지 않는 데 있어야 한다.