한 곳만 고치면 되게 만든다
여러 곳을 맞춰 고쳐야 하는 일은 반드시 한 곳이 빠진다. 사람이 해도 그렇고, AI가 해도 그렇다.
판 번호가 게임 안에 여러 군데 나온다. 타이틀 화면, 실행 파일 속성, 설치 파일 이름, 빌드 스크립트. 예전에는 화면을 그리는 파일 안에만 있어서, 나머지가 같은 값을 쓰려면 파일을 뒤져야 했다.
지금은 한 줄이다. 그 한 줄을 고치면 넷이 다 따라온다.
사소해 보이지만 이 파일에는 조건이 하나 더 붙어 있다 — 게임 라이브러리를 불러오지 않는다. 빌드 스크립트가 게임을 띄우지 않고 이 값만 읽을 수 있어야 하니까. 단일 소스로 만들기 위해 의존성을 일부러 덜어낸 것이다.
위반의 대가를 주석에 적어 둔다
"여기 한 곳에서만 정한다"는 주석이 스물네 군데가 넘는다. 그중 여럿에는 안 지켰을 때 무슨 일이 있었는지가 같이 적혀 있다.
저장 파일 이름의 앞머리를 두 곳에 따로 적어 뒀다가, 한 무대에서 저장한 파일이 불러오기 목록에 안 떴다. 저장은 됐는데 목록에서 안 보이니 사라진 것처럼 보였다.
어떤 표를 게임만 알고 지도 편집기는 몰랐다. 같은 자료를 두 프로그램이 다르게 해석하니, 편집기에서 멀쩡한 지도가 게임에서는 이상하게 나왔다.
대가를 적어 두는 이유는 단순하다. "한 곳에서만"은 지키기 귀찮다. 급할 때는 그 자리에 값을 하나 더 적는 게 빠르다. 그 유혹이 올 때 옆에 "예전에 이래서 이런 일이 있었다"가 적혀 있으면 손이 멈춘다.
어디에 두는지도 규칙이다
값만 한 곳에 모으는 게 아니다. 검사도 한 곳에 둔다.
정착 명령을 부르는 자리가 셋 있었다 — 손으로 내릴 때, 미리보기에서 확정할 때, 예약해 둔 것이 실행될 때. 세 자리에 각각 검사를 넣으면 언젠가 하나를 빠뜨린다. 그래서 주석에 이렇게 적고 안쪽 한 곳으로 모았다.
검사는 여기 한 곳에 둔다 — 부르는 자리가 셋이라 각각에 두면 하나를 빠뜨린다.
화면 크기도 같다. 화면마다 크기를 따로 재면 곧 어긋나므로 한 곳만 본다. 표의 열 폭도, 입체 효과의 깊이도 그렇다 — 한 곳만 바꾸면 모든 요소가 함께 바뀐다.
한 곳으로 못 모을 때는 등가성을 시험한다
늘 하나로 합칠 수 있는 건 아니다. 게임과 지도 편집기는 별개 프로그램인데 같은 지도를 같은 모습으로 그려야 한다. 그리는 코드를 완전히 공유하기는 어렵다.
이럴 때는 합치는 대신 둘이 같은지를 재는 시험을 만든다. 편집기가 그린 그림과 게임이 그린 그림이 같은지 본다. 하나로 못 모으면, 어긋났을 때 알게 만드는 것이다.
이름도 마찬가지다. 같은 기술 이름이 여러 자료와 화면에 흩어져 있는데, 서로 맞는지를 재는 시험이 있다. 사람이 대조하면 반드시 빠뜨린다.
문서도 대상이다
가장 마음에 드는 시험이 하나 있다. 설명이 한 줄이다.
조작법이 거짓말을 하면 안 된다.
게임 안 조작 안내에 적힌 키와 실제로 동작하는 키가 같은지 본다. 기능을 고치면서 안내를 잊는 일이 잦으니까.
실제로 이 종류의 점검에서 잡힌 것들이 있다 — 없어진 명령이 안내에 남아 있었고, 이름이 바뀐 기능이 옛 이름으로 적혀 있었다. 문서도 코드처럼 낡는다. 다만 문서는 낡어도 아무 일이 안 생기니 더 오래 방치된다.
웹 쪽에서도 같은 방식
이 홈페이지의 내려받기 목록을 손으로 쓰지 않는다. 폴더를 훑어 파일 목록과 크기와 지문을 자동으로 채운다. 새 판을 올릴 때 내가 적는 것은 "이 판에서 바뀐 것" 뿐이다.
스타일도 파일 하나에 모았다. 이 글과 옆의 글들이 같은 스타일 파일을 쓴다. 새 글을 쓸 때 껍데기를 복사하지 않아도 된다.
최근에 하나 더 붙였다. 내려받기 목록이 판 여러 개에서 제대로 그려지는지 확인하는 시험인데, 페이지의 코드를 다시 구현하지 않고 그대로 떼어내 실행한다. 그러니 페이지를 고치면 시험도 자동으로 따라간다. 시험이 낡을 수 없게 만든 것이다.
AI와 일할 때 이게 왜 더 중요한가
AI는 "이 값을 쓰는 다섯 곳을 다 고쳐줘"를 아주 잘한다. 사람보다 빠르고, 대개 정확하다. 문제는 두 가지다.
하나를 빼먹고도 "했습니다"라고 한다
네 곳을 고치고 한 곳을 놓쳤을 때, 돌아오는 답은 "네 곳을 고쳤습니다"가 아니라 "모두 고쳤습니다"다. 스스로 몇 곳인지 세지 않았기 때문이다. 그러면 나는 확인할 근거가 없다.
여섯 번째 자리가 있는 것을 모른다
이게 더 무섭다. 검색으로 안 걸리는 자리 — 이름을 조립해 부르거나, 다른 낱말로 적혀 있거나, 문서에만 있는 자리는 애초에 목록에 안 들어온다. 다섯 곳을 완벽하게 고쳐도 여섯 번째는 그대로 남는다.
그리고 나도 모른다. 몇 달 전에 내가 만든 자리인데도.
고칠 곳을 세는 능력에 기대지 않는다. 고칠 곳을 하나로 줄인다. 하나면 세지 않아도 된다.
줄일 수 없을 때는 어긋났을 때 알게 만든다. 둘을 재는 시험, 이름이 맞는지 보는 시험, 문서가 거짓말하는지 보는 시험. 그러면 여섯 번째 자리가 있어도 영영 모르는 상태는 안 된다.
한 곳으로 모으는 일은 게으름이 아니다. 실수 예산을 줄이는 일이다. 사람의 주의력에도, 기계의 검색 능력에도 한도가 있으니, 그 한도 안에서 굴러가게 판을 좁혀 두는 것이다.