설계 판단
이름만 바꾸면 되지 않는다 — 격자 규격까지 따라 하면 위험하다
낙하 블록 게임 v1을 폐기하고 다시 만든 이유. 용어를 전부 지워도 10×20 격자와 정형 4칸 7종 조각, 표준 회전 규칙이 그대로면 위험은 남는다.
용어를 전부 지웠는데도 다시 만들었다
낙하 블록 퍼즐의 첫 버전은 이름과 용어만 바꾼 구현이었습니다. 제목, h1, 메타 태그, OG, 소제목, 자바스크립트 코드에서 문제가 될 단어를 전부 지웠습니다. 검증도 했습니다. 저장소 전체를 훑어 해당 용어가 0건임을 확인했고, 회전 규칙은 "벽 밀어내기 회전"으로 일반화했으며, 블록 색상도 표준 팔레트에서 벗어난 자체 색으로 바꿨습니다.
그런데 규격이 그대로였습니다. 10열 20행 격자에 정형 4칸 조각 7종, 그리고 표준 회전 규칙. 이름을 다 바꿔도 게임을 열면 무엇을 본떴는지 한눈에 보이는 상태였습니다. 실제 분쟁 사례에서 문제가 된 것도 이름이 아니라 이 조합이었습니다. 결국 페이지를 내리고 스펙부터 새로 썼습니다.
무엇을 바꿨나
다시 만들면서 규격 자체를 다르게 잡았습니다. 격자는 8열 12행, 조각은 5종입니다. 중요한 건 조각의 칸 수가 제각각이라는 점입니다. 막대 3칸, 꺾쇠 3칸, 네모 4칸, 번개 4칸, 쐐기 1칸으로 구성했습니다. 모든 조각이 4칸으로 통일된 세트와 가장 크게 갈리는 지점입니다.
여기에 원본에 없는 메커닉을 넣었습니다. 스파크 코어가 터지면 인접한 칸이 날아가고, 그 구멍으로 위쪽 블록이 열 단위로 흘러내리며 연쇄가 이어집니다. 이 규칙 덕분에 판을 뒤집는 역전 수단이 생겼고, 조각을 쌓아 줄을 지우는 것 말고 다른 축의 판단이 필요해졌습니다.
스펙과 코드가 어긋나 있었다
v1을 정리하면서 더 나쁜 문제도 드러났습니다. 페이지 본문에는 스펙을 따라 "8열 12행, 5종 블록"이라고 적혀 있었는데코드는 10×20에 7종이었습니다. 사용자가 읽는 설명과 실제로 돌아가는 게임이 달랐던 겁니다.
문서를 먼저 쓰고 구현이 따라오지 않으면 이런 일이 생깁니다. 그래서 지금은 본문에 적은 수치를 엔진 상수와 기계적으로 대조합니다. 격자 크기, 조각 개수, 레벨 수처럼 본문에 등장하는 숫자는 코드에서 찾아 맞춰 봅니다. 문서가 코드보다 앞서 있으면 문서를 고치는 게 아니라 코드가 사실이라고 보고 둘 중 하나를 맞춥니다.
기계적인 검사는 예외를 만들면 끝이다
금지 용어가 다시 들어오지 못하도록 엔진 테스트에 소스 검사를 넣었습니다. 주석까지 포함해 특정 단어가 0건인지 확인합니다.
재미있게도 이 검사가 자기 자신의 주석에 걸린 적이 있습니다. 테스트 파일 헤더에 적힌 설명 문구가 금지 목록의 단어를 포함하고 있었던 겁니다. 검사를 느슨하게 만들지 않고 주석 표현을 바꿨습니다.한 번 예외를 허용하면 그 다음부터는 게이트가 아니라 장식이 됩니다.