C.W.K.
Stream
Lesson 01 of 04 · published

단일 플래그 없음

~10 min · single-flag, idempotency, staleness, cache-invalidation

Level 0Empty Shelf
0 XP0/35 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"뭐 기준으로 done? 그 질문에 답 못 하는 플래그는 입력이 바뀌길 기다리는 버그야."

한-비트 거짓말

거의 모든 파이프라인이 processed = true 플래그를 키워. 작업 재실행을 피하는 뻔한 방법이야: 항목마다 done 표시하고, 다음엔 done 인 걸 건너뛰어. 괜찮아 — 입력이 바뀔 때까지는. 그럼 플래그가 조용한 거짓말이 돼. 항목은 done 표시됐는데, 뭐 기준으로 done? 이후 재-export 된 source 파일? 이후 바꾼 오디오 설정? 이후 업그레이드한 model config? 단일 boolean 은 못 말해. 열두 개의 다른 질문을 한 비트로 무너뜨리고, 밑의 입력 중 아무거나 움직이면, 비트는 여전히 true 로 읽히고 진짜 바뀐 작업이 조용히 건너뛰어져.

이건 stale cache 랑 같은 함정이야. cache 항목은 '답을 갖고 있어' 라고 말하는데 — 그 답은 특정 입력에 대해 계산됐고, 입력이 바뀌면 cached 답은 여전히 권위 있어 보이면서 틀려. done 플래그는 정확히 key 없는 cache 야: 작업이 일어났다는 걸 기억하지만 뭐에 대해 됐는지는 안 기억해. cache invalidation 은 컴퓨팅의 어려운 문제 중 하나로 유명하고, 벌거벗은 done-flag 는 곧장 거기 걸어 들어가.

'이미 done' 은 identity 기준으로만 뜻이 있어

고침은 '이게 done 이야?' 묻길 멈추고 '이게 이 정확한 identity 기준으로 done 이야?' 묻기 시작하는 거야. 영상의 boolean 대신, Recall 은 정확히 정의된 identity 에 대해 뭐가 됐는지 기록해: 이 source 콘텐츠, 이 오디오 설정, 이 provider 설정, 이 release. 이제 '이미 done' 은 확인 가능한 답 가진 진짜 질문이야: 현재 입력을 hash 하고, 그 정확한 identity 아래 기록을 찾아. 찾음? 진짜 done, 안전하게 건너뛰어. 못 찾음? 뭔가 바뀜, 작업해. 건너뛰기가 작업이 실제로 의존한 것에 묶였으니까 이제 맞아.

차이는 '이 영상에 뭔가 한 번 했다' 랑 '이 정확한 입력에서 이 정확한 출력을 냈다' 의 차이야. 두 번째만 건너뛰기 안전해, 두 번째만 입력이 바뀌는 즉시 false 가 되니까. 이 트랙의 나머지는 그 identity 를 잘 고르는 거야 — 네가 알아채야 할 각 종류의 변화마다 하나씩.

시스템이 커질수록 왜 더 중요해

장난감 프로젝트에선 done-flag 가 대체로 돼, 입력이 밑에서 바뀌는 일이 드무니까. 몇 달에 걸쳐 재-스캔되고, 재-export 되고, 재-설정되고, 재실행되는 진짜 아카이브에선 입력이 끊임없이 바뀌고 — 그 변화 하나하나가 벌거벗은 done-flag 가 재실행 필요한 작업을 건너뛸 기회야. 버그는 자기를 알리지 않아; 원인 한참 뒤에 '왜 이 영상 transcript 가 옛 model 거지?' 로 나타나. 계층 identity 는 그 부류의 조용한 staleness 를 나중에 절대 디버그 안 하려고 앞서 내는 비용이야. 지금 정밀하거나, 영원히 미스터리 skip 이거나.

Code

boolean 은 key 를 잊고; identity 는 기억한다·python
# 틀림: 뭐에 대해 됐는지 잊는 플래그
if video.processed:
    skip()   # done... 뭐 기준으로? source? config? model?
             # 아무 입력이나 바뀜 -> 여전히 'true' -> 조용히 skip

# 맞음: 'done' 을 의존한 정확한 identity 기준으로 확인
identity = (source_sha256, audio_config_sha, asr_config_sha)
if ledger.has_completed(identity):
    skip()   # 이 입력들에 대해 증명 가능하게 done
else:
    do_the_work()   # 입력 바뀜 -> identity 다름 -> 재실행

# done-flag 는 key 없는 cache 다. key 를 줘라.

External links

Exercise

네 일에서 'processed' / 'done' / 'synced' 플래그를 찾아. 그 플래그를 무효화해야 하는 변화의 모든 입력을 나열해 — source, 설정, 그걸 낸 코드 버전. 이제 물어: 그 중 아무거나 바뀌면 네 플래그가 알아채, 아니면 계속 true 로 읽혀? 완료를 그 입력의 identity 를 key 로 한 기록으로 다시 설계하고, boolean 을 대체하는 정확한 조회를 설명해.
Hint
테스트는: 재실행을 강제해야 하는 변화를 대고, 지금 플래그가 그걸 잡는지 확인해. 의미 있는 입력이 바뀐 뒤에도 플래그가 true 로 남으면, key 없는 cache 야. 중요한 입력을 identity 로 hash 하고 그 identity 아래 완료를 기록해 고쳐 — 이제 '이미 done?' 이 네가 나열한 모든 변화에 올바르게 답해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.