한 채널의 긴급 문의 백로그를 세려고 조회했는데 숫자가 서로 안 맞았다. 처리됨 상태가 90건인데 실제 답변 시각이 찍힌 것은 8건뿐이었다.
Table of contents
Open Table of contents
데이터만으로 하는 규명
물어봐도 아무도 이유를 몰랐는데 과거 조치라 기억이 남아 있지 않았다. 남은 데이터만으로 규명해야 하는 상황이었다.
수집기를 먼저 봤는데 레코드를 만들 때 상태를 항상 초기값으로 넣고 있었다. 그러면 지금 처리됨 상태인 행은 누군가 나중에 바꾼 것이 된다.
두 컬럼의 불일치
정상 흐름이라면 답변할 때 상태가 바뀌면서 답변 시각도 함께 채워진다. 둘이 같이 가는 구조인데 답변 시각이 비었는데 상태만 처리됨인 행이 있었다.
두 컬럼의 조합을 축으로 나누니 세 갈래로 깔끔하게 갈렸다. 처리됨인데 시각이 없으면 응답 면제 일괄 조치이고 초기 상태에 시각도 없으면 면제에서 누락된 방치분이며 시각이 있으면 실제 답변이다.
시각 뭉침으로 찾은 시점
일괄 변경이면 같은 시각에 뭉쳐 있을 것이라고 보고 갱신 시각을 분 단위로 묶어 세어 봤다. 한 분 안에 전부 몰려 있었고 그것으로 조치 시점까지 특정됐다.
일괄 조작은 몇 초 안에 끝나므로 분 단위로 묶으면 한 덩어리로 보이고 정상 처리는 시간에 흩어져 있다. 뭉침 자체가 일괄 조작의 흔적이다.
세는 방법이 바꾼 결과
가장 중요한 것은 두 번째 갈래였는데 답도 안 했고 면제도 안 된 진짜 방치분이 7건 있었다.
상태값만 세면 면제분이 처리로 세어져 방치분이 가려지고 답변 수만 세면 면제분이 미처리로 부풀려진다. 어느 한 축으로만 세면 둘 다 틀리므로 백로그를 세기 전에 면제분과 방치분과 처리분으로 먼저 3분할해야 했다. 그중 방치분만이 실제로 할 일이다.
데이터가 곧 이력
여기서 다른 데도 쓸 규칙이 하나 나왔다. 상태 컬럼과 그 상태를 뒷받침해야 할 타임스탬프의 불일치는 수동 일괄 조작의 지문이라는 것이다.
정상 흐름은 둘을 같이 바꾸므로 하나만 바뀐 것은 코드가 아니라 사람이 한 것이다. 완료 상태에 완료 시각이 없거나 발송 상태에 발송 시각이 없는 조합을 보면 과거에 누가 손댔다고 읽는다.
이 조사에서 인상적이었던 것은 아무 기록이 없는데 과거 조치를 재구성했다는 점이다. 무엇을 했는지는 상태값 조합에서 나오고 언제 했는지는 갱신 시각 뭉침에서 나오며 무엇을 놓쳤는지는 그 조건에 안 맞는 것에서 나왔다. 별도 로그가 없어도 데이터 자체가 이력이다.
정리
- 상태와 그 상태를 뒷받침할 타임스탬프의 불일치는 수동 조작의 지문이다
- 정상 흐름은 둘을 같이 바꾸므로 하나만 바뀐 것은 사람이 한 것이다
- 백로그를 세기 전에 면제분과 방치분과 처리분으로 3분할한다
- 상태값만 세면 방치분이 가려진다
- 처리 수만 세면 방치분이 부풀려진다
- 갱신 시각 뭉침으로 조치 시점을 역추적할 수 있다
- 정상 처리는 시간에 흩어져 있고 일괄 조작은 뭉쳐 있다
- 기록이 없어도 데이터 자체가 이력이다