3장 · 저자 검증 기록
서로 독립된 빈 폴더에서 2회 실행 · 2회 모두 같은 숫자로 원인에 도달 값이 처음 달라지는 지점 2/2 일치 · 차이가 20위 영화 관객수와 정확히 일치 2/2 · 한 곳 수정 뒤 검사 8개 전항목 통과 2/2 · 최종 확인 2026-08-29
실제로 만들어봤습니다
책에 인쇄된 요청문만으로 원인을 찾아 되돌릴 수 있는지 확인했습니다.
- 요청문은 책 3장에 나오는 문장을 글자까지 그대로 썼습니다.
- 2장을 끝낸 상태를 빈 폴더에 놓고 검사 8개가 모두 통과하는 것을 확인한 뒤 3장을 이어 붙였습니다. 3장은 정상 보고서와 검사가 있어야 성립하기 때문입니다.
- 책에 없는 추가 지시를 보태지 않았습니다.
- 서로 독립된 빈 폴더 2개에서 각각 새 세션으로 돌렸습니다.
3장의 완료 기준은 여섯 가지입니다. 두 실행 모두 여섯 가지 전부 통과했습니다.
| 확인 항목 | 실행 2회 | |
|---|---|---|
| 1 | 오류가 요약 총 관객수 한 곳에만 들어가고, 기준 자료·상세 데이터·기존 검사는 그대로다 | 통과 |
| 2 | 그 오류가 검사에서 실패로 잡힌다 | 통과 |
| 3 | 수정하지 않고 다시 실행해도 같은 실패가 다시 나타난다 | 통과 |
| 4 | 값이 처음 달라지는 지점이 상세 데이터에서 요약 총 관객수를 계산하는 단계다 | 통과 |
| 5 | 확인된 사실과 아직 추측인 것을 나눠서 보고한다 | 통과 |
| 6 | 확인된 원인 한 곳만 고쳐 검사가 전부 통과로 돌아온다 | 통과 |
1번이 이 장의 숨은 기준입니다. 연습용 오류가 의도한 자리보다 넓게 들어가면 그 뒤의 조사 과정 전체가 연습이 되지 않습니다.
완성된 결과를 공개합니다
3장을 끝낸 상태의 프로젝트
chapters/ch03/source/movie-report/
| 파일 | 무엇인가 |
|---|---|
| build_movie_report.py | movie-report-2024.xlsx를 만드는 코드 |
| source/kobis-2024-source.xlsx | 보고서를 만들 때 사용한 KOBIS 데이터를 작업 당시 상태로 남긴 기준 자료 |
| tests/test_movie_report.py | 완료 조건 일곱 가지를 확인하는 자동 검사 8개 |
| tests/conftest.py | 보고서와 기준 자료를 열어주는 준비 코드 |
이 폴더만 빈 폴더에 복사해 단독으로 돌려, 보고서가 만들어지고 자동 검사 8개가 모두 통과하는 것까지 확인했습니다.
3장은 자기가 만든 오류를 되돌리는 장이므로 이 폴더의 내용은 2장을 끝낸 상태와 같습니다. 그래도 3장 폴더를 따로 두어, 3장에서 막힌 사람이 앞 장을 찾아 올라가지 않고 이 자리에서 다시 시작할 수 있게 했습니다.
이 장이 실제로 만드는 것은 절차입니다
두 실행이 같은 순서로 같은 결론에 도달했습니다.
| 순서 | 두 실행이 도달한 결과 |
|---|---|
| 문제를 재현한다 | 두 번째 실행에서도 같은 항목이 같은 값으로 실패 |
| 기준 자료 -> 상세 데이터 | 영화명·관객수·매출액 60개 값 전부 일치 |
| 상세 데이터 -> 요약 | 여기서 처음 달라짐 |
| 사실과 추측을 나눈다 | 값 대조로 확인한 사실과 남은 추측을 따로 표기 |
| 근본 원인 | 요약 관객수 합계의 계산 범위가 19편에서 끝남 |
| 최소 수정 | 계산 한 곳, 다른 값은 그대로 |
자동 검사도 해봤습니다
3장은 검사를 새로 만들지 않고 2장에서 만든 검사를 그대로 사용합니다.
| 항목 | 수 |
|---|---|
| 3장 Source에서 돌린 Test | 8개 |
| 3장에서 새로 추가된 Test | 0개 |
돌린 검사 코드는 3장 Source 안에 있습니다.
| 파일 | 무엇을 확인하는가 | 검사 |
|---|---|---|
| tests/test_movie_report.py | TOP 20 구조, 기준 자료와 영화명·관객수·매출액 일치, 출처와 조회 기준 연도, 요약 관객수 합계 | 8개 |
| tests/conftest.py | 보고서와 기준 자료를 열어 검사에 넘겨주는 준비 코드 | 0개 |
이 장에서 실패한 검사는 마지막 줄인 test_관객수_합계가_요약값과_일치한다입니다.
| 실행 1 | 실행 2 | |
|---|---|---|
| 검사 항목 | 8개 | 8개 |
| 오류를 넣은 뒤 | 7/8 통과, 1개 실패 | 7/8 통과, 1개 실패 |
| 무엇이 잡았나 | 요약 관객수 합계 검사 | 요약 관객수 합계 검사 |
| 수정 없이 다시 실행 | 같은 1개, 같은 값 | 같은 1개, 같은 값 |
| 한 곳 고친 뒤 | 8/8 통과 | 8/8 통과 |
기준 자료와 상세 데이터를 확인하는 검사는 두 실행 모두 그대로 통과했습니다. 이 통과 정보가 조사 범위를 좁힙니다. 데이터가 무결하다는 것이 확인되면 남는 것은 그 데이터를 모으는 계산뿐입니다.
두 실행이 확인한 숫자는 같았습니다.
| 항목 | 값 |
|---|---|
| 요약에 적힌 총 관객수 | 76,848,858명 |
| 상세 20편을 더한 값 | 78,454,312명 |
| 차이 | 1,605,454명 |
| 20위 영화 관객수 | 1,605,454명 |
차이가 20위 영화 한 편의 관객수와 소수점 없이 같습니다. 이 관계가 이 장에서 가장 중요한 증거입니다. 조금 어긋난 것이 아니라 한 편이 통째로 빠졌다는 뜻이고, 두 실행 모두 이 관계로 원인을 특정했습니다.
요약의 평균 관객수도 같은 합계를 바탕으로 계산됩니다. 그래서 오류 상태에서는 평균도 함께 어긋나 있었고, 합계 계산 한 곳을 고치자 평균도 같이 정상으로 돌아왔습니다. 여러분이 평균을 확인하는 검사까지 만들어 두었다면 그 검사도 함께 실패합니다. 실패가 여러 개라도 고칠 곳은 한 곳입니다.
직접 확인해볼 수 있습니다
책의 3장을 그대로 따라 하시면 됩니다. 요청문은 chapters/ch03/prompts.md에 책에 나오는 순서대로 있습니다. 다섯 개를 순서대로 모두 사용하세요. 첫 번째가 오류를 만들고 마지막이 그것을 되돌립니다.
3장 Source를 받아 그대로 돌려볼 수도 있습니다.
python3 build_movie_report.py
python3 -m pytest tests/ -v연습용 오류가 의도한 자리에만 들어갔는지 직접 확인하고 싶으면 Claude에게 물어보면 됩니다.
연습용 오류를 넣기 전과 지금을 비교해줘.
보존한 기준 자료와 TOP 20 상세 데이터, 기존 Test가 그대로인지 확인하고
바뀐 곳이 요약 총 관객수 계산 한 곳뿐인지 알려줘.저자가 확인할 때 실제로 돌린 파일도 함께 공개합니다.
| 파일 | 무엇인가 |
|---|---|
| artifacts/check-result.json | 2회 실행의 단계별 결과와 측정 조건 |
이런 한계가 있습니다
- 오류가 들어가는 표현은 실행마다 다릅니다. 두 실행 모두 요약 관객수 합계를 구하는 같은 계산에서 20위 한 편을 빼냈지만, 그것을 적는 방식이 서로 달랐습니다. 여러분의 화면에 나오는 설명이 또 달라도 정상입니다.
- 위 숫자는 2장에서 보존한 기준 자료를 기준으로 한 값입니다. 여러분의 기준 자료를 만든 시점이 다르면 합계와 차이의 절대값이 달라집니다. 확인할 것은 숫자 자체가 아니라 차이가 20위 영화 한 편의 관객수와 같다는 관계입니다.