-
/review — 테스트가 못 보는 의미 부패를 청소하는 자리 (gstack 시리즈 4/6)IT 2026. 5. 20. 21:00
시리즈 3편에서 세 시선의 plan-review를 거쳐 PLAN v2를 도출했다. 이번 글부터는 PLAN을 들고 들어간 구현 사이클 차원의 게이트 — 그 첫 번째
/review가 car-game에서 무엇을 청소했는지를 다룬다.왜 이런 스킬이 필요했나
ralph-loop은 코드를 빠르게 늘린다. 그런데 빠르다는 건 두 가지 부작용을 동시에 가져온다.
- 잔재 누적: 어제 추가한 코드가 오늘은 더 이상 호출되지 않는다. 그런데 자동으로 지워지지는 않는다.
- 의미와 값의 분리: 어제
LANE_COUNT = 3이 맞는 값이었지만, 오늘 4차로로 바뀌면서 이 상수는 거짓말이 된다. 그래도 테스트는 통과한다 — 테스트는 "값의 일치"만 보지 "의미의 일치"는 못 보기 때문이다.
테스트가 모두 초록불일 때도 코드 안에는 부패한 라인이 쌓이고 있다. 부패는 처음엔 무해해 보이지만, 일정 분량 이상 누적되면 다음 기능을 추가할 때마다 잘못된 가정 위에서 출발하게 만든다. ralph-loop은 부패를 만들 수는 있어도 청소하지는 않는다 — 그게 자기 시야 안에서 보이지 않기 때문이다.
/review는 그 부패만 보는 별도 차원의 게이트다.무엇을 하는 스킬인가
/review는 코드 변경분을 받아 테스트가 보지 않는 차원에서 검토한다. 본질적으로 네 가지 종류의 결함을 본다:- 미사용 import: 더 이상 호출되지 않는 모듈 참조
- 거짓말하는 상수: 변경된 정책과 어긋나 있는 매직넘버 / 지역 상수
- 도달 불가 분기: 위에 early return이 박혀서 절대 실행되지 않는 코드
- 의미가 빠진 매직넘버: 출처 없이 박힌 숫자 — 다음 사람이 못 바꾸는 부채
이 결함들은 모두 테스트의 시야 밖에 있다. 테스트는 "함수가 약속한 출력을 내놓는가"를 묻지, "함수의 모든 라인이 살아 있는가"는 묻지 않는다.
그림 설명: 두 원은 같은 코드 베이스를 보는 두 가지 차원이다. 파란 영역은 단위 테스트의 시야 — 함수 입출력이 약속과 일치하는가를 본다. 초록 영역은
/review의 시야 — 라인의 의미가 현재 정책과 일치하는가를 본다. 두 원의 교집합은 "함수 시그니처가 맞고 자료구조도 정합한가" 정도. 미사용 import, 거짓말하는 상수, 도달 불가 분기, 출처 없는 매직넘버는 모두 초록 영역에만 떨어진다 — 테스트로는 잡을 수 없다.car-game에서 이 스킬이 한 일
세션 중반에
/review를 한 사이클 돌렸을 때 7개의 finding이 나왔다. 모두 자동 수정 가능한 종류였고, 즉시 정리됐다:- 거짓말 상수 1건: 4차로로 정책이 바뀐 뒤에도 한 모듈에
LANE_COUNT = 3이 남아 있었다. 호출 코드는 이 거짓 상수를 기준으로 차로 중앙 좌표를 계산하고 있었다 — 단위 테스트는 그 잘못된 계산값과 일치하면 통과해 버린다. - 미사용 import 3건: 기능이 분리·이동되면서 끊긴 모듈 참조 3개.
- 도달 불가 분기 1건: 위에 early return이 박혀 절대 실행되지 않는 분기 1개.
- 의미 없는 매직넘버 2건: 출처를 알 수 없는 상수 2개.
이 7개는
/review직전 시점까지 ralph-loop이 다 두고 간 부채였다. 한 사이클에 7개. 이 페이스로 부채가 쌓이는데 청소를 5일 안 하면 35~50개가 누적된다는 뜻이고, 그 시점에선 한 변경이 어디까지 영향을 주는지 추적이 어려워진다.그림 설명: car-game에서
/review가 한 사이클에 잡은 7개 finding을 종류별로 정리한 표다. 거짓말 상수 1건(주황), 미사용 import 3건(파랑), 도달 불가 분기 1건(분홍), 출처 없는 매직넘버 2건(보라). 네 종류 모두 단위 테스트는 잡지 못한다 — 그림 아래 회색 줄이 강조하듯 테스트 384개는 이 시점에 모두 통과 상태였다./review의 한 사이클이 이 7개를 모두 자동 정리했다. 청소를 안 했다면 다음 사이클은 거짓말 상수 위에서 출발하게 됐을 것이다.핵심 메시지
테스트는 값을 본다.
/review는 의미를 본다. car-game에서/review는 한 사이클에 7개의 의미 부패를 잡아내 ralph-loop이 깨끗한 출발점에서 다음 사이클을 시작할 수 있게 만들었다. 한 번 돌릴 때마다 "쌓일 뻔한 잘못된 가정"이 사라진다 — 이 누적 효과가 며칠치 ralph-loop이 비교적 안정적으로 굴러간 진짜 이유다.다음 글에서는
/review로도 잡을 수 없는 — 의미는 옳은데 화면 위에서 사라지는 — 영역을 다룬다./qa가 그 자리다.
이 글은 생성형 AI의 도움을 받아 작성되었습니다. 원본 자료를 기반으로 AI가 초안을 생성하고, 작성자가 검토·편집하였습니다.
'IT' 카테고리의 다른 글