Skip to main content
← 블로그

해 보고 나서야, 템플릿이 배운다

VauDium ·

템플릿에서 발화한 기록을 실제로 해 보면 으레 뭔가 달라집니다 — 재료 하나를 더 챙기고, 단계 하나를 빼고. 원할 때 그 차이를 템플릿에 되돌려, 청사진이 현실을 따라 배우게 했습니다.

해 보고 나서야, 템플릿이 배운다

Fecit에서 템플릿은 청사진입니다. 자주 하는 일을 한 번 잘 적어 두면, 그걸 발화해 기록을 만들고 실제로 실행합니다. 준비물, 단계, 작전, 예상 시간 — 템플릿에 적어 둔 것들이 기록으로 그대로 복사돼 따라옵니다.

그런데 실제로 해 보면, 으레 뭔가 달라집니다.

장 보러 가서 목록에 없던 버터를 하나 더 담습니다. 레시피의 “재료를 볶는다”를 “약불로 천천히 볶는다”로 고쳐 적습니다. 막상 해 보니 필요 없던 단계 하나를 지웁니다. 기록은 — 진짜로 한 번 해 본 그 기록은 — 청사진보다 한 발 앞서 있습니다. 그런데 그 앎은 기록 안에서 끝나 버렸습니다. 다음에 같은 템플릿을 발화하면, 똑같이 버터가 빠진 목록으로 다시 시작했죠.

그 틈을 메우기로 했습니다.

드리프트: 청사진과 실행 사이의 거리

발화 시점엔 기록과 템플릿이 똑같습니다. 그러다 실행 중 손을 대면서, 기록은 원본에서 조금씩 멀어집니다. 우리는 이 거리를 드리프트(drift) 라고 부릅니다 — 천천히 흘러서 멀어진다는 뜻 그대로.

드리프트는 세 가지 모습으로 나타납니다.

  • 추가 — 기록엔 있는데 템플릿엔 없는 것 (버터를 더 담았다)
  • 제거 — 템플릿엔 있는데 기록에선 뺀 것 (안 쓰는 단계를 지웠다)
  • 수정 — 같은 항목인데 내용이 달라진 것 (단계 설명을 다듬었다)

이건 기록에 적는 ‘대응 지침’과 결이 닿아 있습니다. 거기서 우리는 “계획은 실행을 만나야 한다”고 적었죠. 드리프트는 그 만남이 남긴 흔적입니다. 문제는, 흔적이 기록 한 장에만 남고 청사진엔 닿지 못한다는 것이었습니다.

언제 되먹일지는 당신이 정한다

처음엔 이걸 자동으로 만들었습니다 — 기록을 완료하는 순간 서버가 비교해서 제안을 쏟아냈죠. 그런데 곧 깨달았습니다. 완료할 때마다 자동으로 제안이 생기면, 보지도 않는 제안이 템플릿에 쌓입니다. 한 번뿐인 변덕까지 전부 제안이 되어 쌓이는 garbage가 됐죠.

그래서 되먹임은 당신이 부르도록 바꿨습니다.

완료된 기록은 여전히 “이번엔 실제로 이렇게 했다”는 확정된 진술입니다. 그 기록의 메뉴에서 **‘개선 제안 생성’**을 누르면 — 그제야 Fecit이 그 기록을 origin 템플릿과 나란히 놓고 비교해, 달라진 곳을 개선 제안으로 만들어 템플릿 옆에 붙입니다. 원할 때만, 쌓이지 않게.

비교 대상은 작전(description), 예상 시간(duration), 준비물(재료·도구·장소·인력·증명), 단계(서브태스크) — 추가·제거·수정 모두입니다.

”같은 항목”을 어떻게 알아보나

추가·제거·수정을 가르려면, 기록의 어떤 항목이 템플릿의 어떤 항목에서 나온 것인지 짝지을 수 있어야 합니다. 이름으로 맞추면 — 이름을 고치는 순간 짝을 잃습니다. 같은 이름이 둘이면 헷갈리고요.

그래서 준비물 항목엔 안정적인 키를 하나씩 박았습니다. 발화로 복사될 때 키도 따라오므로, 기록의 재료와 그 재료가 나온 템플릿의 재료는 같은 키를 공유합니다. 이름을 “밀가루”에서 “중력분”으로 고쳐도 키는 그대로 — 그래서 우리는 그게 새 항목이 아니라 고쳐진 같은 항목이라는 걸 압니다.

단계는 사정이 조금 다릅니다. 서브태스크는 그 자체로 별도의 문서라, 발화 때 이미 origin 포인터를 갖습니다. 기록의 단계가 어느 템플릿 단계에서 복제됐는지 그 포인터가 가리키죠. 그래서 단계엔 따로 키를 만들 필요가 없었습니다 — 이미 길이 나 있었습니다.

PR처럼, 받아들이거나 무시하거나

제안은 강요가 아닙니다. GitHub의 Pull Request처럼, 템플릿 옆에 대기 상태로 떠 있을 뿐입니다. 준비 섹션이나 단계 헤더에 작은 아이콘이 켜지고, 눌러서 검토 화면을 엽니다. “이 재료를 템플릿에도 추가할까요?” — 적용하거나, 무시하거나.

몇 가지는 조용히 신경 썼습니다.

  • 멱등 — 이미 반영된 걸 또 눌러도 중복되지 않습니다.
  • 무시는 끈질기게 — 한 번 “아니”라고 한 제안은, 다른 기록에서 같은 드리프트가 나와도 다시 조르지 않습니다.
  • 철 지난 건 사라진다 — 사용자가 그새 직접 템플릿을 손봤다면, 무의미해진 제안은 알아서 숨습니다.

받아들인 추가 제안은 한 가지를 더 합니다. 그 기록의 항목을 새로 만들어진 템플릿 항목에 연결해 둡니다. 그래야 그 기록을 또 완료해도 같은 추가가 두 번 제안되지 않습니다 — 루프가 스스로 닫히게요.

루프가 닫힌다

Fecit의 한 축은 목표 → 실행 → 회고 라는 레이어가 명시적으로 존재한다는 점입니다. 그동안 이 화살표는 한 방향이었습니다. 템플릿이 기록을 낳고, 기록이 실행됐죠.

이제 화살표 하나가 거꾸로 생겼습니다. 실행이 청사진을 고쳐 씁니다. 한 번 해 보고 알게 된 것이 그 기록 안에서 죽지 않고, 다음 사람을 — 다음의 나를 — 조금 더 잘 준비된 자리에서 출발하게 합니다.

자주 하는 일일수록, 템플릿은 점점 당신이 실제로 하는 모습을 닮아 갑니다. 적어 둔 청사진이 아니라, 살아온 청사진으로.