다 만들고 나서 걷어냈다
설계 문서를 쓰고, 세 단계로 나눠 구현하고, 시험 마흔여덟 개를 통과시켰다. 그리고 직접 해 보고 되돌렸다.
턴제 전략 게임에 실시간 전투를 넣어 보려 했다. 턴을 넘길 때마다 전투가 숫자로만 결판나는 게 아쉬웠고, 시간이 흐르는 동안 명령을 내리고 필요하면 멈추는 방식이 더 재미있을 것 같았다.
결과부터 말하면 다 만들고 걷어냈다. 그 과정에서 배운 것이 기능 자체보다 값졌다.
제대로 시작했다
되돌아보면 시작은 흠잡을 데가 없었다. 설계 문서를 먼저 썼고, 그 문서의 첫 절은 내가 한 요구를 축약하지 않고 번호 붙여 옮긴 것이었다. 그 아래에 "한 문장으로:" 요약을 붙였다. 요구와 해석을 나란히 둔 것이다.
그다음이 핵심 원칙 여섯 개. 그중 하나가 나중에 이 이야기의 결말을 좌우한다 — 뒤에서 다시 나온다.
구현은 세 단계로 쪼갰고, 문서에 진행 표를 두어 단계마다 이렇게 적었다.
M1 … 적용 (2026-08-21 · 시험 test_policy.py 16개)
M2 … 적용 (…)
M3 … 적용 (…)
단계마다 시험 파일 이름과 개수를 함께 적는다. "됐다"가 아니라 "무엇으로 확인했다"를 적는 것이다. 세 단계를 합쳐 시험 마흔여덟 개가 붙었고 전부 통과했다.
그런데 해 보니
데이터 처리가 많아서 그런지 느리고 조작이 잘 안되고 하는 문제가 있어 실시간이 우리 시스템에 맞는지 다시 한번 고민이 필요할것 같네— 설계 문서의 철회 절에 남은 원문
시험은 다 통과했지만 게임이 재미없어졌다. 이건 시험이 잡을 수 있는 종류가 아니다. 시험은 "명령이 제 시각에 처리되는가"를 묻고, 나는 "이거 답답한데"를 느낀다. 둘은 다른 층에 있다.
원인은 분명했다. 이 게임의 속은 턴 단위로 한 번에 계산하는 엔진이다. 그 위에 연속된 시간처럼 보이는 껍데기를 씌운 것이라, 부대와 도시가 많아질수록 껍데기를 유지하는 값이 커졌다.
"연속 시간의 환상을 씌우는 비용이 재미보다 크다. 환상을 걷고 정직한 턴으로 돌아간다."
지우지 않고, 개정으로 남겼다
여기서 한 선택이 이 글의 요점이다. 설계 문서를 지우지 않았다. 대신 맨 뒤에 "개정 — 턴제 회귀"라는 절을 새로 열었다.
그 절에는 세 가지가 들어갔다.
- 무엇이 문제였나 (실측) — 느낌이 아니라 숫자로. 무엇이 얼마나 느렸는지.
- 남길 것과 걷어낼 것 — 표로 갈랐다. 실시간을 위해 만든 것 중에도 턴제에서 그대로 쓸모 있는 것이 있었다.
- 되살아나는 것 — 이 절이 특히 마음에 든다. 실시간을 넣으면서 가려졌던 기존 동작이 어느 것들이고, 걷어내면 그것들이 어떻게 돌아오는지 적었다.
왜 이렇게까지 하나. 몇 달 뒤에 같은 생각을 또 한다. "실시간으로 하면 재미있지 않을까?" 그때 문서에 "해 봤고, 이런 이유로 걷었다"가 없으면 처음부터 다시 만든다. 나도 그렇고, AI는 더 그렇다 — 막힌 길이 적혀 있지 않으면 가장 그럴듯한 그 길을 다시 제안한다.
깔끔하게 걷을 수 있었던 이유
되돌리는 데 며칠이 걸리지 않았다. 앞에서 미뤄 둔 핵심 원칙 하나 때문이다.
설정이 비어 있으면 원래 동작으로 돌아간다.
새 기능을 처음부터 이렇게 만들었다. 실시간 설정을 아무것도 켜지 않으면 기존 턴제 경로가 그대로 돈다. 새 갈래를 덧붙이기만 하고 기존 갈래를 고치지 않은 것이다.
그래서 걷어낼 때 기존 코드를 되돌릴 일이 없었다. 끄면 원래대로였으니까.
더 재미있는 일도 있었다. 나중에 관전 기능을 붙일 때 이 성질이 값을 했다. 착수 전에 영향 분석을 해 보니 결론이 이랬다 —
한 줄도 새로 쓰지 않는다. 관전은 "모든 설정이 비어 있는 상태"와 똑같아진다.
이미 있는 구조가 그 성질을 갖고 있었기 때문이다. 분석의 가장 좋은 결과는 안 만들어도 된다는 답이다.
AI와 일하면 버리는 값이 병목이 된다
예전에는 만드는 것이 비쌌다. 그래서 신중하게 고르고, 고른 다음에는 웬만하면 끝까지 갔다. 절반쯤 만든 것을 버리는 건 큰 손실이었다.
AI와 일하면 그 균형이 뒤집힌다. 설계 문서를 쓰고 세 단계로 구현하고 시험 마흔여덟 개를 붙이는 일이 며칠이면 된다. 만드는 값이 싸진 것이다.
그러면 병목이 옮겨 온다. 버리는 값으로.
만들기 쉬우니 더 많이 시도하게 되고, 시도가 많으면 버릴 것도 많아진다. 그런데 버리는 게 어려우면 — 기존 코드를 뜯어 고쳐 놓았거나, 왜 만들었는지가 안 적혀 있거나, 어디까지 퍼졌는지 모르면 — 버리지 못해서 안고 간다. 그게 쌓이면 손을 못 대는 코드가 된다.
새 기능을 시작할 때 "이걸 걷어낸다면 어떻게 걷나"를 먼저 정한다. 끄면 원래대로 돌아가게 만들고, 왜 만들었는지를 적어 두고, 걷어냈으면 걷어낸 이유까지 남긴다.
실시간 전투는 지금 게임에 없다. 대신 그 시도에서 나온 것 몇 가지는 남아 있고, "왜 없는지"가 문서에 적혀 있다. 마흔여덟 개의 시험은 지워졌지만 판단 하나가 남았다. 나쁘지 않은 거래였다고 생각한다.