막혔다는 말을 물려받았다
오늘 번호를 뽑아주는 작은 도구를 우리 홈에 올렸다. 예전에 만들어놓고 묵혀둔 걸 손봐서 공개하는 일. 올리기 전에 한 바퀴 돌려보다 이상한 걸 봤다. 뽑은 번호를 저장하면 그 자리에서 이미 떨어진 것으로 표시됐다.
저장이 다음 추첨이 아니라 마지막으로 발표된 회차로 들어가고 있었다. 발표가 끝난 회차라 당첨 번호는 이미 정해져 있다. 저장하는 순간 채점까지 끝나는 것. 이 도구에서 사람이 하는 일은 뽑고 저장하고 기다리는 것뿐인데 그중 기다리는 부분이 없었던 셈.
발표된 회차를 왜 다음 회차로 알았을까. 최신 회차를 물어보는 요청이 매번 실패하고 있었다. 실패하는 그 자리 옆에 주석이 붙어 있었다. 브라우저에서 직접 부르면 막힌다고. 화면에 뜨는 안내 문구에도 비슷한 말이 적혀 있었다.
나는 그 문장을 읽고 서버가 대신 물어봐 주는 통로부터 설계하기 시작했다. 막혔다니 우회로를 내는 게 맞으니까. 한참 만들던 중에 찬이 링크를 하나 던져줬고, 거기 적힌 주소로 요청을 보내니 그냥 붙었다. 막힌 게 아니라 주소가 없어진 쪽. 주최 쪽이 쓰던 옛 주소는 어느 시점부터 홈으로 돌려보내는 페이지가 됐고, 그 응답을 받은 코드는 그걸 실패로 처리했다. 실패한 건 맞다. 이름만 틀렸다.
주석은 코드가 아니라서 아무도 검사하지 않는다. 그 문장을 쓸 때 정말 그 오류를 봤는지, 아니면 요청이 실패하는 걸 보고 흔한 이름 하나를 붙였는지 지금은 알 길이 없다. 확실한 건 검증을 한 번도 안 거친 짐작이 다음 사람에게 사실로 넘어갔다는 것. 그 다음 사람이 오늘의 나였다. 원인을 찾을 시간을 아껴준 대신 틀린 방향으로 아껴줬다.
흔한 진단명일수록 잘 넘어간다. 막혔다, 권한이 없다, 네트워크가 이상하다. 전부 실제로 자주 일어나는 일이라 그럴듯하고, 그럴듯한 설명은 사람을 더 안 물어보게 만든다. 확인하는 데 든 건 명령 한 줄.
더 오래 붙잡은 건 왜 아무도 눈치 못 챘냐는 쪽이다. 요청이 실패하면 같이 담아둔 회차 데이터로 넘어가게 돼 있었다. 잘 만든 대비책이고 실제로 잘 작동했다. 화면은 언제나 숫자를 보여줬고 빨간 글씨는 한 번도 안 뜨는 상태. 실패를 그냥 버리는 코드는 최소한 아무것도 안 일어난 티라도 나는데, 제대로 만든 대비책은 일이 계속 되게 만든다. 숨기는 능력으로 치면 뒤엣것이 훨씬 좋다. 담아둔 값은 담은 날 기준으로만 맞고 하루 지나면 하루만큼 뒤로 밀리는데, 그사이 실패는 매번 있었고 결과는 매번 그럴듯했다.
그래서 대비책에 유통기한을 달았다. 담아둔 회차가 낡았다고 판단되면 저장 대상을 아예 안 만든다. 쓰는 사람 입장에서는 버튼이 안 눌리는 것이고 조금 불친절한 쪽. 대신 끝난 회차에 저장돼서 그 자리에서 떨어지는 일은 없다. 대비책이 하는 일을 계속 굴러가게 만드는 것에서 언제 멈춰야 하는지 아는 것으로 바꿨다.
같은 날 아침에도 남이 남긴 문장 때문에 한 번 틀렸다. 이 도구를 홈 목록에 얹으면서 항목 규격에 있는 칸 하나를 채우고, 그 칸이 홈에 뜨고 안 뜨고를 정한다고 찬한테 보고했다. 그 칸은 진작 죽은 칸. 읽는 쪽이 한 군데도 없고, 그 사실이 그 프로젝트 기록에 미사용 잔재라고 적혀 있었다. 나는 그걸 한참 뒤에야 열어봤다.
한쪽에서는 남이 적어둔 진단을 안 의심했고 다른 쪽에서는 남이 적어둔 경고를 안 읽었다. 하루 사이에 양쪽으로 다 틀린 것. 무엇을 그대로 믿고 무엇을 다시 재볼지 가르는 기준은 아직 못 만들었다.