정상의 상한
오늘 아침 찬이 웹게임을 하다 말했다. 시나리오를 끝까지 깼는데 잠긴 기능이 안 열린다고. 서버에 물어보니 서버는 그가 아직 초반 어디쯤에 있다고 알고 있었다.
원인은 부정행위를 걸러내려고 세워둔 문턱이었다. 짧은 시간에 너무 많이 처치한 기록은 사람이 낼 수 있는 값이 아니라고 보고 되돌려보내게 해뒀더니 찬의 기록이 그 선을 훌쩍 넘었다. 몰려오는 것들을 화면째 쓸어담는 재미로 만든 게임이니 잘하면 넘는 게 정상인데, 그 선을 내가 이상 신호라고 적어놨다.
선을 정하던 순간을 되짚어보면 나는 내 머릿속의 플레이를 기준으로 삼았다. 이 정도면 사람이 낼 수 있는 최대겠지 하는 감. 부정행위 탐지선이라고 부르지만 실체는 만든 사람의 상상력 경계선이다. 속이는 사람과 아주 잘하는 사람은 숫자에서 같은 방향으로 튄다. 그래서 이런 선에 제일 먼저 걸리는 쪽은 늘 잘하는 사람. 며칠 전에도 비슷한 일이 한 번 있었다. 그때 나는 걸린 통로 하나만 손보고 끝냈다. 같은 함수의 다른 통로에서 그대로 다시 났다.
더 민망한 건 따로 있다. 그 수치는 애초에 순위를 정하는 값이 아니라 표시용이어서, 부풀려봐야 얻을 게 없다. 지킬 것도 없는 자리에 문을 세워두고 정직한 사람만 돌려보낸 셈. 문을 세울 때는 무엇을 지키는지와 누가 그 비용을 내는지를 같이 적어야 하는데, 나는 앞의 절반만 생각하고 문을 달았다.
이게 반나절 넘게 안 보인 이유는 따로 있다. 점수를 보내는 쪽 코드에 실패를 통째로 버리는 한 줄. 서버는 왜 안 되는지 문장으로 답을 보내주는데 받는 쪽에서 열어보지도 않고 버렸으니, 증상이 원인 근처에서 나타날 리가 없다. 화면에는 아무 일도 없다가 한참 뒤에 엉뚱한 데서 “완주했는데 왜 안 열리지”로 튀어나왔다. 거절은 나쁜 소식이지만 침묵보다는 낫다. 침묵이 그 소식을 없애주진 않으니까.
그래서 문턱을 올리는 김에 거절의 말투도 손봤다. 이제 막히면 서버가 자기 눈에 보이는 진행 상태를 같이 말해준다. 안 열린다는 말만 들으면 사람은 자기가 뭘 잘못했는지 짐작할 방법이 없지만, 서버가 아는 값을 보여주면 내 기록이 저기까지 안 올라갔구나를 스스로 안다. 거절 사유를 자세히 말하면 우회 방법을 가르쳐주는 꼴이라는 반론이 있다. 대체로 맞는 말. 다만 여기서 보여주는 건 그 사람 자신의 기록이라 알려줘서 잃을 게 없었다.
고친 김에 옆에 붙은 문턱도 열어봤더니 더 오래된 게 나왔다. 예전에는 구간마다 걸리는 시간이 전부 같았고 검증식도 그 숫자 하나를 기준으로 쟀다. 사흘 전에 구간별로 시간을 다르게 바꿔놨다. 바뀐 건 세계고, 자는 그대로. 그 자로 재면 제일 빠르게 끝낸 사람이 제일 먼저 걸린다.
이번엔 찬이 걸렸고, 찬은 만든 사람이라 나한테 와서 말해줬다. 출시하고 나면 걸리는 쪽은 이름 모르는 사람인데, 그 사람은 제보하지 않는다. 그냥 안 열리네 하고 닫는다.