「제가 없으면 안 돌아갑니다」는
문서를 안 써서가 아닙니다.
문서는 대개 있습니다. 문제는 그 문서가 맞는지 아무도 모른다는 것입니다. 이 저장소는 인수인계를 문서가 아니라 검사로 다룹니다. 그렇게 만든 자리와, 그래도 새는 자리를 하루치로 적었습니다.
「지금 무엇이 막혀 있는가」는 한 곳에만 있습니다
인수인계 문서가 여럿이면 어느 것이 최신인지 다시 물어야 합니다. 그래서 진입점은 하나입니다 — 521줄짜리 문서 한 장. 세션이 여럿이어도, 사람이 바뀌어도 그 한 장만 봅니다.
디렉토리를 나눠 세션마다 문서를 만들면 당장은 편하고 나중에 비쌉니다. 읽는 사람은 다섯 장을 대조해서 어느 것이 살아 있는지 판정해야 하고, 그 판정을 매번 다시 합니다.
문서의 수치는 코드와 대조됩니다
문서에 「검사 40종」이라고 적어두면, 검사가 41종이 되는 순간 문서가 거짓이 됩니다. 아무도 안 고치고, 다음 사람은 그 수를 근거로 판단합니다.
그래서 그 문서의 수치 자리 5곳은 코드에서 직접 세어 대조합니다. 어긋나면 커밋이 막힙니다. 이 규칙은 세 번 낡은 뒤에 만들었습니다 — 습관으로는 안 됐습니다.
오늘도 한 번 걸렸습니다. 검사를 늘렸다고 생각해 문서를 먼저 올렸는데, 실제로는 기존 검사를 넓힌 것이라 수가 그대로였습니다. 기억이 아니라 대조가 잡았습니다.
도구는 등록부에 이름을 올려야 합니다
검사 스크립트를 만들어놓고 아무 데서도 안 부르면, 그건 있는데 없는 것입니다. 다음 사람은 파일 목록에서 그것을 보고 「돌고 있겠지」라고 읽습니다.
오늘 새 검사를 만들었을 때 등록부 검사가 물었습니다 — 「등록부에 없다. 언제 도는지 아무도 모른다」. 만든 사람은 알지만, 만든 사람이 계속 있을 거라는 가정이 문제입니다.
장부는 한쪽으로만 늙습니다
발견한 문제를 장부에 적습니다. 지금 46건이 있고 33건이 닫혔습니다. 여기까지는 잘 돌아갑니다.
오늘 열린 항목을 라이브로 하나씩 대조해봤습니다. 3건이 이미 해소돼 있었습니다. 전부 그날 고친 것인데 장부는 그대로였습니다 — 고치는 사람과 장부를 닫는 사람이 같은데도 그렇습니다.
이 저장소에는 반대 방향 검사가 둘 있습니다 — 「물린 것이 되살아났나」와 「확인된 것이 사라졌나」. 그런데 「열려 있다고 적힌 것이 이미 해결됐나」는 아무도 안 봅니다. 고칠 때는 「됐다」로 끝나고, 다음 사람은 「아직 열려 있네」로 읽습니다.
검사가 무는지 확인하는 장치도 낡습니다
검사 74개가 정말 무는지 시험합니다 — 일부러 결함을 심어 잡히는지 봅니다. 프로브 72개.
그런데 결함을 심으려면 코드의 특정 자리를 찾아야 하고, 그 자리가 바뀌면 결함이 안 심어집니다. 오늘 셋이 그렇게 됐고, 그중 하나는 제가 등록하고 두 커밋 뒤에 제가 깨뜨린 것이었습니다.
그 사이 회귀 검사는 계속 통과했습니다 — 검사 자체는 살아 있었으니까요. 「불성립」을 통과와 따로 세지 않았다면 영영 안 보였을 것입니다. 인수인계에서 가장 위험한 것은 틀린 문서가 아니라 «맞는지 확인되지 않은 문서»입니다.
이력이 없는 서버는 mtime 만 말합니다
어떤 서버에는 형상관리가 없습니다. 누가 언제 무엇을 고쳤는지 알 방법이 파일의 수정 시각뿐입니다. 오늘 배포 직전 대조에서 그것이 드러났습니다 — 서버가 로컬보다 앞선 파일이 둘 있었고, 그대로 덮었으면 되돌릴 곳이 없었습니다.
「제가 없으면 안 돌아갑니다」의 절반은 이런 자리에서 옵니다. 고친 사람만 아는 변경이 쌓이고, 그 사람이 자리를 비우면 아무도 그것이 왜 그런지 모릅니다. 문서를 더 쓰는 것보다 흔적이 자동으로 남게 하는 것이 먼저입니다.
인수인계는 문서가 아니라 대조입니다
여섯 자리 중 넷은 문서가 있는데도 생겼습니다. 문서는 쓰인 시점에 맞았고, 그 뒤로 아무도 틀렸다고 말해주지 않았습니다. 문서는 늙지만 스스로 늙었다고 말하지 않습니다.
자리를 비울 수 있게 만드는 순서는 이렇습니다 — 진입점을 하나로, 문서의 수치를 코드와 대조, 도구는 「언제 도는가」와 함께 등록, 그리고 닫는 쪽에도 검사를 두는 것입니다. 마지막이 제일 자주 빠집니다.