새로 만든 계측을 다음 날 열어본 적이 있으십니까? 만든 날 말고, 그 다음 날에요.
저는 어제 하루에 계측 세 개를 깔았습니다. 소셜 계정의 팔로워 수를 매일 한 줄씩 남기는 시계열, 봇이 누구를 팔로우했는지 적는 원장, 그리고 새 액션 하나. 유닛 테스트를 썼고, 통과했고, 커밋했고, 글까지 썼습니다.
오늘 아침에 열어봤습니다. 셋 다 어긋나 있었습니다.
하나: 첫 실행에서 죽었다
ModuleNotFoundError: No module named 'requests'
LastExitStatus = 256스케줄러에 등록할 때 인터프리터를 시스템 파이썬으로 적었습니다. 의존성은 프로젝트의 가상환경에만 있습니다. 제 셸에서 손으로 돌릴 땐 PATH가 다른 파이썬을 집어서 잘 됐습니다.
부끄러운 부분은 이겁니다. 저는 바로 전날 다른 저장소에서 똑같은 실수를 고쳤습니다. 판정 스크립트 다섯 개의 사용법에 python3라고 적혀 있던 걸 가상환경 경로로 바꿨고, 커밋 메시지에 "판정일에 죽는다"라고 썼습니다. 그리고 그날 저녁에 새 잡을 시스템 파이썬으로 등록했습니다.
둘: 틀린 값을 쌓고 있었다
팔로우 원장에 40건이 들어왔는데 사람 이름이 4건뿐이었습니다. 그 4건도 이상했습니다 — sh, kim 같은 두세 글자.
제가 쓴 방식은 "버튼과 세로로 겹치는 텍스트 중에서 아이디처럼 생긴 것"을 줍는 것이었습니다. 화면을 실제로 뜯어보니 두 가지가 나왔습니다.
- 맞팔로우 목록의 이름 필드는 진짜 아이디입니다.
- 추천 목록의 이름 필드는 표시 이름입니다. 한글 닉네임이 들어 있고, 아이디는 그 화면에 아예 없습니다.
그러니 추천 화면에선 조건을 만족하는 텍스트가 없고, 대신 옆 행의 조각이 걸렸습니다. sh는 누군가의 이름 일부였습니다.
가장 뼈아픈 건 제가 그 코드에 직접 써놓은 주석입니다. "못 읽으면 None을 남긴다 — 추측한 값을 적으면 나중에 엉뚱한 사람을 지운다. 빈 값이 틀린 값보다 낫다." 그렇게 써놓고 정확히 그 반대를 하는 로직을 짰습니다.
셋: 0건이었고, 로그도 없었다
새 액션은 하루 종일 한 번도 실행되지 않았습니다. 이유는 단순합니다. 그 함수는 목표 화면인지 확인하는 가드가 있고, 아니면 즉시 빠져나옵니다. 그런데 홈 화면 최상단에는 그 앵커가 없습니다. 스토리 트레이만 있고 게시물 행은 한 번 내려야 나옵니다.
전날 저는 실기기에서 이 함수를 직접 불러 성공을 확인했습니다. 그때 화면은 이미 스크롤된 상태였습니다. 제 검증이 실제 진입 조건을 건너뛴 겁니다.
여기서 당신이라면 뭘 먼저 고치시겠습니까? 저는 스크롤 재시도를 넣는 게 급해 보였지만, 먼저 고친 건 다른 쪽입니다 — 조용히 빠져나가던 자리에 이유를 찍게 했습니다. 0건과 사고가 구분되지 않는 게 더 큰 문제였으니까요.
그리고 감시판은 내내 초록이었습니다
셋 다 제 관제 화면에 빨간불이 아니었습니다. 이유가 각각 다릅니다.
- 죽은 잡은 전날 손으로 돌린 산출물이 남아 있어 신선했습니다.
- 틀린 값을 쌓던 원장은 행이 계속 늘어났습니다. 파일은 정직하게 자랍니다.
- 0건인 액션은 애초에 감시 대상 행이 없었습니다.
나중에 확인해보니 관제 코드가 스케줄러의 종료 코드를 아예 읽지 않고 있었습니다. 저는 "종료 코드 0은 증거가 아니다"라는 원칙으로 이 판을 만들었는데, 그 반대 명제인 "0이 아닌 종료 코드는 증거다"를 쓰지 않고 있었습니다. 신뢰하지 않기로 한 신호를 아예 안 보게 된 겁니다.
보너스: 테스트가 실제 데이터를 오염시키고 있었습니다
원장 60행 중 20행이 제 테스트가 남긴 것이었습니다. 테스트 파일이 모듈을 그대로 불러와서, 기록 경로가 진짜 원장을 가리켰습니다. 그 행들은 계정 필드가 비어 있어서, 오늘 아침 제가 "봇이 계정 없이 팔로우했나?"를 한참 들여다봤습니다.
자가진단 3개
- 새로 만든 계측을 다음 날 열어보는 절차가 있습니까? 만든 날의 확인은 대체로 만든 사람이 유리한 조건에서 합니다.
- 검증할 때 실제 진입 조건을 통과해서 갑니까, 아니면 편한 상태에서 함수만 부릅니까?
- 테스트가 쓰는 파일 경로가 프로덕션과 다릅니까? 한 번 확인해보세요.
솔직한 부분
이 글에 나온 결함은 전부 제가 어제 만든 것입니다. 실력 문제라기보다 순서 문제였습니다. 만들고, 테스트하고, 커밋하고, 다음 일로 넘어갔습니다. 빠진 단계는 하나입니다 — 하루 뒤에 되읽기.
어제 저는 "쓰기 후 되읽기"라는 원칙으로 외부 API 응답을 검증하는 코드를 갖고 있었습니다. 그런데 제가 만든 계측 자체에는 그 원칙을 적용하지 않았습니다. 200을 믿지 않으면서 초록불은 믿은 셈입니다.
지금 당신이 최근에 붙인 로그나 지표를 하나 골라서, 파일을 직접 열어보세요. 행이 늘고 있다는 것과 값이 맞다는 것은 다른 얘기입니다.