"늦은 일은 끝날 수 있어도 지금 일만 착지할 수 있어."
먼저 지킬 것
배경 작업은 자기가 태어난 세계가 아직 있다고 가정할 수 없는 때 끝나. 모델이 생각하는 동안 엔트리가 지워지고 원문이 바뀌고 작업이 취소될 수 있어. 그래서 완료는 착지 제안이지 명령이 아니야.
상태로 약속해
모델 결과가 돌아오면 엔트리를 새로 읽어. job도 새로 읽어 status가 여전히 running인지 확인해. entry와 job, 정확한 source snapshot guard가 모두 통과한 뒤에만 translation write method를 불러.
조용한 실패
모델 호출 전에만 신선함을 보면 검사 뒤 race가 남아. 먼저 쓰고 나중에 검사하면 stale 출력이 잠깐 노출돼. pipeline이 쓰기 직전에 entry와 job guard를 수행해. set_translation_text 자체는 boolean guard가 아니라 write method야.
다섯 순간을 따라가
이 원칙이 진짜인지 알려면 생성 직전, 저장 직후, worker가 집어 든 순간, 결과가 돌아온 순간, 다음 날 다시 읽는 순간을 차례로 봐. 각 순간에 엔트리와 작업의 상태, 잡아 둔 원문, 사용자가 보는 문구를 적어. 성공한 요청만 맞고 재시도나 취소에서 달라지면 원문 주권은 조건부였던 거야.
수행해
guarded 완료 경로를 쓰고 착지를 거절할 이유를 전부 적어. 정상 완료 하나만 그리지 말고 원문 수정, 엔트리 삭제, worker 재시작, 외부 서비스 실패도 같은 표에 넣어. 결과를 버리는 일이 데이터 손실이 아니라 무결성 보존이 되는 순간을 분명히 표시해.
마지막 질문
화면이 원문을 계속 보여주고 작업 상태를 솔직히 말하는가? 그렇다면 장식은 원문을 돕고 있어. spinner나 빈칸으로 실패를 숨기거나 늦은 결과가 최신 글을 덮으면 장식이 왕좌를 훔친 거야.
이 레슨의 착지 조건
guard가 착지를 거절하면 이유를 구분해 기록해. 취소됐는지, 엔트리가 삭제됐는지, 원문이 바뀌었는지, job이 superseded됐는지에 따라 다음 안전 행동이 달라져. 그래도 공통 결론은 같아. 이미 쓴 결과를 아깝다고 현재 행에 밀어 넣지 않는 거야.
응답 속도와 정확성은 서로 반대편에 있지 않아. 오래 남을 원문을 먼저 확정하고, 나중 결과에는 현재 상태를 다시 묻게 하면 둘 다 지킬 수 있어.