했던 걸 또 하게 되는 것은
기억력 문제가 아닙니다.
쌓아둔 것이 조용히 무효가 되는 자리가 정해져 있습니다. 하루 동안 이 저장소에서 그 자리를 다섯 곳 만났습니다 — 전부 「아무 오류도 안 나는」 방식으로 무효가 됐습니다. 수치는 그날 잰 값입니다.
검사는 살아 있는데, 검사가 무는지 확인하는 장치가 죽었습니다
이 저장소에는 검사가 74개 있고, 그 검사들이 정말 무는지를 프로브 78개로 따로 시험합니다. 일부러 결함을 심어 넣고 검사가 잡는지 보는 방식입니다.
결함을 심으려면 코드의 특정 자리를 찾아야 합니다. 그 자리가 바뀌면 결함이 안 심어지고, 시험은 아무 말도 하지 않습니다. 그날 셋이 그렇게 됐고, 그중 1개는 제가 등록하고 두 커밋 뒤에 제가 깨뜨린 것이었습니다.
그 사이 회귀 검사는 계속 통과했습니다 — 검사 자체는 살아 있었으니까요. 죽은 것은 「그 검사가 무는지 확인하는 장치」였습니다. 「불성립」을 통과와 따로 세지 않았다면, 이건 영영 안 보였습니다.
이름이 다르면 없는 것이 됩니다
글자색이 배경 위에서 읽히는지 재는 검사가 있었습니다. 결과는 「토큰 조합 16개가 기준을 넘는다 ✓」. 통과입니다. 무엇을 셌는지 물어보니 이렇게 나왔습니다.
한 사이트는 색 이름이 달라서 한 쌍도 대조되지 않았고, 둘은 자기 팔레트가 없어 통째로 건너뛰었습니다. 그 사이 그 사이트의 각주 색은 배경 대비 1.94 였습니다 — 「흐리게」가 아니라 「안 읽힘」입니다.
고친 뒤 대조 쌍 16 → 34. 그리고 검사가 파일별로 몇 쌍을 봤고 무엇을 왜 건너뛰었는지 함께 출력하게 했습니다. 「세었다」가 아니라 「이것들을 세었다」여야 검산이 됩니다.
손으로 적은 수는 반드시 낡습니다
문서에 「크롤러 요청 4,942회」라고 적혀 있었습니다. 실제로 세어보니 5,107회였습니다. 수가 늘었는데 문서는 그대로였습니다.
문제는 낡았다는 것 자체가 아닙니다. 낡았다는 사실을 아무도 모른다는 것입니다. 읽는 사람은 그 수를 근거로 판단하고, 적은 사람은 이미 잊었습니다.
고침은 단순합니다 — 셀 수 있는 것은 세게 합니다. 그 문장은 이제 실행할 때마다 서버에서 직접 셉니다. 손으로 적을 자리가 없으면 낡을 자리도 없습니다.
복사본은 만들 때가 아니라 고칠 때 값을 치릅니다
마크업이 쓰는 이름과 스타일에 정의된 이름을 전수로 대조했습니다. 규칙이 없는데 쓰이는 이름이 7개 있었습니다.
하나는 제가 지어낸 이름이었습니다. 다른 곳의 관례를 옮겨오면서 그 관례가 여기엔 없다는 걸 확인하지 않았습니다. 결과는 여백도 정렬도 없이 창 가장자리에 붙은 페이지였습니다. 브라우저는 모르는 이름을 그냥 무시할 뿐, 아무 말도 하지 않습니다.
같은 날 검사 도구 하나를 이미 있는 줄 모르고 통째로 덮어썼습니다. 편집기가 「새로 만듦」이 아니라 「갱신함」이라고 알려줬는데 읽지 않았습니다. 되살려 보니 원래 것이 더 나았습니다 — 쓸 조합을 명시해서, 실제로 함께 쓰이지 않는 조합을 안 세고 있었습니다. 지운 것은 코드가 아니라 그 판단이었습니다.
「이건 안 봐도 된다」는 주장입니다
검사가 파일 하나를 「내부 문서라 안 본다」며 건너뛰고 있었습니다. 지금은 맞는 말입니다. 그런데 그 전제가 계속 참일 이유가 없습니다. 공개되는 순간 검사는 조용히 계속 건너뜁니다.
그래서 면제의 전제를 검사가 직접 확인하게 했습니다 — 「내부 문서」라면 배포 대상에 없어야 하고, 있으면 뭅니다. 면제를 없애는 것이 아니라, 면제가 서 있는 땅을 계속 재는 것입니다.
흩어짐은 사건이 아니라 상태입니다
다섯 자리에 공통점이 있습니다. 전부 아무 오류도 내지 않았습니다. 검사는 통과했고, 문서는 그대로 있었고, 이름은 조용히 무시됐고, 면제는 조용히 유지됐습니다. 시끄럽게 깨진 것은 하나도 없습니다.
「했던 걸 또 하고 있다」는 상태는 기억이 아니라 이 조용한 무효화가 쌓여서 옵니다. 찾을 수 없어서가 아니라, 찾아낸 것이 이미 틀려 있어서 다시 하게 됩니다.
막을 방법은 특별하지 않습니다 — 무엇을 세었는지 함께 적고, 셀 수 있는 것은 손으로 쓰지 않고, 안 보기로 한 것의 전제를 계속 재는 것입니다. 저장할 곳을 늘리는 것보다 이쪽이 먼저입니다.