데이터 상태를 보려고 무작위로 백 건을 뽑아 연결 상태를 셌다. 절반 넘게 끊겨 있다고 나왔는데 실제 서비스는 멀쩡했다.
Table of contents
Open Table of contents
무작위 표본이 낸 값
표본의 값과 실제 관측이 크게 어긋나면 표본 쪽을 먼저 의심하는 것이 순서다. 모집단에 무엇이 들어 있는지를 상태별로 세어 봤다.
삭제 표시가 붙은 행이 살아 있는 행의 두 배였다. 지운 기기는 당연히 연결이 끊겨 있으므로 무작위로 뽑으면 그쪽이 대부분 잡힌다.
지운 것을 뺀 뒤의 값
삭제 표시를 뺀 모집단에서 다시 백 건을 뽑으니 대부분 정상으로 나왔다. 실제 서비스 상태와 맞는 값이었다.
같은 쿼리에 조건 하나가 있고 없고가 결론을 뒤집었다. 표본의 문제는 뽑는 방법이 아니라 무엇에서 뽑느냐에 있었다.
화면을 통하면 안 보이는 조건
화면 코드를 보니 조회에 삭제 조건이 들어가 있었다. 화면을 통해 보면 그 조건이 항상 붙으므로 지운 행이 있다는 사실 자체가 드러나지 않는다.
내가 손으로 친 쿼리에만 그 조건이 없었다. 직접 조회할 때 빠지는 조건은 화면에서 늘 붙어 있던 것이라 빠뜨렸다는 자각도 없다.
표본이 이상해서 본 것이 다른 것을 알려 줬다
지운 행이 두 배가 넘는 것이 이상해서 삭제 날짜로 묶어 봤다. 특정 하루에 사천 건이 한꺼번에 지워져 있었고 기기 등록을 다시 하면서 옛것을 정리한 정상 작업이었다.
그 사천 건 중 대부분이 구십 일을 넘긴 상태라 보관 테이블로 옮기고 본 테이블에서 뺐다. 표본이 이상해서 들여다본 것이 데이터 정리 대상까지 알려 준 셈이다.
조건이 빠질 자리를 없애기
같은 실수가 반복되지 않게 살아 있는 행만 보는 뷰를 만들고 그것을 보게 했다. 지운 것까지 봐야 할 때는 본 테이블을 직접 보므로 의도가 드러난다.
코드에서도 기본 조회에 조건이 붙게 하고 전체를 보는 것은 이름으로 구분되게 했다. 표본을 뽑기 전에 전체 건수와 섞인 것과 대표성을 확인하는 목록도 적었는데 시험용 기기가 이름 규칙으로만 구분되고 있어서 그것도 값으로 바꿔 조회에서 걸러지게 했다.
정리
- 표본에 지운 것이 섞이면 결과가 실제와 어긋난다
- 표본과 관측이 다르면 표본 쪽을 먼저 의심한다
- 문제는 뽑는 방법이 아니라 무엇에서 뽑느냐에 있다
- 화면을 통하면 조건이 늘 붙어 있어 빠진 줄 모른다
- 표본이 이상하면 왜 그런지 보면 다른 것이 나온다
- 지운 것이 쌓이면 보관 테이블로 옮긴다
- 뷰와 기본 메서드로 조건이 빠질 자리를 없앤다
- 이름 규칙에 기대는 구분은 값으로 바꿔야 조회에서 걸린다