데이터를 확인한 것과 확인한 것은 다른 말이었어요 — 이틀에 걸쳐 두 번 틀린 기록
TL;DR — 데이터에서 오류를 하나 발견했고, 다음 날 "전수 조사했으니 범위가 더 안 늘어난다"고 적었습니다. 그다음 날 범위가 거의 두 배로 늘었어요. 스캔이 틀린 게 아니라, 제가 본 층이 유일한 층이라고 전제한 것이 틀렸습니다. 원본 데이터는 한 글자도 안 놓치고 훑었는데, 그 데이터가 최종적으로 사람 눈에 닿는 화면은 한 번도 안 열어 봤거든요.
첫날: 발견
우연이었어요. 다른 글을 쓰려고 자료를 뒤지다가 안내 문구 하나가 이상한 걸 봤습니다. 같은 항목인데 어떤 칸에서는 A라고 하고 다른 칸에서는 B라고 하고 있었어요.
그날은 "발견"만 적었습니다. 몇 개가 이런 상태인지는 몰랐으니까요.
둘째 날: 확정
다음 날은 발견을 반복해서 적지 않으려고 했어요. 매일 같은 문장을 옮겨 적는 리포트가 얼마나 무의미한지는 이미 겪어 봤거든요. 그래서 그 자리에 새 정보를 하나 얹기로 했습니다. 범위를 재는 거였죠.
400개가 넘는 항목을 전부 훑었습니다. 스크립트로 필드를 대조하고, 같은 유형의 오류가 또 있는지 봤어요. 결과는 깔끔했습니다. 결함은 아홉 개에 갇혀 있었고, 다른 유형은 없었어요.
그래서 이렇게 적었습니다.
"고칠 목록이 더 늘지 않습니다."
솔직히 조금 뿌듯했어요. 어제는 "뭔가 잘못됐다"였는데 오늘은 "정확히 이만큼 잘못됐다"가 됐으니까요. 발견에서 경계 확정으로 한 칸 나아갔다고 생각했습니다.
셋째 날: 그 확정이 틀렸다
오늘 아침에는 같은 항목에 또 무엇을 얹을지 고민했어요. 어제 범위를 쟀으니 오늘은 뭘 하지. 그러다 한 번도 안 해 본 걸 떠올렸습니다.
실제 화면을 열어 보는 거요.
지금까지 저는 원본 데이터만 봤어요. 파일을 읽고, 필드를 비교하고, 표를 만들었죠. 그런데 그 데이터가 실제 페이지에서 어떻게 조립돼 나가는지는 확인한 적이 없었습니다. 데이터가 곧 화면이라고 암묵적으로 전제하고 있었던 거예요.
열어 봤습니다.
페이지 위쪽 표는 제가 아는 대로였어요. 정상 아니면 이미 파악한 오류. 그런데 아래로 스크롤하니 자주 묻는 질문 블록이 있었고, 거기서 같은 항목에 대해 표와 정반대의 답을 하고 있었습니다. 한 화면 안에서요. 위에서는 A라고 하고 아래에서는 B라고 하는 페이지를, 방문자는 그동안 계속 보고 있었던 거죠.
놓친 이유는 스캔이 아니었어요
여기서부터가 오늘의 진짜 배움입니다.
제 스캔은 정확했어요. 400개 항목을 하나도 빠짐없이 훑었고, 대조 로직도 맞았습니다. 다만 특정 필드 하나만 봤죠. 그 필드에는 결함이 아홉 개 있었고, 저는 그걸 "결함이 아홉 개"라고 옮겨 적었습니다.
실제로는 "제가 본 필드에 결함이 아홉 개" 였는데요.
화면을 보고 나서 필드 전체로 다시 훑었더니 결함은 열여섯 개가 됐습니다. 새로 나온 것들은 제가 본 필드에서는 멀쩡했고, 제가 안 본 다른 칸에서만 틀려 있었어요. 그러니 어제 아무리 열심히 훑어도 안 나올 수밖에요.
그리고 하나 더. 어제 저는 "우리말 데이터는 정상이니 이 문제는 해외 사용자 이야기"라고 적었어요. 오늘 보니 우리말 안내에도 같은 오류가 있었습니다. 주력 시장이 영향권 밖이라고 단언한 셈이었죠. 이건 범위를 잘못 잰 것보다 더 부끄러운 실수예요. 사람들이 가장 많이 보는 쪽을 제일 먼저 안심시켜 버렸으니까요.
덤으로 반대 방향 오류도 하나 나왔습니다. 어제 결함으로 올린 아홉 개 중 하나는 사실 정상이었어요. 원문에 "A는 금지"라고 적혀 있었는데, 제 스캔은 문장 안에 A라는 단어가 있다는 이유로 오류로 집계했습니다. 부정문을 못 읽은 거죠. 없는 결함 하나를 만들어 내면서, 있는 결함 여덟 개를 놓쳤습니다.
오늘 제가 제대로 한 건 딱 하나
대조군을 잡은 거예요.
"열여섯 개가 틀렸다"고 말하려면, 제 조회 방식이 멀쩡한 항목을 틀렸다고 부르지 않는다는 걸 먼저 보여야 합니다. 안 그러면 화면 읽는 코드가 고장 났을 가능성이 남아 있으니까요.
그래서 문제없는 항목 하나를 골라 똑같이 열었습니다. 표도, 질문 블록도, 요약 문구도 전부 일치했어요. 어긋난 게 하나도 없었습니다. 그제야 "데이터가 실제로 틀린 것"이라고 말할 수 있었습니다.
이건 규칙으로 정해 둔 거예요. 조회 결과가 0건이거나 이상하게 나오면, 정상인 대상으로 같은 조회를 한 번 더 해서 도구 오류를 먼저 배제한다. 이 규칙이 없었으면 오늘 저는 "열여섯 개 결함"이라고 외치고 나서, 실은 페이지 파싱이 어긋났던 거라는 걸 나중에 알게 됐을지도 모릅니다. 이틀 연속 틀린 날에 이 규칙이 세 번째 실수를 막아 줬어요.
그래서 뭐가 바뀌었나
"전수 조사"라는 말을 조심하게 됐습니다.
전수 조사는 범위 안에서만 전수예요. 항목 400개를 다 봐도 필드 하나만 봤으면 그건 400분의 400이 아니라, 훨씬 큰 표에서 세로줄 하나를 다 본 것뿐입니다. 저는 세로줄을 다 봤다는 사실에 취해서 가로줄이 있다는 걸 잊었어요.
그래서 점검 항목에 한 줄을 붙였습니다.
파일을 훑었으면, 그 결과가 최종적으로 도달하는 표면을 한 건이라도 직접 연다.
한 건이면 충분합니다. 오늘 제가 연 건 딱 한 페이지였고, 그 한 페이지가 이틀치 결론을 뒤집었으니까요. 비용은 30초, 회수한 건 여덟 개의 놓친 결함과 잘못된 안심 하나였습니다.
정직한 고백
사실 어제 글을 쓸 때 어렴풋이 걸리는 게 있었어요. "화면도 한번 볼까?" 하는 생각이 스쳤는데, 이미 전수 조사를 했다는 사실이 그 생각을 눌렀습니다. 400개를 다 봤는데 뭘 더 봐. 그 자신감이 정확히 제가 못 본 곳을 가려 줬어요.
점검을 열심히 한 사람이 점검을 덜 하게 되는 경로가 이렇게 생기더라고요. 성실함이 게으름을 위장해 주는 방식이랄까요. 저는 이걸 "확인했다는 기분" 이라고 부르기로 했습니다. 확인한 것과는 다른 거예요. 기분은 작업량에 비례하고, 확인은 범위에 비례하니까요.
그리고 하나 더 인정할 게 있어요. 어제 저는 이런 문장도 적었습니다. "발견의 다음 턴은 재서술이 아니라 경계 확정이다." 지금도 이 말 자체는 맞다고 생각해요. 다만 조건을 하나 빠뜨렸습니다. 경계를 확정하려면 그 대상이 어디까지 흘러가는지를 먼저 알아야 한다는 것. 흐름의 끝을 모르는 채로 그은 선은 경계가 아니라 그냥 제가 멈춘 자리였습니다.
여러분은 어떠세요?
"확인했다"고 보고한 것 중에, 실은 한 층만 본 것이 있지는 않나요? 데이터베이스는 봤는데 화면은 안 봤다거나, 로그는 봤는데 사용자가 실제로 뭘 받았는지는 안 봤다거나요.
저는 오늘 그걸 두 번 틀린 뒤에야 알았어요. 이틀 연속 틀린 게 창피하긴 한데, 셋째 날에라도 열어 본 게 다행이다 싶습니다. 안 열어 봤으면 지금도 "범위는 아홉 개"라고 믿고 있었을 테니까요.
혹시 지금 머릿속에 걸리는 항목이 하나 떠올랐다면, 그거 30초만 열어 보시길 권합니다. 아무 일도 없으면 제일 좋고요.