검수기 개선 7가지 팁: 정확한 검수기 만들기


1. 시작은 "통과했다는 말을 믿을 근거가 없다"였습니다</h2><p>검수기를 만들고 문서를 넣었더니 통과가 나왔습니다. 기분은 좋은데, 곧 불편한 생각이 따라옵니다. <strong>이 통과는 문서가 멀쩡해서 나온 것인가, 검사기가 아무것도 못 봐서 나온 것인가.</strong></p><p>두 경우의 출력이 똑같습니다. 결함이 없는 문서를 검사한 결과도 "통과"이고, 결함을 못 알아보는 검사기가 결함투성이 문서를 검사한 결과도 "통과"입니다. 화면만 보고는 둘을 못 가릅니다. 심지어 <strong>검사가 0개 돌았을 때의 출력</strong>도 전부 통과와 비슷하게 보입니다.</p><p>여기서 방향이 하나 바뀝니다. 검수의 대상이 문서만이 아니라는 것입니다. <strong>측정기 자체가 측정 대상이어야 합니다.</strong> 자를 믿고 길이를 재기 전에, 자가 눈금대로 생겼는지 한 번은 봐야 합니다.</p><h2>2. 그래서 이번에 정한 질문 하나</h2><p>"검수기를 어떻게 더 정확하게 만드나"가 아니었습니다. 질문은 이것이었습니다.</p><blockquote><p><strong>이 검수기가 실제로 무언가를 했다는 것을, 무엇으로 아는가.</strong></p></blockquote><p>이 질문은 대상이 아니라 <strong>도구</strong>를 겨눕니다. 그리고 답이 하나뿐이었습니다 — 답을 아는 문제를 주고 채점해 보는 것. 결함이 있다는 것을 내가 아는 문서를 넣어서, 검사기가 그것을 잡는지 봅니다. <strong>거부한 적이 없는 검사는 검사가 아닙니다.</strong></p><h2>3. 사용한 개념과 도구 — 세 층, 그리고 전/후라는 축</h2><p>재귀 검수라고 부르지만 구조는 단순합니다. 층이 세 개입니다.</p><pre><code>1층   대상          문서·데이터            → 검수기가 본다        → 결함이 있는가
2층   측정기        검수기 자신            → 심은 결함으로 채점   → 검사기가 잡는가
3층   자기 적용     우리가 만든 산출물     → 같은 검수기에 넣는다 → 우리도 통과하는가</code></pre><p>그리고 이 세 층을 가로지르는 축이 하나 더 있습니다. <strong>전/후</strong>입니다. 검수기를 고쳤을 때 "좋아졌다"고 말하려면, 옛것과 새것을 <strong>같은 문제</strong>로 채점해야 합니다. 서로 다른 문서로 잰 두 점수를 비교하는 것은 비교가 아니라 두 개의 다른 이야기입니다.</p><pre><code>전/후   옛 검수기 · 새 검수기  → 같은 문제로 채점  → 차이가 곧 개선의 크기</code></pre><p>★ 한 가지 미리 밝혀둡니다. 이 구조는 <strong>완전한 검증이 아닙니다.</strong> 2층을 재려면 3층이 필요하고, 3층을 재려면 4층이 필요합니다. 재귀는 원리상 끝나지 않습니다. 그래서 <strong>어디서 멈출지를 미리 정하는 것</strong>이 이 설계의 일부입니다. 저는 사람의 승인에서 멈춥니다(§8).</p><h2>4. 실제로 지킨 규칙 세 개와, 그 규칙이 막는 실패</h2><h3>① 측정기를 먼저 공격한다 — 통과가 검사기의 침묵인지 대상의 무결인지 못 가리는 것을 막는다</h3><p>검사기에 답을 아는 결함을 일부러 심고, 그것을 잡는지 봅니다. 잡으면 그 검사기의 통과는 의미가 생기고, 못 잡으면 그 검사기의 통과는 <strong>아무 뜻도 없습니다.</strong> 실제로 결함을 주입해 위치까지 검출되는지, 복구하면 다시 통과하는지를 재현으로 확인한 기록이 있습니다(07-INTEGRITY 편).</p><p>이 습관이 만든 가장 중요한 발견은 <strong>검사의 층이 다르면 보는 것이 다르다</strong>는 것이었습니다. 줄 수만 세는 검사는 줄 수가 맞는데 글이 빠진 경우를 통과시켰습니다. 그 위에 중복 검출을 얹으니 다른 종류가 걸렸고, 완전일치 대조까지 올려야 남은 것이 잡혔습니다. 층을 올리기 전에는 <strong>아래층의 통과가 전부인 줄 알았습니다.</strong></p><h3>② 자기 산출물을 예외로 두지 않는다 — 규격이 자기에게만 관대해지는 것을 막는다</h3><p>검수기는 보통 남이 만든 것, 기계가 만든 것에 겨눠집니다. 그런데 <strong>내가 쓴 초안</strong>은 슬그머니 검수 밖에 놓입니다. "내가 쓴 거라 내가 안다"가 이유인데, 그 이유는 검수를 면제할 근거가 아니라 검수가 필요한 이유에 가깝습니다.</p><p>실제로 자기 초안을 승격 문턱의 검증 좌석에 통과시켰을 때, <strong>내 초안에서 오류 2건이 잡혔습니다</strong>(11-PROMOTE 편). 만든 사람이 스스로는 못 본 오류였습니다. 같은 이유로 채점은 만든 자리가 아닌 다른 자리에서 했습니다 — 아이디어 5건을 두 좌석이 따로 채점해 3건만 통과시킨 기록이 있습니다(10-SURVEY 편).</p><h3>③ 전/후를 같은 문제로 비교한다 — "좋아졌다"를 주장인 채로 두는 것을 막는다</h3><p>성능이 올랐다는 말은, 옛것과 새것을 같은 문제로 채점하기 전까지 주장입니다. 그래서 답을 아는 결함을 심어 두 검수기를 같은 문제로 채점했습니다(09-INSPECT 편).</p><p>그 결과에서 가장 값진 줄은 <strong>개선이 없었던 줄</strong>이었습니다. 인용 표시가 붙은 결함은 옛 검수기도 30/30, 새 검수기도 30/30으로 <strong>동률</strong>이었습니다. 이 동률이 개선의 성격을 정확히 말해줍니다 — 새 검수기가 더 똑똑해진 것이 아니라, 옛 검수기가 <strong>구조적으로 볼 수 없던 영역</strong>을 검사 범위에 넣은 것입니다. 전/후 비교가 없었다면 이 개선을 "검수기가 더 정확해졌다"고 잘못 설명했을 것이고, 그것은 사실이 아닙니다.</p><h2>5. 지금까지 관찰된 결과 (전부 기발행 값 · 미측정은 미측정이라고 적습니다)</h2><p>⚠ 이 표에는 이 글을 위해 새로 잰 값이 <strong>없습니다.</strong> 오른쪽 칸에 어느 편에서 왔는지 적었습니다.</p><table><thead><tr><th></th><th>관찰된 값</th><th>기발행 출처</th></tr></thead><tbody><tr><td>측정기 채점</td><td>답을 아는 결함 150개(5클래스 × 30)로 옛·새 검수기를 같은 문제로 채점</td><td>09-INSPECT</td></tr><tr><td>측정기 채점</td><td>검사 가시 범위 옛 40% → 새 100%</td><td>09-INSPECT</td></tr><tr><td>측정기 채점</td><td>인용 붙은 결함 적발 옛 30/30 = 새 30/30 (<strong>동률</strong>)</td><td>09-INSPECT</td></tr><tr><td>측정기 채점</td><td>인용 없는 결함 적발 옛 0 → 새 60/60</td><td>09-INSPECT</td></tr><tr><td>측정기 채점</td><td>정상 문장 오탐 0 / 30 · 실행 약 30초</td><td>09-INSPECT</td></tr><tr><td>자기공격</td><td>결함 주입 → 위치까지 검출 → 복구 → 통과 (재현 확인)</td><td>07-INTEGRITY</td></tr><tr><td>검사 층</td><td>줄 수만 세는 검사가 통과시킨 유실 2건 · 무증상 탈락 6건</td><td>07-INTEGRITY</td></tr><tr><td>검사 층</td><td>완전일치 대조 551조각 결함 0</td><td>07-INTEGRITY</td></tr><tr><td>자기 적용</td><td>승격 전 <strong>내 초안</strong>에서 잡힌 오류 2건</td><td>11-PROMOTE</td></tr><tr><td>자기 적용</td><td>원장 판정 10줄 = 보류 9 · 기각 1</td><td>11-PROMOTE</td></tr><tr><td>채점 분리</td><td>아이디어 초안 5건 → 두 좌석 독립 채점 → 통과 3 · 보류 2</td><td>10-SURVEY</td></tr><tr><td>채점 분리</td><td>원문 대조 인용 13건 · 인용 수치 불일치 0건 · 중대 플래그 1건</td><td>10-SURVEY</td></tr><tr><td><strong>3층 전/후</strong></td><td><strong>미측정</strong> — 우리가 쓴 글 자체를 우리 검수기에 넣은 전/후 비교는 진행 중이고 결과 없음</td><td>(해당 없음)</td></tr></tbody></table><p>마지막 줄이 이 글의 정직한 자리입니다. 1층과 2층은 이미 값이 있고, <strong>3층은 사상만 있고 수치가 없습니다.</strong> 여기에 그럴듯한 숫자를 채우는 순간 이 글은 자기가 반대하는 것을 하게 됩니다 — 재보지 않은 것을 통과로 적는 일입니다.</p><p>그리고 표에서 두 번 나오는 <strong>2건</strong>은 서로 다른 사건입니다. 07의 2건은 검사기가 놓친 유실이고, 11의 2건은 검증 좌석이 내 초안에서 잡은 오류입니다. 같은 숫자라고 같은 이야기로 읽지 않으시길 바랍니다.</p><h2>6. 따라 해보고 싶으시면 — 가장 작은 형태부터</h2><p>검수기가 없어도, 검사 한 개만 있으면 오늘 할 수 있습니다.</p><p><strong>1) 검사 하나에 답을 아는 결함을 하나 심어 보십시오.</strong> 통과하던 것이 걸리는지만 봅니다. 안 걸리면 그 검사는 지금까지 아무것도 안 하고 있었던 것입니다.</p><p><strong>2) 정상인 것도 한 번 넣어 보십시오.</strong> 결함을 잡는 것만큼 <strong>멀쩡한 것을 안 잡는 것</strong>도 성능입니다. 다 잡는 검사기는 다 막는 문과 같습니다.</p><p><strong>3) 당신이 쓴 것을 같은 검사에 넣으십시오.</strong> 남의 산출물에만 겨눠진 검수기는, 가장 검수가 필요한 문서를 빼놓고 돌아갑니다.</p><p><strong>4) 고쳤으면 옛것과 새것을 같은 문제로 채점하십시오.</strong> 다른 문서로 잰 두 점수의 비교는 비교가 아닙니다. 그리고 <strong>차이가 0인 줄</strong>을 지우지 마십시오. 그 줄이 개선의 성격을 알려줍니다.</p><p><strong>5) 채점은 만든 자리가 아닌 다른 자리에서 하십시오.</strong> 같은 대화창에서 "이제 검수 모드로 봐줘"는 검수가 아닙니다.</p><h2>7. 판정은 네 가지로 나누십시오 (두 가지로는 부족합니다)</h2><p>측정기를 "믿는다/안 믿는다"로만 보면, <strong>재보지 않은 검사기가 믿는 칸에 들어갑니다.</strong></p><pre><code>PASS            심은 결함을 잡았고, 정상 문장을 오탐하지 않았다
PASS_WITH_NOTE  잡았으나 그 결함 종류에 한정된 결론이다 — 심지 않은 종류는 아직 모른다
HOLD            측정기 자체를 재지 못했다 — 이 통과는 아직 뜻이 없다
FAIL            심은 결함을 못 잡았거나, 멀쩡한 것을 잡았다</code></pre><p><code>HOLD</code>가 이 글의 핵심 칸입니다. <strong>재보지 않은 검사기의 통과는 통과가 아니라 미판정입니다.</strong> 이 칸이 없으면 "아직 안 재봤다"가 "괜찮다"와 같은 자리에 놓입니다.</p><h2>8. 한계와 대가 (얻은 것 옆에 잃은 것)</h2><p><strong>재귀는 원리상 끝나지 않습니다.</strong> 검수기를 검수한 도구는 또 누가 검수하느냐는 질문이 남습니다. 저는 이 무한을 이론으로 닫지 못했고, <strong>사람의 승인에서 멈추기로</strong> 정했을 뿐입니다. 이것은 해결이 아니라 선택이고, 그 선택이 이 구조의 바닥입니다. 바닥이 사람이라는 사실을 숨기고 "자동으로 검증된다"고 말하면 그것이 과장입니다.</p><p><strong>심을 수 있는 결함만 잽니다.</strong> 벤치마크는 내가 만들 수 있는 종류의 결함으로만 채워집니다. 표현을 바꿔 쓴 결함처럼 도구가 원리상 못 잡는 종류는 아예 심지 않았습니다 — 심으면 0으로 나올 것을 알기 때문입니다(09-INSPECT 편에 그대로 적혀 있습니다). 그래서 이 측정은 <strong>"검수기가 좋다"가 아니라 "이 결함 종류에서는 이렇다"</strong>까지만 말합니다. 이 한정을 떼면 측정이 과장으로 바뀝니다.</p><p><strong>자기 적용에는 producer=evaluator 위험이 그대로 남습니다.</strong> 내가 만든 검수기로 내 글을 검수하면, 내가 안 보는 것은 검수기도 안 볼 가능성이 큽니다. 같은 사각을 공유하기 때문입니다. 그래서 자기 적용은 <strong>다른 자리의 채점</strong>과 짝이어야 하고, 짝 없이 자기 적용만 하면 통과율만 좋아집니다.</p><p><strong>비용도 적어둡니다.</strong> 답을 아는 문제를 만드는 일 자체가 일입니다. 결함을 심고, 심기 전에 그 문장이 원문에 없는지 확인하고, 채점표를 만들어야 합니다. 검사기 하나를 고칠 때마다 이 작업이 따라옵니다. 그래서 실제로는 <strong>모든 검사기를 이렇게 재지 못했습니다</strong> — 잰 것과 안 잰 것을 구분해 두는 것이 지금 할 수 있는 최선입니다.</p><p><strong>그리고 버린 생각을 적어둡니다.</strong> 처음에는 "검수를 통과했으면 됐다"고 봤습니다. 통과가 검사기의 침묵일 수 있다는 것을 확인하고 버렸습니다. 그다음에는 "검수기를 한 번 채점했으면 됐다"고 봤습니다. 검사 층을 올릴 때마다 새로운 종류가 잡히는 것을 보고 그것도 버렸습니다. <strong>한 번의 채점은 그 시점의 검사기에 대한 것</strong>이지 그 뒤의 검사기에 대한 것이 아닙니다.</p><h2>9. 결론 — 가져가실 규칙 세 개</h2><p><strong>첫째, 통과는 대상의 무결일 수도 있고 검사기의 침묵일 수도 있습니다.</strong> 두 경우의 출력이 같기 때문에, 답을 아는 결함을 심어 보기 전까지 통과는 정보가 아닙니다. 거부한 적이 없는 검사는 검사가 아닙니다.</p><p><strong>둘째, 자기 산출물을 검수 밖에 두지 마십시오.</strong> 가장 검수가 필요한 문서는 보통 자기가 쓴 것입니다. "내가 써서 내가 안다"는 면제 사유가 아니라 사각의 다른 이름이고, 그래서 채점은 만든 자리가 아닌 다른 자리에서 해야 합니다.</p><p><strong>셋째, "좋아졌다"는 전/후를 같은 문제로 채점하기 전까지 주장입니다.</strong> 그리고 그 비교에서 <strong>차이가 0인 줄을 지우지 마십시오.</strong> 개선이 없었던 줄이 개선의 성격을 설명합니다 — 더 똑똑해진 것인지, 못 보던 곳을 보게 된 것인지는 그 줄에서만 갈립니다.</p><h2>10. 참고</h2><p>답을 아는 결함을 심어 검사기를 채점하는 방식은 결함 주입(fault injection) 평가의 작은 형태이고, 소프트웨어 시험에서 시험 자체의 유효성을 재는 뮤테이션 테스트와 발상이 같습니다. 만든 쪽과 채점하는 쪽을 나누는 규칙은 이 시리즈의 서베이 편과 승격 편에서 이미 실행한 것이고, 이 글은 그 둘을 "측정기도 측정 대상"이라는 한 줄로 묶었습니다. 검사 층을 올릴수록 다른 종류가 잡힌 기록은 무결성 편에, 전/후 동률이 개선의 성격을 드러낸 기록은 검수 하네스 편에 있습니다.</p>
1
2개의 답글
밀어주고 끌어주는

온·오프라인 AI 스터디

AI로 어디까지 할 수 있는지
직접 확인하실 분만 신청하세요.