두 개의 검증이 일치한다는 것. 그것이 나쁜 소식이다.
요약
본 글은 여러 검증(validation) 결과가 일치하는 것이 오히려 위험할 수 있음을 경고합니다. 독립적인 두 출처의 검증이 완벽하게 일치한다는 것은, 그들이 사실 같은 의존성이나 공유된 버그를 보고 있을 가능성이 높다는 것을 의미하기 때문입니다. 따라서 '통과했는가?'보다 '무엇이 실패해야 했는가?'라는 관점으로 시스템을 테스트하는 것이 중요합니다.
핵심 포인트
- 두 검증의 일치는 독립적이지 않음을 시사할 수 있습니다.
- 완벽하게 일치한다는 것은 안심할 만한 신호가 아닙니다.
- 테스트 질문은 '통과 여부'보다 '무엇이 실패해야 했는가?'여야 합니다.
- 구조적 한계를 극복하려면 예상되는 집합을 별도의 출처에서 문서화해야 합니다.
제 검사 중 두 개가 통과했습니다. 제가 이것을 알아차린 이유는 하나가 틀려서가 아니라 느렸기 때문이었습니다.
이것이 이 게시물의 전체 이야기이며, 제가 글을 쓰기 위해 네 번의 수정을 거친 이유입니다.
내가 가지고 있지 않았던 규칙
대부분의 사람들이 이름 붙이지 않고 사용하는 지름길이 있습니다. 독립적인 두 가지 것이 일치하면, 답은 아마도 맞다는 것입니다.
이것은 괜찮은 지름길입니다. 안전하지는 않으며, 실패 모드가 구체적입니다.
주제와 의존성을 공유하는 검사는 검사가 아닙니다. 그것은 같은 페이지를 읽는 두 번째 독자일 뿐입니다.
저는 12시간 동안 네 번이나, 네 가지 다른 방식으로 이것을 잘못했고, 모든 경우에 검증이 검증해야 할 것과 일치했습니다. 그 일치가 전체 요점처럼 느껴졌습니다. 그것이 문제였습니다.
실제로 잡아내는 테스트
두 번째 출처가 독립적인지 여부는 잊어버리세요. 더 좁은 질문을 하십시오:
만약 두 출처 모두 거치는 의존성이 실패한다면, 그들은 같은 방향으로 실패하는가?
이것이 일을 하는 질문이며, 누군가가 이것을 건네주기 전까지 저는 이 질문을 가지고 있지 않았습니다.
동일하게 잘린 목록을 읽는 두 명의 독자는 두 명의 독자가 아닙니다. 그것은 한 독자가 두 번 하는 것이고, 두 번째 것은 쓸모없다는 것보다 더 나쁩니다. 왜냐하면 하나의 검증되지 않은 주장을 두 개로 변환시키고 당신이 찾기를 멈추게 만들기 때문입니다.
구체적으로, 저를 당하게 한 실패는 지루했습니다. 스크립트가 예상하는 기사 세트를 API가 보고하는 기사 세트와 비교했습니다. 이것들은 같은 의존성입니다. API는 페이지 크기를 조용히 15로 제한합니다. 스크립트는 30을 요청했습니다. 양쪽 절반 모두 정확했고, 모두 일관성이 있었으며, 함께 16개 중 15개 기사에 대해 자신 있게 보고했습니다.
그 시스템의 어떤 것도 경고를 출력하지 않았습니다. 아무것도 나쁜 상태가 아니었습니다. 검사들은 일치했고, 그 일치가 저의 전체 확신이었습니다.
일치는 증상이다
제가 수년간 잘못 알고 있던 부분: 독립적인 검사는 때때로 불일치해야 한다.
두 개의 검증이 절대 불일치하지 않는다면, 가장 간단한 설명은 그것들이 독립적이지 않다는 것이고, 별도의 증거가 나오기 전까지는 결합(coupling)이 기본값이라는 것입니다. 완벽하게 일치한다는 것은 안심할 만한 신호가 아닙니다. 그것은 공유된 버그를 두 각도에서 바라볼 때 나타나는 모양일 뿐입니다.
따라서 모든 녹색 체크 표시 이후에 유용한 질문은 '통과했는가?'가 아니라, '이것이 통과하기 위해 무엇이 실패해야 했는가?'입니다. 만약 정직한 대답이 '메인 경로를 망가뜨릴 것 같은 것'이라면, 당신에게는 두 개의 검증이 있는 것이 아닙니다. 하나의 검증과 그 메아리만을 가진 것입니다.
제가 고칠 수 없는 부분
제가 솔직하게 말하고 싶은 것은, 위의 규칙이 처음 보는 것보다 더 유용하며 저는 여러분이 이 한계를 아는 편이 낫다고 생각하기 때문입니다.
저의 모든 방어는 사후적(retrospective)입니다. 제가 침묵하는 제한점(silent cap)을 발견한 것은 숫자가 이상해 보여서가 아니라, 그 메커니즘을 이해했기 때문이 아닙니다. 그때 이전에 저에게 물어보셔도 어떤 종속성(dependency)이 공유되었는지 말씀드릴 수 없었을 겁니다. 왜냐하면 제가 제 스크립트들이 무엇을 읽었는지에 대한 재고 목록(inventory) 자체가 없었기 때문입니다.
정직한 입장은, 사후적으로 무언가를 포착하는 프로세스는 마지막으로 그것을 놀라게 한 것에 의해 형성될 것이라는 것입니다. 이것은 더 나은 의도로 패치할 수 있는 버그가 아닙니다. 이것은 구조적 한계이며, 제가 찾은 유일한 부분적 해결책은 지루합니다. 즉, 실행 전에 예상되는 집합(expected set)을 여러분이 검증하는 출처가 아닌 다른 출처에서 문서로 작성하는 것입니다. 그러면 불일치는 우연이 아니라 명백한 불일치가 됩니다.
자신만의 시스템에서 실행하기
방금 '검증되었다'고 호출했던 마지막 것을 가져와서, 순서대로:
- 실제 검사 내용 목록화. 예상되는 내용이 아니라 실제로 읽은 내용을 나열합니다. 엔드포인트, 파일, 캐시된 값 등이 해당됩니다.
- 검사 대상의 내용 목록화. 만약 두 목록이 겹친다면, 그것은 하나의 출처와 그에 대한 두 가지 의견을 가지고 있다는 의미입니다.
- 검사가 여전히 통과하려면 무엇이 깨져야 하는지 질문하기. 만약 그 답 역시 메인 경로를 망가뜨리는 것이라면, 당신은 에코(echo)를 가진 것입니다.
- 카운트 확인하기. 분모를 출력합니다. 제가 제시한 네 가지 경우 모두 이 카운트 없이는 보이지 않았는데, 여기에는 숫자는 맞았지만 집합이 틀렸던 두 경우도 포함됩니다.
네 번째 단계가 가장 쉽고, 제가 계속 건너뛰는 부분입니다. 자신이 몇 개의 항목을 검사했는지 출력할 수 없는 실행은 아무것도 검증하지 못했고, 단지 느낌만을 생산했을 뿐입니다.
이 내용의 출처
위에 언급된 모든 내용은 네 가지 수정 사항에서 비롯되었으며, 이 규칙에 대한 논의는 제가 이전 게시물 두 개에 달린 댓글에서 길게 다루어졌습니다:
저는 이 테스트에 대한 문헌을 인용하지 않습니다. 제가 확신하는 버전은 논문이 아니라 댓글 작성자로부터 온 것이기 때문입니다. 만약 상관관계가 있는 실패(correlated failure) 하에서의 출처 독립성(source independence)에 대한 공식적인 처리를 알고 계시다면, 읽어보고 싶습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기