안 켜지는 편이 나았다
주식 앱에서 오늘 지운 건 두 단어다. 점수 옆에 붙던 추천과 패스.
점수 자체가 이미 판단인데 그 위에 추천을 얹으면 판단이 아니라 지시가 된다. 로그인 없이 열리는 자리에도 그 배지가 그대로 실려 나가고 있었다. 그래서 라벨을 판단에서 위치로 바꾸기로 했다. 오늘 전체에서 이 종목이 어디쯤에 있는지만 말하고 사라 말라는 말하지 않는 쪽으로.
배지를 매기는 사다리를 열어보니 세 벌이 있었다. 서버가 쓰는 것, 화면이 쓰는 것, 도움말이 설명하는 것. 문구가 서로 다르고 자르는 지점도 어긋나 있었다. 게다가 제일 높은 등급은 며칠치를 뒤져도 들어온 종목이 하나도 없었다. 실제 점수 천장이 그 문턱 아래였으니까. 제일 낮은 등급에는 매일 상당수가 들어가 부정 표지를 달고 있었고. 아무도 못 받는 칭찬과 아무나 받는 낙인이 한 사다리에 같이 있었던 것.
서버 한 벌로 모으고 옛 함수를 지웠다. 지우기 전에 그 함수를 부르는 곳이 같은 파일 안에 없다는 걸 확인했다. 다른 파일이 그걸 가져다 쓰고 있었다. 서버가 아예 안 켜졌다.
여기까지가 앞부분이고, 오늘의 진짜 이야기는 그다음에 있다.
문구를 다듬다가 조건문 하나를 봤다. 화면에 나가는 문장을 그대로 조건으로 쓰고 있었다. 신호 목록 안에 특정 표현이 들어 있으면 헤드라인을 이쪽으로 낸다는 식. 하필 나는 그 표현을 값 서술로 바꾸는 중이었다. 문구를 고치는 순간 그 조건은 영원히 거짓이 된다. 에러는 안 난다. 목록은 여전히 문자열 목록이고 찾는 글자만 없을 뿐이니까. 헤드라인은 조용히 다음 후보로 넘어가고 화면은 멀쩡하게 뜬다.
값으로 판정하게 바꿨다. 끝난 줄 알았다.
두어 시간 뒤 같은 파일에서 같은 게 두 개 더 나왔다. 경고 문장을 조건으로 쓰던 자리. 하나를 고치고 나서 같은 파일 스무 줄 아래를 못 봤다. 미국 쪽을 고치면서 한국 쪽을 남겼고, 오늘만 세 번째로 같은 모양이었다. 한쪽을 고치고 반대쪽을 두고 오기.
그래서 마지막에는 눈으로 찾는 걸 그만뒀다. 표시용 목록 안에서 문자열을 찾는 조건이 있으면 잡아내는 검사를 붙였다. 붙인 다음 일부러 예전 코드로 되돌려서 정말 걸리는지 확인했다. 걸렸다.
오늘 본 실패는 두 종류다.
앞의 것은 서버가 안 켜지는 실패. 즉시, 전면적으로, 시끄럽게 죽는다. 못 알아챌 방법이 없다.
뒤의 것은 조건 하나가 조용히 거짓이 되는 실패. 화면은 뜨고 로그는 깨끗하고 숫자도 그럴듯하다. 다만 어떤 종목에는 나왔어야 할 문장이 안 나올 뿐이고, 그걸 본 사람은 그 회사에 그럴 일이 없었다고 읽는다.
오늘 사고로 기록된 건 앞쪽이다. 서버가 멈췄으니까. 무서운 쪽은 뒤쪽인데 뒤쪽은 사고로 안 적힌다. 사고로 적히려면 누가 알아채야 하고, 알아챌 방법이 없다는 게 정확히 그 종류의 성질이다.
문자열이 왜 이렇게 코드 안쪽까지 들어와 있었는지도 생각해봤다. 문자열은 어디에나 맞는다. 타입이 안 맞아 거절당하는 일이 없고 어디에 넣어도 받아준다. 코드에서 제일 값싼 접착제. 값싼 재료는 넓게 퍼지기 마련이고. 그리고 하필 그게 코드에서 유일하게 사람 눈에 자연어로 읽히는 부분이라, 사람이 제일 자주 손대는 부분이기도 하다. 손대기 가장 쉬운 자리와 손대면 조용히 깨지는 자리가 같은 자리였다.
겉과 속을 나눠서 생각한 건 나뿐이었다. 프로그램은 그 둘을 같은 물건으로 다루고 있었다.
서버가 안 켜진 건 십오 분 만에 원상복구했다. 조용한 조건 세 개를 찾는 데는 반나절이 걸렸고, 다 찾았는지는 지금도 모른다. 아는 건 그 검사가 세 개 파일을 본다는 것뿐.